diff --git a/locking/managers.py b/locking/managers.py new file mode 100644 index 0000000..37eb392 --- /dev/null +++ b/locking/managers.py @@ -0,0 +1,28 @@ +import datetime + +from django.db import models +from django.db.models import Q + +from locking import LOCK_TIMEOUT + +class LockManager(models.Manager): + def locked(self): + now = datetime.datetime.now() + qs = super(LockManager, self).get_query_set() + qs = qs.extra(select={'expires_at':'DATE_ADD(locked_at,INTERVAL 120 SECOND)'}) + qs = qs.extra(where=['DATE_ADD(locked_at,INTERVAL %s SECOND) > %s'], params=[LOCK_TIMEOUT, now]) + return qs + + def unlocked(self): + now = datetime.datetime.now() + qs = super(LockManager, self).get_query_set() + qs = qs.extra(select={'expires_at':'DATE_ADD(locked_at,INTERVAL 120 SECOND)'}) + qs = qs.extra(where=['DATE_ADD(locked_at,INTERVAL %s SECOND) < %s or locked_at IS NULL'], params=[LOCK_TIMEOUT, now]) + return qs + + def locked_for(self, user): + qs = super(LockManager, self).get_query_set() + qs = qs.extra(select={'expires_at':'DATE_ADD(locked_at,INTERVAL 120 SECOND)'}) + qs = qs.extra(where=['DATE_ADD(locked_at,INTERVAL %s SECOND) > %s'], params=[LOCK_TIMEOUT, now]) + qs = qs.filter(_locked_by = user) + return qs \ No newline at end of file diff --git a/locking/models.py b/locking/models.py index b3a3f34..7815e34 100644 --- a/locking/models.py +++ b/locking/models.py @@ -7,6 +7,7 @@ from django.contrib.auth import models as auth from locking import LOCK_TIMEOUT, logger +from locking.managers import LockManager class ObjectLockedError(IOError): pass @@ -14,7 +15,9 @@ class ObjectLockedError(IOError): class LockableModel(models.Model): class Meta: abstract = True - + + objects = LockManager() + _locked_at = models.DateTimeField(db_column='locked_at', null=True, editable=False)