Revision 8e45d6fd snf-astakos-app/astakos/im/models.py
b/snf-astakos-app/astakos/im/models.py | ||
---|---|---|
59 | 59 |
|
60 | 60 |
logger = logging.getLogger(__name__) |
61 | 61 |
|
62 |
class Service(models.Model): |
|
63 |
name = models.CharField('Name', max_length=255, unique=True, db_index=True) |
|
64 |
url = models.FilePathField() |
|
65 |
icon = models.FilePathField(blank=True) |
|
66 |
auth_token = models.CharField('Authentication Token', max_length=32, |
|
67 |
null=True, blank=True) |
|
68 |
auth_token_created = models.DateTimeField('Token creation date', null=True) |
|
69 |
auth_token_expires = models.DateTimeField('Token expiration date', null=True) |
|
70 |
|
|
71 |
def save(self, **kwargs): |
|
72 |
if not self.id: |
|
73 |
self.renew_token() |
|
74 |
self.full_clean() |
|
75 |
super(Service, self).save(**kwargs) |
|
76 |
|
|
77 |
def renew_token(self): |
|
78 |
md5 = hashlib.md5() |
|
79 |
md5.update(self.name.encode('ascii', 'ignore')) |
|
80 |
md5.update(self.url.encode('ascii', 'ignore')) |
|
81 |
md5.update(asctime()) |
|
82 |
|
|
83 |
self.auth_token = b64encode(md5.digest()) |
|
84 |
self.auth_token_created = datetime.now() |
|
85 |
self.auth_token_expires = self.auth_token_created + \ |
|
86 |
timedelta(hours=AUTH_TOKEN_DURATION) |
|
87 |
|
|
88 |
def __str__(self): |
|
89 |
return self.name |
|
90 |
|
|
91 |
class ResourceMetadata(models.Model): |
|
92 |
key = models.CharField('Name', max_length=255, unique=True, db_index=True) |
|
93 |
value = models.CharField('Value', max_length=255) |
|
94 |
|
|
95 |
class Resource(models.Model): |
|
96 |
name = models.CharField('Name', max_length=255, unique=True, db_index=True) |
|
97 |
meta = models.ManyToManyField(ResourceMetadata) |
|
98 |
service = models.ForeignKey(Service) |
|
99 |
|
|
100 |
def __str__(self): |
|
101 |
return '%s : %s' % (self.service, self.name) |
|
102 |
|
|
103 |
class GroupKind(models.Model): |
|
104 |
name = models.CharField('Name', max_length=255, unique=True, db_index=True) |
|
105 |
|
|
106 |
def __str__(self): |
|
107 |
return self.name |
|
108 |
|
|
109 |
class AstakosGroup(Group): |
|
110 |
kind = models.ForeignKey(GroupKind) |
|
111 |
desc = models.TextField('Description', null=True) |
|
112 |
identifier = models.URLField('URI identifier', unique=True, default='', db_index=True) |
|
113 |
policy = models.ManyToManyField(Resource, null=True, blank=True, through='AstakosGroupQuota') |
|
114 |
creation_date = models.DateTimeField('Creation date', default=datetime.now()) |
|
115 |
issue_date = models.DateTimeField('Issue date', null=True) |
|
116 |
expiration_date = models.DateTimeField('Expiration date', null=True) |
|
117 |
moderatation_enabled = models.BooleanField('Moderated membership?', default=False) |
|
118 |
approval_date = models.DateTimeField('Activation date', null=True, blank=True) |
|
119 |
estimated_participants = models.PositiveIntegerField('Estimated number of participants', null=True) |
|
120 |
|
|
121 |
@property |
|
122 |
def is_disabled(self): |
|
123 |
if not approval_date: |
|
124 |
return False |
|
125 |
return True |
|
126 |
|
|
127 |
@property |
|
128 |
def is_active(self): |
|
129 |
if self.is_disabled: |
|
130 |
return False |
|
131 |
if not self.issue_date: |
|
132 |
return False |
|
133 |
if not self.expiration_date: |
|
134 |
return True |
|
135 |
now = datetime.now() |
|
136 |
if self.issue_date > now: |
|
137 |
return False |
|
138 |
if now >= self.expiration_date: |
|
139 |
return False |
|
140 |
return True |
|
141 |
|
|
142 |
@property |
|
143 |
def participants(self): |
|
144 |
if not self.id: |
|
145 |
return 0 |
|
146 |
return self.user_set.count() |
|
147 |
|
|
148 |
def approve(self): |
|
149 |
self.approval_date = datetime.now() |
|
150 |
self.save() |
|
151 |
|
|
152 |
def disapprove(self): |
|
153 |
self.approval_date = None |
|
154 |
self.save() |
|
155 |
|
|
156 |
def approve_member(self, member): |
|
157 |
m = self.membership_set.get(person=member) |
|
158 |
m.date_joined = datetime.now() |
|
159 |
m.save() |
|
160 |
|
|
161 |
def disapprove_member(self, member): |
|
162 |
m = self.membership_set.remove(member) |
|
163 |
|
|
164 |
def get_members(self, approved=True): |
|
165 |
if approved: |
|
166 |
return self.membership_set().filter(is_approved=True) |
|
167 |
return self.membership_set().all() |
|
168 |
|
|
62 | 169 |
class AstakosUser(User): |
63 | 170 |
""" |
64 | 171 |
Extends ``django.contrib.auth.models.User`` by defining additional fields. |
... | ... | |
93 | 200 |
|
94 | 201 |
activation_sent = models.DateTimeField('Activation sent data', null=True, blank=True) |
95 | 202 |
|
203 |
policy = models.ManyToManyField(Resource, null=True, through='AstakosUserQuota') |
|
204 |
|
|
205 |
astakos_groups = models.ManyToManyField(AstakosGroup, verbose_name=_('agroups'), blank=True, |
|
206 |
help_text=_("In addition to the permissions manually assigned, this user will also get all permissions granted to each group he/she is in."), |
|
207 |
through='Membership') |
|
208 |
|
|
96 | 209 |
__has_signed_terms = False |
97 | 210 |
__groupnames = [] |
98 | 211 |
|
212 |
owner = models.ManyToManyField(AstakosGroup, related_name='owner', null=True) |
|
213 |
|
|
99 | 214 |
class Meta: |
100 | 215 |
unique_together = ("provider", "third_party_identifier") |
101 | 216 |
|
... | ... | |
152 | 267 |
if self.is_active and self.activation_sent: |
153 | 268 |
# reset the activation sent |
154 | 269 |
self.activation_sent = None |
270 |
|
|
155 | 271 |
super(AstakosUser, self).save(**kwargs) |
156 | 272 |
|
157 | 273 |
# set group if does not exist |
... | ... | |
210 | 326 |
self.save() |
211 | 327 |
return False |
212 | 328 |
return True |
329 |
|
|
330 |
def enroll_group(self, group): |
|
331 |
self.membership_set.add(group) |
|
332 |
|
|
333 |
def get_astakos_groups(self, approved=True): |
|
334 |
if approved: |
|
335 |
return self.membership_set().filter(is_approved=True) |
|
336 |
return self.membership_set().all() |
|
337 |
|
|
338 |
class Membership(models.Model): |
|
339 |
person = models.ForeignKey(AstakosUser) |
|
340 |
group = models.ForeignKey(AstakosGroup) |
|
341 |
date_requested = models.DateField(default=datetime.now()) |
|
342 |
date_joined = models.DateField(null=True, db_index=True) |
|
343 |
|
|
344 |
class Meta: |
|
345 |
unique_together = ("person", "group") |
|
346 |
|
|
347 |
@property |
|
348 |
def is_approved(self): |
|
349 |
if self.date_joined: |
|
350 |
return True |
|
351 |
return False |
|
352 |
|
|
353 |
class AstakosGroupQuota(models.Model): |
|
354 |
limit = models.PositiveIntegerField('Limit') |
|
355 |
resource = models.ForeignKey(Resource) |
|
356 |
group = models.ForeignKey(AstakosGroup, blank=True) |
|
357 |
|
|
358 |
class Meta: |
|
359 |
unique_together = ("resource", "group") |
|
360 |
|
|
361 |
class AstakosUserQuota(models.Model): |
|
362 |
limit = models.PositiveIntegerField('Limit') |
|
363 |
resource = models.ForeignKey(Resource) |
|
364 |
user = models.ForeignKey(AstakosUser) |
|
365 |
|
|
366 |
class Meta: |
|
367 |
unique_together = ("resource", "user") |
|
213 | 368 |
|
214 | 369 |
class ApprovalTerms(models.Model): |
215 | 370 |
""" |
... | ... | |
251 | 406 |
# or if specific fields are modified |
252 | 407 |
if not user.id: |
253 | 408 |
return True |
254 |
db_instance = AstakosUser.objects.get(id = user.id) |
|
409 |
try: |
|
410 |
db_instance = AstakosUser.objects.get(id = user.id) |
|
411 |
except AstakosUser.DoesNotExist: |
|
412 |
return True |
|
255 | 413 |
for f in BILLING_FIELDS: |
256 | 414 |
if (db_instance.__getattribute__(f) != user.__getattribute__(f)): |
257 | 415 |
return True |
... | ... | |
341 | 499 |
expiration_date = timedelta(days=EMAILCHANGE_ACTIVATION_DAYS) |
342 | 500 |
return self.requested_at + expiration_date < datetime.now() |
343 | 501 |
|
344 |
class Service(models.Model): |
|
345 |
name = models.CharField('Name', max_length=255, unique=True) |
|
346 |
url = models.FilePathField() |
|
347 |
icon = models.FilePathField(blank=True) |
|
348 |
auth_token = models.CharField('Authentication Token', max_length=32, |
|
349 |
null=True, blank=True) |
|
350 |
auth_token_created = models.DateTimeField('Token creation date', null=True) |
|
351 |
auth_token_expires = models.DateTimeField('Token expiration date', null=True) |
|
352 |
|
|
353 |
def save(self, **kwargs): |
|
354 |
if not self.id: |
|
355 |
self.renew_token() |
|
356 |
self.full_clean() |
|
357 |
super(Service, self).save(**kwargs) |
|
358 |
|
|
359 |
def renew_token(self): |
|
360 |
md5 = hashlib.md5() |
|
361 |
md5.update(self.name.encode('ascii', 'ignore')) |
|
362 |
md5.update(self.url.encode('ascii', 'ignore')) |
|
363 |
md5.update(asctime()) |
|
364 |
|
|
365 |
self.auth_token = b64encode(md5.digest()) |
|
366 |
self.auth_token_created = datetime.now() |
|
367 |
self.auth_token_expires = self.auth_token_created + \ |
|
368 |
timedelta(hours=AUTH_TOKEN_DURATION) |
|
369 |
|
|
370 | 502 |
class AdditionalMail(models.Model): |
371 | 503 |
""" |
372 | 504 |
Model for registring invitations |
Also available in: Unified diff