From 56b28d0a0ae7cd27412b87bdad880f05be82e656 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Tue, 19 Mar 2019 14:08:35 +0530 Subject: [PATCH 001/256] feat: Init energy points --- frappe/boot.py | 2 +- frappe/core/doctype/user/user.js | 43 +- frappe/core/doctype/user/user.json | 110 ++- frappe/core/doctype/user/user.py | 2 +- .../page/energy_point_history/__init__.py | 0 .../energy_point_history.js | 19 + .../energy_point_history.json | 18 + .../energy_point_transactions.html | 10 + frappe/hooks.py | 5 +- frappe/integrations/github_event_handler.py | 81 +++ frappe/modules.txt | 2 +- frappe/public/build.json | 2 +- frappe/public/js/frappe/misc/user.js | 6 +- .../public/js/frappe/ui/toolbar/navbar.html | 20 +- frappe/public/less/avatar.less | 2 +- frappe/public/less/common.less | 6 +- frappe/public/less/flex.less | 4 + frappe/public/less/social.less | 2 +- frappe/public/less/variables.less | 1 + frappe/social/doctype/badge/__init__.py | 0 frappe/social/doctype/badge/badge.js | 8 + frappe/social/doctype/badge/badge.json | 191 ++++++ frappe/social/doctype/badge/badge.py | 10 + .../doctype/energy_point_log/__init__.py | 0 .../energy_point_log/energy_point_log.js | 8 + .../energy_point_log/energy_point_log.json | 226 +++++++ .../energy_point_log/energy_point_log.py | 79 +++ .../doctype/energy_point_rule/__init__.py | 0 .../energy_point_rule/energy_point_rule.js | 8 + .../energy_point_rule/energy_point_rule.json | 226 +++++++ .../energy_point_rule/energy_point_rule.py | 10 + frappe/social/doctype/post/post.json | 624 +++++++++--------- frappe/social/doctype/post/post.py | 2 +- frappe/social/doctype/user_badge/__init__.py | 0 .../social/doctype/user_badge/user_badge.json | 108 +++ .../social/doctype/user_badge/user_badge.py | 10 + frappe/utils/user.py | 2 +- 37 files changed, 1497 insertions(+), 350 deletions(-) create mode 100644 frappe/core/page/energy_point_history/__init__.py create mode 100644 frappe/core/page/energy_point_history/energy_point_history.js create mode 100644 frappe/core/page/energy_point_history/energy_point_history.json create mode 100644 frappe/core/page/energy_point_history/energy_point_transactions.html create mode 100644 frappe/integrations/github_event_handler.py create mode 100644 frappe/social/doctype/badge/__init__.py create mode 100644 frappe/social/doctype/badge/badge.js create mode 100644 frappe/social/doctype/badge/badge.json create mode 100644 frappe/social/doctype/badge/badge.py create mode 100644 frappe/social/doctype/energy_point_log/__init__.py create mode 100644 frappe/social/doctype/energy_point_log/energy_point_log.js create mode 100644 frappe/social/doctype/energy_point_log/energy_point_log.json create mode 100644 frappe/social/doctype/energy_point_log/energy_point_log.py create mode 100644 frappe/social/doctype/energy_point_rule/__init__.py create mode 100644 frappe/social/doctype/energy_point_rule/energy_point_rule.js create mode 100644 frappe/social/doctype/energy_point_rule/energy_point_rule.json create mode 100644 frappe/social/doctype/energy_point_rule/energy_point_rule.py create mode 100644 frappe/social/doctype/user_badge/__init__.py create mode 100644 frappe/social/doctype/user_badge/user_badge.json create mode 100644 frappe/social/doctype/user_badge/user_badge.py diff --git a/frappe/boot.py b/frappe/boot.py index 05117acb7a..1e99b6bb30 100644 --- a/frappe/boot.py +++ b/frappe/boot.py @@ -195,7 +195,7 @@ def load_translations(bootinfo): def get_fullnames(): """map of user fullnames""" ret = frappe.db.sql("""select `name`, full_name as fullname, - user_image as image, gender, email, username, bio, location, interest, banner_image, allowed_in_mentions + user_image as image, gender, email, username, bio, location, interest, banner_image, allowed_in_mentions, energy_points from tabUser where enabled=1 and user_type!='Website User'""", as_dict=1) d = {} diff --git a/frappe/core/doctype/user/user.js b/frappe/core/doctype/user/user.js index d334731015..d9f87a1db1 100644 --- a/frappe/core/doctype/user/user.js +++ b/frappe/core/doctype/user/user.js @@ -2,7 +2,7 @@ frappe.ui.form.on('User', { before_load: function(frm) { var update_tz_select = function(user_language) { frm.set_df_property("time_zone", "options", [""].concat(frappe.all_timezones)); - } + }; if(!frappe.all_timezones) { frappe.call({ @@ -25,7 +25,7 @@ frappe.ui.form.on('User', { args: { role_profile: frm.doc.role_profile_name }, - callback: function (data) { + callback: function(data) { frm.set_value("roles", []); $.each(data.message || [], function(i, v){ var d = frm.add_child("roles"); @@ -60,6 +60,15 @@ frappe.ui.form.on('User', { frm.reload_doc(); return; } + if (!frm.points) { + frm.points = frm.sidebar.image_section.append(` + + `); + } if(doc.name===frappe.session.user && !doc.__unsaved && frappe.all_timezones && (doc.language || frappe.boot.user.language) @@ -78,7 +87,7 @@ frappe.ui.form.on('User', { "user": doc.name }; frappe.set_route('List', 'User Permission'); - }, __("Permissions")) + }, __("Permissions")); frm.add_custom_button(__('View Permitted Documents'), () => frappe.set_route('query-report', 'Permitted Documents For User', @@ -93,7 +102,7 @@ frappe.ui.form.on('User', { args: { "user": frm.doc.name } - }) + }); }, __("Password")); frm.add_custom_button(__("Reset OTP Secret"), function() { @@ -102,7 +111,7 @@ frappe.ui.form.on('User', { args: { "user": frm.doc.name } - }) + }); }, __("Password")); frm.trigger('enabled'); @@ -130,8 +139,8 @@ frappe.ui.form.on('User', { } if (!found){ frm.add_custom_button(__("Create User Email"), function() { - frm.events.create_user_email(frm) - }) + frm.events.create_user_email(frm); + }); } } @@ -146,7 +155,7 @@ frappe.ui.form.on('User', { }, validate: function(frm) { if(frm.roles_editor) { - frm.roles_editor.set_roles_in_table() + frm.roles_editor.set_roles_in_table(); } }, enabled: function(frm) { @@ -173,18 +182,18 @@ frappe.ui.form.on('User', { "awaiting_password": 1, "enable_incoming": 1 }; - frappe.model.with_doctype("Email Account", function (doc) { + frappe.model.with_doctype("Email Account", function(doc) { var doc = frappe.model.get_new_doc("Email Account"); frappe.route_flags.linked_user = frm.doc.name; frappe.route_flags.delete_user_from_locals = true; frappe.set_route("Form", "Email Account", doc.name); - }) + }); } else { frappe.route_flags.create_user_account = frm.doc.name; frappe.set_route("Form", "Email Account", r.message[0]["name"]); } } - }) + }); }, generate_keys: function(frm){ frappe.call({ @@ -197,9 +206,9 @@ frappe.ui.form.on('User', { frappe.msgprint(__("Save API Secret: ") + r.message.api_secret); } } - }) + }); } -}) +}); function has_access_to_edit_user() { return has_common(frappe.user_roles, get_roles_for_editing_user()); @@ -239,10 +248,14 @@ frappe.ModuleEditor = Class.extend({ var module = $(this).attr('data-module'); if($(this).prop("checked")) { // remove from block_modules - me.frm.doc.block_modules = $.map(me.frm.doc.block_modules || [], function(d) { if(d.module != module){ return d } }); + me.frm.doc.block_modules = $.map(me.frm.doc.block_modules || [], function(d) { + if(d.module != module){ + return d; + } + }); } else { me.frm.add_child("block_modules", {"module": module}); } }); } -}) +}); diff --git a/frappe/core/doctype/user/user.json b/frappe/core/doctype/user/user.json index e96cdf6f36..c565aa562a 100644 --- a/frappe/core/doctype/user/user.json +++ b/frappe/core/doctype/user/user.json @@ -21,6 +21,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "sb0_5", "fieldtype": "Section Break", "hidden": 0, @@ -53,6 +54,7 @@ "collapsible": 0, "columns": 0, "default": "1", + "fetch_if_empty": 0, "fieldname": "enabled", "fieldtype": "Check", "hidden": 0, @@ -87,6 +89,7 @@ "collapsible": 0, "columns": 0, "depends_on": "enabled", + "fetch_if_empty": 0, "fieldname": "section_break_3", "fieldtype": "Section Break", "hidden": 0, @@ -118,6 +121,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "email", "fieldtype": "Data", "hidden": 0, @@ -152,6 +156,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "first_name", "fieldtype": "Data", "hidden": 0, @@ -185,6 +190,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "middle_name", "fieldtype": "Data", "hidden": 0, @@ -218,6 +224,7 @@ "bold": 1, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "last_name", "fieldtype": "Data", "hidden": 0, @@ -251,6 +258,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "full_name", "fieldtype": "Data", "hidden": 0, @@ -285,6 +293,7 @@ "columns": 0, "default": "1", "depends_on": "eval:doc.__islocal", + "fetch_if_empty": 0, "fieldname": "send_welcome_email", "fieldtype": "Check", "hidden": 0, @@ -317,6 +326,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "unsubscribed", "fieldtype": "Check", "hidden": 1, @@ -348,6 +358,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "column_break0", "fieldtype": "Column Break", "hidden": 0, @@ -381,6 +392,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "username", "fieldtype": "Data", "hidden": 0, @@ -414,6 +426,7 @@ "collapsible": 0, "columns": 0, "description": "", + "fetch_if_empty": 0, "fieldname": "language", "fieldtype": "Link", "hidden": 0, @@ -447,6 +460,7 @@ "collapsible": 0, "columns": 0, "description": "", + "fetch_if_empty": 0, "fieldname": "time_zone", "fieldtype": "Select", "hidden": 0, @@ -479,6 +493,7 @@ "collapsible": 0, "columns": 0, "description": "Get your globally recognized avatar from Gravatar.com", + "fetch_if_empty": 0, "fieldname": "user_image", "fieldtype": "Attach Image", "hidden": 1, @@ -512,6 +527,7 @@ "columns": 0, "depends_on": "enabled", "description": "", + "fetch_if_empty": 0, "fieldname": "sb1", "fieldtype": "Section Break", "hidden": 0, @@ -543,6 +559,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "role_profile_name", "fieldtype": "Link", "hidden": 0, @@ -576,6 +593,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "roles_html", "fieldtype": "HTML", "hidden": 0, @@ -607,6 +625,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "roles", "fieldtype": "Table", "hidden": 1, @@ -641,6 +660,7 @@ "collapsible": 1, "columns": 0, "depends_on": "enabled", + "fetch_if_empty": 0, "fieldname": "short_bio", "fieldtype": "Section Break", "hidden": 0, @@ -672,6 +692,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "gender", "fieldtype": "Link", "hidden": 0, @@ -706,6 +727,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "phone", "fieldtype": "Data", "hidden": 0, @@ -738,6 +760,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "mobile_no", "fieldtype": "Data", "hidden": 0, @@ -770,6 +793,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "birth_date", "fieldtype": "Date", "hidden": 0, @@ -803,6 +827,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "location", "fieldtype": "Data", "hidden": 0, @@ -834,6 +859,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "banner_image", "fieldtype": "Attach Image", "hidden": 0, @@ -866,6 +892,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "column_break_22", "fieldtype": "Column Break", "hidden": 0, @@ -896,6 +923,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "interest", "fieldtype": "Small Text", "hidden": 0, @@ -928,6 +956,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "bio", "fieldtype": "Small Text", "hidden": 0, @@ -959,6 +988,40 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, + "fieldname": "energy_points", + "fieldtype": "Int", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Energy Points", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fetch_if_empty": 0, "fieldname": "mute_sounds", "fieldtype": "Check", "hidden": 0, @@ -992,6 +1055,7 @@ "collapsible": 1, "columns": 0, "depends_on": "eval:doc.enabled && (!doc.__islocal || !cint(doc.send_welcome_email))", + "fetch_if_empty": 0, "fieldname": "change_password", "fieldtype": "Section Break", "hidden": 0, @@ -1023,6 +1087,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "new_password", "fieldtype": "Password", "hidden": 0, @@ -1055,6 +1120,7 @@ "collapsible": 0, "columns": 0, "depends_on": "eval:!doc.__islocal", + "fetch_if_empty": 0, "fieldname": "send_password_update_notification", "fieldtype": "Check", "hidden": 0, @@ -1088,6 +1154,7 @@ "collapsible": 0, "columns": 0, "default": "0", + "fetch_if_empty": 0, "fieldname": "logout_all_sessions", "fieldtype": "Check", "hidden": 0, @@ -1120,6 +1187,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "reset_password_key", "fieldtype": "Data", "hidden": 1, @@ -1151,6 +1219,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "redirect_url", "fieldtype": "Small Text", "hidden": 1, @@ -1184,6 +1253,7 @@ "collapsible": 1, "columns": 0, "depends_on": "", + "fetch_if_empty": 0, "fieldname": "document_follow_notifications_section", "fieldtype": "Section Break", "hidden": 0, @@ -1216,6 +1286,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "document_follow_notify", "fieldtype": "Check", "hidden": 0, @@ -1251,6 +1322,7 @@ "columns": 0, "default": "Daily", "depends_on": "eval:(doc.document_follow_notify== 1)", + "fetch_if_empty": 0, "fieldname": "document_follow_frequency", "fieldtype": "Select", "hidden": 0, @@ -1285,6 +1357,7 @@ "collapsible": 1, "columns": 0, "depends_on": "enabled", + "fetch_if_empty": 0, "fieldname": "email_settings", "fieldtype": "Section Break", "hidden": 0, @@ -1318,6 +1391,7 @@ "collapsible": 0, "columns": 0, "default": "1", + "fetch_if_empty": 0, "fieldname": "thread_notify", "fieldtype": "Check", "hidden": 0, @@ -1350,6 +1424,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "send_me_a_copy", "fieldtype": "Check", "hidden": 0, @@ -1383,6 +1458,7 @@ "collapsible": 0, "columns": 0, "default": "1", + "fetch_if_empty": 0, "fieldname": "allowed_in_mentions", "fieldtype": "Check", "hidden": 0, @@ -1415,6 +1491,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "email_signature", "fieldtype": "Small Text", "hidden": 0, @@ -1446,6 +1523,7 @@ "bold": 0, "collapsible": 1, "columns": 0, + "fetch_if_empty": 0, "fieldname": "email_inbox", "fieldtype": "Section Break", "hidden": 0, @@ -1479,6 +1557,7 @@ "collapsible": 0, "columns": 0, "description": "", + "fetch_if_empty": 0, "fieldname": "user_emails", "fieldtype": "Table", "hidden": 0, @@ -1513,6 +1592,7 @@ "collapsible": 1, "columns": 0, "depends_on": "enabled", + "fetch_if_empty": 0, "fieldname": "background", "fieldtype": "Section Break", "hidden": 0, @@ -1545,6 +1625,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "background_image", "fieldtype": "Attach", "hidden": 0, @@ -1577,6 +1658,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "background_style", "fieldtype": "Select", "hidden": 0, @@ -1612,6 +1694,7 @@ "columns": 0, "default": "", "description": "", + "fetch_if_empty": 0, "fieldname": "sb_allow_modules", "fieldtype": "Section Break", "hidden": 0, @@ -1644,6 +1727,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "modules_html", "fieldtype": "HTML", "hidden": 0, @@ -1676,6 +1760,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "block_modules", "fieldtype": "Table", "hidden": 1, @@ -1710,6 +1795,7 @@ "collapsible": 0, "columns": 0, "default": "", + "fetch_if_empty": 0, "fieldname": "home_settings", "fieldtype": "Code", "hidden": 0, @@ -1743,6 +1829,7 @@ "collapsible": 0, "columns": 0, "description": "These values will be automatically updated in transactions and also will be useful to restrict permissions for this user on transactions containing these values.", + "fetch_if_empty": 0, "fieldname": "sb2", "fieldtype": "Section Break", "hidden": 1, @@ -1778,6 +1865,7 @@ "collapsible": 0, "columns": 0, "description": "Enter default value fields (keys) and values. If you add multiple values for a field, the first one will be picked. These defaults are also used to set \"match\" permission rules. To see list of fields, go to \"Customize Form\".", + "fetch_if_empty": 0, "fieldname": "defaults", "fieldtype": "Table", "hidden": 1, @@ -1811,6 +1899,7 @@ "collapsible": 1, "columns": 0, "depends_on": "enabled", + "fetch_if_empty": 0, "fieldname": "sb3", "fieldtype": "Section Break", "hidden": 0, @@ -1844,6 +1933,7 @@ "collapsible": 0, "columns": 0, "default": "1", + "fetch_if_empty": 0, "fieldname": "simultaneous_sessions", "fieldtype": "Int", "hidden": 0, @@ -1878,6 +1968,7 @@ "columns": 0, "default": "System User", "description": "If the user has any role checked, then the user becomes a \"System User\". \"System User\" has access to the desktop", + "fetch_if_empty": 0, "fieldname": "user_type", "fieldtype": "Select", "hidden": 0, @@ -1913,6 +2004,7 @@ "collapsible": 0, "columns": 0, "description": "Allow user to login only after this hour (0-24)", + "fetch_if_empty": 0, "fieldname": "login_after", "fieldtype": "Int", "hidden": 0, @@ -1945,6 +2037,7 @@ "collapsible": 0, "columns": 0, "description": "Allow user to login only before this hour (0-24)", + "fetch_if_empty": 0, "fieldname": "login_before", "fieldtype": "Int", "hidden": 0, @@ -1977,6 +2070,7 @@ "collapsible": 0, "columns": 0, "description": "Restrict user from this IP address only. Multiple IP addresses can be added by separating with commas. Also accepts partial IP addresses like (111.111.111)", + "fetch_if_empty": 0, "fieldname": "restrict_ip", "fieldtype": "Data", "hidden": 0, @@ -2010,6 +2104,7 @@ "columns": 0, "depends_on": "eval:doc.restrict_ip && doc.restrict_ip.length", "description": "If enabled, user can login from any IP Address using Two Factor Auth, this can also be set for all users in System Settings", + "fetch_if_empty": 0, "fieldname": "bypass_restrict_ip_check_if_2fa_enabled", "fieldtype": "Check", "hidden": 0, @@ -2042,6 +2137,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "column_break1", "fieldtype": "Column Break", "hidden": 0, @@ -2075,6 +2171,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "last_login", "fieldtype": "Read Only", "hidden": 0, @@ -2108,6 +2205,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "last_ip", "fieldtype": "Read Only", "hidden": 0, @@ -2141,6 +2239,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "last_active", "fieldtype": "Datetime", "hidden": 0, @@ -2174,6 +2273,7 @@ "collapsible": 0, "columns": 0, "description": "Stores the JSON of last known versions of various installed apps. It is used to show release notes.", + "fetch_if_empty": 0, "fieldname": "last_known_versions", "fieldtype": "Text", "hidden": 1, @@ -2207,6 +2307,7 @@ "collapsible": 1, "columns": 0, "depends_on": "enabled", + "fetch_if_empty": 0, "fieldname": "third_party_authentication", "fieldtype": "Section Break", "hidden": 0, @@ -2238,6 +2339,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "social_logins", "fieldtype": "Table", "hidden": 0, @@ -2271,6 +2373,7 @@ "bold": 0, "collapsible": 1, "columns": 0, + "fetch_if_empty": 0, "fieldname": "api_access", "fieldtype": "Section Break", "hidden": 0, @@ -2304,6 +2407,7 @@ "collapsible": 0, "columns": 0, "description": "API Key cannot be regenerated", + "fetch_if_empty": 0, "fieldname": "api_key", "fieldtype": "Data", "hidden": 0, @@ -2336,6 +2440,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "generate_keys", "fieldtype": "Button", "hidden": 0, @@ -2368,6 +2473,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "column_break_65", "fieldtype": "Column Break", "hidden": 0, @@ -2399,6 +2505,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "api_secret", "fieldtype": "Password", "hidden": 0, @@ -2437,7 +2544,8 @@ "issingle": 0, "istable": 0, "max_attachments": 5, - "modified": "2019-03-03 11:10:06.162541", + "menu_index": 0, + "modified": "2019-03-19 10:52:33.592908", "modified_by": "Administrator", "module": "Core", "name": "User", diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py index 17b88ffe13..9d0ea7436d 100644 --- a/frappe/core/doctype/user/user.py +++ b/frappe/core/doctype/user/user.py @@ -1082,4 +1082,4 @@ def generate_keys(user): user_details.save() return {"api_secret": api_secret} - frappe.throw(frappe._("Not Permitted"), frappe.PermissionError) + frappe.throw(frappe._("Not Permitted"), frappe.PermissionError) \ No newline at end of file diff --git a/frappe/core/page/energy_point_history/__init__.py b/frappe/core/page/energy_point_history/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/frappe/core/page/energy_point_history/energy_point_history.js b/frappe/core/page/energy_point_history/energy_point_history.js new file mode 100644 index 0000000000..cb53cef9e4 --- /dev/null +++ b/frappe/core/page/energy_point_history/energy_point_history.js @@ -0,0 +1,19 @@ +frappe.pages['energy-point-history'].on_page_load = function(wrapper) { + const page = frappe.ui.make_app_page({ + parent: wrapper, + title: 'Transaction', + single_column: true, + btn_primary: console.log + + }); + console.log(page); + frappe.db.get_list('Energy Point Log', { + filters: { user: frappe.session.user }, + fields: ['point', 'reason'] + }) + .then((data) => { + console.log(data); + $(frappe.render_template('energy_point_transactions', {data: data})) + .appendTo(page.body); + }) +} \ No newline at end of file diff --git a/frappe/core/page/energy_point_history/energy_point_history.json b/frappe/core/page/energy_point_history/energy_point_history.json new file mode 100644 index 0000000000..350feba8f4 --- /dev/null +++ b/frappe/core/page/energy_point_history/energy_point_history.json @@ -0,0 +1,18 @@ +{ + "content": null, + "creation": "2018-08-06 12:43:28.480030", + "docstatus": 0, + "doctype": "Page", + "idx": 0, + "modified": "2018-08-06 12:43:28.480030", + "modified_by": "Administrator", + "module": "Core", + "name": "energy-point-history", + "owner": "Administrator", + "page_name": "Energy Point History", + "roles": [], + "script": null, + "standard": "Yes", + "style": null, + "system_page": 1 +} \ No newline at end of file diff --git a/frappe/core/page/energy_point_history/energy_point_transactions.html b/frappe/core/page/energy_point_history/energy_point_transactions.html new file mode 100644 index 0000000000..90466ce8b8 --- /dev/null +++ b/frappe/core/page/energy_point_history/energy_point_transactions.html @@ -0,0 +1,10 @@ +
+ +
\ No newline at end of file diff --git a/frappe/hooks.py b/frappe/hooks.py index 6301c51f6a..0ef32601b4 100644 --- a/frappe/hooks.py +++ b/frappe/hooks.py @@ -130,12 +130,15 @@ doc_events = { ], "on_change": [ "frappe.core.doctype.feedback_trigger.feedback_trigger.trigger_feedback_request", + "frappe.social.doctype.energy_point_log.energy_point_log.update_log" ] }, "Email Group Member": { "validate": "frappe.email.doctype.email_group.email_group.restrict_email_group" }, - + "Energy Point Log": { + "after_insert": "frappe.social.doctype.energy_point_log.energy_point_log.update_user_energy_points" + }, } scheduler_events = { diff --git a/frappe/integrations/github_event_handler.py b/frappe/integrations/github_event_handler.py new file mode 100644 index 0000000000..052ccecdf8 --- /dev/null +++ b/frappe/integrations/github_event_handler.py @@ -0,0 +1,81 @@ +# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors +# MIT License. See license.txt + +from __future__ import unicode_literals +import json +import frappe +import frappe.utils +from frappe.social.doctype.energy_point_log.energy_point_log import ENERGY_POINT_VALUES, create_energy_point_log + + +@frappe.whitelist(allow_guest=True) +def handle_event(*args, **kwargs): + r = frappe.request + event_type = r.headers.get('X-Github-Event') + payload = json.loads(r.get_data()) + if event_type == 'pull_request': + process_pull_request(payload) + if event_type == 'pull_request_review': + process_pull_request(payload) + elif event_type == 'issues': + process_issues(payload) + return True + +def process_pull_request(payload): + action = payload.get('action') + data = payload.get('pull_request') + user_github_id = data['user']['login'] + if not is_local_user(user_github_id): return + if action == 'closed' and data['merged']: + process_merged_pull_request(data) + if action == 'submitted': + process_pull_request_review(data) + +def process_issues(payload): + action = payload.get('action') + data = payload.get('issue') + user_github_id = data['user']['login'] + if not is_local_user(user_github_id): return + if action == 'opened': + create_energy_point_log( + ENERGY_POINT_VALUES['github_issue_open'], + 'Opened Issue: {}'.format(data['title']), + None, + None, + get_user_name(data['user']['login']) + ) + if action == 'closed': + create_energy_point_log( + ENERGY_POINT_VALUES['github_issue_close'], + 'Closed Issue: {}'.format(data['title']), + None, + None, + get_user_name(data['user']['login']) + ) + +def process_merged_pull_request(data): + create_energy_point_log( + ENERGY_POINT_VALUES['github_pull_request_merge'], + 'Pull Request Merged: {}'.format(data['title']), + None, + None, + get_user_name(data['user']['login']) + ) + +def process_pull_request_review(data): + create_energy_point_log( + ENERGY_POINT_VALUES['github_pull_request_review_submit'], + 'Reviewed Pull Request: {}'.format(data['title']), + None, + None, + get_user_name(data['user']['login']) + ) + + +def is_local_user(github_id): + return frappe.db.count('Social Profile', {'github_id': github_id}) + +def get_user_name(github_id): + return frappe.get_value('Social Profile', filters={ + 'github_id': github_id + }, fieldname='name') diff --git a/frappe/modules.txt b/frappe/modules.txt index 3a9ea8f05e..6505174327 100644 --- a/frappe/modules.txt +++ b/frappe/modules.txt @@ -11,4 +11,4 @@ Contacts Data Migration Chat Social -Automation \ No newline at end of file +Automation diff --git a/frappe/public/build.json b/frappe/public/build.json index 73a9fae189..f2285fd4aa 100755 --- a/frappe/public/build.json +++ b/frappe/public/build.json @@ -264,8 +264,8 @@ "public/less/form_grid.less" ], "js/form.min.js": [ - "public/js/frappe/form/templates/print_layout.html", "public/js/frappe/form/document_follow.js", + "public/js/frappe/form/templates/print_layout.html", "public/js/frappe/form/templates/users_in_sidebar.html", "public/js/frappe/form/templates/set_sharing.html", "public/js/frappe/form/templates/form_sidebar.html", diff --git a/frappe/public/js/frappe/misc/user.js b/frappe/public/js/frappe/misc/user.js index 15e91a82c5..311f208750 100644 --- a/frappe/public/js/frappe/misc/user.js +++ b/frappe/public/js/frappe/misc/user.js @@ -9,7 +9,7 @@ frappe.user_info = function(uid) { fullname: __("Bot"), image: "/assets/frappe/images/ui/bot.png", abbr: "B" - } + }; } if(!(frappe.boot.user_info && frappe.boot.user_info[uid])) { @@ -24,7 +24,7 @@ frappe.user_info = function(uid) { user_info.color = frappe.get_palette(user_info.fullname); return user_info; -} +}; frappe.ui.set_user_background = function(src, selector, style) { if(!selector) selector = "#page-desktop"; @@ -47,7 +47,7 @@ frappe.ui.set_user_background = function(src, selector, style) { background:background, style: style==="Fill Screen" ? "background-size: cover;" : "" })); -} +}; frappe.provide('frappe.user'); diff --git a/frappe/public/js/frappe/ui/toolbar/navbar.html b/frappe/public/js/frappe/ui/toolbar/navbar.html index ea6691a7a3..0f7df81088 100644 --- a/frappe/public/js/frappe/ui/toolbar/navbar.html +++ b/frappe/public/js/frappe/ui/toolbar/navbar.html @@ -20,15 +20,17 @@ {{ avatar }} - + +
- {{ __('All Users') }} + {{ __('Leaderboard') }}
diff --git a/frappe/public/js/frappe/social/pages/UserList.vue b/frappe/public/js/frappe/social/pages/UserList.vue index 5cdf1142e7..fbe6b836a8 100644 --- a/frappe/public/js/frappe/social/pages/UserList.vue +++ b/frappe/public/js/frappe/social/pages/UserList.vue @@ -1,29 +1,45 @@ - diff --git a/frappe/public/js/frappe/views/components/Desktop.vue b/frappe/public/js/frappe/views/components/Desktop.vue index 74d3cc6622..240f3511a8 100644 --- a/frappe/public/js/frappe/views/components/Desktop.vue +++ b/frappe/public/js/frappe/views/components/Desktop.vue @@ -1,24 +1,30 @@ + \ No newline at end of file diff --git a/frappe/public/js/frappe/social/pages/UserList.vue b/frappe/public/js/frappe/social/pages/UserList.vue index 17154542d0..c935d7e830 100644 --- a/frappe/public/js/frappe/social/pages/UserList.vue +++ b/frappe/public/js/frappe/social/pages/UserList.vue @@ -16,40 +16,52 @@
  • -
    - -
    -
    {{ user.fullname }}
    -
    - {{ frappe.ellipsis(user.bio, 100) || 'No Bio'}} -
    + v-for="user in filtered_users" + :key="user.name" + @click="toggle_log(user.name)"> +
    +
    + + + {{ user.fullname }} +
    + {{ frappe.ellipsis(user.bio, 100) || 'No Bio'}} +
    +
    + + {{ user.energy_points }} + + + {{ user.review_points }} + + + {{ user.given_points }} +
    - - {{ user.energy_points }} - - - {{ user.review_points }} - - - {{ user.given_points }} - + +
  • -
  • {{__('No user found')}}
  • +
  • {{__('No user found')}}
  • From 872b867d63cd858c6d6c5c591f01aed1a78ac630 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Fri, 5 Apr 2019 12:59:38 +0530 Subject: [PATCH 227/256] refactor: Use commonified code for formatted log --- .../social/components/EnergyPointHistory.vue | 23 +------------------ 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/frappe/public/js/frappe/social/components/EnergyPointHistory.vue b/frappe/public/js/frappe/social/components/EnergyPointHistory.vue index 6d15e30633..aae03b6b09 100644 --- a/frappe/public/js/frappe/social/components/EnergyPointHistory.vue +++ b/frappe/public/js/frappe/social/components/EnergyPointHistory.vue @@ -2,10 +2,7 @@
    • - - -  -  - +
    • {{__('No logs found')}} @@ -32,19 +29,6 @@ export default { this.history_logs = data; }) }, - methods: { - log_body(log) { - const doc_link = frappe.utils.get_form_link(log.reference_doctype, log.reference_name, true) - const owner_name = frappe.user.full_name(log.owner).bold(); - if (log.type === 'Appreciation') { - return __('{0} appreciated on {1}', [owner_name, doc_link]) - } - if (log.type === 'Criticism') { - return __('{0} criticized on {1}', [owner_name, doc_link]) - } - return __('via automatic rule {0} for {1}', [log.rule.bold(), doc_link]) - } - } } @@ -71,11 +55,6 @@ export default { padding: 10px; padding-left: 50px; display: flex; - span:nth-child(1) { - width: 40px; - text-align: right; - margin-right: 10px; - } position: relative; } .history-log:before { From 48e16de859b8f64af9bfe3e32bd4903767a712ba Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Fri, 5 Apr 2019 13:00:05 +0530 Subject: [PATCH 228/256] fix: Return review doc on new review creation --- frappe/social/doctype/energy_point_log/energy_point_log.py | 2 ++ 1 file changed, 2 insertions(+) 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 b8d5ef4642..2f2e40e135 100644 --- a/frappe/social/doctype/energy_point_log/energy_point_log.py +++ b/frappe/social/doctype/energy_point_log/energy_point_log.py @@ -134,6 +134,8 @@ def review(doc, points, to_user, reason, review_type='Appreciation'): docname=review_doc.name ) + return review_doc + @frappe.whitelist() def get_reviews(doctype, docname): return frappe.get_all('Energy Point Log', filters={ From 0e077dbfa82ec8b508bebd1eb7d2d4431f93a257 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Fri, 5 Apr 2019 13:03:13 +0530 Subject: [PATCH 229/256] fix: Set with_timestamp=false by default --- frappe/public/js/frappe/misc/energy_point_utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/misc/energy_point_utils.js b/frappe/public/js/frappe/misc/energy_point_utils.js index 46afc9b412..4bf2b3b8f6 100644 --- a/frappe/public/js/frappe/misc/energy_point_utils.js +++ b/frappe/public/js/frappe/misc/energy_point_utils.js @@ -20,7 +20,7 @@ Object.assign(frappe.energy_points, { } return __('via automatic rule {0} for {1}', [log.rule.bold(), doc_link]); }, - format_log(log, with_timestamp=true) { + format_log(log, with_timestamp=false) { let formatted_log = ` ${this.get_points(log.points)} ${this.log_message(log)} ${ with_timestamp ? ' - ' + frappe.datetime.comment_when(log.creation):''} From 5599634927780d9db835efccdffb75703a24a3b7 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Fri, 5 Apr 2019 13:14:49 +0530 Subject: [PATCH 230/256] fix(ux): assign box --- frappe/public/js/frappe/form/footer/assign_to.js | 7 +++++-- frappe/public/js/frappe/ui/dialog.js | 5 +++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/frappe/public/js/frappe/form/footer/assign_to.js b/frappe/public/js/frappe/form/footer/assign_to.js index 95ddebcc99..147ed7731e 100644 --- a/frappe/public/js/frappe/form/footer/assign_to.js +++ b/frappe/public/js/frappe/form/footer/assign_to.js @@ -185,6 +185,7 @@ frappe.ui.add_assignment = function(opts, dialog) { var assign_to = dialog.fields_dict.assign_to.get_value(); var args = dialog.get_values(); if(args && assign_to) { + dialog.set_message('Assigning...'); return frappe.call({ method: opts.method, args: $.extend(args, { @@ -194,15 +195,17 @@ frappe.ui.add_assignment = function(opts, dialog) { bulk_assign: opts.bulk_assign || false, re_assign: opts.re_assign || false }), - callback: function(r,rt) { + btn: dialog.get_primary_btn(), + callback: function(r) { if(!r.exc) { if(opts.callback){ opts.callback(r); } dialog && dialog.hide(); + } else { + dialog.clear_message(); } }, - btn: this }); } } diff --git a/frappe/public/js/frappe/ui/dialog.js b/frappe/public/js/frappe/ui/dialog.js index 0a08c5f0ec..a09c62af32 100644 --- a/frappe/public/js/frappe/ui/dialog.js +++ b/frappe/public/js/frappe/ui/dialog.js @@ -112,6 +112,11 @@ frappe.ui.Dialog = class Dialog extends frappe.ui.FieldGroup { this.$body.removeClass('hide'); } + clear() { + super(); + this.clear_message(); + } + set_primary_action(label, click) { this.has_primary_action = true; var me = this; From 14f63830adb6d5f4fff51769eb7dccce6f49c9e9 Mon Sep 17 00:00:00 2001 From: Himanshu Date: Fri, 5 Apr 2019 13:29:07 +0530 Subject: [PATCH 231/256] fix: test case --- .../addresses_and_contacts/test_addresses_and_contacts.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/contacts/report/addresses_and_contacts/test_addresses_and_contacts.py b/frappe/contacts/report/addresses_and_contacts/test_addresses_and_contacts.py index 4e76256342..7a21645a82 100644 --- a/frappe/contacts/report/addresses_and_contacts/test_addresses_and_contacts.py +++ b/frappe/contacts/report/addresses_and_contacts/test_addresses_and_contacts.py @@ -94,7 +94,7 @@ def create_linked_contact(link_list): class TestAddressesAndContacts(unittest.TestCase): def test_get_data(self): - linked_docs = [get_custom_doc_for_address_and_contacts()] + linked_docs = get_custom_doc_for_address_and_contacts() links_list = [item.name for item in linked_docs] create_linked_contact(links_list) create_linked_address(links_list) @@ -104,4 +104,4 @@ class TestAddressesAndContacts(unittest.TestCase): self.assertIn(test_item, report_data) def tearDown(self): - frappe.db.rollback() \ No newline at end of file + frappe.db.rollback() From 0fcececd9fddfaa79399a3fd5e849b589dbddfef Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Fri, 5 Apr 2019 13:54:23 +0530 Subject: [PATCH 232/256] fix: Remove Administrator from involved users --- frappe/public/js/frappe/form/review.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/form/review.js b/frappe/public/js/frappe/form/review.js index 8fed9d33ba..c484b78340 100644 --- a/frappe/public/js/frappe/form/review.js +++ b/frappe/public/js/frappe/form/review.js @@ -75,7 +75,7 @@ frappe.ui.form.Review = class Review { return involved_users .uniqBy(u => u) - .filter(user => user !== frappe.session.user) + .filter(user => !['Administrator', frappe.session.user].includes(user)) .filter(Boolean); } show_review_dialog() { From 44da34b4b4ce1e1b522234eb39a086fca1620db9 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Fri, 5 Apr 2019 14:11:51 +0530 Subject: [PATCH 233/256] feat: Show Indicator for with energy point alert --- .../energy_point_log/energy_point_log.py | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) 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 2f2e40e135..34f1013aee 100644 --- a/frappe/social/doctype/energy_point_log/energy_point_log.py +++ b/frappe/social/doctype/energy_point_log/energy_point_log.py @@ -15,33 +15,40 @@ class EnergyPointLog(Document): frappe.throw(_('You cannot give review points to yourself')) def after_insert(self): - message = get_alert_message(self) - if message: - frappe.publish_realtime('energy_point_alert', message=message, user=self.user) + alert_dict = get_alert_dict(self) + if alert_dict: + frappe.publish_realtime('energy_point_alert', message=alert_dict, user=self.user) frappe.cache().hdel('energy_points', self.user) frappe.publish_realtime('update_points') -def get_alert_message(doc): - message = '' +def get_alert_dict(doc): + alert_dict = frappe._dict({ + 'message': '', + 'indicator': 'green' + }) owner_name = get_fullname(doc.owner) doc_link = frappe.get_desk_link(doc.reference_doctype, doc.reference_name) points = frappe.bold(doc.points) if doc.type == 'Auto': - message=_('You gained {} points').format(points) + alert_dict.message=_('You gained {} points').format(points) elif doc.type == 'Appreciation': - message = _('{} appreciated your work on {} with {} points'.format( + alert_dict.message = _('{} appreciated your work on {} with {} points'.format( owner_name, doc_link, points )) elif doc.type == 'Criticism': - message = _('{} criticized your work on {} with {} points'.format( + alert_dict.message = _('{} criticized your work on {} with {} points'.format( owner_name, doc_link, points )) - return message + alert_dict.indicator = 'red' + else: + alert_dict = {} + + return alert_dict def create_energy_points_log(ref_doctype, ref_name, doc): doc = frappe._dict(doc) From 9633b4fb0026e348f29c5b20e97c8af1048cdad8 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Fri, 5 Apr 2019 14:47:57 +0530 Subject: [PATCH 234/256] fix: Modify log message --- frappe/public/js/frappe/misc/energy_point_utils.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/frappe/public/js/frappe/misc/energy_point_utils.js b/frappe/public/js/frappe/misc/energy_point_utils.js index 4bf2b3b8f6..cdee77a2ed 100644 --- a/frappe/public/js/frappe/misc/energy_point_utils.js +++ b/frappe/public/js/frappe/misc/energy_point_utils.js @@ -12,13 +12,14 @@ Object.assign(frappe.energy_points, { log_message(log) { const doc_link = frappe.utils.get_form_link(log.reference_doctype, log.reference_name, true); const owner_name = frappe.user.full_name(log.owner).bold(); + const user = frappe.user.full_name(log.user).bold(); if (log.type === 'Appreciation') { - return __('{0} appreciated on {1}', [owner_name, doc_link]); + return __('{0} appreciated {1} on {2}', [owner_name, user, doc_link]); } if (log.type === 'Criticism') { - return __('{0} criticized on {1}', [owner_name, doc_link]); + return __('{0} criticized {1} on {2}', [owner_name, user, doc_link]); } - return __('via automatic rule {0} for {1}', [log.rule.bold(), doc_link]); + return __('for {0} via automatic rule {1} on {2}', [user, log.rule.bold(), doc_link]); }, format_log(log, with_timestamp=false) { let formatted_log = ` From 1b4550c5033a88e7ff575b324ee75cb916b0935a Mon Sep 17 00:00:00 2001 From: Himanshu Warekar Date: Fri, 5 Apr 2019 15:05:09 +0530 Subject: [PATCH 235/256] fix: test case --- .../addresses_and_contacts/test_addresses_and_contacts.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/contacts/report/addresses_and_contacts/test_addresses_and_contacts.py b/frappe/contacts/report/addresses_and_contacts/test_addresses_and_contacts.py index 7a21645a82..c7637ce202 100644 --- a/frappe/contacts/report/addresses_and_contacts/test_addresses_and_contacts.py +++ b/frappe/contacts/report/addresses_and_contacts/test_addresses_and_contacts.py @@ -94,7 +94,7 @@ def create_linked_contact(link_list): class TestAddressesAndContacts(unittest.TestCase): def test_get_data(self): - linked_docs = get_custom_doc_for_address_and_contacts() + linked_docs = [get_custom_doc_for_address_and_contacts()] links_list = [item.name for item in linked_docs] create_linked_contact(links_list) create_linked_address(links_list) From f06fa603d7031df87386e265aaba40ab53342239 Mon Sep 17 00:00:00 2001 From: Himanshu Warekar Date: Fri, 5 Apr 2019 15:22:55 +0530 Subject: [PATCH 236/256] fix: test case --- .../addresses_and_contacts/test_addresses_and_contacts.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/contacts/report/addresses_and_contacts/test_addresses_and_contacts.py b/frappe/contacts/report/addresses_and_contacts/test_addresses_and_contacts.py index c7637ce202..a016a46a7e 100644 --- a/frappe/contacts/report/addresses_and_contacts/test_addresses_and_contacts.py +++ b/frappe/contacts/report/addresses_and_contacts/test_addresses_and_contacts.py @@ -101,7 +101,7 @@ class TestAddressesAndContacts(unittest.TestCase): report_data = get_data({"reference_doctype": "Test Custom Doctype"}) for link in links_list: test_item = [link, 'test address line 1', 'test address line 2', 'Milan', None, None, 'Italy', 0, '_Test First Name', '_Test Last Name', '+91 0000000000', None, 'test_contact@example.com', 1] - self.assertIn(test_item, report_data) + self.assertEquals(test_item, report_data) def tearDown(self): frappe.db.rollback() From 422a1e151b7e81d4fbf96356713097c26636b239 Mon Sep 17 00:00:00 2001 From: Himanshu Warekar Date: Fri, 5 Apr 2019 16:00:16 +0530 Subject: [PATCH 237/256] fix: test cases using assertListEqual --- .../addresses_and_contacts/test_addresses_and_contacts.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/contacts/report/addresses_and_contacts/test_addresses_and_contacts.py b/frappe/contacts/report/addresses_and_contacts/test_addresses_and_contacts.py index a016a46a7e..e315019ca7 100644 --- a/frappe/contacts/report/addresses_and_contacts/test_addresses_and_contacts.py +++ b/frappe/contacts/report/addresses_and_contacts/test_addresses_and_contacts.py @@ -99,9 +99,9 @@ class TestAddressesAndContacts(unittest.TestCase): create_linked_contact(links_list) create_linked_address(links_list) report_data = get_data({"reference_doctype": "Test Custom Doctype"}) - for link in links_list: + for idx, link in enumerate(links_list): test_item = [link, 'test address line 1', 'test address line 2', 'Milan', None, None, 'Italy', 0, '_Test First Name', '_Test Last Name', '+91 0000000000', None, 'test_contact@example.com', 1] - self.assertEquals(test_item, report_data) + self.assertListEqual(test_item, report_data[idx]) def tearDown(self): frappe.db.rollback() From 1972ff2375d6981206e625f811af2f3041bdcfa5 Mon Sep 17 00:00:00 2001 From: Saurabh Date: Fri, 5 Apr 2019 17:09:04 +0600 Subject: [PATCH 238/256] bumped to version 11.1.19 --- frappe/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/__init__.py b/frappe/__init__.py index 11263a831e..913f6440ff 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -24,7 +24,7 @@ if sys.version[0] == '2': reload(sys) sys.setdefaultencoding("utf-8") -__version__ = '11.1.18' +__version__ = '11.1.19' __title__ = "Frappe Framework" local = Local() From 7e8fc8f69e1fd7c2b2f4ae04768de36f3de5f2b7 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Fri, 5 Apr 2019 19:16:15 +0530 Subject: [PATCH 239/256] fix: Skip review logs - while adding to enegy point logs to docinfo --- frappe/desk/form/load.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frappe/desk/form/load.py b/frappe/desk/form/load.py index 56f15da39d..3107c97895 100644 --- a/frappe/desk/form/load.py +++ b/frappe/desk/form/load.py @@ -140,7 +140,8 @@ def get_comments(doctype, name): def get_point_logs(doctype, docname): return frappe.db.get_all('Energy Point Log', filters={ 'reference_doctype': doctype, - 'reference_name': docname + 'reference_name': docname, + 'type': ['!=', 'Review'] }, fields=['*']) def _get_communications(doctype, name, start=0, limit=20): From e8cd9dc4c60cfbbe5a267fa0ef74ef4ea4ebff20 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Fri, 5 Apr 2019 19:42:16 +0530 Subject: [PATCH 240/256] fix: Include only appreciation and criticism logs for review pills --- frappe/public/js/frappe/form/review.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/form/review.js b/frappe/public/js/frappe/form/review.js index c484b78340..1799cd68b5 100644 --- a/frappe/public/js/frappe/form/review.js +++ b/frappe/public/js/frappe/form/review.js @@ -140,7 +140,7 @@ frappe.ui.form.Review = class Review { } update_reviewers() { const review_logs = this.frm.get_docinfo().energy_point_logs - .filter(log => log.type !== 'Auto'); + .filter(log => ['Appreciation', 'Criticism'].includes(log.type)); this.review_list_wrapper.find('.review-pill').remove(); review_logs.forEach(log => { From 950ce155f733bc064c7ace57a7dccd153aa6499b Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Fri, 5 Apr 2019 19:46:43 +0530 Subject: [PATCH 241/256] fix: format energy point log for history and form separately --- .../public/js/frappe/form/footer/timeline.js | 2 +- .../js/frappe/misc/energy_point_utils.js | 64 ++++++++++++++----- .../social/components/EnergyPointHistory.vue | 2 +- 3 files changed, 50 insertions(+), 18 deletions(-) diff --git a/frappe/public/js/frappe/form/footer/timeline.js b/frappe/public/js/frappe/form/footer/timeline.js index 545d8b45f5..5f2acd3929 100644 --- a/frappe/public/js/frappe/form/footer/timeline.js +++ b/frappe/public/js/frappe/form/footer/timeline.js @@ -522,7 +522,7 @@ frappe.ui.form.Timeline = class Timeline { let energy_point_logs = this.frm.get_docinfo().energy_point_logs; energy_point_logs.map(log => { log.comment_type = 'Energy Points'; - log.content = frappe.energy_points.format_log(log); + log.content = frappe.energy_points.format_form_log(log); return log; }); return energy_point_logs; diff --git a/frappe/public/js/frappe/misc/energy_point_utils.js b/frappe/public/js/frappe/misc/energy_point_utils.js index cdee77a2ed..d9a64a41d8 100644 --- a/frappe/public/js/frappe/misc/energy_point_utils.js +++ b/frappe/public/js/frappe/misc/energy_point_utils.js @@ -9,23 +9,55 @@ Object.assign(frappe.energy_points, { ${points > 0 ? '+': ''}${points} `; }, - log_message(log) { - const doc_link = frappe.utils.get_form_link(log.reference_doctype, log.reference_name, true); - const owner_name = frappe.user.full_name(log.owner).bold(); - const user = frappe.user.full_name(log.user).bold(); - if (log.type === 'Appreciation') { - return __('{0} appreciated {1} on {2}', [owner_name, user, doc_link]); - } - if (log.type === 'Criticism') { - return __('{0} criticized {1} on {2}', [owner_name, user, doc_link]); - } - return __('for {0} via automatic rule {1} on {2}', [user, log.rule.bold(), doc_link]); - }, - format_log(log, with_timestamp=false) { - let formatted_log = ` - ${this.get_points(log.points)} ${this.log_message(log)} - ${ with_timestamp ? ' - ' + frappe.datetime.comment_when(log.creation):''} + format_form_log(log) { + const separator = ` - `; + const formatted_log = ` + ${this.get_points(log.points)}  + ${this.get_form_log_message(log)} + ${log.reason ? separator + log.reason: ''} `; return formatted_log; }, + format_history_log(log) { + // redundant code to honor readability and to avoid confusion + const separator = ` - `; + const formatted_log = ` + ${this.get_points(log.points)}  + ${this.get_history_log_message(log)} + ${log.reason ? separator + log.reason: ''} + ${separator + frappe.datetime.comment_when(log.creation)} + `; + return formatted_log; + }, + get_history_log_message(log) { + const doc_link = frappe.utils.get_form_link(log.reference_doctype, log.reference_name, true); + const owner_name = frappe.user.full_name(log.owner).bold(); + if (log.type === 'Appreciation') { + return __('{0} appreciated on {1}', [owner_name, doc_link]); + } + if (log.type === 'Criticism') { + return __('{0} criticized on {1}', [owner_name, doc_link]); + } + if (log.type === 'Revert') { + return __('{0} reverted {1}', [owner_name, + frappe.utils.get_form_link('Energy Point Log', log.revert_for, true)]); + } + return __('via automatic rule {0} on {1}', [log.rule.bold(), doc_link]); + }, + get_form_log_message(log) { + // redundant code to honor readability and to avoid confusion + const owner_name = frappe.user.full_name(log.owner).bold(); + const user = frappe.user.full_name(log.user).bold(); + if (log.type === 'Appreciation') { + return __('{0} appreciated {1}', [owner_name, user]); + } + if (log.type === 'Criticism') { + return __('{0} criticized {1}', [owner_name, user]); + } + if (log.type === 'Revert') { + return __('{0} reverted {1}', [user, + frappe.utils.get_form_link('Energy Point Log', log.revert_for, true)]); + } + return __('gained by {0} via automatic rule {1}', [user, log.rule.bold()]); + }, }); \ No newline at end of file diff --git a/frappe/public/js/frappe/social/components/EnergyPointHistory.vue b/frappe/public/js/frappe/social/components/EnergyPointHistory.vue index aae03b6b09..e7274f548f 100644 --- a/frappe/public/js/frappe/social/components/EnergyPointHistory.vue +++ b/frappe/public/js/frappe/social/components/EnergyPointHistory.vue @@ -2,7 +2,7 @@
      • - +
      • {{__('No logs found')}} From d1cc18b508f51250fe3067c7864a7fe1fd9130c2 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Fri, 5 Apr 2019 19:48:15 +0530 Subject: [PATCH 242/256] feat: Init revert point system --- .../energy_point_log/energy_point_log.js | 14 +++- .../energy_point_log/energy_point_log.json | 75 ++++++++++++++++++- .../energy_point_log/energy_point_log.py | 26 ++++++- 3 files changed, 109 insertions(+), 6 deletions(-) diff --git a/frappe/social/doctype/energy_point_log/energy_point_log.js b/frappe/social/doctype/energy_point_log/energy_point_log.js index c01d8e6c28..c057f7b5e4 100644 --- a/frappe/social/doctype/energy_point_log/energy_point_log.js +++ b/frappe/social/doctype/energy_point_log/energy_point_log.js @@ -2,7 +2,17 @@ // For license information, please see license.txt frappe.ui.form.on('Energy Point Log', { - refresh: function() { - + refresh: function(frm) { + if (frm.doc.reverted) { + frm.set_intro(__('This document has been reverted')); + } else if (!['Revert', 'Review'].includes(frm.doc.type) + && frappe.user_roles.includes('System Manager')) { + const revert_button = __('Revert'); + frm.add_custom_button(revert_button, () => { + return frappe.xcall('frappe.social.doctype.energy_point_log.energy_point_log.revert', { + 'name': frm.doc.name + }); + }); + } } }); diff --git a/frappe/social/doctype/energy_point_log/energy_point_log.json b/frappe/social/doctype/energy_point_log/energy_point_log.json index 2b43e99d38..72f23187a2 100644 --- a/frappe/social/doctype/energy_point_log/energy_point_log.json +++ b/frappe/social/doctype/energy_point_log/energy_point_log.json @@ -67,7 +67,7 @@ "label": "Type", "length": 0, "no_copy": 0, - "options": "Auto\nAppreciation\nCriticism\nReview", + "options": "Auto\nAppreciation\nCriticism\nReview\nRevert", "permlevel": 0, "precision": "", "print_hide": 0, @@ -248,6 +248,75 @@ "set_only_once": 0, "translatable": 0, "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "0", + "fetch_if_empty": 0, + "fieldname": "reverted", + "fieldtype": "Check", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Reverted", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:doc.type === 'Revert'", + "fetch_if_empty": 0, + "fieldname": "revert_for", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Revert For", + "length": 0, + "no_copy": 0, + "options": "Energy Point Log", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 } ], "has_web_view": 0, @@ -259,7 +328,7 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2019-03-30 12:25:27.821811", + "modified": "2019-04-05 17:20:43.998915", "modified_by": "Administrator", "module": "Social", "name": "Energy Point Log", @@ -306,7 +375,7 @@ } ], "quick_entry": 0, - "read_only": 1, + "read_only": 0, "show_name_in_global_search": 0, "sort_field": "modified", "sort_order": "DESC", 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 34f1013aee..4292af7fad 100644 --- a/frappe/social/doctype/energy_point_log/energy_point_log.py +++ b/frappe/social/doctype/energy_point_log/energy_point_log.py @@ -45,6 +45,12 @@ def get_alert_dict(doc): points )) alert_dict.indicator = 'red' + elif doc.type == 'Revert': + alert_dict.message = _('{} reverted your points on {}'.format( + owner_name, + doc_link, + )) + alert_dict.indicator = 'red' else: alert_dict = {} @@ -149,4 +155,22 @@ def get_reviews(doctype, docname): 'reference_doctype': doctype, 'reference_name': docname, 'type': ['in', ('Appreciation', 'Criticism')], - }, fields=['points', 'owner', 'type', 'user', 'reason', 'creation']) \ No newline at end of file + }, fields=['points', 'owner', 'type', 'user', 'reason', 'creation']) + +@frappe.whitelist() +def revert(name, reason=None): + frappe.only_for('System Manager') + doc_to_revert = frappe.get_doc('Energy Point Log', name) + doc_to_revert.reverted = 1 + doc_to_revert.save() + + frappe.get_doc({ + 'doctype': 'Energy Point Log', + 'points': -doc_to_revert.points, + 'type': 'Revert', + 'user': doc_to_revert.user, + 'reason': reason, + 'reference_doctype': doc_to_revert.reference_doctype, + 'reference_name': doc_to_revert.reference_name, + 'revert_for': doc_to_revert.name + }).insert() From 520a6b8020e25fa7b00d72dc9b644fbbd38b1a0b Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Fri, 5 Apr 2019 21:07:33 +0530 Subject: [PATCH 243/256] feat: Add revert dialog to get the reason of revert - Show type and doctype in list view - Track changes for energy point logs --- .../energy_point_log/energy_point_log.js | 30 +++++++++++++++---- .../energy_point_log/energy_point_log.json | 12 ++++---- .../energy_point_log/energy_point_log.py | 8 +++-- 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/frappe/social/doctype/energy_point_log/energy_point_log.js b/frappe/social/doctype/energy_point_log/energy_point_log.js index c057f7b5e4..0d0bd741fe 100644 --- a/frappe/social/doctype/energy_point_log/energy_point_log.js +++ b/frappe/social/doctype/energy_point_log/energy_point_log.js @@ -7,12 +7,30 @@ frappe.ui.form.on('Energy Point Log', { frm.set_intro(__('This document has been reverted')); } else if (!['Revert', 'Review'].includes(frm.doc.type) && frappe.user_roles.includes('System Manager')) { - const revert_button = __('Revert'); - frm.add_custom_button(revert_button, () => { - return frappe.xcall('frappe.social.doctype.energy_point_log.energy_point_log.revert', { - 'name': frm.doc.name - }); - }); + frm.add_custom_button(__('Revert'), () => frm.events.show_revert_dialog(frm)); } + }, + show_revert_dialog(frm) { + const revert_dialog = new frappe.ui.Dialog({ + title: __('Revert'), + fields: [{ + fieldname: 'reason', + fieldtype: 'Small Text', + label: __('Reason'), + reqd: 1 + }], + primary_action: (values) => { + return frappe.xcall('frappe.social.doctype.energy_point_log.energy_point_log.revert', { + 'name': frm.doc.name, + 'reason': values.reason + }).then(revert_log => { + revert_dialog.hide(); + revert_dialog.clear(); + frappe.model.docinfo[frm.doc.reference_doctype][frm.doc.reference_name].energy_point_logs.unshift(revert_log); + }).catch(() => {}); + }, + primary_action_label: __('Submit') + }); + revert_dialog.show(); } }); diff --git a/frappe/social/doctype/energy_point_log/energy_point_log.json b/frappe/social/doctype/energy_point_log/energy_point_log.json index 72f23187a2..2a24016c82 100644 --- a/frappe/social/doctype/energy_point_log/energy_point_log.json +++ b/frappe/social/doctype/energy_point_log/energy_point_log.json @@ -62,7 +62,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_global_search": 0, - "in_list_view": 0, + "in_list_view": 1, "in_standard_filter": 0, "label": "Type", "length": 0, @@ -130,7 +130,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_global_search": 0, - "in_list_view": 0, + "in_list_view": 1, "in_standard_filter": 0, "label": "Reference Doctype", "length": 0, @@ -292,7 +292,7 @@ "columns": 0, "depends_on": "eval:doc.type === 'Revert'", "fetch_if_empty": 0, - "fieldname": "revert_for", + "fieldname": "revert_of", "fieldtype": "Link", "hidden": 0, "ignore_user_permissions": 0, @@ -301,7 +301,7 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Revert For", + "label": "Revert Of", "length": 0, "no_copy": 0, "options": "Energy Point Log", @@ -328,7 +328,7 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2019-04-05 17:20:43.998915", + "modified": "2019-04-05 20:23:53.917559", "modified_by": "Administrator", "module": "Social", "name": "Energy Point Log", @@ -380,7 +380,7 @@ "sort_field": "modified", "sort_order": "DESC", "title_field": "user", - "track_changes": 0, + "track_changes": 1, "track_seen": 0, "track_views": 0 } \ No newline at end of file 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 4292af7fad..bcafe09eba 100644 --- a/frappe/social/doctype/energy_point_log/energy_point_log.py +++ b/frappe/social/doctype/energy_point_log/energy_point_log.py @@ -158,13 +158,13 @@ def get_reviews(doctype, docname): }, fields=['points', 'owner', 'type', 'user', 'reason', 'creation']) @frappe.whitelist() -def revert(name, reason=None): +def revert(name, reason): frappe.only_for('System Manager') doc_to_revert = frappe.get_doc('Energy Point Log', name) doc_to_revert.reverted = 1 doc_to_revert.save() - frappe.get_doc({ + revert_log = frappe.get_doc({ 'doctype': 'Energy Point Log', 'points': -doc_to_revert.points, 'type': 'Revert', @@ -172,5 +172,7 @@ def revert(name, reason=None): 'reason': reason, 'reference_doctype': doc_to_revert.reference_doctype, 'reference_name': doc_to_revert.reference_name, - 'revert_for': doc_to_revert.name + 'revert_of': doc_to_revert.name }).insert() + + return revert_log \ No newline at end of file From 743086dc41c44af058005636b108d63643a0234c Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Fri, 5 Apr 2019 21:08:10 +0530 Subject: [PATCH 244/256] fix: Rename revert_for -> revert_of --- frappe/public/js/frappe/misc/energy_point_utils.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/public/js/frappe/misc/energy_point_utils.js b/frappe/public/js/frappe/misc/energy_point_utils.js index d9a64a41d8..dc7df166ec 100644 --- a/frappe/public/js/frappe/misc/energy_point_utils.js +++ b/frappe/public/js/frappe/misc/energy_point_utils.js @@ -40,7 +40,7 @@ Object.assign(frappe.energy_points, { } if (log.type === 'Revert') { return __('{0} reverted {1}', [owner_name, - frappe.utils.get_form_link('Energy Point Log', log.revert_for, true)]); + frappe.utils.get_form_link('Energy Point Log', log.revert_of, true)]); } return __('via automatic rule {0} on {1}', [log.rule.bold(), doc_link]); }, @@ -56,7 +56,7 @@ Object.assign(frappe.energy_points, { } if (log.type === 'Revert') { return __('{0} reverted {1}', [user, - frappe.utils.get_form_link('Energy Point Log', log.revert_for, true)]); + frappe.utils.get_form_link('Energy Point Log', log.revert_of, true)]); } return __('gained by {0} via automatic rule {1}', [user, log.rule.bold()]); }, From 04a40d286deea8e5641d0cc3a959fc90a5fcf809 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Fri, 5 Apr 2019 21:14:21 +0530 Subject: [PATCH 245/256] fix: Show alert message - Append indicator element instead of adding class to parent div to avoid css bleed --- frappe/public/js/frappe/ui/messages.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frappe/public/js/frappe/ui/messages.js b/frappe/public/js/frappe/ui/messages.js index 9293d497b5..9b8ff15b09 100644 --- a/frappe/public/js/frappe/ui/messages.js +++ b/frappe/public/js/frappe/ui/messages.js @@ -283,12 +283,12 @@ frappe.show_alert = function(message, seconds=7, actions={}) { ×
      `); - div.find('.alert-message').append(message.message); - if(message.indicator) { - div.find('.alert-message').addClass('indicator '+ message.indicator); + div.find('.alert-message').append(``); } + div.find('.alert-message').append(message.message); + if (body_html) { div.find('.alert-body').show().html(body_html); } From a418e87444b02b9e7caad1253570cd483aec654f Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Fri, 5 Apr 2019 21:57:17 +0530 Subject: [PATCH 246/256] fix: Refresh timeline after getting a new review --- frappe/public/js/frappe/form/review.js | 1 + 1 file changed, 1 insertion(+) diff --git a/frappe/public/js/frappe/form/review.js b/frappe/public/js/frappe/form/review.js index 1799cd68b5..8447118644 100644 --- a/frappe/public/js/frappe/form/review.js +++ b/frappe/public/js/frappe/form/review.js @@ -131,6 +131,7 @@ frappe.ui.form.Review = class Review { review_dialog.hide(); review_dialog.clear(); this.frm.get_docinfo().energy_point_logs.unshift(review); + this.frm.timeline.refresh(); this.update_reviewers(); }); }, From 0c31d9c814ddcac20e20a7d77eeb9468f56f156b Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Fri, 5 Apr 2019 22:00:53 +0530 Subject: [PATCH 247/256] fix: Allow revert for logs only with type auto --- frappe/social/doctype/energy_point_log/energy_point_log.js | 2 +- frappe/social/doctype/energy_point_log/energy_point_log.py | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/frappe/social/doctype/energy_point_log/energy_point_log.js b/frappe/social/doctype/energy_point_log/energy_point_log.js index 0d0bd741fe..d136219efc 100644 --- a/frappe/social/doctype/energy_point_log/energy_point_log.js +++ b/frappe/social/doctype/energy_point_log/energy_point_log.js @@ -5,7 +5,7 @@ frappe.ui.form.on('Energy Point Log', { refresh: function(frm) { if (frm.doc.reverted) { frm.set_intro(__('This document has been reverted')); - } else if (!['Revert', 'Review'].includes(frm.doc.type) + } else if (frm.doc.type === 'Auto' && frappe.user_roles.includes('System Manager')) { frm.add_custom_button(__('Revert'), () => frm.events.show_revert_dialog(frm)); } 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 bcafe09eba..3160915729 100644 --- a/frappe/social/doctype/energy_point_log/energy_point_log.py +++ b/frappe/social/doctype/energy_point_log/energy_point_log.py @@ -161,12 +161,16 @@ def get_reviews(doctype, docname): def revert(name, reason): frappe.only_for('System Manager') doc_to_revert = frappe.get_doc('Energy Point Log', name) + + if doc_to_revert.type != 'Auto': + frappe.throw(_('This document cannot be reverted')) + doc_to_revert.reverted = 1 doc_to_revert.save() revert_log = frappe.get_doc({ 'doctype': 'Energy Point Log', - 'points': -doc_to_revert.points, + 'points': -(doc_to_revert.points), 'type': 'Revert', 'user': doc_to_revert.user, 'reason': reason, From 8abd261c1827dc67dae98d849b7bd81a022a5290 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Fri, 5 Apr 2019 22:03:30 +0530 Subject: [PATCH 248/256] fix: Super class call in dialog.js --- frappe/public/js/frappe/ui/dialog.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/ui/dialog.js b/frappe/public/js/frappe/ui/dialog.js index a09c62af32..eb9215e208 100644 --- a/frappe/public/js/frappe/ui/dialog.js +++ b/frappe/public/js/frappe/ui/dialog.js @@ -113,7 +113,7 @@ frappe.ui.Dialog = class Dialog extends frappe.ui.FieldGroup { } clear() { - super(); + super.clear(); this.clear_message(); } From b3359f5eb229bc147e5c21567dbfae855a44654d Mon Sep 17 00:00:00 2001 From: Himanshu Warekar Date: Sat, 6 Apr 2019 21:53:09 +0530 Subject: [PATCH 249/256] fix: code refactor --- .../report/addresses_and_contacts/addresses_and_contacts.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/contacts/report/addresses_and_contacts/addresses_and_contacts.py b/frappe/contacts/report/addresses_and_contacts/addresses_and_contacts.py index 354911cd70..2f2b10fca3 100644 --- a/frappe/contacts/report/addresses_and_contacts/addresses_and_contacts.py +++ b/frappe/contacts/report/addresses_and_contacts/addresses_and_contacts.py @@ -63,8 +63,8 @@ def get_reference_addresses_and_contact(reference_doctype, reference_name): contacts = details.get("contact", []) if not any([addresses, contacts]): result = [reference_name] - result.extend(add_blank_columns_for("Contact")) result.extend(add_blank_columns_for("Address")) + result.extend(add_blank_columns_for("Contact")) data.append(result) else: max_length = max(len(addresses), len(contacts)) From 5c3121ab842c994dcd4abeea3444b8153addcb0e Mon Sep 17 00:00:00 2001 From: Himanshu Warekar Date: Sat, 6 Apr 2019 22:50:05 +0530 Subject: [PATCH 250/256] fix: making it py2 and py3 compatible --- .../addresses_and_contacts/addresses_and_contacts.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/frappe/contacts/report/addresses_and_contacts/addresses_and_contacts.py b/frappe/contacts/report/addresses_and_contacts/addresses_and_contacts.py index 2f2b10fca3..0907476b30 100644 --- a/frappe/contacts/report/addresses_and_contacts/addresses_and_contacts.py +++ b/frappe/contacts/report/addresses_and_contacts/addresses_and_contacts.py @@ -67,12 +67,15 @@ def get_reference_addresses_and_contact(reference_doctype, reference_name): result.extend(add_blank_columns_for("Contact")) data.append(result) else: + addresses = list(map(list, addresses)) + contacts = list(map(list, contacts)) + max_length = max(len(addresses), len(contacts)) for idx in range(0, max_length): result = [reference_name] - result.extend(list(addresses[idx].values()) if idx < len(addresses) else add_blank_columns_for("Address")) - result.extend(list(contacts[idx].values()) if idx < len(contacts) else add_blank_columns_for("Contact")) + result.extend(addresses[idx] if idx < len(addresses) else add_blank_columns_for("Address")) + result.extend(contacts[idx] if idx < len(contacts) else add_blank_columns_for("Contact")) data.append(result) @@ -85,12 +88,11 @@ def get_reference_details(reference_doctype, doctype, reference_list, reference_ ] fields = ["`tabDynamic Link`.link_name"] + field_map.get(doctype, []) - records = frappe.get_list(doctype, filters=filters, fields=fields) + records = frappe.get_list(doctype, filters=filters, fields=fields, as_list=True) temp_records = list() for d in records: - d.pop('link_name') - temp_records.append(d) + temp_records.append(d[1:]) reference_details[reference_list[0]][frappe.scrub(doctype)] = temp_records return reference_details From 2d51a1ec7e8f3cce9ed15171298a65b37868ab8a Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Sun, 7 Apr 2019 12:47:45 +0530 Subject: [PATCH 251/256] Revert "fix: Update user activity using ORM" This reverts commit b963868f611159f23ee03f14b96e0cc58368c99f. --- frappe/sessions.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/frappe/sessions.py b/frappe/sessions.py index 81ced8ce95..aaf40f30e7 100644 --- a/frappe/sessions.py +++ b/frappe/sessions.py @@ -226,11 +226,12 @@ class Session: self.insert_session_record() # update user - user = frappe.get_doc('User', self.data['user']) - user.last_login = frappe.utils.now() - user.last_ip = frappe.local.request_ip - user.last_active = frappe.utils.now() - user.save() + frappe.db.sql("""UPDATE tabUser SET last_login = %(now)s, last_ip = %(ip)s, last_active = %(now)s + where name=%(name)s""", { + "now": frappe.utils.now(), + "ip": frappe.local.request_ip, + "name": self.data['user'] + }) frappe.db.commit() From e3d0a84e64ad0f710916e6109e105d8b88929506 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Sun, 7 Apr 2019 12:53:21 +0530 Subject: [PATCH 252/256] Revert "fix: Update user activity using ORM" This reverts commit b963868f611159f23ee03f14b96e0cc58368c99f. --- frappe/sessions.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/frappe/sessions.py b/frappe/sessions.py index eb28cc4dee..ef5c59a1ef 100644 --- a/frappe/sessions.py +++ b/frappe/sessions.py @@ -231,11 +231,12 @@ class Session: self.insert_session_record() # update user - user = frappe.get_doc('User', self.data['user']) - user.last_login = frappe.utils.now() - user.last_ip = frappe.local.request_ip - user.last_active = frappe.utils.now() - user.save(ignore_permissions=True) + frappe.db.sql("""UPDATE tabUser SET last_login = %(now)s, last_ip = %(ip)s, last_active = %(now)s + where name=%(name)s""", { + "now": frappe.utils.now(), + "ip": frappe.local.request_ip, + "name": self.data['user'] + }) frappe.db.commit() From 42b6faabe78ea2764e2a2acb5785d1dd23ab53cf Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Sun, 7 Apr 2019 13:10:10 +0530 Subject: [PATCH 253/256] fix: Add quotes --- frappe/sessions.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/frappe/sessions.py b/frappe/sessions.py index ef5c59a1ef..62436bdd5d 100644 --- a/frappe/sessions.py +++ b/frappe/sessions.py @@ -231,11 +231,15 @@ class Session: self.insert_session_record() # update user - frappe.db.sql("""UPDATE tabUser SET last_login = %(now)s, last_ip = %(ip)s, last_active = %(now)s - where name=%(name)s""", { - "now": frappe.utils.now(), - "ip": frappe.local.request_ip, - "name": self.data['user'] + frappe.db.sql("""UPDATE `tabUser` + SET + last_login = %(now)s, + last_ip = %(ip)s, + last_active = %(now)s + WHERE name=%(name)s""", { + 'now': frappe.utils.now(), + 'ip': frappe.local.request_ip, + 'name': self.data['user'] }) frappe.db.commit() From f31e8f0ffad36d776e33827f0aeba4b02b8fb70d Mon Sep 17 00:00:00 2001 From: igrekus Date: Sun, 7 Apr 2019 10:57:16 +0300 Subject: [PATCH 254/256] fix: Hide empty categories in Show / Hide Cards dialog (#7215) --- frappe/public/js/frappe/views/components/Desktop.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/views/components/Desktop.vue b/frappe/public/js/frappe/views/components/Desktop.vue index f950d04e79..a93920214d 100644 --- a/frappe/public/js/frappe/views/components/Desktop.vue +++ b/frappe/public/js/frappe/views/components/Desktop.vue @@ -107,7 +107,7 @@ export default { }); const d = new frappe.ui.Dialog({ title: __('Show / Hide Cards'), - fields, + fields: fields.filter(f => f.options.length > 0), primary_action_label: __('Save'), primary_action: (values) => { let all_modules = this.modules.map(m => m.module_name); From acd7c99db65988b8dcf8d2b34c5a67347ad4554f Mon Sep 17 00:00:00 2001 From: Frappe Bot Date: Sun, 7 Apr 2019 08:47:11 +0000 Subject: [PATCH 255/256] bumped to version 11.1.20 --- frappe/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/__init__.py b/frappe/__init__.py index 913f6440ff..c92951a4af 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -24,7 +24,7 @@ if sys.version[0] == '2': reload(sys) sys.setdefaultencoding("utf-8") -__version__ = '11.1.19' +__version__ = '11.1.20' __title__ = "Frappe Framework" local = Local() From 0334950a8b238eb7ea4b3420a7d486927e63f0c0 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Mon, 8 Apr 2019 10:34:34 +0530 Subject: [PATCH 256/256] feat(leaderboard): Load more logs (#7226) * feat: Load more logs * fix: Use v-show instead of v-if to avoid network repeated calls --- .../social/components/EnergyPointHistory.vue | 46 ++++++++++++++----- .../js/frappe/social/pages/UserList.vue | 2 +- 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/frappe/public/js/frappe/social/components/EnergyPointHistory.vue b/frappe/public/js/frappe/social/components/EnergyPointHistory.vue index e7274f548f..d8e9665849 100644 --- a/frappe/public/js/frappe/social/components/EnergyPointHistory.vue +++ b/frappe/public/js/frappe/social/components/EnergyPointHistory.vue @@ -4,8 +4,18 @@
    • +
    • + {{ __('Fetching') + '...' }} +
    • +
    • + +
    • - {{__('No logs found')}} + {{ __('No logs found') }}
    @@ -15,19 +25,33 @@ export default { props: ['user'], data() { return { - history_logs: [] + history_logs: [], + fetching: false, + has_more_logs: true } }, created() { - frappe.db.get_list('Energy Point Log', { - filters: { - user: this.user, - type: ['!=', 'Review'] - }, - fields: ['*'] - }).then(data => { - this.history_logs = data; - }) + this.get_logs(); + }, + methods: { + get_logs() { + this.fetching = true; + const pull_limit = 10; + frappe.db.get_list('Energy Point Log', { + filters: { + user: this.user, + type: ['!=', 'Review'] + }, + fields: ['*'], + limit: pull_limit, + limit_start: this.history_logs.length + }).then(data => { + this.history_logs = this.history_logs.concat(data); + this.has_more_logs = data.length === pull_limit; + }).finally(() => { + this.fetching = false; + }) + } }, } diff --git a/frappe/public/js/frappe/social/pages/UserList.vue b/frappe/public/js/frappe/social/pages/UserList.vue index 76e91af98e..925cf43c6f 100644 --- a/frappe/public/js/frappe/social/pages/UserList.vue +++ b/frappe/public/js/frappe/social/pages/UserList.vue @@ -39,7 +39,7 @@