feat: added website analytics report
This commit is contained in:
parent
fb66f85d63
commit
f684756fba
2 changed files with 98 additions and 20 deletions
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue