fix: removed CRM User doctype and moved api's to user.py

(cherry picked from commit 901bcb84602eb2a0a1ac7bcdf1743107cbeb301f)
This commit is contained in:
Shariq Ansari 2025-06-20 16:45:48 +05:30 committed by Mergify
parent ffd24933cd
commit e3cd126304
7 changed files with 86 additions and 229 deletions

85
crm/api/user.py Normal file
View File

@ -0,0 +1,85 @@
import frappe
@frappe.whitelist()
def add_existing_users(users, role="Sales User"):
"""
Add existing users to the CRM User doctype.
:param users: List of user names to be added
"""
frappe.only_for(["System Manager", "Sales Manager"])
users = frappe.parse_json(users)
for user in users:
add_user(user, role)
@frappe.whitelist()
def update_user_role(user, new_role):
"""
Update the role of the user to Sales Manager, Sales User, or System Manager.
:param user: The name of the user
:param new_role: The new role to assign (Sales Manager or Sales User)
"""
frappe.only_for(["System Manager", "Sales Manager"])
if new_role not in ["System Manager", "Sales Manager", "Sales User"]:
frappe.throw("Cannot assign this role")
user_doc = frappe.get_doc("User", user)
if new_role == "System Manager":
user_doc.append_roles("System Manager", "Sales Manager", "Sales User")
if new_role == "Sales Manager":
user_doc.append_roles("Sales Manager", "Sales User")
user_doc.remove_roles("System Manager")
if new_role == "Sales User":
user_doc.append_roles("Sales User")
user_doc.remove_roles("Sales Manager", "System Manager")
user_doc.save()
@frappe.whitelist()
def add_user(user, role):
"""
Add a user means adding role (Sales User or/and Sales Manager) to the user.
:param user: The name of the user to be added
:param role: The role to be assigned (Sales User or Sales Manager)
"""
frappe.only_for(["System Manager", "Sales Manager"])
if role not in ["System Manager", "Sales Manager", "Sales User"]:
frappe.throw("Cannot assign this role")
user_doc = frappe.get_doc("User", user)
if role == "System Manager":
user_doc.append_roles("System Manager", "Sales Manager", "Sales User")
elif role == "Sales Manager":
user_doc.append_roles("Sales Manager", "Sales User")
elif role == "Sales User":
user_doc.append_roles("Sales User")
user_doc.save()
@frappe.whitelist()
def remove_user(user):
"""
Remove a user means removing Sales User & Sales Manager roles from the user.
:param user: The name of the user to be removed
"""
frappe.only_for(["System Manager", "Sales Manager"])
user_doc = frappe.get_doc("User", user)
roles = [d.role for d in user_doc.roles]
if "Sales User" in roles:
user_doc.remove_roles("Sales User")
if "Sales Manager" in roles:
user_doc.remove_roles("Sales Manager")
user_doc.save()
frappe.msgprint(f"User {user} has been removed from CRM roles.")

View File

@ -1,8 +0,0 @@
// Copyright (c) 2025, Frappe Technologies Pvt. Ltd. and contributors
// For license information, please see license.txt
// frappe.ui.form.on("CRM User", {
// refresh(frm) {
// },
// });

View File

@ -1,112 +0,0 @@
{
"actions": [],
"allow_rename": 1,
"autoname": "field:user",
"creation": "2025-05-21 12:59:26.007215",
"doctype": "DocType",
"engine": "InnoDB",
"field_order": [
"user",
"is_active",
"section_break_qdxc",
"first_name",
"middle_name",
"last_name",
"column_break_kpoq",
"user_name",
"image"
],
"fields": [
{
"fieldname": "user",
"fieldtype": "Link",
"label": "User",
"options": "User",
"unique": 1
},
{
"default": "1",
"fieldname": "is_active",
"fieldtype": "Check",
"label": "Is Active"
},
{
"fieldname": "section_break_qdxc",
"fieldtype": "Section Break"
},
{
"fieldname": "column_break_kpoq",
"fieldtype": "Column Break"
},
{
"fieldname": "image",
"fieldtype": "Attach Image",
"label": "Image"
},
{
"fetch_from": "user.first_name",
"fetch_if_empty": 1,
"fieldname": "first_name",
"fieldtype": "Data",
"in_list_view": 1,
"label": "First Name",
"reqd": 1
},
{
"fieldname": "middle_name",
"fieldtype": "Data",
"label": "Middle Name"
},
{
"fieldname": "last_name",
"fieldtype": "Data",
"label": "Last Name"
},
{
"fieldname": "user_name",
"fieldtype": "Data",
"label": "Full Name"
}
],
"grid_page_length": 50,
"image_field": "image",
"index_web_pages_for_search": 1,
"links": [],
"modified": "2025-06-17 23:17:19.996659",
"modified_by": "Administrator",
"module": "FCRM",
"name": "CRM User",
"naming_rule": "By fieldname",
"owner": "Administrator",
"permissions": [
{
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"print": 1,
"read": 1,
"report": 1,
"role": "System Manager",
"share": 1,
"write": 1
},
{
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"print": 1,
"read": 1,
"report": 1,
"role": "Sales Manager",
"share": 1,
"write": 1
}
],
"row_format": "Dynamic",
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
"title_field": "user_name"
}

