From bc042b37b7d1e014012dfed9978cbc2a43e966c2 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 16 Apr 2020 00:01:27 +0530 Subject: [PATCH 01/15] feat: added Page View doctype --- frappe/website/doctype/page_view/__init__.py | 0 frappe/website/doctype/page_view/page_view.js | 8 ++ .../website/doctype/page_view/page_view.json | 75 +++++++++++++++++++ frappe/website/doctype/page_view/page_view.py | 34 +++++++++ .../doctype/page_view/test_page_view.py | 10 +++ .../website_settings/test_website_settings.py | 10 +++ 6 files changed, 137 insertions(+) create mode 100644 frappe/website/doctype/page_view/__init__.py create mode 100644 frappe/website/doctype/page_view/page_view.js create mode 100644 frappe/website/doctype/page_view/page_view.json create mode 100644 frappe/website/doctype/page_view/page_view.py create mode 100644 frappe/website/doctype/page_view/test_page_view.py create mode 100644 frappe/website/doctype/website_settings/test_website_settings.py diff --git a/frappe/website/doctype/page_view/__init__.py b/frappe/website/doctype/page_view/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/frappe/website/doctype/page_view/page_view.js b/frappe/website/doctype/page_view/page_view.js new file mode 100644 index 0000000000..3d6bf92429 --- /dev/null +++ b/frappe/website/doctype/page_view/page_view.js @@ -0,0 +1,8 @@ +// Copyright (c) 2020, Frappe Technologies and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Page View', { + // refresh: function(frm) { + + // } +}); diff --git a/frappe/website/doctype/page_view/page_view.json b/frappe/website/doctype/page_view/page_view.json new file mode 100644 index 0000000000..a79472154f --- /dev/null +++ b/frappe/website/doctype/page_view/page_view.json @@ -0,0 +1,75 @@ +{ + "actions": [], + "creation": "2020-04-15 22:54:46.009703", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "path", + "referrer", + "browser", + "browser_version", + "date" + ], + "fields": [ + { + "fieldname": "path", + "fieldtype": "Data", + "label": "Path", + "set_only_once": 1 + }, + { + "fieldname": "referrer", + "fieldtype": "Data", + "label": "Referrer", + "search_index": 1, + "set_only_once": 1 + }, + { + "fieldname": "browser", + "fieldtype": "Data", + "label": "Browser", + "search_index": 1, + "set_only_once": 1 + }, + { + "fieldname": "browser_version", + "fieldtype": "Data", + "label": "Browser Version", + "set_only_once": 1 + }, + { + "fieldname": "date", + "fieldtype": "Datetime", + "label": "Date", + "set_only_once": 1 + } + ], + "in_create": 1, + "links": [], + "modified": "2020-04-15 23:31:27.517793", + "modified_by": "Administrator", + "module": "Website", + "name": "Page View", + "owner": "Administrator", + "permissions": [ + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, + "write": 1 + } + ], + "quick_entry": 1, + "read_only": 1, + "sort_field": "modified", + "sort_order": "DESC", + "title_field": "path", + "track_changes": 1 +} \ No newline at end of file diff --git a/frappe/website/doctype/page_view/page_view.py b/frappe/website/doctype/page_view/page_view.py new file mode 100644 index 0000000000..9c41e1c4aa --- /dev/null +++ b/frappe/website/doctype/page_view/page_view.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2020, Frappe Technologies and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class PageView(Document): + pass + + +@frappe.whitelist(allow_guest=True) +def make_view_log(path, referrer=None, browser=None, version=None): + if path.startswith('/'): + path = path[1:] + + if is_tracking_enabled(): + view = frappe.new_doc("Page View") + view.path = path + view.referrer = referrer + view.browser = browser + view.browser_version = version + view.date = frappe.utils.now_datetime() + view.insert(ignore_permissions=True) + + return + +@frappe.whitelist() +def get_page_view_count(path): + return frappe.db.count("Page View", filters={'path': path}) + +def is_tracking_enabled(): + return frappe.db.get_value("Website Settings", "Website Settings", "enable_view_tracking") \ No newline at end of file diff --git a/frappe/website/doctype/page_view/test_page_view.py b/frappe/website/doctype/page_view/test_page_view.py new file mode 100644 index 0000000000..2ac98f2be2 --- /dev/null +++ b/frappe/website/doctype/page_view/test_page_view.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2020, Frappe Technologies and Contributors +# See license.txt +from __future__ import unicode_literals + +# import frappe +import unittest + +class TestPageView(unittest.TestCase): + pass diff --git a/frappe/website/doctype/website_settings/test_website_settings.py b/frappe/website/doctype/website_settings/test_website_settings.py new file mode 100644 index 0000000000..9eca957713 --- /dev/null +++ b/frappe/website/doctype/website_settings/test_website_settings.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2020, Frappe Technologies and Contributors +# See license.txt +from __future__ import unicode_literals + +# import frappe +import unittest + +class TestWebsiteSettings(unittest.TestCase): + pass From 3d454607495fd7997a5b3b909745c0ef0d0ab4f4 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 16 Apr 2020 00:01:38 +0530 Subject: [PATCH 02/15] feat: added tracking script to website --- frappe/www/website_script.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/frappe/www/website_script.js b/frappe/www/website_script.js index fd361f8986..9f0dd329c6 100644 --- a/frappe/www/website_script.js +++ b/frappe/www/website_script.js @@ -12,3 +12,17 @@ ga('create', '{{ google_analytics_id }}', 'auto'); ga('send', 'pageview'); // End Google Analytics {%- endif %} + +{% if enable_view_tracking %} + if (navigator.doNotTrack != 1) { + frappe.ready(() => { + let browser = frappe.utils.get_browser(); + frappe.call("frappe.website.doctype.page_view.page_view.make_view_log", { + path: location.pathname, + referrer: document.referrer, + browser: browser.name, + version: browser.version + }) + }) + } +{% endif %} From 9ad1cf94f2a6db4ad88f68493b52030323c9e823 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 16 Apr 2020 00:01:55 +0530 Subject: [PATCH 03/15] feat: add tracking enabled info to boot --- frappe/boot.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frappe/boot.py b/frappe/boot.py index e6d1199b19..e11dd87990 100644 --- a/frappe/boot.py +++ b/frappe/boot.py @@ -17,6 +17,7 @@ from frappe.utils.change_log import get_versions from frappe.translate import get_lang_dict from frappe.email.inbox import get_email_accounts from frappe.social.doctype.energy_point_settings.energy_point_settings import is_energy_point_enabled +from frappe.website.doctype.page_view.page_view import is_tracking_enabled from frappe.social.doctype.energy_point_log.energy_point_log import get_energy_points from frappe.social.doctype.post.post import frequently_visited_links @@ -79,6 +80,7 @@ def get_bootinfo(): bootinfo.success_action = get_success_action() bootinfo.update(get_email_accounts(user=frappe.session.user)) bootinfo.energy_points_enabled = is_energy_point_enabled() + bootinfo.website_tracking_enabled = is_tracking_enabled() bootinfo.points = get_energy_points(frappe.session.user) bootinfo.frequently_visited_links = frequently_visited_links() bootinfo.link_preview_doctypes = get_link_preview_doctypes() From 6233e94dab4de5bf73f161aa7565f758662e2100 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 16 Apr 2020 00:02:27 +0530 Subject: [PATCH 04/15] feat: added utility to get browser details --- frappe/public/js/frappe/utils/utils.js | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/utils/utils.js b/frappe/public/js/frappe/utils/utils.js index a2b03f180e..a81d6deece 100644 --- a/frappe/public/js/frappe/utils/utils.js +++ b/frappe/public/js/frappe/utils/utils.js @@ -743,7 +743,25 @@ Object.assign(frappe.utils, { }); return $el; - } + }, + + get_browser() { + var ua=navigator.userAgent,tem,M=ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || []; + if(/trident/i.test(M[1])){ + tem=/\brv[ :]+(\d+)/g.exec(ua) || []; + return {name:'IE',version:(tem[1]||'')}; + } + if(M[1]==='Chrome'){ + tem=ua.match(/\bOPR|Edge\/(\d+)/) + if(tem!=null) {return {name:'Opera', version:tem[1]};} + } + M=M[2]? [M[1], M[2]]: [navigator.appName, navigator.appVersion, '-?']; + if((tem=ua.match(/version\/(\d+)/i))!=null) {M.splice(1,1,tem[1]);} + return { + name: M[0], + version: M[1] + }; + } }); // Array de duplicate From 815f05a0eb4939b73f531da9b939991916139d15 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 16 Apr 2020 00:02:52 +0530 Subject: [PATCH 05/15] feat: added enable tracking flag to default website context --- .../doctype/website_settings/website_settings.json | 11 +++++++++-- .../doctype/website_settings/website_settings.py | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/frappe/website/doctype/website_settings/website_settings.json b/frappe/website/doctype/website_settings/website_settings.json index 39ffa2329f..f247082046 100644 --- a/frappe/website/doctype/website_settings/website_settings.json +++ b/frappe/website/doctype/website_settings/website_settings.json @@ -29,6 +29,7 @@ "footer_items", "hide_footer_signup", "integrations", + "enable_view_tracking", "enable_google_indexing", "authorize_api_indexing_access", "indexing_refresh_token", @@ -186,7 +187,7 @@ "collapsible": 1, "fieldname": "integrations", "fieldtype": "Section Break", - "label": "Google Integrations" + "label": "Integrations" }, { "description": "Add Google Analytics ID: eg. UA-89XXX57-1. Please search help on Google Analytics for more information.", @@ -319,6 +320,12 @@ "fieldname": "authorize_api_indexing_access", "fieldtype": "Button", "label": "Authorize API Indexing Access" + }, + { + "default": "0", + "fieldname": "enable_view_tracking", + "fieldtype": "Check", + "label": "Enable In App Website Tracking" } ], "icon": "fa fa-cog", @@ -326,7 +333,7 @@ "issingle": 1, "links": [], "max_attachments": 10, - "modified": "2020-02-21 16:46:59.947403", + "modified": "2020-04-15 22:59:26.256662", "modified_by": "Administrator", "module": "Website", "name": "Website Settings", diff --git a/frappe/website/doctype/website_settings/website_settings.py b/frappe/website/doctype/website_settings/website_settings.py index 4356b1aa82..ff94bd15a3 100644 --- a/frappe/website/doctype/website_settings/website_settings.py +++ b/frappe/website/doctype/website_settings/website_settings.py @@ -118,7 +118,7 @@ def get_website_settings(): for k in ["banner_html", "brand_html", "copyright", "twitter_share_via", "facebook_share", "google_plus_one", "twitter_share", "linked_in_share", "disable_signup", "hide_footer_signup", "head_html", "title_prefix", - "navbar_search"]: + "navbar_search", "enable_view_tracking"]: if hasattr(settings, k): context[k] = settings.get(k) From 7a9a16b6afec7d34435004275f4b6a168c56f856 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 16 Apr 2020 00:03:17 +0530 Subject: [PATCH 06/15] feat: add page view count to form --- frappe/public/js/frappe/form/sidebar/form_sidebar.js | 9 +++++++++ frappe/public/js/frappe/form/templates/form_sidebar.html | 1 + frappe/public/js/frappe/utils/common.js | 6 ++++++ frappe/public/less/sidebar.less | 3 ++- 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/form/sidebar/form_sidebar.js b/frappe/public/js/frappe/form/sidebar/form_sidebar.js index 02caf25557..677d53bb64 100644 --- a/frappe/public/js/frappe/form/sidebar/form_sidebar.js +++ b/frappe/public/js/frappe/form/sidebar/form_sidebar.js @@ -81,6 +81,15 @@ frappe.ui.form.Sidebar = Class.extend({ } this.frm.viewers.refresh(); this.frm.tags && this.frm.tags.refresh(this.frm.get_docinfo().tags); + + if (this.frm.doc.route && frappe.boot.website_tracking_enabled) { + let route = this.frm.doc.route; + frappe.utils.get_page_view_count(route).then(res => { + this.sidebar.find(".pageview-count").html(__("{0} Page Views", + ["" + res.message + ""])); + }) + } + this.sidebar.find(".modified-by").html(__("{0} edited this {1}", ["" + frappe.user.full_name(this.frm.doc.modified_by) + "", "
" + comment_when(this.frm.doc.modified)])); diff --git a/frappe/public/js/frappe/form/templates/form_sidebar.html b/frappe/public/js/frappe/form/templates/form_sidebar.html index b611557c43..30b2205bae 100644 --- a/frappe/public/js/frappe/form/templates/form_sidebar.html +++ b/frappe/public/js/frappe/form/templates/form_sidebar.html @@ -105,6 +105,7 @@ diff --git a/frappe/public/js/frappe/utils/common.js b/frappe/public/js/frappe/utils/common.js index e919012664..5d20b04616 100644 --- a/frappe/public/js/frappe/utils/common.js +++ b/frappe/public/js/frappe/utils/common.js @@ -352,3 +352,9 @@ frappe.utils.new_auto_repeat_prompt = function(frm) { __('Save') ); } + +frappe.utils.get_page_view_count = function(route) { + return frappe.call("frappe.website.doctype.page_view.page_view.get_page_view_count", { + path: route + }) +} diff --git a/frappe/public/less/sidebar.less b/frappe/public/less/sidebar.less index ac5a5c33d5..28dae1a948 100644 --- a/frappe/public/less/sidebar.less +++ b/frappe/public/less/sidebar.less @@ -273,7 +273,8 @@ body[data-route^="Module"] .main-menu { } .layout-side-section .form-sidebar { - .modified-by { + .modified-by, + .pageview-count { margin-bottom: 15px; } } From 985392d07f8880f5277c3830462a58416271a3ee Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 16 Apr 2020 11:29:15 +0530 Subject: [PATCH 07/15] fix: linting fixes --- .../js/frappe/form/sidebar/form_sidebar.js | 2 +- frappe/public/js/frappe/utils/common.js | 4 +- frappe/public/js/frappe/utils/utils.js | 37 ++++++++++++------- 3 files changed, 27 insertions(+), 16 deletions(-) diff --git a/frappe/public/js/frappe/form/sidebar/form_sidebar.js b/frappe/public/js/frappe/form/sidebar/form_sidebar.js index 677d53bb64..9910227590 100644 --- a/frappe/public/js/frappe/form/sidebar/form_sidebar.js +++ b/frappe/public/js/frappe/form/sidebar/form_sidebar.js @@ -87,7 +87,7 @@ frappe.ui.form.Sidebar = Class.extend({ frappe.utils.get_page_view_count(route).then(res => { this.sidebar.find(".pageview-count").html(__("{0} Page Views", ["" + res.message + ""])); - }) + }); } this.sidebar.find(".modified-by").html(__("{0} edited this {1}", diff --git a/frappe/public/js/frappe/utils/common.js b/frappe/public/js/frappe/utils/common.js index 5d20b04616..7ffec5e541 100644 --- a/frappe/public/js/frappe/utils/common.js +++ b/frappe/public/js/frappe/utils/common.js @@ -356,5 +356,5 @@ frappe.utils.new_auto_repeat_prompt = function(frm) { frappe.utils.get_page_view_count = function(route) { return frappe.call("frappe.website.doctype.page_view.page_view.get_page_view_count", { path: route - }) -} + }); +}; diff --git a/frappe/public/js/frappe/utils/utils.js b/frappe/public/js/frappe/utils/utils.js index b07e71bc91..315637092d 100644 --- a/frappe/public/js/frappe/utils/utils.js +++ b/frappe/public/js/frappe/utils/utils.js @@ -748,22 +748,33 @@ Object.assign(frappe.utils, { }, get_browser() { - var ua=navigator.userAgent,tem,M=ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || []; - if(/trident/i.test(M[1])){ - tem=/\brv[ :]+(\d+)/g.exec(ua) || []; - return {name:'IE',version:(tem[1]||'')}; + var ua = navigator.userAgent, + tem, + M = + ua.match( + /(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i + ) || []; + if (/trident/i.test(M[1])) { + tem = /\brv[ :]+(\d+)/g.exec(ua) || []; + return { name: "IE", version: tem[1] || "" }; + } + if (M[1] === "Chrome") { + tem = ua.match(/\bOPR|Edge\/(\d+)/); + if (tem != null) { + return { name: "Opera", version: tem[1] }; } - if(M[1]==='Chrome'){ - tem=ua.match(/\bOPR|Edge\/(\d+)/) - if(tem!=null) {return {name:'Opera', version:tem[1]};} - } - M=M[2]? [M[1], M[2]]: [navigator.appName, navigator.appVersion, '-?']; - if((tem=ua.match(/version\/(\d+)/i))!=null) {M.splice(1,1,tem[1]);} + } + M = M[2] + ? [M[1], M[2]] + : [navigator.appName, navigator.appVersion, "-?"]; + if ((tem = ua.match(/version\/(\d+)/i)) != null) { + M.splice(1, 1, tem[1]); + } return { - name: M[0], - version: M[1] + name: M[0], + version: M[1], }; - } + }, }); // Array de duplicate From 33c6089049938695d1604584eb0de5af0f86a17d Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 16 Apr 2020 15:35:46 +0530 Subject: [PATCH 08/15] feat: rename doctype to Web Page View --- frappe/boot.py | 2 +- frappe/public/js/frappe/utils/common.js | 2 +- .../doctype/{page_view => web_page_view}/__init__.py | 0 .../test_web_page_view.py} | 2 +- .../page_view.js => web_page_view/web_page_view.js} | 2 +- .../page_view.json => web_page_view/web_page_view.json} | 2 +- .../page_view.py => web_page_view/web_page_view.py} | 6 +++--- frappe/website/website_theme/standard/standard.json | 4 ++-- frappe/www/website_script.js | 2 +- 9 files changed, 11 insertions(+), 11 deletions(-) rename frappe/website/doctype/{page_view => web_page_view}/__init__.py (100%) rename frappe/website/doctype/{page_view/test_page_view.py => web_page_view/test_web_page_view.py} (81%) rename frappe/website/doctype/{page_view/page_view.js => web_page_view/web_page_view.js} (80%) rename frappe/website/doctype/{page_view/page_view.json => web_page_view/web_page_view.json} (98%) rename frappe/website/doctype/{page_view/page_view.py => web_page_view/web_page_view.py} (85%) diff --git a/frappe/boot.py b/frappe/boot.py index e11dd87990..dc7ea8b3da 100644 --- a/frappe/boot.py +++ b/frappe/boot.py @@ -17,7 +17,7 @@ from frappe.utils.change_log import get_versions from frappe.translate import get_lang_dict from frappe.email.inbox import get_email_accounts from frappe.social.doctype.energy_point_settings.energy_point_settings import is_energy_point_enabled -from frappe.website.doctype.page_view.page_view import is_tracking_enabled +from frappe.website.doctype.web_page_view.web_page_view import is_tracking_enabled from frappe.social.doctype.energy_point_log.energy_point_log import get_energy_points from frappe.social.doctype.post.post import frequently_visited_links diff --git a/frappe/public/js/frappe/utils/common.js b/frappe/public/js/frappe/utils/common.js index 7ffec5e541..6ad15e44bf 100644 --- a/frappe/public/js/frappe/utils/common.js +++ b/frappe/public/js/frappe/utils/common.js @@ -354,7 +354,7 @@ frappe.utils.new_auto_repeat_prompt = function(frm) { } frappe.utils.get_page_view_count = function(route) { - return frappe.call("frappe.website.doctype.page_view.page_view.get_page_view_count", { + return frappe.call("frappe.website.doctype.web_page_view.web_page_view.get_page_view_count", { path: route }); }; diff --git a/frappe/website/doctype/page_view/__init__.py b/frappe/website/doctype/web_page_view/__init__.py similarity index 100% rename from frappe/website/doctype/page_view/__init__.py rename to frappe/website/doctype/web_page_view/__init__.py diff --git a/frappe/website/doctype/page_view/test_page_view.py b/frappe/website/doctype/web_page_view/test_web_page_view.py similarity index 81% rename from frappe/website/doctype/page_view/test_page_view.py rename to frappe/website/doctype/web_page_view/test_web_page_view.py index 2ac98f2be2..d51727ec68 100644 --- a/frappe/website/doctype/page_view/test_page_view.py +++ b/frappe/website/doctype/web_page_view/test_web_page_view.py @@ -6,5 +6,5 @@ from __future__ import unicode_literals # import frappe import unittest -class TestPageView(unittest.TestCase): +class TestWebPageView(unittest.TestCase): pass diff --git a/frappe/website/doctype/page_view/page_view.js b/frappe/website/doctype/web_page_view/web_page_view.js similarity index 80% rename from frappe/website/doctype/page_view/page_view.js rename to frappe/website/doctype/web_page_view/web_page_view.js index 3d6bf92429..77a047e408 100644 --- a/frappe/website/doctype/page_view/page_view.js +++ b/frappe/website/doctype/web_page_view/web_page_view.js @@ -1,7 +1,7 @@ // Copyright (c) 2020, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Page View', { +frappe.ui.form.on('Web Page View', { // refresh: function(frm) { // } diff --git a/frappe/website/doctype/page_view/page_view.json b/frappe/website/doctype/web_page_view/web_page_view.json similarity index 98% rename from frappe/website/doctype/page_view/page_view.json rename to frappe/website/doctype/web_page_view/web_page_view.json index a79472154f..7a1a210d62 100644 --- a/frappe/website/doctype/page_view/page_view.json +++ b/frappe/website/doctype/web_page_view/web_page_view.json @@ -50,7 +50,7 @@ "modified": "2020-04-15 23:31:27.517793", "modified_by": "Administrator", "module": "Website", - "name": "Page View", + "name": "Web Page View", "owner": "Administrator", "permissions": [ { diff --git a/frappe/website/doctype/page_view/page_view.py b/frappe/website/doctype/web_page_view/web_page_view.py similarity index 85% rename from frappe/website/doctype/page_view/page_view.py rename to frappe/website/doctype/web_page_view/web_page_view.py index 9c41e1c4aa..d09ee8ecb3 100644 --- a/frappe/website/doctype/page_view/page_view.py +++ b/frappe/website/doctype/web_page_view/web_page_view.py @@ -6,7 +6,7 @@ from __future__ import unicode_literals import frappe from frappe.model.document import Document -class PageView(Document): +class WebPageView(Document): pass @@ -16,7 +16,7 @@ def make_view_log(path, referrer=None, browser=None, version=None): path = path[1:] if is_tracking_enabled(): - view = frappe.new_doc("Page View") + view = frappe.new_doc("Web Page View") view.path = path view.referrer = referrer view.browser = browser @@ -28,7 +28,7 @@ def make_view_log(path, referrer=None, browser=None, version=None): @frappe.whitelist() def get_page_view_count(path): - return frappe.db.count("Page View", filters={'path': path}) + return frappe.db.count("Web Page View", filters={'path': path}) def is_tracking_enabled(): return frappe.db.get_value("Website Settings", "Website Settings", "enable_view_tracking") \ No newline at end of file diff --git a/frappe/website/website_theme/standard/standard.json b/frappe/website/website_theme/standard/standard.json index a719031c40..138168a648 100644 --- a/frappe/website/website_theme/standard/standard.json +++ b/frappe/website/website_theme/standard/standard.json @@ -5,12 +5,12 @@ "doctype": "Website Theme", "font_properties": "300,600", "idx": 26, - "modified": "2020-04-16 11:23:03.707474", + "modified": "2020-04-16 18:23:34.573404", "modified_by": "Administrator", "module": "Website", "name": "Standard", "owner": "Administrator", "theme": "Standard", "theme_scss": "\n\n\n\n\n\n\n$enable-shadows: false;\n$enable-gradients: false;\n$enable-rounded: false;\n\n@import \"frappe/public/scss/website\";\n\nbody {\n \n}", - "theme_url": "/assets/css/standard_25d87270.css" + "theme_url": "/assets/css/standard_a9402c50.css" } \ No newline at end of file diff --git a/frappe/www/website_script.js b/frappe/www/website_script.js index 9f0dd329c6..38f11a18a7 100644 --- a/frappe/www/website_script.js +++ b/frappe/www/website_script.js @@ -17,7 +17,7 @@ ga('send', 'pageview'); if (navigator.doNotTrack != 1) { frappe.ready(() => { let browser = frappe.utils.get_browser(); - frappe.call("frappe.website.doctype.page_view.page_view.make_view_log", { + frappe.call("frappe.website.doctype.web_page_view.web_page_view.make_view_log", { path: location.pathname, referrer: document.referrer, browser: browser.name, From 0bc153704ccd6ae69f11bd67748391fe6aeb2a99 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 16 Apr 2020 18:30:20 +0530 Subject: [PATCH 09/15] style: linting & formatting fixes --- .../js/frappe/form/sidebar/form_sidebar.js | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/frappe/public/js/frappe/form/sidebar/form_sidebar.js b/frappe/public/js/frappe/form/sidebar/form_sidebar.js index 9910227590..3da6bedb8c 100644 --- a/frappe/public/js/frappe/form/sidebar/form_sidebar.js +++ b/frappe/public/js/frappe/form/sidebar/form_sidebar.js @@ -69,7 +69,7 @@ frappe.ui.form.Sidebar = Class.extend({ }, refresh: function() { - if(this.frm.doc.__islocal) { + if (this.frm.doc.__islocal) { this.sidebar.toggle(false); } else { this.sidebar.toggle(true); @@ -84,18 +84,31 @@ frappe.ui.form.Sidebar = Class.extend({ if (this.frm.doc.route && frappe.boot.website_tracking_enabled) { let route = this.frm.doc.route; - frappe.utils.get_page_view_count(route).then(res => { - this.sidebar.find(".pageview-count").html(__("{0} Page Views", - ["" + res.message + ""])); + frappe.utils.get_page_view_count(route).then((res) => { + this.sidebar + .find(".pageview-count") + .html( + __("{0} Page Views", [String(res.message).bold()]) + ); }); } - this.sidebar.find(".modified-by").html(__("{0} edited this {1}", - ["" + frappe.user.full_name(this.frm.doc.modified_by) + "", - "
" + comment_when(this.frm.doc.modified)])); - this.sidebar.find(".created-by").html(__("{0} created this {1}", - ["" + frappe.user.full_name(this.frm.doc.owner) + "", - "
" + comment_when(this.frm.doc.creation)])); + this.sidebar + .find(".modified-by") + .html( + __("{0} edited this {1}", [ + frappe.user.full_name(this.frm.doc.modified_by).bold(), + "
" + comment_when(this.frm.doc.modified), + ]) + ); + this.sidebar + .find(".created-by") + .html( + __("{0} created this {1}", [ + frappe.user.full_name(this.frm.doc.owner).bold(), + "
" + comment_when(this.frm.doc.creation), + ]) + ); this.refresh_like(); frappe.ui.form.set_user_image(this.frm); From 7e0e6630bd66b1b29db886e597a82475ba581a16 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Fri, 17 Apr 2020 13:00:48 +0530 Subject: [PATCH 10/15] feat: add user timezone and unique visit check --- .../website/doctype/web_page_view/web_page_view.py | 14 ++++++++++++-- frappe/www/website_script.js | 6 ++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/frappe/website/doctype/web_page_view/web_page_view.py b/frappe/website/doctype/web_page_view/web_page_view.py index d09ee8ecb3..ba2d707e44 100644 --- a/frappe/website/doctype/web_page_view/web_page_view.py +++ b/frappe/website/doctype/web_page_view/web_page_view.py @@ -11,7 +11,15 @@ class WebPageView(Document): @frappe.whitelist(allow_guest=True) -def make_view_log(path, referrer=None, browser=None, version=None): +def make_view_log(path, referrer=None, browser=None, version=None, url=None, user_tz=None): + from pprint import pprint + request_dict = frappe.request.__dict__ + user_agent = request_dict.get('environ', {}).get('HTTP_USER_AGENT') + + is_unique = True + if referrer.startswith(url): + is_unique = False + if path.startswith('/'): path = path[1:] @@ -21,7 +29,9 @@ def make_view_log(path, referrer=None, browser=None, version=None): view.referrer = referrer view.browser = browser view.browser_version = version - view.date = frappe.utils.now_datetime() + view.time_zone = user_tz + view.user_agent = user_agent + view.is_unique = is_unique view.insert(ignore_permissions=True) return diff --git a/frappe/www/website_script.js b/frappe/www/website_script.js index 38f11a18a7..7fdc2e94d6 100644 --- a/frappe/www/website_script.js +++ b/frappe/www/website_script.js @@ -21,8 +21,10 @@ ga('send', 'pageview'); path: location.pathname, referrer: document.referrer, browser: browser.name, - version: browser.version + version: browser.version, + url: location.origin, + user_tz: Intl.DateTimeFormat().resolvedOptions().timeZone }) }) } -{% endif %} +{% endif %} \ No newline at end of file From 00cb903462fc53c3eb415ed83e7d0902eea24056 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Fri, 17 Apr 2020 15:47:56 +0530 Subject: [PATCH 11/15] feat: remove unused import --- frappe/website/doctype/web_page_view/web_page_view.py | 1 - 1 file changed, 1 deletion(-) diff --git a/frappe/website/doctype/web_page_view/web_page_view.py b/frappe/website/doctype/web_page_view/web_page_view.py index ba2d707e44..08625f9d6f 100644 --- a/frappe/website/doctype/web_page_view/web_page_view.py +++ b/frappe/website/doctype/web_page_view/web_page_view.py @@ -12,7 +12,6 @@ class WebPageView(Document): @frappe.whitelist(allow_guest=True) def make_view_log(path, referrer=None, browser=None, version=None, url=None, user_tz=None): - from pprint import pprint request_dict = frappe.request.__dict__ user_agent = request_dict.get('environ', {}).get('HTTP_USER_AGENT') From ba03e6ee5d0d18f1e2f7b49081c06e97cf56b28d Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Mon, 20 Apr 2020 16:36:52 +0530 Subject: [PATCH 12/15] fix: conflict --- frappe/website/website_theme/standard/standard.json | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/frappe/website/website_theme/standard/standard.json b/frappe/website/website_theme/standard/standard.json index 138168a648..2393b684ca 100644 --- a/frappe/website/website_theme/standard/standard.json +++ b/frappe/website/website_theme/standard/standard.json @@ -1,16 +1,20 @@ { + "button_gradients": 0, + "button_rounded_corners": 1, + "button_shadows": 0, "creation": "2015-02-19 13:37:33.925909", "custom": 0, "docstatus": 0, "doctype": "Website Theme", "font_properties": "300,600", - "idx": 26, - "modified": "2020-04-16 18:23:34.573404", + "idx": 27, + "modified": "2020-04-19 05:34:56.086984", "modified_by": "Administrator", "module": "Website", "name": "Standard", "owner": "Administrator", + "primary_color": "Blue", "theme": "Standard", - "theme_scss": "\n\n\n\n\n\n\n$enable-shadows: false;\n$enable-gradients: false;\n$enable-rounded: false;\n\n@import \"frappe/public/scss/website\";\n\nbody {\n \n}", - "theme_url": "/assets/css/standard_a9402c50.css" + "theme_scss": "\n\n$primary: #5e3aa8;\n\n\n\n\n$enable-shadows: false;\n$enable-gradients: false;\n$enable-rounded: true;\n\n@import \"frappe/public/scss/website\";\n\nbody {\n \n}", + "theme_url": "/assets/css/standard_999ef15b.css" } \ No newline at end of file From d265f00f9b28f6f8d0daaacc5a5895fe8e0d51f6 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Tue, 21 Apr 2020 12:38:04 +0530 Subject: [PATCH 13/15] fix: update timestamp --- .../doctype/website_settings/website_settings.json | 2 +- frappe/website/website_theme/standard/standard.json | 9 +++------ 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/frappe/website/doctype/website_settings/website_settings.json b/frappe/website/doctype/website_settings/website_settings.json index 635f0d3f22..708d2a0473 100644 --- a/frappe/website/doctype/website_settings/website_settings.json +++ b/frappe/website/doctype/website_settings/website_settings.json @@ -371,7 +371,7 @@ "issingle": 1, "links": [], "max_attachments": 10, - "modified": "2020-04-21 16:46:59.947403", + "modified": "2020-04-21 12:37:44.070662", "modified_by": "Administrator", "module": "Website", "name": "Website Settings", diff --git a/frappe/website/website_theme/standard/standard.json b/frappe/website/website_theme/standard/standard.json index 2393b684ca..099d57da01 100644 --- a/frappe/website/website_theme/standard/standard.json +++ b/frappe/website/website_theme/standard/standard.json @@ -1,20 +1,17 @@ { - "button_gradients": 0, - "button_rounded_corners": 1, - "button_shadows": 0, "creation": "2015-02-19 13:37:33.925909", "custom": 0, "docstatus": 0, "doctype": "Website Theme", "font_properties": "300,600", "idx": 27, - "modified": "2020-04-19 05:34:56.086984", + "modified": "2020-04-21 12:36:34.307990", "modified_by": "Administrator", "module": "Website", "name": "Standard", "owner": "Administrator", "primary_color": "Blue", "theme": "Standard", - "theme_scss": "\n\n$primary: #5e3aa8;\n\n\n\n\n$enable-shadows: false;\n$enable-gradients: false;\n$enable-rounded: true;\n\n@import \"frappe/public/scss/website\";\n\nbody {\n \n}", - "theme_url": "/assets/css/standard_999ef15b.css" + "theme_scss": "\n\n$primary: Blue;\n\n\n\n\n$enable-shadows: false;\n$enable-gradients: false;\n$enable-rounded: false;\n\n@import \"frappe/public/scss/website\";\n\nbody {\n \n}", + "theme_url": "/assets/css/standard_44af43a7.css" } \ No newline at end of file From ceabdf7403645873b24e25986e1ecec11e060833 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Tue, 21 Apr 2020 12:43:26 +0530 Subject: [PATCH 14/15] feat: better handling of website tracking flag --- frappe/public/js/frappe/form/sidebar/form_sidebar.js | 2 +- frappe/website/doctype/website_settings/website_settings.js | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/form/sidebar/form_sidebar.js b/frappe/public/js/frappe/form/sidebar/form_sidebar.js index 3da6bedb8c..a145e47149 100644 --- a/frappe/public/js/frappe/form/sidebar/form_sidebar.js +++ b/frappe/public/js/frappe/form/sidebar/form_sidebar.js @@ -82,7 +82,7 @@ frappe.ui.form.Sidebar = Class.extend({ this.frm.viewers.refresh(); this.frm.tags && this.frm.tags.refresh(this.frm.get_docinfo().tags); - if (this.frm.doc.route && frappe.boot.website_tracking_enabled) { + if (this.frm.doc.route && cint(frappe.boot.website_tracking_enabled)) { let route = this.frm.doc.route; frappe.utils.get_page_view_count(route).then((res) => { this.sidebar diff --git a/frappe/website/doctype/website_settings/website_settings.js b/frappe/website/doctype/website_settings/website_settings.js index 38e1ff993a..be294258f4 100644 --- a/frappe/website/doctype/website_settings/website_settings.js +++ b/frappe/website/doctype/website_settings/website_settings.js @@ -56,6 +56,10 @@ frappe.ui.form.on('Website Settings', { }); }, + enable_view_tracking: function(frm) { + frappe.boot.website_tracking_enabled = frm.doc.enable_view_tracking; + }, + set_parent_options: function(frm, doctype, name) { var item = frappe.get_doc(doctype, name); if(item.parentfield === "top_bar_items") { From 2fccdd5bd20cd4cd5c6852d7bb7bd607e0ec76b4 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Tue, 21 Apr 2020 13:34:00 +0530 Subject: [PATCH 15/15] fix: resolve conflicts in standard.json --- frappe/website/website_theme/standard/standard.json | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/frappe/website/website_theme/standard/standard.json b/frappe/website/website_theme/standard/standard.json index 099d57da01..a799f25425 100644 --- a/frappe/website/website_theme/standard/standard.json +++ b/frappe/website/website_theme/standard/standard.json @@ -1,17 +1,20 @@ { + "button_gradients": 0, + "button_rounded_corners": 1, + "button_shadows": 0, "creation": "2015-02-19 13:37:33.925909", "custom": 0, "docstatus": 0, "doctype": "Website Theme", "font_properties": "300,600", + "font_size": "", "idx": 27, - "modified": "2020-04-21 12:36:34.307990", + "modified": "2020-04-21 02:10:31.761219", "modified_by": "Administrator", "module": "Website", "name": "Standard", "owner": "Administrator", - "primary_color": "Blue", "theme": "Standard", - "theme_scss": "\n\n$primary: Blue;\n\n\n\n\n$enable-shadows: false;\n$enable-gradients: false;\n$enable-rounded: false;\n\n@import \"frappe/public/scss/website\";\n\nbody {\n \n}", - "theme_url": "/assets/css/standard_44af43a7.css" + "theme_scss": "$enable-shadows: false;\n$enable-gradients: false;\n$enable-rounded: true;\n\n@import \"frappe/public/scss/website\";\n\n", + "theme_url": "/assets/css/standard_style.css" } \ No newline at end of file