Merge pull request #9959 from scmmishra/tracking

feat: web page tracking
This commit is contained in:
Prssanna Desai 2020-04-21 14:08:41 +05:30 committed by GitHub
commit f9e898eea4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
15 changed files with 236 additions and 12 deletions

View file

@ -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.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
@ -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()

View file

@ -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);
@ -81,12 +81,34 @@ frappe.ui.form.Sidebar = Class.extend({
}
this.frm.viewers.refresh();
this.frm.tags && this.frm.tags.refresh(this.frm.get_docinfo().tags);
this.sidebar.find(".modified-by").html(__("{0} edited this {1}",
["<strong>" + frappe.user.full_name(this.frm.doc.modified_by) + "</strong>",
"<br>" + comment_when(this.frm.doc.modified)]));
this.sidebar.find(".created-by").html(__("{0} created this {1}",
["<strong>" + frappe.user.full_name(this.frm.doc.owner) + "</strong>",
"<br>" + comment_when(this.frm.doc.creation)]));
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
.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).bold(),
"<br>" + 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(),
"<br>" + comment_when(this.frm.doc.creation),
])
);
this.refresh_like();
frappe.ui.form.set_user_image(this.frm);

View file

@ -105,6 +105,7 @@
</li>
</ul>
<ul class="list-unstyled sidebar-menu text-muted">
<li class="pageview-count"></li>
<li class="modified-by"></li>
<li class="created-by"></li>
</ul>

View file

@ -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.web_page_view.web_page_view.get_page_view_count", {
path: route
});
};

View file

@ -745,7 +745,36 @@ 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

View file

@ -273,7 +273,8 @@ body[data-route^="Module"] .main-menu {
}
.layout-side-section .form-sidebar {
.modified-by {
.modified-by,
.pageview-count {
margin-bottom: 15px;
}
}

View file

@ -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 TestWebPageView(unittest.TestCase):
pass

View file

@ -0,0 +1,8 @@
// Copyright (c) 2020, Frappe Technologies and contributors
// For license information, please see license.txt
frappe.ui.form.on('Web Page View', {
// refresh: function(frm) {
// }
});

View file

@ -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": "Web 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
}

View file

@ -0,0 +1,43 @@
# -*- 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 WebPageView(Document):
pass
@frappe.whitelist(allow_guest=True)
def make_view_log(path, referrer=None, browser=None, version=None, url=None, user_tz=None):
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:]
if is_tracking_enabled():
view = frappe.new_doc("Web Page View")
view.path = path
view.referrer = referrer
view.browser = browser
view.browser_version = version
view.time_zone = user_tz
view.user_agent = user_agent
view.is_unique = is_unique
view.insert(ignore_permissions=True)
return
@frappe.whitelist()
def get_page_view_count(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")

View file

@ -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") {

View file

@ -33,6 +33,7 @@
"footer_items",
"hide_footer_signup",
"integrations",
"enable_view_tracking",
"enable_google_indexing",
"authorize_api_indexing_access",
"indexing_refresh_token",
@ -196,7 +197,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.",
@ -330,6 +331,12 @@
"fieldtype": "Button",
"label": "Authorize API Indexing Access"
},
{
"default": "0",
"fieldname": "enable_view_tracking",
"fieldtype": "Check",
"label": "Enable In App Website Tracking"
},
{
"default": "Standard",
"fieldname": "footer_type",
@ -364,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",

View file

@ -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)

View file

@ -12,3 +12,19 @@ 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.web_page_view.web_page_view.make_view_log", {
path: location.pathname,
referrer: document.referrer,
browser: browser.name,
version: browser.version,
url: location.origin,
user_tz: Intl.DateTimeFormat().resolvedOptions().timeZone
})
})
}
{% endif %}