feat: added website analytics report
This commit is contained in:
parent
acc7de7335
commit
da60242427
5 changed files with 206 additions and 0 deletions
0
frappe/website/report/__init__.py
Normal file
0
frappe/website/report/__init__.py
Normal file
0
frappe/website/report/website_analytics/__init__.py
Normal file
0
frappe/website/report/website_analytics/__init__.py
Normal file
34
frappe/website/report/website_analytics/website_analytics.js
Normal file
34
frappe/website/report/website_analytics/website_analytics.js
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
// Copyright (c) 2016, Frappe Technologies and contributors
|
||||
// For license information, please see license.txt
|
||||
/* eslint-disable */
|
||||
|
||||
frappe.query_reports["Website Analytics"] = {
|
||||
"filters": [
|
||||
{
|
||||
fieldname: "from_date",
|
||||
label: __("From Date"),
|
||||
fieldtype: "Date",
|
||||
default: frappe.datetime.add_days(frappe.datetime.now_date(true), -7),
|
||||
reqd: 1
|
||||
},
|
||||
{
|
||||
fieldname:"to_date",
|
||||
label: __("To Date"),
|
||||
fieldtype: "Date",
|
||||
default: frappe.datetime.now_date(true),
|
||||
reqd: 1
|
||||
},
|
||||
{
|
||||
fieldname: "range",
|
||||
label: __("Range"),
|
||||
fieldtype: "Select",
|
||||
options: [
|
||||
{ "value": "D", "label": __("Daily") },
|
||||
{ "value": "W", "label": __("Weekly") },
|
||||
{ "value": "M", "label": __("Monthly") },
|
||||
],
|
||||
default: "D",
|
||||
reqd: 1
|
||||
}
|
||||
]
|
||||
};
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
{
|
||||
"add_total_row": 0,
|
||||
"creation": "2020-04-17 13:04:45.770148",
|
||||
"disable_prepared_report": 0,
|
||||
"disabled": 0,
|
||||
"docstatus": 0,
|
||||
"doctype": "Report",
|
||||
"idx": 0,
|
||||
"is_standard": "Yes",
|
||||
"modified": "2020-04-17 16:10:30.168312",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Website",
|
||||
"name": "Website Analytics",
|
||||
"owner": "Administrator",
|
||||
"prepared_report": 0,
|
||||
"ref_doctype": "Web Page View",
|
||||
"report_name": "Website Analytics",
|
||||
"report_type": "Script Report",
|
||||
"roles": [
|
||||
{
|
||||
"role": "System Manager"
|
||||
},
|
||||
{
|
||||
"role": "Website Manager"
|
||||
}
|
||||
]
|
||||
}
|
||||
145
frappe/website/report/website_analytics/website_analytics.py
Normal file
145
frappe/website/report/website_analytics/website_analytics.py
Normal file
|
|
@ -0,0 +1,145 @@
|
|||
# Copyright (c) 2013, Frappe Technologies and contributors
|
||||
# For license information, please see license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import frappe
|
||||
from frappe.utils.dateutils import get_date_range
|
||||
|
||||
def execute(filters=None):
|
||||
return WebsiteAnalytics(filters).run()
|
||||
|
||||
class WebsiteAnalytics(object):
|
||||
def __init__(self, filters=None):
|
||||
self.filters = frappe._dict(filters or {})
|
||||
self.filters.to_date = frappe.utils.add_days(self.filters.to_date, 1)
|
||||
self.query_filters = {'creation': ['between', [self.filters.from_date, self.filters.to_date]]}
|
||||
|
||||
def run(self):
|
||||
columns = self.get_columns()
|
||||
data = self.get_data()
|
||||
summary = self.get_report_summary()
|
||||
chart = self.get_chart_data()
|
||||
return columns, data, None, chart, summary
|
||||
|
||||
def get_columns(self):
|
||||
return [
|
||||
{
|
||||
"fieldname": "path",
|
||||
"label": "Page",
|
||||
"fieldtype": "Data",
|
||||
"width": 300
|
||||
},
|
||||
{
|
||||
"fieldname": "count",
|
||||
"label": "Page Views",
|
||||
"fieldtype": "Int",
|
||||
"width": 150
|
||||
}
|
||||
]
|
||||
|
||||
def get_data(self):
|
||||
data = frappe.get_all("Web Page View", fields=['path', 'count(*) as count'], filters=self.query_filters, group_by="path", order_by='count desc')
|
||||
return data
|
||||
|
||||
def get_chart_data(self):
|
||||
def _get_field_for_chart(filters_range):
|
||||
field = 'creation'
|
||||
date_format = '%Y-%m-%d'
|
||||
|
||||
if filters_range == "W":
|
||||
field = 'ADDDATE(creation, INTERVAL 1-DAYOFWEEK(creation) DAY)'
|
||||
|
||||
elif filters_range == "M":
|
||||
date_format = '%Y-%m-01'
|
||||
|
||||
return field, date_format
|
||||
|
||||
field, date_format = _get_field_for_chart(self.filters.range)
|
||||
|
||||
data = frappe.db.sql("""
|
||||
SELECT
|
||||
DATE_FORMAT({0}, %s) as date,
|
||||
COUNT(*) as count,
|
||||
count(CASE WHEN is_unique = 1 THEN 1 END) as unique_count
|
||||
FROM `tabWeb Page View`
|
||||
WHERE creation BETWEEN %s AND %s
|
||||
GROUP BY DATE_FORMAT({0}, %s)
|
||||
ORDER BY creation
|
||||
""".format(field), (date_format, self.filters.from_date, self.filters.to_date, date_format), as_dict=1, debug=1)
|
||||
|
||||
return self.prepare_chart_data(data)
|
||||
|
||||
def prepare_chart_data(self, data):
|
||||
date_range = get_date_range(self.filters.from_date, self.filters.to_date, self.filters.range)
|
||||
if self.filters.range == "M":
|
||||
date_range = [frappe.utils.add_days(dd, 1) for dd in date_range]
|
||||
|
||||
labels = []
|
||||
total_dataset = []
|
||||
unique_dataset = []
|
||||
|
||||
def get_data_for_date(date):
|
||||
for item in data:
|
||||
item_date = frappe.utils.get_datetime(item.get("date")).date()
|
||||
if item_date == date.date():
|
||||
return item
|
||||
return {'count': 0, 'unique_count': 0}
|
||||
|
||||
|
||||
for date in date_range:
|
||||
labels.append(date.strftime("%b %d %Y"))
|
||||
match = get_data_for_date(date)
|
||||
total_dataset.append(match.get('count', 0))
|
||||
unique_dataset.append(match.get('unique_count', 0))
|
||||
|
||||
chart = {
|
||||
"data": {
|
||||
'labels': labels,
|
||||
'datasets': [
|
||||
{
|
||||
'name': "Total Views",
|
||||
'type': 'line',
|
||||
'values': total_dataset
|
||||
},
|
||||
{
|
||||
'name': "Unique Visits",
|
||||
'type': 'line',
|
||||
'values': unique_dataset
|
||||
}
|
||||
]
|
||||
},
|
||||
"type": "axis-mixed",
|
||||
'lineOptions': {
|
||||
'regionFill': 1,
|
||||
},
|
||||
'axisOptions': {
|
||||
'xIsSeries': 1
|
||||
}
|
||||
}
|
||||
|
||||
return chart
|
||||
|
||||
|
||||
def get_report_summary(self):
|
||||
summary_data = frappe.get_all("Web Page View", fields=['is_unique', 'count(*) as count'], filters=self.query_filters, group_by="is_unique")
|
||||
|
||||
total_count = 0
|
||||
unique_count = 0
|
||||
for data in summary_data:
|
||||
if data.get('is_unique'):
|
||||
unique_count = data.get('count')
|
||||
total_count += data.get('count')
|
||||
report_summary = [
|
||||
{
|
||||
"value": total_count,
|
||||
"label": "Total Page Views",
|
||||
"datatype": "Int",
|
||||
},
|
||||
{
|
||||
"value": unique_count,
|
||||
"label": "Unique Page Views",
|
||||
"datatype": "Int",
|
||||
},
|
||||
|
||||
]
|
||||
return report_summary
|
||||
Loading…
Add table
Reference in a new issue