198 try: |
198 try: |
199 ldap_emailattr = self.user_rev_attrs['email'] |
199 ldap_emailattr = self.user_rev_attrs['email'] |
200 except KeyError: |
200 except KeyError: |
201 return # no email in ldap, we're done |
201 return # no email in ldap, we're done |
202 session = self.repo.internal_session() |
202 session = self.repo.internal_session() |
|
203 execute = session.execute |
203 try: |
204 try: |
204 cursor = session.system_sql("SELECT eid, extid FROM entities WHERE " |
205 cursor = session.system_sql("SELECT eid, extid FROM entities WHERE " |
205 "source='%s'" % self.uri) |
206 "source='%s'" % self.uri) |
206 for eid, b64extid in cursor.fetchall(): |
207 for eid, b64extid in cursor.fetchall(): |
207 extid = b64decode(b64extid) |
208 extid = b64decode(b64extid) |
208 # if no result found, _search automatically delete entity information |
209 # if no result found, _search automatically delete entity information |
209 res = self._search(session, extid, BASE) |
210 res = self._search(session, extid, BASE) |
210 if res: |
211 if res: |
211 ldapemailaddr = res[0].get(ldap_emailattr) |
212 ldapemailaddr = res[0].get(ldap_emailattr) |
212 if ldapemailaddr: |
213 if ldapemailaddr: |
213 rset = session.execute('EmailAddress A WHERE ' |
214 rset = execute('Any X,A WHERE ' |
214 'U use_email X, U eid %(u)s', |
215 'X address A, U use_email X, U eid %(u)s', |
215 {'u': eid}) |
216 {'u': eid}) |
216 ldapemailaddr = unicode(ldapemailaddr) |
217 ldapemailaddr = unicode(ldapemailaddr) |
217 for emailaddr, in rset: |
218 for emaileid, emailaddr, in rset: |
218 if emailaddr == ldapemailaddr: |
219 if emailaddr == ldapemailaddr: |
219 break |
220 break |
220 else: |
221 else: |
221 self.info('updating email address of user %s to %s', |
222 self.info('updating email address of user %s to %s', |
222 extid, ldapemailaddr) |
223 extid, ldapemailaddr) |
223 if rset: |
224 emailrset = execute('EmailAddress A WHERE A address %(addr)s', |
224 session.execute('SET X address %(addr)s WHERE ' |
225 {'addr': ldapemailaddr}) |
225 'U primary_email X, U eid %(u)s', |
226 if emailrset: |
226 {'addr': ldapemailaddr, 'u': eid}) |
227 execute('SET U use_email X WHERE ' |
|
228 'X eid %(x)s, U eid %(u)s', |
|
229 {'x': emailrset[0][0], 'u': eid}) |
|
230 elif rset: |
|
231 if not execute('SET X address %(addr)s WHERE ' |
|
232 'U primary_email X, U eid %(u)s', |
|
233 {'addr': ldapemailaddr, 'u': eid}, 'u'): |
|
234 execute('SET X address %(addr)s WHERE ' |
|
235 'X eid %(x)s', |
|
236 {'addr': ldapemailaddr, 'x': rset[0][0]}, 'x') |
227 else: |
237 else: |
228 # no email found, create it |
238 # no email found, create it |
229 _insert_email(session, ldapemailaddr, eid) |
239 _insert_email(session, ldapemailaddr, eid) |
230 finally: |
240 finally: |
231 session.commit() |
241 session.commit() |