Statistics
| Branch: | Tag: | Revision:

root / poller / views.py @ 94fb8123

History | View | Annotate | Download (5.2 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 3e99e2d1 Leonidas Poulopoulos
from flowspy.utils 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 97e42c7d Leonidas Poulopoulos
        self.user = None
44 25d08a62 Leonidas Poulopoulos
        self.user_cache = {}
45 25d08a62 Leonidas Poulopoulos
        self.user_cursor = {}
46 3e99e2d1 Leonidas Poulopoulos
        self.cache = []
47 25d08a62 Leonidas Poulopoulos
        self.new_message_event = None
48 25d08a62 Leonidas Poulopoulos
        self.new_message_user_event = {}
49 3e99e2d1 Leonidas Poulopoulos
50 3e99e2d1 Leonidas Poulopoulos
    def main(self, request):
51 25d08a62 Leonidas Poulopoulos
        if self.user_cache:
52 25d08a62 Leonidas Poulopoulos
            request.session['cursor'] = self.user_cache[-1]['id']
53 25d08a62 Leonidas Poulopoulos
        return render_to_response('poll.html', {'messages': self.user_cache})
54 97e42c7d Leonidas Poulopoulos
55 3e99e2d1 Leonidas Poulopoulos
    def message_existing(self, request):
56 97e42c7d Leonidas Poulopoulos
        if request.is_ajax():
57 97e42c7d Leonidas Poulopoulos
            try:
58 97e42c7d Leonidas Poulopoulos
                user = request.user.get_profile().peer.domain_name
59 97e42c7d Leonidas Poulopoulos
            except:
60 97e42c7d Leonidas Poulopoulos
                user = None
61 97e42c7d Leonidas Poulopoulos
                return False
62 97e42c7d Leonidas Poulopoulos
            try:
63 97e42c7d Leonidas Poulopoulos
                assert(self.new_message_user_event[user])
64 97e42c7d Leonidas Poulopoulos
            except:
65 97e42c7d Leonidas Poulopoulos
                self.new_message_user_event[user] = Event()
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
#        self.cache.append(msg)
92 25d08a62 Leonidas Poulopoulos
        if len(self.user_cache[user]) > self.cache_size:
93 25d08a62 Leonidas Poulopoulos
            self.user_cache[user] = self.user_cache[user][-self.cache_size:]
94 25d08a62 Leonidas Poulopoulos
        self.new_message_user_event[user].set()
95 25d08a62 Leonidas Poulopoulos
        self.new_message_user_event[user].clear()
96 3e99e2d1 Leonidas Poulopoulos
        return json_response(msg)
97 3e99e2d1 Leonidas Poulopoulos
    
98 3e99e2d1 Leonidas Poulopoulos
    def message_updates(self, request):
99 97e42c7d Leonidas Poulopoulos
        if request.is_ajax():
100 97e42c7d Leonidas Poulopoulos
            cursor = {}
101 97e42c7d Leonidas Poulopoulos
            try:
102 97e42c7d Leonidas Poulopoulos
    #            user = request.user.username
103 97e42c7d Leonidas Poulopoulos
                user = request.user.get_profile().peer.domain_name
104 97e42c7d Leonidas Poulopoulos
            except:
105 97e42c7d Leonidas Poulopoulos
                user = None
106 97e42c7d Leonidas Poulopoulos
                return False
107 97e42c7d Leonidas Poulopoulos
            cursor[user] = self.user_cursor[user]
108 97e42c7d Leonidas Poulopoulos
                
109 97e42c7d Leonidas Poulopoulos
            try:
110 97e42c7d Leonidas Poulopoulos
                if not isinstance(self.user_cache[user], list):
111 97e42c7d Leonidas Poulopoulos
                    self.user_cache[user] = []
112 97e42c7d Leonidas Poulopoulos
            except:
113 25d08a62 Leonidas Poulopoulos
                self.user_cache[user] = []
114 97e42c7d Leonidas Poulopoulos
            if not self.user_cache[user] or cursor[user] == self.user_cache[user][-1]['id']:
115 97e42c7d Leonidas Poulopoulos
                self.new_message_user_event[user].wait()
116 97e42c7d Leonidas Poulopoulos
    #            self.new_message_event.wait()
117 97e42c7d Leonidas Poulopoulos
    #        assert cursor[user] != self.user_cache[user][-1]['id'], cursor[user]
118 97e42c7d Leonidas Poulopoulos
            try:
119 97e42c7d Leonidas Poulopoulos
                for index, m in enumerate(self.user_cache[user]):
120 97e42c7d Leonidas Poulopoulos
                    if m['id'] == cursor[user]:
121 97e42c7d Leonidas Poulopoulos
                        return json_response({'messages': self.user_cache[user][index + 1:]})
122 97e42c7d Leonidas Poulopoulos
                return json_response({'messages': self.user_cache[user]})
123 97e42c7d Leonidas Poulopoulos
            finally:
124 97e42c7d Leonidas Poulopoulos
                if self.user_cache[user]:
125 97e42c7d Leonidas Poulopoulos
                    self.user_cursor[user] = self.user_cache[user][-1]['id']
126 94fb8123 Leonidas Poulopoulos
        return HttpResponseRedirect(reverse('group-routes'))
127 97e42c7d Leonidas Poulopoulos
    #            else:
128 97e42c7d Leonidas Poulopoulos
    #                request.session.pop('cursor', None)
129 3e99e2d1 Leonidas Poulopoulos
130 3e99e2d1 Leonidas Poulopoulos
    def monitor_polls(self, polls=None):
131 3e99e2d1 Leonidas Poulopoulos
        b = beanstalkc.Connection()
132 3e99e2d1 Leonidas Poulopoulos
        b.watch(settings.POLLS_TUBE)
133 3e99e2d1 Leonidas Poulopoulos
        while True:
134 3e99e2d1 Leonidas Poulopoulos
            job = b.reserve()
135 25d08a62 Leonidas Poulopoulos
            msg = json.loads(job.body)
136 3e99e2d1 Leonidas Poulopoulos
            job.bury()
137 25d08a62 Leonidas Poulopoulos
            self.message_new(msg)
138 3e99e2d1 Leonidas Poulopoulos
            
139 3e99e2d1 Leonidas Poulopoulos
    
140 3e99e2d1 Leonidas Poulopoulos
    def start_polling(self):
141 3e99e2d1 Leonidas Poulopoulos
        logger.info("Start Polling")
142 3e99e2d1 Leonidas Poulopoulos
        p = Pool(10)
143 3e99e2d1 Leonidas Poulopoulos
        while True:
144 3e99e2d1 Leonidas Poulopoulos
            p.spawn(self.monitor_polls)
145 3e99e2d1 Leonidas Poulopoulos
            
146 3e99e2d1 Leonidas Poulopoulos
msgs = Msgs()
147 3e99e2d1 Leonidas Poulopoulos
148 3e99e2d1 Leonidas Poulopoulos
main = msgs.main
149 3e99e2d1 Leonidas Poulopoulos
150 3e99e2d1 Leonidas Poulopoulos
message_new = msgs.message_new
151 3e99e2d1 Leonidas Poulopoulos
message_updates = msgs.message_updates
152 3e99e2d1 Leonidas Poulopoulos
message_existing = msgs.message_existing
153 3e99e2d1 Leonidas Poulopoulos
154 3e99e2d1 Leonidas Poulopoulos
poll = msgs.start_polling
155 3e99e2d1 Leonidas Poulopoulos
poll()
156 3e99e2d1 Leonidas Poulopoulos
157 3e99e2d1 Leonidas Poulopoulos
158 3e99e2d1 Leonidas Poulopoulos
159 3e99e2d1 Leonidas Poulopoulos
160 3e99e2d1 Leonidas Poulopoulos
161 3e99e2d1 Leonidas Poulopoulos
162 3e99e2d1 Leonidas Poulopoulos
163 3e99e2d1 Leonidas Poulopoulos
164 3e99e2d1 Leonidas Poulopoulos