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 |