From e3cd12630402f74a9beb02205c09bd4e1e4706fe Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Fri, 20 Jun 2025 16:45:48 +0530 Subject: [PATCH] fix: removed CRM User doctype and moved api's to user.py (cherry picked from commit 901bcb84602eb2a0a1ac7bcdf1743107cbeb301f) --- crm/api/user.py | 85 ++++++++++++++++ crm/fcrm/doctype/crm_user/__init__.py | 0 crm/fcrm/doctype/crm_user/crm_user.js | 8 -- crm/fcrm/doctype/crm_user/crm_user.json | 112 --------------------- crm/fcrm/doctype/crm_user/crm_user.py | 80 --------------- crm/fcrm/doctype/crm_user/test_crm_user.py | 29 ------ frontend/components.d.ts | 1 + 7 files changed, 86 insertions(+), 229 deletions(-) create mode 100644 crm/api/user.py delete mode 100644 crm/fcrm/doctype/crm_user/__init__.py delete mode 100644 crm/fcrm/doctype/crm_user/crm_user.js delete mode 100644 crm/fcrm/doctype/crm_user/crm_user.json delete mode 100644 crm/fcrm/doctype/crm_user/crm_user.py delete mode 100644 crm/fcrm/doctype/crm_user/test_crm_user.py diff --git a/crm/api/user.py b/crm/api/user.py new file mode 100644 index 00000000..ab20fbda --- /dev/null +++ b/crm/api/user.py @@ -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.") diff --git a/crm/fcrm/doctype/crm_user/__init__.py b/crm/fcrm/doctype/crm_user/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/crm/fcrm/doctype/crm_user/crm_user.js b/crm/fcrm/doctype/crm_user/crm_user.js deleted file mode 100644 index 71b91b59..00000000 --- a/crm/fcrm/doctype/crm_user/crm_user.js +++ /dev/null @@ -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) { - -// }, -// }); diff --git a/crm/fcrm/doctype/crm_user/crm_user.json b/crm/fcrm/doctype/crm_user/crm_user.json deleted file mode 100644 index 1f7f119c..00000000 --- a/crm/fcrm/doctype/crm_user/crm_user.json +++ /dev/null @@ -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" -} diff --git a/crm/fcrm/doctype/crm_user/crm_user.py b/crm/fcrm/doctype/crm_user/crm_user.py deleted file mode 100644 index 2bc585a8..00000000 --- a/crm/fcrm/doctype/crm_user/crm_user.py +++ /dev/null @@ -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) diff --git a/crm/fcrm/doctype/crm_user/test_crm_user.py b/crm/fcrm/doctype/crm_user/test_crm_user.py deleted file mode 100644 index f368fa88..00000000 --- a/crm/fcrm/doctype/crm_user/test_crm_user.py +++ /dev/null @@ -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 diff --git a/frontend/components.d.ts b/frontend/components.d.ts index 60081dac..cd05f733 100644 --- a/frontend/components.d.ts +++ b/frontend/components.d.ts @@ -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']