@@ -77,105 +77,107 @@ def compound_metrics(self, **kwargs):
7777 return self ._simple_get ('/sidekiq/compound_metrics' , ** kwargs )
7878
7979
80- class UserEmail (GitlabObject ):
81- _url = '/users/%(user_id)s/emails'
82- canUpdate = False
83- shortPrintAttr = 'email'
84- requiredUrlAttrs = ['user_id' ]
85- requiredCreateAttrs = ['email' ]
80+ class UserEmail (RESTObject ):
81+ _short_print_attr = 'email'
8682
8783
88- class UserEmailManager (BaseManager ):
89- obj_cls = UserEmail
84+ class UserEmailManager (RetrieveMixin , CreateMixin , DeleteMixin , RESTManager ):
85+ _path = '/users/%(user_id)s/emails'
86+ _obj_cls = UserEmail
87+ _from_parent_attrs = {'user_id' : 'id' }
88+ _create_attrs = {'required' : ('email' , ), 'optional' : tuple ()}
9089
9190
92- class UserKey (GitlabObject ):
93- _url = '/users/%(user_id)s/keys'
94- canGet = 'from_list'
95- canUpdate = False
96- requiredUrlAttrs = ['user_id' ]
97- requiredCreateAttrs = ['title' , 'key' ]
91+ class UserKey (RESTObject ):
92+ pass
9893
9994
100- class UserKeyManager (BaseManager ):
101- obj_cls = UserKey
95+ class UserKeyManager (GetFromListMixin , CreateMixin , DeleteMixin , RESTManager ):
96+ _path = '/users/%(user_id)s/emails'
97+ _obj_cls = UserKey
98+ _from_parent_attrs = {'user_id' : 'id' }
99+ _create_attrs = {'required' : ('title' , 'key' ), 'optional' : tuple ()}
102100
103101
104- class UserProject (GitlabObject ):
105- _url = '/projects/user/%(user_id)s'
106- _constructorTypes = {'owner' : 'User' , 'namespace' : 'Group' }
107- canUpdate = False
108- canDelete = False
109- canList = False
110- canGet = False
111- requiredUrlAttrs = ['user_id' ]
112- requiredCreateAttrs = ['name' ]
113- optionalCreateAttrs = ['default_branch' , 'issues_enabled' , 'wall_enabled' ,
114- 'merge_requests_enabled' , 'wiki_enabled' ,
115- 'snippets_enabled' , 'public' , 'visibility' ,
116- 'description' , 'builds_enabled' , 'public_builds' ,
117- 'import_url' , 'only_allow_merge_if_build_succeeds' ]
102+ class UserProject (RESTObject ):
103+ _constructor_types = {'owner' : 'User' , 'namespace' : 'Group' }
118104
119105
120- class UserProjectManager (BaseManager ):
121- obj_cls = UserProject
106+ class UserProjectManager (CreateMixin , RESTManager ):
107+ _path = '/projects/user/%(user_id)s'
108+ _obj_cls = UserProject
109+ _from_parent_attrs = {'user_id' : 'id' }
110+ _create_attrs = {
111+ 'required' : ('name' , ),
112+ 'optional' : ('default_branch' , 'issues_enabled' , 'wall_enabled' ,
113+ 'merge_requests_enabled' , 'wiki_enabled' ,
114+ 'snippets_enabled' , 'public' , 'visibility' , 'description' ,
115+ 'builds_enabled' , 'public_builds' , 'import_url' ,
116+ 'only_allow_merge_if_build_succeeds' )
117+ }
122118
123119
124- class User (GitlabObject ):
125- _url = '/users'
126- shortPrintAttr = 'username'
127- optionalListAttrs = ['active' , 'blocked' , 'username' , 'extern_uid' ,
128- 'provider' , 'external' ]
129- requiredCreateAttrs = ['email' , 'username' , 'name' ]
130- optionalCreateAttrs = ['password' , 'reset_password' , 'skype' , 'linkedin' ,
131- 'twitter' , 'projects_limit' , 'extern_uid' ,
132- 'provider' , 'bio' , 'admin' , 'can_create_group' ,
133- 'website_url' , 'skip_confirmation' , 'external' ,
134- 'organization' , 'location' ]
135- requiredUpdateAttrs = ['email' , 'username' , 'name' ]
136- optionalUpdateAttrs = ['password' , 'skype' , 'linkedin' , 'twitter' ,
137- 'projects_limit' , 'extern_uid' , 'provider' , 'bio' ,
138- 'admin' , 'can_create_group' , 'website_url' ,
139- 'skip_confirmation' , 'external' , 'organization' ,
140- 'location' ]
141- managers = (
142- ('emails' , 'UserEmailManager' , [('user_id' , 'id' )]),
143- ('keys' , 'UserKeyManager' , [('user_id' , 'id' )]),
144- ('projects' , 'UserProjectManager' , [('user_id' , 'id' )]),
120+ class User (SaveMixin , RESTObject ):
121+ _short_print_attr = 'username'
122+ _managers = (
123+ ('emails' , 'UserEmailManager' ),
124+ ('keys' , 'UserKeyManager' ),
125+ ('projects' , 'UserProjectManager' ),
145126 )
146127
147- def _data_for_gitlab (self , extra_parameters = {}, update = False ,
148- as_json = True ):
149- if hasattr (self , 'confirm' ):
150- self .confirm = str (self .confirm ).lower ()
151- return super (User , self )._data_for_gitlab (extra_parameters )
152-
153128 def block (self , ** kwargs ):
154- """Blocks the user."""
155- url = '/users/%s/block' % self .id
156- r = self .gitlab ._raw_post (url , ** kwargs )
157- raise_error_from_response (r , GitlabBlockError , 201 )
158- self .state = 'blocked'
129+ """Blocks the user.
130+
131+ Returns:
132+ bool: whether the user status has been changed.
133+ """
134+ path = '/users/%s/block' % self .id
135+ server_data = self .manager .gitlab .http_post (path , ** kwargs )
136+ if server_data is True :
137+ self ._attrs ['state' ] = 'blocked'
138+ return server_data
159139
160140 def unblock (self , ** kwargs ):
161- """Unblocks the user."""
162- url = '/users/%s/unblock' % self .id
163- r = self .gitlab ._raw_post (url , ** kwargs )
164- raise_error_from_response (r , GitlabUnblockError , 201 )
165- self .state = 'active'
141+ """Unblocks the user.
142+
143+ Returns:
144+ bool: whether the user status has been changed.
145+ """
146+ path = '/users/%s/unblock' % self .id
147+ server_data = self .manager .gitlab .http_post (path , ** kwargs )
148+ if server_data is True :
149+ self ._attrs ['state' ] = 'active'
150+ return server_data
166151
167- def __eq__ (self , other ):
168- if type (other ) is type (self ):
169- selfdict = self .as_dict ()
170- otherdict = other .as_dict ()
171- selfdict .pop ('password' , None )
172- otherdict .pop ('password' , None )
173- return selfdict == otherdict
174- return False
175152
153+ class UserManager (CRUDMixin , RESTManager ):
154+ _path = '/users'
155+ _obj_cls = User
176156
177- class UserManager (BaseManager ):
178- obj_cls = User
157+ _list_filters = ('active' , 'blocked' , 'username' , 'extern_uid' , 'provider' ,
158+ 'external' )
159+ _create_attrs = {
160+ 'required' : ('email' , 'username' , 'name' ),
161+ 'optional' : ('password' , 'reset_password' , 'skype' , 'linkedin' ,
162+ 'twitter' , 'projects_limit' , 'extern_uid' , 'provider' ,
163+ 'bio' , 'admin' , 'can_create_group' , 'website_url' ,
164+ 'skip_confirmation' , 'external' , 'organization' ,
165+ 'location' )
166+ }
167+ _update_attrs = {
168+ 'required' : ('email' , 'username' , 'name' ),
169+ 'optional' : ('password' , 'skype' , 'linkedin' , 'twitter' ,
170+ 'projects_limit' , 'extern_uid' , 'provider' , 'bio' ,
171+ 'admin' , 'can_create_group' , 'website_url' ,
172+ 'skip_confirmation' , 'external' , 'organization' ,
173+ 'location' )
174+ }
175+
176+ def _sanitize_data (self , data , action ):
177+ new_data = data .copy ()
178+ if 'confirm' in data :
179+ new_data ['confirm' ] = str (new_data ['confirm' ]).lower ()
180+ return new_data
179181
180182
181183class CurrentUserEmail (GitlabObject ):
0 commit comments