]>
git.ipfire.org Git - ipfire.org.git/blob - src/backend/analytics.py
8 from .decorators
import *
21 class Analytics(misc
.Object
):
22 def log_unique_visit(self
, address
, referrer
, country_code
=None, user_agent
=None,
23 host
=None, uri
=None, source
=None, medium
=None, campaign
=None, content
=None,
26 Logs a unique visit to this a page
28 asn
, query_args
, bot
= None, None, False
32 url
= urllib
.parse
.urlparse(referrer
)
34 # Remove everything after ? and #
35 referrer
= "%s://%s%s" % (url
.scheme
, url
.netloc
, url
.path
)
37 # Drop anything that isn't valid
38 for invalid_referrer
in INVALID_REFERRERS
:
39 if referrer
.startswith(invalid_referrer
):
49 uri
, _
, query_args
= uri
.partition("?")
51 # Parse query arguments
53 query_args
= urllib
.parse
.parse_qs(query_args
)
57 bot
= "bot" in user_agent
.lower()
65 analytics_unique_visits
84 %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s
87 host
, uri
, json
.dumps(query_args
or {}), country_code
, asn
, referrer
or "",
88 user_agent
, q
, bot
, source
or "", medium
or "", campaign
or "", content
or "",
92 def get_total_page_views(self
, host
, since
=None):
93 # Make since an absolute timestamp
94 if since
and isinstance(since
, datetime
.timedelta
):
95 since
= datetime
.datetime
.utcnow() - since
102 analytics_unique_visits
110 res
= self
.db
.get("""
114 analytics_unique_visits
125 def get_page_views(self
, host
, uri
, since
=None):
126 # Make since an absolute timestamp
127 if since
and isinstance(since
, datetime
.timedelta
):
128 since
= datetime
.datetime
.utcnow() - since
131 res
= self
.db
.get("""
135 analytics_unique_visits
142 """, host
, uri
, since
,
145 res
= self
.db
.get("""
149 analytics_unique_visits
164 def get_most_popular_docs_pages(self
, host
, since
=None, offset
=None, limit
=None):
165 # Make since an absolute timestamp
166 if since
and isinstance(since
, datetime
.timedelta
):
167 since
= datetime
.datetime
.utcnow() - since
169 pages
= self
.backend
.wiki
._get
_pages
("""
176 wiki ON wiki_current.id = wiki.id
178 analytics_unique_visits
179 ON (CASE WHEN wiki.page = '/' THEN '/docs'
180 ELSE '/docs' || wiki.page END) = analytics_unique_visits.uri
193 """, host
, limit
, offset
,
200 def get_search_queries(self
, host
, uri
, limit
=None):
201 res
= self
.db
.query("""
206 analytics_unique_visits
217 """, host
, uri
, limit
,
220 return { " ".join(row
.q
) : row
.c
for row
in res
}