server/repository.py
branchtls-sprint
changeset 1373 5e6abf61636d
parent 1372 d4264cd876e1
child 1398 5fe84a5f7035
equal deleted inserted replaced
1370:c1cf86a66e30 1373:5e6abf61636d
   488                                    'P pkey K, P value V, NOT P for_user U',
   488                                    'P pkey K, P value V, NOT P for_user U',
   489                                    build_descr=False)
   489                                    build_descr=False)
   490         finally:
   490         finally:
   491             session.close()
   491             session.close()
   492 
   492 
   493     def register_user(self, login, password, **kwargs):
   493     def register_user(self, login, password, email=None, **kwargs):
   494         """check a user with the given login exists, if not create it with the
   494         """check a user with the given login exists, if not create it with the
   495         given password. This method is designed to be used for anonymous
   495         given password. This method is designed to be used for anonymous
   496         registration on public web site.
   496         registration on public web site.
   497         """
   497         """
   498         session = self.internal_session()
   498         session = self.internal_session()
   499         try:
   499         # for consistency, keep same error as unique check hook (although not required)
   500             if session.execute('EUser X WHERE X login %(login)s', {'login': login}):
   500         errmsg = session._('the value "%s" is already used, use another one')
   501                 return False
   501         try:
   502             if session.execute('EUser X WHERE X use_email C, C address %(login)s',
   502             if (session.execute('EUser X WHERE X login %(login)s', {'login': login})
   503                                {'login': login}):
   503                 or session.execute('EUser X WHERE X use_email C, C address %(login)s',
   504                 return False
   504                                    {'login': login})):
       
   505                 raise ValidationError(None, {'login': errmsg % login})
   505             # we have to create the user
   506             # we have to create the user
   506             user = self.vreg.etype_class('EUser')(session, None)
   507             user = self.vreg.etype_class('EUser')(session, None)
   507             if isinstance(password, unicode):
   508             if isinstance(password, unicode):
   508                 # password should *always* be utf8 encoded
   509                 # password should *always* be utf8 encoded
   509                 password = password.encode('UTF8')
   510                 password = password.encode('UTF8')
   511             kwargs['upassword'] = password
   512             kwargs['upassword'] = password
   512             user.update(kwargs)
   513             user.update(kwargs)
   513             self.glob_add_entity(session, user)
   514             self.glob_add_entity(session, user)
   514             session.execute('SET X in_group G WHERE X eid %(x)s, G name "users"',
   515             session.execute('SET X in_group G WHERE X eid %(x)s, G name "users"',
   515                             {'x': user.eid})
   516                             {'x': user.eid})
   516             # FIXME this does not work yet
   517             if email or '@' in login:
   517             if '@' in login:
   518                 d = {'login': login, 'email': email or login}
   518                 session.execute('INSERT EmailAddress X: X address "%(login)s", '
   519                 if session.execute('EmailAddress X WHERE X address %(email)s', d):
   519                                 'U primary_email X, U use_email X WHERE U login "%(login)s"',
   520                     raise ValidationError(None, {'address': errmsg % d['email']})
   520                                 {'login':login})
   521                 session.execute('INSERT EmailAddress X: X address %(email)s, '
       
   522                                 'U primary_email X, U use_email X WHERE U login %(login)s', d)
   521             session.commit()
   523             session.commit()
   522         finally:
   524         finally:
   523             session.close()
   525             session.close()
   524         return True
   526         return True
   525         
   527