32 """ |
32 """ |
33 |
33 |
34 def __init__(self): |
34 def __init__(self): |
35 """Defines the name, key_name and model for this entity. |
35 """Defines the name, key_name and model for this entity. |
36 """ |
36 """ |
|
37 base.Logic.__init__(self, soc.models.user.User, |
|
38 skip_properties=['former_accounts']) |
37 |
39 |
38 self._name = "User" |
40 def isFormerAccount(self, account): |
39 self._model = soc.models.user.User |
41 """Returns true if account is a former account of some User. |
40 self._skip_properties = ['former_ids'] |
42 """ |
41 |
|
42 def isFormerId(self, id): |
|
43 """Returns true if id is in former ids""" |
|
44 # TODO(pawel.solyga): replace 1000 with solution that works for any number of queries |
43 # TODO(pawel.solyga): replace 1000 with solution that works for any number of queries |
45 users_with_former_ids = soc.models.user.User.gql('WHERE former_ids != :1', None).fetch(1000) |
44 users_with_former_accounts = soc.models.user.User.gql( |
|
45 'WHERE former_accounts != :1', None).fetch(1000) |
46 |
46 |
47 for former_id_user in users_with_former_ids: |
47 for former_account_user in users_with_former_accounts: |
48 if id in former_id_user.former_ids: |
48 if account in former_account_user.former_accounts: |
49 return True |
49 return True |
50 |
50 |
51 return False |
51 return False |
52 |
52 |
53 def getKeyValues(self, entity): |
53 def getKeyValues(self, entity): |
54 """See base.Logic.getKeyValues. |
54 """See base.Logic.getKeyValues. |
55 """ |
55 """ |
56 |
56 |
57 return [entity.id.email()] |
57 return [entity.account.email()] |
58 |
58 |
59 def getSuffixValues(self, entity): |
59 def getSuffixValues(self, entity): |
60 """See base.Logic.getSuffixValues |
60 """See base.Logic.getSuffixValues |
61 """ |
61 """ |
62 |
62 |
72 properties = { |
72 properties = { |
73 'link_name': fields['link_name'] |
73 'link_name': fields['link_name'] |
74 } |
74 } |
75 |
75 |
76 entity = self.getForFields(properties, unique=True) |
76 entity = self.getForFields(properties, unique=True) |
77 return [entity.id.email()] |
77 return [entity.account.email()] |
78 |
78 |
79 def getKeyFieldNames(self): |
79 def getKeyFieldNames(self): |
80 """See base.Logic.getKeyFieldNames |
80 """See base.Logic.getKeyFieldNames |
81 """ |
81 """ |
82 |
82 |
83 return ['email'] |
83 return ['email'] |
84 |
84 |
85 def updateOrCreateFromId(self, properties, id): |
85 def updateOrCreateFromAccount(self, properties, account): |
86 """Like updateOrCreateFromKeyName, but resolves id to a key_name first. |
86 """Like updateOrCreateFromKeyName, but resolves account to key_name first. |
87 """ |
87 """ |
88 |
88 |
89 # attempt to retrieve the existing entity |
89 # attempt to retrieve the existing entity |
90 user = soc.models.user.User.gql('WHERE id = :1', id).get() |
90 user = soc.models.user.User.gql('WHERE account = :1', account).get() |
91 |
91 |
92 if user: |
92 if user: |
93 key_name = user.key().name() |
93 key_name = user.key().name() |
94 else: |
94 else: |
95 key_name = self.getKeyNameForFields({'email': id.email()}) |
95 key_name = self.getKeyNameForFields({'email': account.email()}) |
96 |
96 |
97 return self.updateOrCreateFromKeyName(properties, key_name) |
97 return self.updateOrCreateFromKeyName(properties, key_name) |
98 |
98 |
99 def _updateField(self, model, name, value): |
99 def _updateField(self, model, name, value): |
100 """Special case logic for id. |
100 """Special case logic for account. |
101 |
101 |
102 When the id is changed, the former_ids field should be appended |
102 When the account is changed, the former_accounts field should be appended |
103 with the old id. |
103 with the old account. |
104 """ |
104 """ |
105 if name == 'id' and model.id != value: |
105 if name == 'account' and model.account != value: |
106 model.former_ids.append(model.id) |
106 model.former_accounts.append(model.account) |
107 |
107 |
108 return True |
108 return True |
109 |
109 |
110 |
110 |
111 logic = Logic() |
111 logic = Logic() |