source: mailjam/postman/models.py@ 4:14b2a12d495e

Last change on this file since 4:14b2a12d495e was 4:14b2a12d495e, checked in by Francisco de Borja Lopez Rio <borja@…>, 12 years ago

Fixed some bugs in the code that was doing the de-serialization of data from
json-encoded files.

One of the bugs raised an exception complaining about the Member, MailingList
and JsonStorage classes not being found when de-serializing objects that
contain instances of such classes in their attributes. I fixed it adding some
imports to the init.py file within the postman/ module

The other bug was causing an infinite loop that was triggering a RuntimeError
(maximum recursion depth exceeded) when de-serializing MailingList instances
(a call to the .load() method in the init method of the MailingList class
was causing it)

File size: 3.4 KB
Line 
1# -*- coding: utf-8 -*-
2
3import os
4from tools import validate_email_address
5from storage import JsonStorage as Storage
6import config
7
8class Member():
9
10 """
11 Class that defines a mailing list member
12 """
13
14 def __init__(self, address):
15 self.address = self._validate_address(address)
16
17 def __repr__(self):
18 return "<Member '%s'>" % self.address
19
20 def __str__(self):
21 return self.address
22
23 def _validate_address(self, address):
24 if not validate_email_address(address):
25 raise ValueError(address, ' is not a valid email address')
26 return address
27
28
29class MailingList():
30
31 """
32 Class that defines a mailing list
33 """
34
35 def __init__(self, name, address, members={}, config={}, storage=None):
36 self.name = name
37 self.address = address
38 self.members = members
39 self.config = config
40 self._validate_config() # validate the config parameters
41 self.storage = Storage(os.path.join(self.config['storage'],
42 self.address))
43 self.archive = Storage(os.path.join(self.config['archive'],
44 self.address))
45
46 def __repr__(self):
47 return "<MailingList '%s'>" % self.address
48
49 def __str__(self):
50 return self.address
51
52 def _validate_config(self):
53 if not 'storage' in self.config.keys():
54 self.config['storage'] = os.path.join(config.storage_path,
55 'mailings/')
56 if not 'archive' in self.config.keys():
57 self.config['archive'] = config.archive_path
58 if not 'private' in self.config.keys():
59 self.config['private'] = config.private_mailing
60
61 def _validate_member_object(self, member=None):
62 if not isinstance(member, Member):
63 raise TypeError(member, ' is not a valid Member instance')
64 return member
65
66 def _validate_member(self, member=None):
67 member = self._validate_member_object(member)
68 return member.address in self.members_addresses()
69
70 def _validate_member_by_address(self, address=None):
71 if not validate_email_address(address):
72 raise ValueError(address, ' is not a valid email address')
73 return address in self.members_addresses()
74
75 def members_addresses(self):
76 return self.members.keys()
77
78 def add_member(self, member):
79 member = self._validate_member_object(member)
80 if self._validate_member(member):
81 return False
82 self.members[member.address] = member
83 return True
84
85 def add_member_by_address(self, address=None):
86 if self._validate_member_by_address(address):
87 return False
88 member = Member(address)
89 self.members[address] = member
90 return True
91
92 def delete_member(self, member=None):
93 member = self._validate_member_object(member)
94 if not self._validate_member(member):
95 return False
96 del self.members[member.address]
97 return True
98
99 def load(self):
100 if self.storage.exists():
101 data = self.storage.read()
102 self.name = data.name
103 self.address = data.address
104 self.members = data.members
105 return True
106 return False
107
108 def save(self):
109 self.storage.write(self)
Note: See TracBrowser for help on using the repository browser.