Skip to content

Commit

Permalink
adding more to the reports framework
Browse files Browse the repository at this point in the history
  • Loading branch information
Val Kolovos committed Oct 24, 2014
1 parent 7e35bca commit d2626f9
Show file tree
Hide file tree
Showing 58 changed files with 20,422 additions and 1,259 deletions.
5 changes: 5 additions & 0 deletions djanalytics/charts/forms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from djanalytics.reports.forms import DateRangeForm
from django import forms

class PageViewChartForm(DateRangeForm):
start_page = forms.CharField(required=False)
94 changes: 50 additions & 44 deletions djanalytics/charts/views/base.py
Original file line number Diff line number Diff line change
@@ -1,62 +1,68 @@
from datetime import datetime, timedelta
from dateutil import parser

from django.conf import settings
from django.http.response import HttpResponseBadRequest
from django.views.generic.base import TemplateView
from django.utils import timezone
from django.views.generic import FormView

from djanalytics.reports.forms import DateRangeForm

try:
import pytz
except ImportError:
pytz = None

from djanalytics import models

class DateRangeChartView(TemplateView):
class DateRangeChartView(FormView):

form_class = DateRangeForm

def __init__(self, *args, **kwargs):
super(DateRangeChartView, self).__init__(*args, **kwargs)
self.client = None
self.form = None

def get_initial(self):
return {
'start_date': timezone.now() - timedelta(days=7),
'end_date': timezone.now()
}

def get(self, request, *args, **kwargs):
client_id = request.GET.get('client_id')
try:
self.client = models.Client.objects.get(uuid=client_id)
except models.Client.DoesNotExist:
return HttpResponseBadRequest(content='Bad or missing client id')
return super(DateRangeChartView, self).get(request, *args, **kwargs)
def form_valid(self, form):
return self.render_to_response(self.get_context_data(form=form))

