Merge lp:~stylistica/mailman.client/user_preferences into lp:mailman.client

Proposed by Sneha Priscilla
Status: Merged
Merged at revision: 47
Proposed branch: lp:~stylistica/mailman.client/user_preferences
Merge into: lp:mailman.client
Diff against target: 157 lines (+28/-6)
1 file modified
src/mailmanclient/_client.py (+28/-6)
To merge this branch: bzr merge lp:~stylistica/mailman.client/user_preferences
Reviewer Review Type Date Requested Status
Florian Fuchs Pending
Review via email: mp+188950@code.launchpad.net

Description of the change

Made changes to the Mailman client file with respect to my user preferences GSoC project.
Brief Summary: Added a read only attributes list for preferences , added preferences for Address object which was missing

To post a comment you must log in.
Revision history for this message
Terri (terriko) wrote :

Asked stylistica, and apparently the extra lines were added by the pep8 tool, so I'm going to assume they're awesome and long-overdue fixes ;)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/mailmanclient/_client.py'
--- src/mailmanclient/_client.py 2013-03-22 18:28:16 +0000
+++ src/mailmanclient/_client.py 2013-10-02 22:19:26 +0000
@@ -43,11 +43,13 @@
4343
4444
45class MailmanConnectionError(Exception):45class MailmanConnectionError(Exception):
46
46 """Custom Exception to catch connection errors."""47 """Custom Exception to catch connection errors."""
47 pass48 pass
4849
4950
50class _Connection:51class _Connection:
52
51 """A connection to the REST client."""53 """A connection to the REST client."""
5254
53 def __init__(self, baseurl, name=None, password=None):55 def __init__(self, baseurl, name=None, password=None):
@@ -122,6 +124,7 @@
122124
123125
124class Client:126class Client:
127
125 """Access the Mailman REST API root."""128 """Access the Mailman REST API root."""
126129
127 def __init__(self, baseurl, name=None, password=None):130 def __init__(self, baseurl, name=None, password=None):
@@ -248,8 +251,9 @@
248 response, content = self._connection.call(251 response, content = self._connection.call(
249 'lists/{0}'.format(fqdn_listname), None, 'DELETE')252 'lists/{0}'.format(fqdn_listname), None, 'DELETE')
250253
251
252254
255
253class _Domain:256class _Domain:
257
254 def __init__(self, connection, url):258 def __init__(self, connection, url):
255 self._connection = connection259 self._connection = connection
256 self._url = url260 self._url = url
@@ -308,6 +312,7 @@
308312
309313
310class _List:314class _List:
315
311 def __init__(self, connection, url, data=None):316 def __init__(self, connection, url, data=None):
312 self._connection = connection317 self._connection = connection
313 self._url = url318 self._url = url
@@ -538,6 +543,7 @@
538543
539544
540class _Member:545class _Member:
546
541 def __init__(self, connection, url):547 def __init__(self, connection, url):
542 self._connection = connection548 self._connection = connection
543 self._url = url549 self._url = url
@@ -594,6 +600,7 @@
594600
595601
596class _User:602class _User:
603
597 def __init__(self, connection, url):604 def __init__(self, connection, url):
598 self._connection = connection605 self._connection = connection
599 self._url = url606 self._url = url
@@ -656,11 +663,11 @@
656 subscriptions = []663 subscriptions = []
657 for address in self.addresses:664 for address in self.addresses:
658 response, content = self._connection.call('members/find',665 response, content = self._connection.call('members/find',
659 data={'subscriber': address})666 data={'subscriber': address})
660 try:667 try:
661 for entry in content['entries']:668 for entry in content['entries']:
662 subscriptions.append(_Member(self._connection,669 subscriptions.append(_Member(self._connection,
663 entry['self_link']))670 entry['self_link']))
664 except KeyError:671 except KeyError:
665 pass672 pass
666 self._subscriptions = subscriptions673 self._subscriptions = subscriptions
@@ -696,6 +703,7 @@
696703
697704
698class _Addresses:705class _Addresses:
706
699 def __init__(self, connection, user_id):707 def __init__(self, connection, user_id):
700 self._connection = connection708 self._connection = connection
701 self._user_id = user_id709 self._user_id = user_id
@@ -719,9 +727,11 @@
719727
720728
721class _Address:729class _Address:
730
722 def __init__(self, connection, address):731 def __init__(self, connection, address):
723 self._connection = connection732 self._connection = connection
724 self._address = address733 self._address = address
734 self._preferences = None
725 self._url = address['self_link']735 self._url = address['self_link']
726 self._info = None736 self._info = None
727737
@@ -748,6 +758,13 @@
748 self._get_info()758 self._get_info()
749 return self._info.get('verified_on')759 return self._info.get('verified_on')
750760
761 @property
762 def preferences(self):
763 if self._preferences is None:
764 path = 'addresses/{0}/preferences'.format(self._address['email'])
765 self._preferences = _Preferences(self._connection, path)
766 return self._preferences
767
751 def verify(self):768 def verify(self):
752 self._connection.call('addresses/{0}/verify'769 self._connection.call('addresses/{0}/verify'
753 .format(self._address['email']), method='POST')770 .format(self._address['email']), method='POST')
@@ -768,8 +785,11 @@
768 'receive_list_copy',785 'receive_list_copy',
769 'receive_own_postings', )786 'receive_own_postings', )
770787
788PREF_READ_ONLY_ATTRS = ('http_etag', 'self_link')
789
771790
772class _Preferences:791class _Preferences:
792
773 def __init__(self, connection, url):793 def __init__(self, connection, url):
774 self._connection = connection794 self._connection = connection
775 self._url = url795 self._url = url
@@ -789,7 +809,7 @@
789809
790 def __setitem__(self, key, value):810 def __setitem__(self, key, value):
791 self._preferences[key] = value811 self._preferences[key] = value
792 812
793 def __getitem__(self, key):813 def __getitem__(self, key):
794 return self._preferences[key]814 return self._preferences[key]
795815
@@ -812,9 +832,9 @@
812 def save(self):832 def save(self):
813 data = {}833 data = {}
814 for key in self._preferences:834 for key in self._preferences:
815 if self._preferences[key] is not None:835 if key not in PREF_READ_ONLY_ATTRS and self._preferences[key] is not None:
816 data[key] = self._preferences[key]836 data[key] = self._preferences[key]
817 response, content = self._connection.call(self._url, data, 'PUT')837 response, content = self._connection.call(self._url, data, 'PATCH')
818838
819839
820LIST_READ_ONLY_ATTRS = ('bounces_address', 'created_at', 'digest_last_sent_at',840LIST_READ_ONLY_ATTRS = ('bounces_address', 'created_at', 'digest_last_sent_at',
@@ -827,6 +847,7 @@
827847
828848
829class _Settings:849class _Settings:
850
830 def __init__(self, connection, url):851 def __init__(self, connection, url):
831 self._connection = connection852 self._connection = connection
832 self._url = url853 self._url = url
@@ -872,6 +893,7 @@
872893
873894
874class _Page:895class _Page:
896
875 def __init__(self, connection, path, model, count=DEFAULT_PAGE_ITEM_COUNT,897 def __init__(self, connection, path, model, count=DEFAULT_PAGE_ITEM_COUNT,
876 page=1):898 page=1):
877 self._connection = connection899 self._connection = connection

Subscribers

People subscribed via source and target branches