-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathsubject.py
More file actions
90 lines (71 loc) · 2.8 KB
/
subject.py
File metadata and controls
90 lines (71 loc) · 2.8 KB
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
import logging
from mongoengine import (
Document,
StringField, ListField,
ReferenceField, NULLIFY)
from db.exceptions import (ObserverNotRegisteredError,
ObserverAlreadyRegisteredError)
from db.observer import Observer, UserObserver
logging.basicConfig(
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
level=logging.INFO)
logger = logging.getLogger(__name__)
class Subject(Document):
"""MongoDB Document for a split ticket VSP
Attributes:
emoji (str): A string emoji
name (str): name of split ticket VSP
uri (str): websocket URI
observers (list of UserObserver): observers watching this subject
"""
emoji = StringField(required=True, max_length=2)
name = StringField(required=True, max_length=55, unique=True)
uri = StringField(required=True, max_length=120, unique=True)
observers = ListField(
ReferenceField(UserObserver, reverse_delete_rule=NULLIFY), default=[]
)
def __str__(self):
return f"{self.header} {self.uri}"
@property
def header(self):
"""str headear for subject
Returns:
str: emoji + name
"""
return f"{self.emoji} {self.name}"
def subscribe(self, observer):
"""Subscribe a Observer to this subject
Args:
observer (Observer): observer to subscribe
Raises:
ObserverAlreadyRegisteredError: if observer is already subscribed to subject
"""
if observer in self.observers:
raise ObserverAlreadyRegisteredError(f"Observer {observer} "
f"is already subscribed!")
self.observers.append(observer)
self.save()
def unsubscribe(self, observer):
"""Unsubscribe a Observer to this subject
Args:
observer (Observer): observer to unsubscribe
Raises:
ObserverNotRegisteredError: if observer is not subscribed
"""
if observer not in self.observers:
raise ObserverNotRegisteredError(f"Observer {observer} "
f"is not subscribed!")
self.observers.remove(observer)
self.save()
def notify(self, update_message):
"""Notify official Observer and UserObserver's subscribed of some UpdateMessage
Args:
update_message (UpdateMessage): update message to be notified
"""
official_observer = Observer.get_official_observer()
logger.info(f'Notifying official observer {official_observer} '
f'for {self}')
official_observer.notify(update_message)
logger.info(f'Notifying observers {self.observers} for {self}')
for observer in self.observers:
observer.notify(update_message)