Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: sitescripts/notifications/web/notification.py

Issue 4883267715072000: Issue 2276 - Handle groups in notification.json requests (Closed)
Patch Set: Test that translations are mixed properly Created April 11, 2015, 9:10 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
« no previous file with comments | « sitescripts/notifications/web/__init__.py ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 # coding: utf-8
2
3 # This file is part of the Adblock Plus web scripts,
4 # Copyright (C) 2006-2015 Eyeo GmbH
5 #
6 # Adblock Plus is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License version 3 as
8 # published by the Free Software Foundation.
9 #
10 # Adblock Plus is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
17
18 import json
19 import random
20 import time
21 from urlparse import parse_qs
22
23 from sitescripts.notifications.parser import load_notifications
24 from sitescripts.web import url_handler
25
26 def _assign_groups(notifications):
27 groups = []
28 selection = random.random()
29 base = 0
30 for notification in filter(lambda notification: "variants" in notification,
31 notifications):
32 group = {"id": notification["id"], "variant": 0}
33 groups.append(group)
34 for i, variant in enumerate(notification["variants"]):
35 sample_size = variant["sample"]
36 if (group["variant"] == 0 and sample_size > 0 and selection >= base and
37 selection <= sample_size + base):
38 group["variant"] = i + 1
39 base += sample_size
40 return groups
41
42 def _create_response(notifications, groups):
43 response = {
44 "version": time.strftime("%Y%m%d%H%M", time.gmtime())
45 }
46 for group in groups:
47 group_id = group["id"]
48 variant = group["variant"]
49 response["version"] += "-%s/%s" % (group_id, variant)
50 if variant > 0:
51 notification = next(notification for notification in notifications
52 if notification["id"] == group_id)
53 notification = notification.copy()
54 notification.update(notification["variants"][variant - 1])
55 del notification["variants"]
56 response["notifications"] = [notification]
57 if not "notifications" in response:
58 response["notifications"] = \
59 filter(lambda notification: not "variants" in notification, notifications)
60 return json.dumps(response, ensure_ascii=False, indent=2,
61 separators=(",", ": "), sort_keys=True)
62
63 @url_handler("/notification.json")
64 def notification(environ, start_response):
65 params = parse_qs(environ.get("QUERY_STRING", ""))
66 version = params.get("lastVersion", [""])[0]
67 current_groups = dict(component.split("/")
68 for component in version.split("-")[1:]
69 if "/" in component)
70 notifications = load_notifications()
71 groups = []
72 for notification in notifications:
73 if "variants" in notification:
74 group_id = notification["id"]
75 if group_id in current_groups:
76 groups.append({"id": group_id,
77 "variant": int(current_groups[group_id])})
78 if not groups:
79 groups = _assign_groups(notifications)
80 response = _create_response(notifications, groups)
81 start_response("200 OK", ["Content-Type", "application/json"])
82 return response
OLDNEW
« no previous file with comments | « sitescripts/notifications/web/__init__.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld