Statistics
| Branch: | Tag: | Revision:

root / poller / views.py @ e7a73512

History | View | Annotate | Download (5 kB)

1 3e99e2d1 Leonidas Poulopoulos
from gevent import monkey
2 3e99e2d1 Leonidas Poulopoulos
monkey.patch_all()
3 3e99e2d1 Leonidas Poulopoulos
from gevent.pool import Pool
4 25d08a62 Leonidas Poulopoulos
import json
5 3e99e2d1 Leonidas Poulopoulos
6 3e99e2d1 Leonidas Poulopoulos
import uuid
7 3e99e2d1 Leonidas Poulopoulos
import simplejson
8 3e99e2d1 Leonidas Poulopoulos
import datetime
9 3e99e2d1 Leonidas Poulopoulos
from django.shortcuts import render_to_response
10 3e99e2d1 Leonidas Poulopoulos
from django.template.loader import render_to_string
11 3e99e2d1 Leonidas Poulopoulos
from django.http import HttpResponse
12 3e99e2d1 Leonidas Poulopoulos
from gevent.event import Event
13 3e99e2d1 Leonidas Poulopoulos
from django.conf import settings
14 94fb8123 Leonidas Poulopoulos
#from django.views.decorators.csrf import csrf_exempt
15 97e42c7d Leonidas Poulopoulos
from django.http import HttpResponseRedirect
16 97e42c7d Leonidas Poulopoulos
from django.core.urlresolvers import reverse
17 97e42c7d Leonidas Poulopoulos
18 3e99e2d1 Leonidas Poulopoulos
19 f57f6e68 Leonidas Poulopoulos
import beanstalkc
20 3e99e2d1 Leonidas Poulopoulos
21 3e99e2d1 Leonidas Poulopoulos
import logging
22 3e99e2d1 Leonidas Poulopoulos
23 3e99e2d1 Leonidas Poulopoulos
FORMAT = '%(asctime)s %(levelname)s: %(message)s'
24 3e99e2d1 Leonidas Poulopoulos
logging.basicConfig(format=FORMAT)
25 3e99e2d1 Leonidas Poulopoulos
logger = logging.getLogger(__name__)
26 3e99e2d1 Leonidas Poulopoulos
logger.setLevel(logging.DEBUG)
27 3e99e2d1 Leonidas Poulopoulos
28 3e99e2d1 Leonidas Poulopoulos
29 25d08a62 Leonidas Poulopoulos
def create_message(body, user):
30 25d08a62 Leonidas Poulopoulos
    data = {'id': str(uuid.uuid4()), 'body': body, 'user':user}
31 3e99e2d1 Leonidas Poulopoulos
    data['html'] = render_to_string('poll_message.html', dictionary={'message': data})
32 3e99e2d1 Leonidas Poulopoulos
    return data
33 3e99e2d1 Leonidas Poulopoulos
34 3e99e2d1 Leonidas Poulopoulos
35 3e99e2d1 Leonidas Poulopoulos
def json_response(value, **kwargs):
36 3e99e2d1 Leonidas Poulopoulos
    kwargs.setdefault('content_type', 'text/javascript; charset=UTF-8')
37 3e99e2d1 Leonidas Poulopoulos
    return HttpResponse(simplejson.dumps(value), **kwargs)
38 3e99e2d1 Leonidas Poulopoulos
39 3e99e2d1 Leonidas Poulopoulos
class Msgs(object):
40 94fb8123 Leonidas Poulopoulos
    cache_size = 500
41 3e99e2d1 Leonidas Poulopoulos
42 3e99e2d1 Leonidas Poulopoulos
    def __init__(self):
43 bec1a51b Leonidas Poulopoulos
        logger.info("initializing")
44 97e42c7d Leonidas Poulopoulos
        self.user = None
45 25d08a62 Leonidas Poulopoulos
        self.user_cache = {}
46 25d08a62 Leonidas Poulopoulos
        self.user_cursor = {}
47 3e99e2d1 Leonidas Poulopoulos
        self.cache = []
48 25d08a62 Leonidas Poulopoulos
        self.new_message_event = None
49 25d08a62 Leonidas Poulopoulos
        self.new_message_user_event = {}
50 3e99e2d1 Leonidas Poulopoulos
51 3e99e2d1 Leonidas Poulopoulos
    def main(self, request):
52 25d08a62 Leonidas Poulopoulos
        if self.user_cache:
53 25d08a62 Leonidas Poulopoulos
            request.session['cursor'] = self.user_cache[-1]['id']
54 25d08a62 Leonidas Poulopoulos
        return render_to_response('poll.html', {'messages': self.user_cache})
55 97e42c7d Leonidas Poulopoulos
56 3e99e2d1 Leonidas Poulopoulos
    def message_existing(self, request):
57 97e42c7d Leonidas Poulopoulos
        if request.is_ajax():
58 97e42c7d Leonidas Poulopoulos
            try:
59 97e42c7d Leonidas Poulopoulos
                user = request.user.get_profile().peer.domain_name
60 97e42c7d Leonidas Poulopoulos
            except:
61 97e42c7d Leonidas Poulopoulos
                user = None
62 97e42c7d Leonidas Poulopoulos
                return False
63 97e42c7d Leonidas Poulopoulos
            try:
64 97e42c7d Leonidas Poulopoulos
                assert(self.new_message_user_event[user])
65 97e42c7d Leonidas Poulopoulos
            except:
66 97e42c7d Leonidas Poulopoulos
                self.new_message_user_event[user] = Event()
67 97e42c7d Leonidas Poulopoulos
            try:
68 97e42c7d Leonidas Poulopoulos
                if self.user_cache[user]:
69 97e42c7d Leonidas Poulopoulos
                    self.user_cursor[user] = self.user_cache[user][-1]['id']
70 97e42c7d Leonidas Poulopoulos
            except:
71 97e42c7d Leonidas Poulopoulos
                self.user_cache[user] = []
72 97e42c7d Leonidas Poulopoulos
                self.user_cursor[user] = ''
73 97e42c7d Leonidas Poulopoulos
            return json_response({'messages': self.user_cache[user]})
74 94fb8123 Leonidas Poulopoulos
        return HttpResponseRedirect(reverse('group-routes'))
75 3e99e2d1 Leonidas Poulopoulos
    
76 25d08a62 Leonidas Poulopoulos
    def message_new(self, mesg=None):
77 3e99e2d1 Leonidas Poulopoulos
        if mesg:
78 25d08a62 Leonidas Poulopoulos
            message = mesg['message']
79 25d08a62 Leonidas Poulopoulos
            user = mesg['username']
80 3e99e2d1 Leonidas Poulopoulos
            now = datetime.datetime.now()
81 25d08a62 Leonidas Poulopoulos
            msg = create_message("[%s]: %s"%(now.strftime("%Y-%m-%d %H:%M:%S"),message), user)
82 25d08a62 Leonidas Poulopoulos
        try:
83 25d08a62 Leonidas Poulopoulos
            isinstance(self.user_cache[user], list)
84 25d08a62 Leonidas Poulopoulos
        except:
85 25d08a62 Leonidas Poulopoulos
            self.user_cache[user] = []
86 25d08a62 Leonidas Poulopoulos
        self.user_cache[user].append(msg)
87 25d08a62 Leonidas Poulopoulos
        if self.user_cache[user][-1] == self.user_cache[user][0]: 
88 25d08a62 Leonidas Poulopoulos
            self.user_cursor[user] = self.user_cache[user][-1]['id']
89 25d08a62 Leonidas Poulopoulos
        else:
90 25d08a62 Leonidas Poulopoulos
            self.user_cursor[user] = self.user_cache[user][-2]['id']
91 25d08a62 Leonidas Poulopoulos
        if len(self.user_cache[user]) > self.cache_size:
92 25d08a62 Leonidas Poulopoulos
            self.user_cache[user] = self.user_cache[user][-self.cache_size:]
93 25d08a62 Leonidas Poulopoulos
        self.new_message_user_event[user].set()
94 25d08a62 Leonidas Poulopoulos
        self.new_message_user_event[user].clear()
95 3e99e2d1 Leonidas Poulopoulos
        return json_response(msg)
96 3e99e2d1 Leonidas Poulopoulos
    
97 3e99e2d1 Leonidas Poulopoulos
    def message_updates(self, request):
98 97e42c7d Leonidas Poulopoulos
        if request.is_ajax():
99 97e42c7d Leonidas Poulopoulos
            cursor = {}
100 97e42c7d Leonidas Poulopoulos
            try:
101 97e42c7d Leonidas Poulopoulos
                user = request.user.get_profile().peer.domain_name
102 97e42c7d Leonidas Poulopoulos
            except:
103 97e42c7d Leonidas Poulopoulos
                user = None
104 97e42c7d Leonidas Poulopoulos
                return False
105 a61c1448 Leonidas Poulopoulos
            try:
106 a61c1448 Leonidas Poulopoulos
                cursor[user] = self.user_cursor[user]
107 a61c1448 Leonidas Poulopoulos
            except:
108 a61c1448 Leonidas Poulopoulos
                return HttpResponse(content='', mimetype=None, status=400)
109 97e42c7d Leonidas Poulopoulos
                
110 97e42c7d Leonidas Poulopoulos
            try:
111 97e42c7d Leonidas Poulopoulos
                if not isinstance(self.user_cache[user], list):
112 97e42c7d Leonidas Poulopoulos
                    self.user_cache[user] = []
113 97e42c7d Leonidas Poulopoulos
            except:
114 25d08a62 Leonidas Poulopoulos
                self.user_cache[user] = []
115 97e42c7d Leonidas Poulopoulos
            if not self.user_cache[user] or cursor[user] == self.user_cache[user][-1]['id']:
116 bec1a51b Leonidas Poulopoulos
                self.new_message_user_event[user].wait(settings.POLL_SESSION_UPDATE)
117 97e42c7d Leonidas Poulopoulos
            try:
118 97e42c7d Leonidas Poulopoulos
                for index, m in enumerate(self.user_cache[user]):
119 97e42c7d Leonidas Poulopoulos
                    if m['id'] == cursor[user]:
120 97e42c7d Leonidas Poulopoulos
                        return json_response({'messages': self.user_cache[user][index + 1:]})
121 97e42c7d Leonidas Poulopoulos
                return json_response({'messages': self.user_cache[user]})
122 97e42c7d Leonidas Poulopoulos
            finally:
123 97e42c7d Leonidas Poulopoulos
                if self.user_cache[user]:
124 97e42c7d Leonidas Poulopoulos
                    self.user_cursor[user] = self.user_cache[user][-1]['id']
125 94fb8123 Leonidas Poulopoulos
        return HttpResponseRedirect(reverse('group-routes'))
126 3e99e2d1 Leonidas Poulopoulos
127 3e99e2d1 Leonidas Poulopoulos
    def monitor_polls(self, polls=None):
128 3e99e2d1 Leonidas Poulopoulos
        b = beanstalkc.Connection()
129 3e99e2d1 Leonidas Poulopoulos
        b.watch(settings.POLLS_TUBE)
130 3e99e2d1 Leonidas Poulopoulos
        while True:
131 3e99e2d1 Leonidas Poulopoulos
            job = b.reserve()
132 25d08a62 Leonidas Poulopoulos
            msg = json.loads(job.body)
133 3e99e2d1 Leonidas Poulopoulos
            job.bury()
134 25d08a62 Leonidas Poulopoulos
            self.message_new(msg)
135 3e99e2d1 Leonidas Poulopoulos
            
136 3e99e2d1 Leonidas Poulopoulos
    
137 3e99e2d1 Leonidas Poulopoulos
    def start_polling(self):
138 3e99e2d1 Leonidas Poulopoulos
        logger.info("Start Polling")
139 3e99e2d1 Leonidas Poulopoulos
        p = Pool(10)
140 3e99e2d1 Leonidas Poulopoulos
        while True:
141 3e99e2d1 Leonidas Poulopoulos
            p.spawn(self.monitor_polls)
142 3e99e2d1 Leonidas Poulopoulos
            
143 3e99e2d1 Leonidas Poulopoulos
msgs = Msgs()
144 3e99e2d1 Leonidas Poulopoulos
main = msgs.main
145 3e99e2d1 Leonidas Poulopoulos
146 3e99e2d1 Leonidas Poulopoulos
message_new = msgs.message_new
147 3e99e2d1 Leonidas Poulopoulos
message_updates = msgs.message_updates
148 3e99e2d1 Leonidas Poulopoulos
message_existing = msgs.message_existing
149 3e99e2d1 Leonidas Poulopoulos
150 3e99e2d1 Leonidas Poulopoulos
poll = msgs.start_polling
151 3e99e2d1 Leonidas Poulopoulos
poll()