cubicweb/sobjects/services.py
changeset 11370 ec858780b6b7
parent 11138 78c8e64f3cef
child 11756 60fed6272771
equal deleted inserted replaced
11369:3c8d345d0f3a 11370:ec858780b6b7
   123     __select__ = Service.__select__ & match_kwargs('login', 'password')
   123     __select__ = Service.__select__ & match_kwargs('login', 'password')
   124     default_groups = ('users',)
   124     default_groups = ('users',)
   125 
   125 
   126     def call(self, login, password, email=None, groups=None, **cwuserkwargs):
   126     def call(self, login, password, email=None, groups=None, **cwuserkwargs):
   127         cnx = self._cw
   127         cnx = self._cw
   128         errmsg = cnx._('the value "%s" is already used, use another one')
       
   129 
       
   130         if (cnx.execute('CWUser X WHERE X login %(login)s', {'login': login},
       
   131                         build_descr=False)
       
   132             or cnx.execute('CWUser X WHERE X use_email C, C address %(login)s',
       
   133                            {'login': login}, build_descr=False)):
       
   134             qname = role_name('login', 'subject')
       
   135             raise ValidationError(None, {qname: errmsg % login})
       
   136 
       
   137         if isinstance(password, text_type):
   128         if isinstance(password, text_type):
   138             # password should *always* be utf8 encoded
   129             # password should *always* be utf8 encoded
   139             password = password.encode('UTF8')
   130             password = password.encode('UTF8')
   140         cwuserkwargs['login'] = login
   131         cwuserkwargs['login'] = login
   141         cwuserkwargs['upassword'] = password
   132         cwuserkwargs['upassword'] = password
   145             groups = self.default_groups
   136             groups = self.default_groups
   146         assert groups, "CWUsers must belong to at least one CWGroup"
   137         assert groups, "CWUsers must belong to at least one CWGroup"
   147         group_names = ', '.join('%r' % group for group in groups)
   138         group_names = ', '.join('%r' % group for group in groups)
   148         cnx.execute('SET X in_group G WHERE X eid %%(x)s, G name IN (%s)' % group_names,
   139         cnx.execute('SET X in_group G WHERE X eid %%(x)s, G name IN (%s)' % group_names,
   149                     {'x': user.eid})
   140                     {'x': user.eid})
   150 
       
   151         if email or '@' in login:
   141         if email or '@' in login:
   152             d = {'login': login, 'email': email or login}
   142             d = {'login': login, 'email': email or login}
   153             if cnx.execute('EmailAddress X WHERE X address %(email)s', d,
       
   154                            build_descr=False):
       
   155                 qname = role_name('address', 'subject')
       
   156                 raise ValidationError(None, {qname: errmsg % d['email']})
       
   157             cnx.execute('INSERT EmailAddress X: X address %(email)s, '
   143             cnx.execute('INSERT EmailAddress X: X address %(email)s, '
   158                         'U primary_email X, U use_email X '
   144                         'U primary_email X, U use_email X '
   159                         'WHERE U login %(login)s', d, build_descr=False)
   145                         'WHERE U login %(login)s', d, build_descr=False)
   160 
   146 
   161         return user
   147         return user