This repository has been archived by the owner on Nov 3, 2021. It is now read-only.
/
views.py
106 lines (81 loc) · 3.39 KB
/
views.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
from django.conf import settings
from django.core.exceptions import ValidationError
from django import http
from django.shortcuts import get_object_or_404
from django.views.decorators.vary import vary_on_headers
import jingo
from tower import ugettext as _
from input.decorators import cache_page
from input.urlresolvers import reverse
from .forms import HappyForm, SadForm
from .models import Opinion, ClusterType
from .validators import validate_ua
def enforce_user_agent(f):
"""
View decorator enforcing feedback from the latest beta users only.
Can be disabled with settings.ENFORCE_USER_AGENT = False.
"""
def wrapped(request, *args, **kwargs):
# Validate User-Agent request header.
ua = request.META.get('HTTP_USER_AGENT', None)
try:
validate_ua(ua)
except ValidationError:
if request.method == 'GET':
return http.HttpResponseRedirect(reverse('feedback.need_beta'))
else:
return http.HttpResponseBadRequest(
_('User-Agent request header must be set.'))
# if we made it here, it's a latest beta user
return f(request, ua=ua, *args, **kwargs)
return wrapped
@vary_on_headers('User-Agent')
@enforce_user_agent
@cache_page
def give_feedback(request, ua, positive):
"""Feedback page (positive or negative)."""
# Positive or negative feedback form?
Formtype = positive and HappyForm or SadForm
if request.method == 'POST':
form = Formtype(request.POST)
if form.is_valid():
# Remove URL if checkbox disabled.
if not form.cleaned_data.get('add_url', False):
form.cleaned_data['url'] = ''
# Save to the DB.
new_opinion = Opinion(
positive=positive, url=form.cleaned_data.get('url', ''),
description=form.cleaned_data['description'],
user_agent=ua)
new_opinion.save()
return http.HttpResponseRedirect(reverse('feedback.thanks'))
else:
# URL is fed in by the feedback extension.
url = request.GET.get('url', '')
form = Formtype(initial={'url': url, 'add_url': False})
data = {'form': form, 'positive': positive}
template = ('feedback/mobile/feedback.html' if request.mobile_site else
'feedback/feedback.html')
return jingo.render(request, template, data)
def need_beta(request):
"""Encourage people to download a current beta version."""
template = 'feedback/%sneed_beta.html' % (
'mobile/' if request.mobile_site else '')
return jingo.render(request, template)
def thanks(request):
"""Thank you for your feedback."""
template = 'feedback/%sthanks.html' % (
'mobile/' if request.mobile_site else '')
return jingo.render(request, template)
@cache_page
def clusters(request):
"""List the various clusters of data we have."""
return jingo.render(request, 'feedback/clusters.html',
{'clusters': ClusterType.objects.all()})
@cache_page
def cluster(request, platform, version, feeling, frequency):
"""Opinions clustered by text similarity."""
t = get_object_or_404(ClusterType, platform=platform, feeling=feeling,
frequency=frequency, version=version)
return jingo.render(request, 'feedback/cluster.html',
{'clusters': t.clusters.all()[:30]})