Revision bf0c6de5 snf-astakos-app/astakos/im/models.py

b/snf-astakos-app/astakos/im/models.py
49 49
from django.template.loader import render_to_string
50 50
from django.core.mail import send_mail
51 51
from django.db import transaction
52
from django.db.models.signals import post_save, post_syncdb
52
from django.db.models.signals import post_save, pre_save, post_syncdb
53 53
from django.db.models import Q
54 54
from django.conf import settings
55
from django.utils.importlib import import_module
55 56

  
56
from astakos.im.settings import DEFAULT_USER_LEVEL, INVITATIONS_PER_LEVEL, \
57
    AUTH_TOKEN_DURATION, BILLING_FIELDS, QUEUE_CONNECTION, SITENAME, \
57
from astakos.im.settings import (
58
    DEFAULT_USER_LEVEL, INVITATIONS_PER_LEVEL,
59
    AUTH_TOKEN_DURATION, BILLING_FIELDS, QUEUE_CONNECTION, SITENAME,
58 60
    EMAILCHANGE_ACTIVATION_DAYS, LOGGING_LEVEL
61
)
59 62

  
60 63
QUEUE_CLIENT_ID = 3 # Astakos.
61 64

  
......
165 168
            except Group.DoesNotExist, e:
166 169
                logger.exception(e)
167 170
    
168
    def renew_token(self):
171
    def renew_token(self, flush_sessions=False, current_key=None):
169 172
        md5 = hashlib.md5()
170 173
        md5.update(settings.SECRET_KEY)
171 174
        md5.update(self.username)
172 175
        md5.update(self.realname.encode('ascii', 'ignore'))
173 176
        md5.update(asctime())
174

  
177
        
175 178
        self.auth_token = b64encode(md5.digest())
176 179
        self.auth_token_created = datetime.now()
177 180
        self.auth_token_expires = self.auth_token_created + \
178 181
                                  timedelta(hours=AUTH_TOKEN_DURATION)
182
        if flush_sessions:
183
            self.flush_sessions(current_key)
179 184
        msg = 'Token renewed for %s' % self.email
180 185
        logger._log(LOGGING_LEVEL, msg, [])
181 186

  
187
    def flush_sessions(self, current_key=None):
188
        q = self.sessions
189
        if current_key:
190
            q = q.exclude(session_key=current_key)
191
        
192
        keys = q.values_list('session_key', flat=True)
193
        if keys:
194
            msg = 'Flushing sessions: %s' % ','.join(keys)
195
            logger._log(LOGGING_LEVEL, msg, [])
196
        engine = import_module(settings.SESSION_ENGINE)
197
        for k in keys:
198
            s = engine.SessionStore(k)
199
            s.flush()
200
#         q.all().delete()
201

  
182 202
    def __unicode__(self):
183 203
        return self.username
184 204
    
......
355 375
    auth_token_created = models.DateTimeField('Token creation date', null=True)
356 376
    auth_token_expires = models.DateTimeField('Token expiration date', null=True)
357 377
    
358
    def save(self, **kwargs):
359
        if not self.id:
360
            self.renew_token()
361
        self.full_clean()
362
        super(Service, self).save(**kwargs)
363
    
364 378
    def renew_token(self):
365 379
        md5 = hashlib.md5()
366 380
        md5.update(settings.SECRET_KEY)
......
372 386
        self.auth_token_created = datetime.now()
373 387
        self.auth_token_expires = self.auth_token_created + \
374 388
                                  timedelta(hours=AUTH_TOKEN_DURATION)
389
        msg = 'Token renewed for %s' % self.name
390
        logger._log(LOGGING_LEVEL, msg, [])
375 391

  
376 392
class AdditionalMail(models.Model):
377 393
    """
......
419 435
                    self.username = username
420 436
        super(PendingThirdPartyUser, self).save(**kwargs)
421 437

  
438
class SessionCatalog(models.Model):
439
    session_key = models.CharField(_('session key'), max_length=40)
440
    user = models.ForeignKey(AstakosUser, related_name='sessions', null=True)
441

  
422 442
def create_astakos_user(u):
423 443
    try:
424 444
        AstakosUser.objects.get(user_ptr=u.pk)
425 445
    except AstakosUser.DoesNotExist:
426 446
        extended_user = AstakosUser(user_ptr_id=u.pk)
427 447
        extended_user.__dict__.update(u.__dict__)
428
        extended_user.renew_token()
429 448
        extended_user.save()
430 449
    except:
431 450
        pass
......
443 462
    if instance.is_superuser:
444 463
        create_astakos_user(instance)
445 464

  
446
post_save.connect(superuser_post_save, sender=User)
465
def astakosuser_post_save(sender, instance, **kwargs):
466
    pass
467

  
468
post_save.connect(superuser_post_save, sender=User)
469

  
470
def renew_token(sender, instance, **kwargs):
471
    if not instance.id:
472
        instance.renew_token()
473

  
474
pre_save.connect(renew_token, sender=AstakosUser)
475
pre_save.connect(renew_token, sender=Service)

Also available in: Unified diff