def save_version(self): '''Save version info''' version = frappe.new_doc('Version') if version.set_diff(self._doc_before_save, self): version.insert(ignore_permissions=True) if not frappe.flags.in_migrate: follow_document(self.doctype, self.name, frappe.session.user)
def add(args=None): """add in someone's to do list args = { "assign_to": , "doctype": , "name": , "description": , "assignment_rule": } """ if not args: args = frappe.local.form_dict if frappe.db.sql("""SELECT `owner` FROM `tabToDo` WHERE `reference_type`=%(doctype)s AND `reference_name`=%(name)s AND `status`='Open' AND `owner`=%(assign_to)s""", args): frappe.throw(_("Already in user's To Do list"), DuplicateToDoError) else: from frappe.utils import nowdate if not args.get('description'): args['description'] = _('Assignment for {0} {1}'.format(args['doctype'], args['name'])) d = frappe.get_doc({ "doctype":"ToDo", "owner": args['assign_to'], "reference_type": args['doctype'], "reference_name": args['name'], "description": args.get('description'), "priority": args.get("priority", "Medium"), "status": "Open", "date": args.get('date', nowdate()), "assigned_by": args.get('assigned_by', frappe.session.user), 'assignment_rule': args.get('assignment_rule') }).insert(ignore_permissions=True) # set assigned_to if field exists if frappe.get_meta(args['doctype']).get_field("assigned_to"): frappe.db.set_value(args['doctype'], args['name'], "assigned_to", args['assign_to']) doc = frappe.get_doc(args['doctype'], args['name']) # if assignee does not have permissions, share if not frappe.has_permission(doc=doc, user=args['assign_to']): frappe.share.add(doc.doctype, doc.name, args['assign_to']) frappe.msgprint(_('Shared with user {0} with read access').format(args['assign_to']), alert=True) # make this document followed by assigned user follow_document(args['doctype'], args['name'], args['assign_to']) # notify notify_assignment(d.assigned_by, d.owner, d.reference_type, d.reference_name, action='ASSIGN',\ description=args.get("description")) return get(args)
def save_version(self): """Save version info""" if not self._doc_before_save and frappe.flags.in_patch: return version = frappe.new_doc('Version') if not self._doc_before_save: version.for_insert(self) version.insert(ignore_permissions=True) elif version.set_diff(self._doc_before_save, self): version.insert(ignore_permissions=True) if not frappe.flags.in_migrate: follow_document(self.doctype, self.name, frappe.session.user)
def add_comment(reference_doctype, reference_name, content, comment_email): """allow any logged user to post a comment""" doc = frappe.get_doc(dict( doctype = 'Comment', reference_doctype = reference_doctype, reference_name = reference_name, content = sanitize_html(content), comment_email = comment_email, comment_type = 'Comment' )).insert(ignore_permissions = True) follow_document(doc.reference_doctype, doc.reference_name, frappe.session.user) return doc.as_dict()
def add_comment(reference_doctype, reference_name, content, comment_email, comment_by): """allow any logged user to post a comment""" doc = frappe.get_doc(dict( doctype='Comment', reference_doctype=reference_doctype, reference_name=reference_name, comment_email=comment_email, comment_type='Comment', comment_by=comment_by )) reference_doc = frappe.get_doc(reference_doctype, reference_name) doc.content = extract_images_from_html(reference_doc, content, is_private=True) doc.insert(ignore_permissions=True) follow_document(doc.reference_doctype, doc.reference_name, frappe.session.user) return doc.as_dict()
def add(doctype, name, user=None, read=1, write=0, submit=0, share=0, everyone=0, flags=None, notify=0): """Share the given document with a user.""" if not user: user = frappe.session.user if not (flags or {}).get("ignore_share_permission"): check_share_permission(doctype, name) share_name = get_share_name(doctype, name, user, everyone) if share_name: doc = frappe.get_doc("DocShare", share_name) else: doc = frappe.new_doc("DocShare") doc.update({ "user": user, "share_doctype": doctype, "share_name": name, "everyone": cint(everyone) }) if flags: doc.flags.update(flags) doc.update({ # always add read, since you are adding! "read": 1, "write": cint(write), "submit": cint(submit), "share": cint(share), }) doc.save(ignore_permissions=True) notify_assignment(user, doctype, name, everyone, notify=notify) follow_document(doctype, name, user) return doc
def save_version(self): """Save version info""" # don't track version under following conditions if (not getattr(self.meta, 'track_changes', False) or self.doctype == 'Version' or self.flags.ignore_version or frappe.flags.in_install or (not self._doc_before_save and frappe.flags.in_patch)): return version = frappe.new_doc('Version') if not self._doc_before_save: version.for_insert(self) version.insert(ignore_permissions=True) elif version.set_diff(self._doc_before_save, self): version.insert(ignore_permissions=True) if not frappe.flags.in_migrate: # follow since you made a change? follow_document(self.doctype, self.name, frappe.session.user)
def _toggle_like(doctype, name, add, user=None): """Same as toggle_like but hides param `user` from API""" if not user: user = frappe.session.user try: liked_by = frappe.db.get_value(doctype, name, "_liked_by") if liked_by: liked_by = json.loads(liked_by) else: liked_by = [] if add == "Yes": if user not in liked_by: liked_by.append(user) add_comment(doctype, name) follow_document(doctype, name, user) else: if user in liked_by: liked_by.remove(user) remove_like(doctype, name) frappe.db.set_value(doctype, name, "_liked_by", json.dumps(liked_by), update_modified=False) except frappe.db.ProgrammingError as e: if frappe.db.is_column_missing(e): add_column(doctype, "_liked_by", "Text") _toggle_like(doctype, name, add, user) else: raise
def test_document_follow(self): user = get_user() event_doc = get_event() event_doc.description = "This is a test description for sending mail" event_doc.save(ignore_version=False) document_follow.unfollow_document("Event", event_doc.name, user.name) doc = document_follow.follow_document("Event", event_doc.name, user.name) self.assertEqual(doc.user, user.name) document_follow.send_hourly_updates() email_queue_entry_name = frappe.get_all("Email Queue", limit=1)[0].name email_queue_entry_doc = frappe.get_doc("Email Queue", email_queue_entry_name) self.assertEqual((email_queue_entry_doc.recipients[0].recipient), user.name) self.assertIn(event_doc.doctype, email_queue_entry_doc.message) self.assertIn(event_doc.name, email_queue_entry_doc.message)
def insert(self, ignore_permissions=None, ignore_links=None, ignore_if_duplicate=False, ignore_mandatory=None, set_name=None, set_child_names=True): """Insert the document in the database (as a new document). This will check for user permissions and execute `before_insert`, `validate`, `on_update`, `after_insert` methods if they are written. :param ignore_permissions: Do not check permissions if True.""" if self.flags.in_print: return self.flags.notifications_executed = [] if ignore_permissions!=None: self.flags.ignore_permissions = ignore_permissions if ignore_links!=None: self.flags.ignore_links = ignore_links if ignore_mandatory!=None: self.flags.ignore_mandatory = ignore_mandatory self.set("__islocal", True) self.check_permission("create") self._set_defaults() self.set_user_and_timestamp() self.set_docstatus() self.check_if_latest() self.run_method("before_insert") self._validate_links() self.set_new_name(set_name=set_name, set_child_names=set_child_names) self.set_parent_in_children() self.validate_higher_perm_levels() self.flags.in_insert = True self.run_before_save_methods() self._validate() self.set_docstatus() self.flags.in_insert = False # follow document on document creation # run validate, on update etc. # parent if getattr(self.meta, "issingle", 0): self.update_single(self.get_valid_dict()) else: try: self.db_insert() except frappe.DuplicateEntryError as e: if not ignore_if_duplicate: raise e # children for d in self.get_all_children(): d.db_insert() self.run_method("after_insert") self.flags.in_insert = True if self.get("amended_from"): self.copy_attachments_from_amended_from() # flag to prevent creation of event update log for create and update both # during document creation self.flags.update_log_for_doc_creation = True self.run_post_save_methods() self.flags.in_insert = False # delete __islocal if hasattr(self, "__islocal"): delattr(self, "__islocal") # clear unsaved flag if hasattr(self, "__unsaved"): delattr(self, "__unsaved") if not (frappe.flags.in_migrate or frappe.local.flags.in_install or frappe.flags.in_setup_wizard): follow_document(self.doctype, self.name, frappe.session.user) return self
def add(args=None): """add in someone's to do list args = { "assign_to": [], "doctype": , "name": , "description": , "assignment_rule": } """ if not args: args = frappe.local.form_dict users_with_duplicate_todo = [] shared_with_users = [] for assign_to in frappe.parse_json(args.get("assign_to")): filters = { "reference_type": args['doctype'], "reference_name": args['name'], "status": "Open", "owner": assign_to } if frappe.get_all("ToDo", filters=filters): users_with_duplicate_todo.append(assign_to) else: from frappe.utils import nowdate if not args.get('description'): args['description'] = _('Assignment for {0} {1}').format( args['doctype'], args['name']) d = frappe.get_doc({ "doctype": "ToDo", "owner": assign_to, "reference_type": args['doctype'], "reference_name": args['name'], "description": args.get('description'), "priority": args.get("priority", "Medium"), "status": "Open", "date": args.get('date', nowdate()), "assigned_by": args.get('assigned_by', frappe.session.user), 'assignment_rule': args.get('assignment_rule') }).insert(ignore_permissions=True) # set assigned_to if field exists if frappe.get_meta(args['doctype']).get_field("assigned_to"): frappe.db.set_value(args['doctype'], args['name'], "assigned_to", assign_to) doc = frappe.get_doc(args['doctype'], args['name']) # if assignee does not have permissions, share if not frappe.has_permission(doc=doc, user=assign_to): frappe.share.add(doc.doctype, doc.name, assign_to) shared_with_users.append(assign_to) # make this document followed by assigned user follow_document(args['doctype'], args['name'], assign_to) # notify notify_assignment(d.assigned_by, d.owner, d.reference_type, d.reference_name, action='ASSIGN', description=args.get("description")) if shared_with_users: user_list = format_message_for_assign_to(shared_with_users) frappe.msgprint( _("Shared with the following Users with Read access:{0}").format( user_list, alert=True)) if users_with_duplicate_todo: user_list = format_message_for_assign_to(users_with_duplicate_todo) frappe.msgprint( _("Already in the following Users ToDo list:{0}").format( user_list, alert=True)) return get(args)