de622f59fd9a59548537104417a7d0f7d4a85f62
[plstackapi.git] / planetstack / observer / event_manager.py
1 import threading
2 import requests, json
3
4 from core.models import *
5 from planetstack.config import Config
6 from observer.deleters import deleters
7
8 import os
9 import base64
10 from fofum import Fofum
11 import json
12
13 # decorator that marks dispatachable event methods    
14 def event(func):
15     setattr(func, 'event', func.__name__)
16     return func         
17
18 class EventHandler:
19     # This code is currently not in use.
20     def __init__(self):
21         pass 
22
23     @staticmethod
24     def get_events():
25         events = []
26         for name in dir(EventHandler):
27             attribute = getattr(EventHandler, name)
28             if hasattr(attribute, 'event'):
29                 events.append(getattr(attribute, 'event'))
30         return events
31
32     def dispatch(self, event, *args, **kwds):
33         if hasattr(self, event):
34             return getattr(self, event)(*args, **kwds)
35             
36         
37 class EventSender:
38     def __init__(self,user=None,clientid=None):
39         try:
40             clid = Config().feefie_client_id
41             user = Config().feefie_client_user
42         except:
43             clid = 'planetstack_core_team'
44             user = 'pl'
45
46         self.fofum = Fofum(user=user)
47         self.fofum.make(clid)
48
49     def fire(self,**args):
50         self.fofum.fire(json.dumps(args))
51
52 class EventListener:
53     def __init__(self,wake_up=None):
54         self.handler = EventHandler()
55         self.wake_up = wake_up
56
57     def handle_event(self, payload):
58         payload_dict = json.loads(payload)
59
60         try:
61             deletion = payload_dict['deletion_flag']
62             if (deletion):
63                 model = payload_dict['model']
64                 pk = payload_dict['pk']
65
66                 for deleter in deleters[model]:
67                     deleter(pk)
68         except:
69             deletion = False
70
71         if (not deletion and self.wake_up):
72             self.wake_up()
73         
74
75     def run(self):
76         # This is our unique client id, to be used when firing and receiving events
77         # It needs to be generated once and placed in the config file
78
79         try:
80             clid = Config().feefie_client_id
81             user = Config().feefie_client_user
82         except:
83             clid = 'planetstack_core_team'
84             user = 'pl'
85
86         f = Fofum(user=user)
87         
88         listener_thread = threading.Thread(target=f.listen_for_event,args=(clid,self.handle_event))
89         listener_thread.start()