feat: added website analytics report

This commit is contained in:
Shivam Mishra 2020-05-05 18:22:04 +05:30
parent fb66f85d63
commit f684756fba
2 changed files with 98 additions and 20 deletions

View file

@ -9,14 +9,12 @@ frappe.query_reports["Website Analytics"] = {
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",

View file

@ -3,6 +3,7 @@
from __future__ import unicode_literals
import frappe
from datetime import datetime
from frappe.utils.dateutils import get_date_range
def execute(filters=None):
@ -11,6 +12,16 @@ def execute(filters=None):
class WebsiteAnalytics(object):
def __init__(self, filters=None):
self.filters = frappe._dict(filters or {})
if not self.filters.to_date:
self.filters.to_date = datetime.now()
if not self.filters.from_date:
self.filters.from_date = frappe.utils.add_days(self.filters.to_date, -7)
if not self.filters.range:
self.filters.range = "D"
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]]}
@ -19,7 +30,8 @@ class WebsiteAnalytics(object):
data = self.get_data()
chart = self.get_chart_data()
summary = self.get_report_summary()
return columns, data, None, chart, summary
return columns, data[:250], None, chart, summary
def get_columns(self):
return [
@ -34,38 +46,105 @@ class WebsiteAnalytics(object):
"label": "Page Views",
"fieldtype": "Int",
"width": 150
},
{
"fieldname": "unique_count",
"label": "Unique Visitors",
"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')
pg_query = """
SELECT
path,
COUNT(*) as count,
COUNT(CASE WHEN CAST(is_unique as Integer) = 1 THEN 1 END) as unique_count
FROM `tabWeb Page View`
WHERE coalesce("tabWeb Page View".creation, '0001-01-01') BETWEEN %s AND %s
GROUP BY path
ORDER BY count desc
"""
mariadb_query = """
SELECT
path,
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 path
ORDER BY count desc
"""
data = frappe.db.multisql({
"mariadb": mariadb_query,
"postgres": pg_query
}, (self.filters.from_date, self.filters.to_date))
return data
def get_chart_data(self):
def _get_field_for_chart(filters_range):
field = 'creation'
date_format = '%Y-%m-%d'
def _get_query_for_mariadb(self):
filters_range = self.filters.range
field = 'creation'
date_format = '%Y-%m-%d'
if filters_range == "W":
field = 'ADDDATE(creation, INTERVAL 1-DAYOFWEEK(creation) DAY)'
if filters_range == "W":
field = 'ADDDATE(creation, INTERVAL 1-DAYOFWEEK(creation) DAY)'
elif filters_range == "M":
date_format = '%Y-%m-01'
elif filters_range == "M":
date_format = '%Y-%m-01'
return field, date_format
field, date_format = _get_field_for_chart(self.filters.range)
self.chart_data = frappe.db.sql("""
query = """
SELECT
DATE_FORMAT({0}, %s) as date,
COUNT(*) as count,
count(CASE WHEN is_unique = 1 THEN 1 END) as unique_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)
""".format(field)
values = (date_format, self.filters.from_date, self.filters.to_date, date_format)
return query, values
def _get_query_for_postgres(self):
filters_range = self.filters.range
field = 'creation'
granularity = 'day'
if filters_range == "W":
granularity = 'week'
elif filters_range == "M":
granularity = 'day'
query = """
SELECT
DATE_TRUNC(%s, {0}) as date,
COUNT(*) as count,
COUNT(CASE WHEN CAST(is_unique as Integer) = 1 THEN 1 END) as unique_count
FROM "tabWeb Page View"
WHERE coalesce("tabWeb Page View".{0}, '0001-01-01') BETWEEN %s AND %s
GROUP BY date_trunc(%s, {0})
ORDER BY date
""".format(field)
values = (granularity, self.filters.from_date, self.filters.to_date, granularity)
return query, values
def get_chart_data(self):
current_dialect = frappe.db.db_type or 'mariadb'
if current_dialect == 'mariadb':
query, values = self._get_query_for_mariadb()
else:
query, values = self._get_query_for_postgres()
self.chart_data = frappe.db.sql(query, values=values, as_dict=1)
return self.prepare_chart_data(self.chart_data)
@ -114,7 +193,8 @@ class WebsiteAnalytics(object):
},
'axisOptions': {
'xIsSeries': 1
}
},
'colors': ['#7cd6fd', '#5e64ff']
}
return chart