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