View File

@ -1,80 +0,0 @@
# Copyright (c) 2025, Frappe Technologies Pvt. Ltd. and contributors
# For license information, please see license.txt
import frappe
from frappe.model.document import Document
class CRMUser(Document):
def validate(self):
if self.user:
user = frappe.get_doc("User", self.user)
if not self.first_name:
self.first_name = user.first_name
if not self.middle_name:
self.middle_name = user.middle_name
if not self.last_name:
self.last_name = user.last_name
if not self.user_name:
self.user_name = user.full_name
if not self.image:
self.image = user.user_image
@frappe.whitelist()
def add_existing_users(users, role='Sales User'):
"""
Add existing users to the CRM User doctype.
:param users: List of user names to be added
"""
frappe.only_for(["System Manager", "Sales Manager"])
users = frappe.parse_json(users)
for user in users:
if not frappe.db.exists("CRM User", {"user": user}):
new_user = frappe.new_doc("CRM User")
new_user.user = user
new_user.save(ignore_permissions=True)
update_user_role(user, role)
else:
frappe.throw(f"User {user} already exists")
@frappe.whitelist()
def update_user_role(user, new_role):
"""
Update the role of the user to Sales Manager, Sales User, or System Manager.
:param user: The name of the user
:param new_role: The new role to assign (Sales Manager or Sales User)
"""
frappe.only_for(["System Manager", "Sales Manager"])
if new_role not in ["System Manager", "Sales Manager", "Sales User"]:
frappe.throw("Cannot assign this role")
user_doc = frappe.get_doc("User", user)
if new_role == "System Manager":
user_doc.append_roles("System Manager")
if new_role == "Sales Manager":
user_doc.append_roles("Sales Manager")
user_doc.remove_roles("System Manager")
if new_role == "Sales User":
user_doc.append_roles("Sales User")
user_doc.remove_roles("Sales Manager", "System Manager")
user_doc.save()
@frappe.whitelist()
def update_user_status(user, status):
"""
Activate or deactivate the user
:param user: The name of the user
:param status: The status to set (1 for active, 0 for inactive)
"""
frappe.only_for(["System Manager", "Sales Manager"])
frappe.db.set_value("CRM User", user, "is_active", status)

View File

@ -1,29 +0,0 @@
# Copyright (c) 2025, Frappe Technologies Pvt. Ltd. and Contributors
# See license.txt
# import frappe
from frappe.tests import IntegrationTestCase, UnitTestCase
# On IntegrationTestCase, the doctype test records and all
# link-field test record dependencies are recursively loaded
# Use these module variables to add/remove to/from that list
EXTRA_TEST_RECORD_DEPENDENCIES = [] # eg. ["User"]
IGNORE_TEST_RECORD_DEPENDENCIES = [] # eg. ["User"]
class UnitTestCRMUser(UnitTestCase):
"""
Unit tests for CRMUser.
Use this class for testing individual functions and methods.
"""
pass
class IntegrationTestCRMUser(IntegrationTestCase):
"""
Integration tests for CRMUser.
Use this class for testing interactions between multiple components.
"""
pass

View File

@ -190,6 +190,7 @@ declare module 'vue' {
MultiActionButton: typeof import('./src/components/MultiActionButton.vue')['default']
MultipleAvatar: typeof import('./src/components/MultipleAvatar.vue')['default']
MultiSelectEmailInput: typeof import('./src/components/Controls/MultiSelectEmailInput.vue')['default']
MultiSelectUserInput: typeof import('./src/components/Controls/MultiSelectUserInput.vue')['default']
MuteIcon: typeof import('./src/components/Icons/MuteIcon.vue')['default']
NestedPopover: typeof import('./src/components/NestedPopover.vue')['default']
NoteArea: typeof import('./src/components/Activities/NoteArea.vue')['default']