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 |