-
Notifications
You must be signed in to change notification settings - Fork 0
/
vote.py
139 lines (118 loc) · 5.82 KB
/
vote.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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
import jinja2
import os
import urllib
import webapp2
import rankdata
import category
import item
from google.appengine.api import users
jinja_environment = jinja2.Environment(loader=jinja2.FileSystemLoader(os.path.dirname(__file__)))
select_category_page_path = 'vote/selectcategory'
select_category_action_path = 'vote/selectcategoryaction'
vote_item_page_path = 'vote/voteitem'
vote_item_action_path = 'vote/voteitemaction'
result_page_path = 'vote/result'
result_action_path = 'vote/resultaction'
class SelectCategoryPage(webapp2.RequestHandler):
"""Construct select category HTMl page
"""
def get(self):
"""Handle user request
The select category HTML page would list all categories of all
users which have at least two items. The user should select one
of them.
"""
invalid_select = self.request.get('select_category')
user = users.get_current_user()
categories = category.get_categories(item_number=2)
url = users.create_logout_url(self.request.uri) if user else users.create_login_url(self.request.uri)
template_values = {
'categories': categories,
'url': url,
'user': user,
'invalid_select': invalid_select,
}
template = jinja_environment.get_template('{path}.html'.format(path=select_category_page_path))
self.response.out.write(template.render(template_values))
class SelectCategoryAction(webapp2.RequestHandler):
"""Handle select category form submition and construct vote HTML page
"""
def get(self):
"""Handle user request
The vote HTML page would list two random items in category and
the result that the user just voted.
"""
category_key = self.request.get('category_key')
if not category_key:
self.redirect('/{path}?'.format(path=select_category_page_path) +
urllib.urlencode({'select_category': 'Nothing'}))
return
user = users.get_current_user()
url = users.create_logout_url(self.request.uri) if user else users.create_login_url(self.request.uri)
win_item_name = self.request.get('win')
lose_item_name = self.request.get('lose')
category_data = category.get_category_by_key(key=category_key)
vote_items = item.get_random_items(category_key=category_key)
win_item = item.get_item_by_key(category_key=category_key, item_name=win_item_name) if win_item_name else None
lose_item = item.get_item_by_key(category_key=category_key, item_name=lose_item_name) if lose_item_name else None
template_values = {
'category': category_data,
'items': vote_items,
'url': url,
'user': user,
'win': win_item,
'lose': lose_item,
}
template = jinja_environment.get_template('{path}.html'.format(path=vote_item_page_path))
self.response.out.write(template.render(template_values))
class VoteItemAction(webapp2.RequestHandler):
"""Handle vote form submition
"""
def post(self):
"""Handle user request
"""
category_key = self.request.get('category_key')
method = self.request.get('method')
if 'Vote' in method:
item_names = self.request.get_all('item_name')
win_item_name = self.request.get('win_item_name')
lose_item_names = [item_name for item_name in item_names if item_name != win_item_name]
win_item = item.get_item_by_key(category_key=category_key, item_name=win_item_name)
lose_item = item.get_item_by_key(category_key=category_key, item_name=lose_item_names[0])
win_item.number_of_win += 1
win_item.percentage = round(float(win_item.number_of_win) / float(win_item.number_of_win + win_item.number_of_lose) * 100, 3)
lose_item.number_of_lose += 1
lose_item.percentage = round(float(lose_item.number_of_win) / float(lose_item.number_of_win + lose_item.number_of_lose) * 100, 3)
win_item.put()
lose_item.put()
self.redirect('/{path}?'.format(path=select_category_action_path) +
urllib.urlencode({'category_key': category_key, 'win': win_item_name, 'lose': lose_item_names[0]}))
elif 'Skip' in method:
self.redirect('/{path}?'.format(path=select_category_action_path) +
urllib.urlencode({'category_key': category_key}))
class ResultPage(webapp2.RequestHandler):
"""Construct vote result HTML page
"""
def get(self):
"""Handle user request
The vote result HTML page would list statistics of vote ordered by
wining percentage in descending.
"""
category_key = self.request.get('category_key')
user = users.get_current_user()
url = users.create_logout_url(self.request.uri) if user else users.create_login_url(self.request.uri)
category_data = category.get_category_by_key(key=category_key)
items = item.get_items(author=category_data.author, category_name=category_data.name, order='-percentage')
template_values = {
'category': category_data,
'items': items,
'url': url,
'user': user,
}
template = jinja_environment.get_template('{path}.html'.format(path=result_page_path))
self.response.out.write(template.render(template_values))
app = webapp2.WSGIApplication([('/{path}'.format(path=select_category_page_path), SelectCategoryPage),
('/{path}'.format(path=select_category_action_path), SelectCategoryAction),
('/{path}'.format(path=vote_item_action_path), VoteItemAction),
('/{path}'.format(path=result_action_path), ResultPage)],
debug=True)