~barry/mailman/events-and-web

« back to all changes in this revision

Viewing changes to src/mailman/rest/preferences.py

  • Committer: Barry Warsaw
  • Date: 2012-09-22 17:35:24 UTC
  • Revision ID: barry@list.org-20120922173524-55hz5ltrdzukupdt
 * You can now PUT and PATCH on user resources to change the user's display
   name or password.  For passwords, you pass in the clear text password and
   Mailman will hash it before storing.

Also:

 * Major refactoring of validators for PUT and PATCH.  Pull the common logic
   out of configuration.py and put it in a PatchValidator class in
   helpers.py.  Also move GetterSetter to helpers.py
 * Add new exception classes RESTError, UnknownPATCHRequestError,
   ReadOnlyPATCHRequestError.  These are used in the PatchValidator.
 * Added Validator.update() which works nicely for PATCH and PUT.

Show diffs side-by-side

added added

removed removed

Lines of Context:
30
30
from restish import http, resource
31
31
 
32
32
from mailman.interfaces.member import DeliveryMode, DeliveryStatus
33
 
from mailman.rest.helpers import PATCH, etag, no_content, path_to
 
33
from mailman.rest.helpers import (
 
34
    GetterSetter, PATCH, etag, no_content, path_to)
34
35
from mailman.rest.validator import (
35
36
    Validator, enum_validator, language_validator)
36
37
 
72
73
        resource['self_link'] = path_to(
73
74
            '{0}/preferences'.format(self._base_url))
74
75
        return http.ok([], etag(resource))
75
 
    
 
76
 
76
77
 
77
78
 
78
79
class Preferences(ReadOnlyPreferences):
82
83
        if self._parent is None:
83
84
            return http.not_found()
84
85
        kws = dict(
85
 
            acknowledge_posts=as_boolean,
86
 
            delivery_mode=enum_validator(DeliveryMode),
87
 
            delivery_status=enum_validator(DeliveryStatus),
88
 
            preferred_language=language_validator,
89
 
            receive_list_copy=as_boolean,
90
 
            receive_own_postings=as_boolean,
 
86
            acknowledge_posts=GetterSetter(as_boolean),
 
87
            delivery_mode=GetterSetter(enum_validator(DeliveryMode)),
 
88
            delivery_status=GetterSetter(enum_validator(DeliveryStatus)),
 
89
            preferred_language=GetterSetter(language_validator),
 
90
            receive_list_copy=GetterSetter(as_boolean),
 
91
            receive_own_postings=GetterSetter(as_boolean),
91
92
            )
92
93
        if is_optional:
93
94
            # For a PUT, all attributes are optional.
94
95
            kws['_optional'] = kws.keys()
95
96
        try:
96
 
            values = Validator(**kws)(request)
 
97
            Validator(**kws).update(self._parent, request)
97
98
        except ValueError as error:
98
99
            return http.bad_request([], str(error))
99
 
        for key, value in values.items():
100
 
            setattr(self._parent, key, value)
101
100
        return no_content()
102
101
 
103
102
    @PATCH()