Benjamin Renard commited on 2014-01-31 00:58:00
Showing 1 changed files, with 81 additions and 2 deletions.
| ... | ... |
@@ -58,6 +58,7 @@ class Group(object): |
| 58 | 58 |
self.uuid=None |
| 59 | 59 |
self.name=None |
| 60 | 60 |
self.contributors={}
|
| 61 |
+ self.deletedContributors={}
|
|
| 61 | 62 |
self.contributions={}
|
| 62 | 63 |
self.deletedContributions={}
|
| 63 | 64 |
|
| ... | ... |
@@ -68,6 +69,10 @@ class Group(object): |
| 68 | 69 |
for email in data['contributors']: |
| 69 | 70 |
self.contributors[email]=Contributor() |
| 70 | 71 |
self.contributors[email].load(data['contributors'][email]) |
| 72 |
+ if 'deletedContributors' in data: |
|
| 73 |
+ for email in data['deletedContributors']: |
|
| 74 |
+ self.deletedContributors[email]=Contributor() |
|
| 75 |
+ self.deletedContributors[email].load(data['deletedContributors'][email]) |
|
| 71 | 76 |
for uuid in data['contributions']: |
| 72 | 77 |
self.contributions[uuid]=Contribution() |
| 73 | 78 |
self.contributions[uuid].load(data['contributions'][uuid]) |
| ... | ... |
@@ -85,6 +90,10 @@ class Group(object): |
| 85 | 90 |
for email in self.contributors: |
| 86 | 91 |
contributors[email]=self.contributors[email].export() |
| 87 | 92 |
|
| 93 |
+ deletedContributors={}
|
|
| 94 |
+ for email in self.deletedContributors: |
|
| 95 |
+ deletedContributors[email]=self.deletedContributors[email].export() |
|
| 96 |
+ |
|
| 88 | 97 |
contributions={}
|
| 89 | 98 |
for uuid in self.contributions: |
| 90 | 99 |
contributions[uuid]=self.contributions[uuid].export() |
| ... | ... |
@@ -97,10 +106,38 @@ class Group(object): |
| 97 | 106 |
'uuid': self.uuid, |
| 98 | 107 |
'name': self.name, |
| 99 | 108 |
'contributors': contributors, |
| 109 |
+ 'deletedContributors': deletedContributors, |
|
| 100 | 110 |
'contributions': contributions, |
| 101 | 111 |
'deletedContributions': deletedContributions |
| 102 | 112 |
} |
| 103 | 113 |
|
| 114 |
+ def restoreContributor(self, email): |
|
| 115 |
+ contributor=Contributor() |
|
| 116 |
+ contributor.load(self.deletedContributors[email]) |
|
| 117 |
+ for uuid in self.deletedContributions: |
|
| 118 |
+ if self.deletedContributions[uuid].contributor==contributor.email and self.deletedContributions[uuid].lastChange==contributor.deletionTime: |
|
| 119 |
+ self.contributions[uuid]=Contribution() |
|
| 120 |
+ self.contributions[uuid].load(self.deletedContributions[uuid].export()) |
|
| 121 |
+ # Restored contribution must not be more up to date than other |
|
| 122 |
+ self.contributions[uuid].lastChange=0 |
|
| 123 |
+ del self.deletedContributions[uuid] |
|
| 124 |
+ contributor.deletionTime=None |
|
| 125 |
+ self.contributors[email]=contributor |
|
| 126 |
+ del self.deletedContributors[email] |
|
| 127 |
+ |
|
| 128 |
+ def deleteContributor(self, email, time): |
|
| 129 |
+ contributor=Contributor() |
|
| 130 |
+ contributor.load(self.contributors[email]) |
|
| 131 |
+ contributor.deletionTime=time |
|
| 132 |
+ for uuid in self.contributions: |
|
| 133 |
+ if self.contributions[uuid].contributor==email: |
|
| 134 |
+ self.deletedContributions[uuid]=Contribution() |
|
| 135 |
+ self.deletedContributions[uuid].load(self.contributions[uuid].export()) |
|
| 136 |
+ self.deletedContributions[uuid].lastChange=time |
|
| 137 |
+ del self.contributions[uuid] |
|
| 138 |
+ self.deletedContributors[email]=contributor |
|
| 139 |
+ del self.contributors[email] |
|
| 140 |
+ |
|
| 104 | 141 |
def sync(self, group): |
| 105 | 142 |
ret=Group() |
| 106 | 143 |
ret.uuid=self.uuid |
| ... | ... |
@@ -108,6 +145,43 @@ class Group(object): |
| 108 | 145 |
# FIXME : Add lastChange on group to permit name choice between to object |
| 109 | 146 |
ret.name=group.name |
| 110 | 147 |
|
| 148 |
+ ## Deleted Contributors |
|
| 149 |
+ for email in self.deletedContributors: |
|
| 150 |
+ if email not in group.deletedContributors: |
|
| 151 |
+ logging.debug('Contributor %s not deleted on the other' % email)
|
|
| 152 |
+ lastChange=0 |
|
| 153 |
+ for uuid in group.contributions: |
|
| 154 |
+ if group.contributions[uuid].contributor==email and group.contributions[uuid].lastChange>lastChange: |
|
| 155 |
+ lastChange=group.contributions[uuid].lastChange |
|
| 156 |
+ if self.deletedContributors[email].deletionTime<lastChange: |
|
| 157 |
+ logging.debug('Some modifications are more recent than my deletion, retoring contributors and his contributions')
|
|
| 158 |
+ # Restore contributor and his contributions |
|
| 159 |
+ self.restoreContributor(email) |
|
| 160 |
+ continue |
|
| 161 |
+ elif email in group.contributors: |
|
| 162 |
+ logging.debug('My deletion are more recent than other modification, deleting contributors and his contributions in the other group')
|
|
| 163 |
+ # Delete contributor and his contributions |
|
| 164 |
+ group.deleteContributor(email,self.deletedContributors[email].deletionTime) |
|
| 165 |
+ ret.deletedContributors[email]=self.deletedContributors[email] |
|
| 166 |
+ |
|
| 167 |
+ for email in group.deletedContributors: |
|
| 168 |
+ if email not in ret.deletedContributors: |
|
| 169 |
+ logging.debug('Contributor %s not deleted on me' % email)
|
|
| 170 |
+ lastChange=0 |
|
| 171 |
+ for uuid in ret.contributions: |
|
| 172 |
+ if ret.contributions[uuid].contributor==email and ret.contributions[uuid].lastChange>lastChange: |
|
| 173 |
+ lastChange=ret.contributions[uuid].lastChange |
|
| 174 |
+ if group.deletedContributors[email].deletionTime<lastChange: |
|
| 175 |
+ logging.debug('Some of my modifications are more recent than the other deletion, retoring contributors and his contributions in the other group')
|
|
| 176 |
+ # Restore contributor and his contributions |
|
| 177 |
+ group.restoreContributor(email) |
|
| 178 |
+ continue |
|
| 179 |
+ elif email in group.contributors: |
|
| 180 |
+ # Delete contributor and his contributions |
|
| 181 |
+ logging.debug('The other group deletion are more recent than my modifications, deleting my contributor and his contributions')
|
|
| 182 |
+ ret.deleteContributor(email,group.deletedContributors[email].deletionTime) |
|
| 183 |
+ ret.deletedContributors[email]=group.deletedContributors[email] |
|
| 184 |
+ |
|
| 111 | 185 |
## Contributors |
| 112 | 186 |
ret.contributors=self.contributors |
| 113 | 187 |
for email in group.contributors: |
| ... | ... |
@@ -185,17 +259,22 @@ class Contributor(object): |
| 185 | 259 |
def __init__(self): |
| 186 | 260 |
self.name=None |
| 187 | 261 |
self.email=None |
| 262 |
+ self.deletionTime=None |
|
| 188 | 263 |
|
| 189 | 264 |
def load(self,data): |
| 190 | 265 |
self.name=data['name'] |
| 191 | 266 |
self.email=data['email'] |
| 267 |
+ if 'deletionTime' in data: |
|
| 268 |
+ self.deletionTime=data['deletionTime'] |
|
| 192 | 269 |
|
| 193 | 270 |
def export(self): |
| 194 |
- return {
|
|
| 271 |
+ ret={
|
|
| 195 | 272 |
'name': self.name, |
| 196 | 273 |
'email': self.email |
| 197 | 274 |
} |
| 198 |
- |
|
| 275 |
+ if self.deletionTime is not None: |
|
| 276 |
+ ret['deletionTime']=self.deletionTime |
|
| 277 |
+ return ret |
|
| 199 | 278 |
|
| 200 | 279 |
if __name__ == '__main__': |
| 201 | 280 |
import testdata |
| 202 | 281 |