diff --git a/frappe/hooks.py b/frappe/hooks.py index 1939e7f0df..5984b216a5 100644 --- a/frappe/hooks.py +++ b/frappe/hooks.py @@ -117,7 +117,8 @@ doc_events = { "frappe.desk.notifications.clear_doctype_notifications", "frappe.core.doctype.activity_log.feed.update_feed", "frappe.workflow.doctype.workflow_action.workflow_action.process_workflow_actions", - "frappe.automation.doctype.assignment_rule.assignment_rule.apply" + "frappe.automation.doctype.assignment_rule.assignment_rule.apply", + "frappe.social.doctype.energy_point_rule.energy_point_rule.process_energy_points" ], "after_rename": "frappe.desk.notifications.clear_doctype_notifications", "on_cancel": [ @@ -129,8 +130,7 @@ doc_events = { "frappe.workflow.doctype.workflow_action.workflow_action.process_workflow_actions" ], "on_change": [ - "frappe.core.doctype.feedback_trigger.feedback_trigger.trigger_feedback_request", - "frappe.social.doctype.energy_point_log.energy_point_log.process_for_energy_points" + "frappe.core.doctype.feedback_trigger.feedback_trigger.trigger_feedback_request" ] }, "Email Group Member": { diff --git a/frappe/social/doctype/energy_point_log/energy_point_log.py b/frappe/social/doctype/energy_point_log/energy_point_log.py index 19b99393a6..44cdcc773b 100644 --- a/frappe/social/doctype/energy_point_log/energy_point_log.py +++ b/frappe/social/doctype/energy_point_log/energy_point_log.py @@ -6,79 +6,34 @@ from __future__ import unicode_literals import frappe from frappe.model.document import Document from frappe.utils import cint -from ..energy_point_settings.energy_point_settings import is_energy_point_enabled - -ENERGY_POINT_VALUES = { - 'issue_closed': 2, - 'instant_reply_on_issue': 2, - 'feedback_point_multiplier': 2, - 'github_pull_request_merge': 2, - 'github_pull_request_review_submit': 2, - 'github_issue_open': 1, - 'github_issue_close': 2, -} class EnergyPointLog(Document): def after_insert(self): update_user_energy_points(self.points, self.user) -def process_for_energy_points(doc, state): - if (not is_energy_point_enabled() - or frappe.flags.in_patch): return - - doc_action = doc.get('_action') - if not doc_action: return - - point_rules = frappe.get_all('Energy Point Rule', filters={ - 'reference_doctype': doc.get('doctype'), - }, fields=['name', 'points', 'rule_name', '`condition`', 'user_field'], debug=1) - print(point_rules) - for point_rule in point_rules: - print(point_rule.condition) - if frappe.safe_eval(point_rule.condition, None, {'doc': doc}): - create_energy_point_log( - points=point_rule.points, - reason=None, - reference_doctype=doc.doctype, - reference_name=doc.name, - user=doc.get(point_rule.user_field), - rule=point_rule.name - ) - -def create_energy_point_log(points, reason, reference_doctype, reference_name, user=None, rule=None): - print('===================in=========', user, points) - if not user: - user = frappe.session.user - - if user in ['admin@example.com', 'Administrator', 'Guest']: return - +def create_energy_point_log(ref_doctype, ref_name, doc): + doc = frappe._dict(doc) log_exists = frappe.db.exists('Energy Point Log', { - 'user': user, - 'rule': rule, - 'reference_doctype': reference_doctype, - 'reference_name': reference_name + 'user': doc.user, + 'rule': doc.rule, + 'reference_doctype': ref_doctype, + 'reference_name': ref_name }) - if log_exists: return - frappe.get_doc({ - 'doctype': 'Energy Point Log', - 'points': points, - 'user': user, - 'rule': rule, - 'reason': reason, - 'reference_doctype': reference_doctype, - 'reference_name': reference_name - }).insert(ignore_permissions=True) + _doc = frappe.new_doc('Energy Point Log') + _doc.reference_doctype = ref_doctype + _doc.reference_name = ref_name + _doc.update(doc) + _doc.insert(ignore_permissions=True) + return _doc -def update_user_energy_points(point, user=None): - point = cint(point) - if not point: return - if not user: user = frappe.session.user +def update_user_energy_points(points, user): + points = cint(points) - previous_point = frappe.db.get_value('User', user, 'energy_points') - new_point = cint(previous_point) + point - frappe.db.set_value('User', user, 'energy_points', new_point) - message='=== You gained {} points ==='.format(point) + previous_points = frappe.db.get_value('User', user, 'energy_points') + new_points = cint(previous_points) + points + frappe.db.set_value('User', user, 'energy_points', new_points) + message='=== You gained {} points ==='.format(points) frappe.publish_realtime('points_gained', message=message , user=user) \ No newline at end of file diff --git a/frappe/social/doctype/energy_point_rule/energy_point_rule.py b/frappe/social/doctype/energy_point_rule/energy_point_rule.py index 975fe16505..40fa4bb877 100644 --- a/frappe/social/doctype/energy_point_rule/energy_point_rule.py +++ b/frappe/social/doctype/energy_point_rule/energy_point_rule.py @@ -5,6 +5,47 @@ from __future__ import unicode_literals import frappe from frappe.model.document import Document +from frappe.utils import cint +from frappe.social.doctype.energy_point_settings.energy_point_settings import is_energy_point_enabled +from frappe.social.doctype.energy_point_log.energy_point_log import create_energy_point_log class EnergyPointRule(Document): - pass + def apply(self, doc): + if frappe.safe_eval(self.condition, None, {'doc': doc.as_dict()}): + multiplier = 1 + + if self.multiplier_field: + multiplier = doc.get(self.multiplier_field, 1) + + points = self.points * multiplier + reference_doctype = doc.doctype + reference_name = doc.name + user = doc.get(self.user_field) + rule = self.name + + create_energy_point_log(reference_doctype, reference_name, { + 'points': points, + 'user': user, + 'rule': rule + }) + + +def process_energy_points(doc, state): + if not is_energy_point_enabled() or frappe.flags.in_patch or frappe.flags.in_install: + return + + energy_point_doctypes = frappe.cache().get_value('energy_point_doctypes', get_energy_point_doctypes) + + if doc.doctype in energy_point_doctypes: + rules = frappe.get_all('Energy Point Rule', filters={ + 'reference_doctype': doc.doctype, + 'enabled': 1 + }) + for d in rules: + frappe.get_doc('Energy Point Rule', d.name).apply(doc) + +def get_energy_point_doctypes(): + return [ + d.reference_doctype for d in frappe.get_all('Energy Point Rule', + ['reference_doctype'], {'enabled': 1}) + ]