def get_context_data(self, **kwargs):
context_data = super(DateRangeChartView, self).get_context_data(**kwargs)
if self.request.GET.get('start_date'):
start_date = parser.parse(
self.request.GET.get('start_date')
self.form = context_data.get('form')
if self.form.is_valid():
if self.form.cleaned_data.get('start_date'):
start_date = self.form.cleaned_data['start_date']
else:
start_date = timezone.now() - timedelta(days=7)
if self.form.cleaned_data.get('end_date'):
end_date = self.form.cleaned_data['end_date']
else:
end_date = timezone.now()
self.start_date = datetime(
start_date.year, start_date.month,
start_date.day, 0, 0, 0
)
else:
start_date = timezone.now() - timedelta(days=7)
if self.request.GET.get('end_date'):
end_date = parser.parse(
self.request.GET.get('end_date')
self.end_date = datetime(
end_date.year, end_date.month,
end_date.day, 23, 59
)
else:
end_date = timezone.now()
self.start_date = datetime(
start_date.year, start_date.month,
start_date.day, 0, 0, 0
)
self.end_date = datetime(
end_date.year, end_date.month,
end_date.day, 23, 59
)
if settings.USE_TZ:
if pytz:
tz = pytz.timezone(settings.TIME_ZONE)
else:
tz = timezone.UTC()
if not timezone.is_aware(self.start_date):
self.start_date = tz.localize(self.start_date)
if not timezone.is_aware(self.end_date):
self.end_date = tz.localize(self.end_date)
context_data.update({
'start_date': self.start_date.strftime('%m/%d/%Y'),
'end_date': self.end_date.strftime('%m/%d/%Y'),
'client_id': self.client.uuid,
})
self.client = self.form.cleaned_data['client']
if settings.USE_TZ:
if pytz:
tz = pytz.timezone(settings.TIME_ZONE)
else:
tz = timezone.UTC()
if not timezone.is_aware(self.start_date):
self.start_date = tz.localize(self.start_date)
if not timezone.is_aware(self.end_date):
self.end_date = tz.localize(self.end_date)
context_data.update({
'start_date': self.start_date.strftime('%m/%d/%Y'),
'end_date': self.end_date.strftime('%m/%d/%Y'),
'client_id': self.client.uuid,
})
return context_data
4 changes: 3 additions & 1 deletion djanalytics/charts/views/exit_page.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,12 @@


class ExitPage(DateRangeChartView):
template_name = 'charts/exit_page.html'
template_name = 'djanalytics/charts/exit_page.html'

def get_context_data(self, **kwargs):
context_data = super(ExitPage, self).get_context_data(**kwargs)
if not self.client:
return context_data
exit_page_data = defaultdict(int)
sessions_query = models.RequestEvent.objects.values(
'tracking_key'
Expand Down
19 changes: 10 additions & 9 deletions djanalytics/charts/views/page_visit.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,25 +4,26 @@
from django.db.models import Count
from django.utils.datastructures import SortedDict

from djanalytics.charts.views.base import DateRangeChartView
from djanalytics import models
from djanalytics.charts.views.base import DateRangeChartView
from djanalytics.charts.forms import PageViewChartForm


class PageVisit(DateRangeChartView):
template_name = 'charts/page_visit.html'

def get(self, request, *args, **kwargs):
self.start_page = request.GET.get('start_page')
return super(PageVisit, self).get(request, *args, **kwargs)
template_name = 'djanalytics/charts/page_visit.html'
form_class = PageViewChartForm

def get_context_data(self, **kwargs):
context_data = super(PageVisit, self).get_context_data(**kwargs)
if not self.client:
return context_data
query = models.RequestEvent.objects.filter(
client=self.client,
created__range=[self.start_date, self.end_date]
)
if self.start_page:
query = query.filter(path=self.start_page)
start_page = self.form.cleaned_data.get('start_page')
if start_page:
query = query.filter(path=start_page)
try:
target_page = query.values('path').annotate(visits=Count('pk')).order_by('-visits')[0]
except IndexError:
Expand Down Expand Up @@ -56,7 +57,7 @@ def get_context_data(self, **kwargs):
}
context_data.update({
'page_info': page_info,
'start_page': self.start_page or target_page['path'],
'start_page': start_page or target_page['path'],
})
return context_data

Expand Down
4 changes: 3 additions & 1 deletion djanalytics/charts/views/referrer.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,12 @@


class Referrer(DateRangeChartView):
template_name = 'charts/referrer.html'
template_name = 'djanalytics/charts/referrer.html'

def get_context_data(self, **kwargs):
context_data = super(Referrer, self).get_context_data(**kwargs)
if not self.client:
return context_data
referrer_query = models.RequestEvent.objects.filter(
client=self.client,
created__range=[self.start_date, self.end_date]
Expand Down
4 changes: 3 additions & 1 deletion djanalytics/charts/views/session.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,12 @@


class SessionChart(DateRangeChartView):
template_name = 'charts/sessions.html'
template_name = 'djanalytics/charts/sessions.html'

def get_context_data(self, **kwargs):
context_data = super(SessionChart, self).get_context_data(**kwargs)
if not self.client:
return context_data
data = [ ('Date', 'Sessions Created') ]
date_dict = defaultdict(int)
for row in models.RequestEvent.objects.values(
Expand Down
6 changes: 4 additions & 2 deletions djanalytics/charts/views/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,12 @@


class UserChart(DateRangeChartView):
template_name = 'charts/users.html'
template_name = 'djanalytics/charts/users.html'

def get_context_data(self, **kwargs):
context_data = super(UserChart, self).get_context_data(**kwargs)
if not self.client:
return context_data
data = [ ('Date', 'Users Created') ]
date_dict = defaultdict(int)
for row in models.RequestEvent.objects.values(
Expand All @@ -31,7 +33,7 @@ def get_context_data(self, **kwargs):
chart = gchart.LineChart(SimpleDataSource(data=data))
context_data.update(
{
'chart': chart
'chart': chart,
}
)
return context_data
Expand Down
Empty file added djanalytics/reports/__init__.py
Empty file.
20 changes: 20 additions & 0 deletions djanalytics/reports/forms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from django import forms
from djanalytics import models


class ClientModelChoiceField(forms.ModelChoiceField):

def label_from_instance(self, obj):
return obj.name


class DateRangeForm(forms.Form):

client = ClientModelChoiceField(
queryset=models.Client.objects.all(),
empty_label=None,
to_field_name='uuid',
)
start_date = forms.DateField(required=False)
end_date = forms.DateField(required=False)

Loading

0 comments on commit d2626f9

Please sign in to comment.