Beispiel #1
0
 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)
Beispiel #2
0
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)
Beispiel #3
0
	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)
Beispiel #4
0
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()
Beispiel #5
0
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()
Beispiel #6
0
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
Beispiel #7
0
	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)
Beispiel #8
0
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
Beispiel #9
0
	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)
Beispiel #10
0
	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
Beispiel #11
0
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)