counts.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. from time import time
  2. from django.conf import settings
  3. from django.dispatch import receiver
  4. from misago.threads.views.newthreads import NewThreads
  5. from misago.threads.views.unreadthreads import UnreadThreads
  6. class BaseCounter(object):
  7. Threads = None
  8. name = None
  9. def __init__(self, user, session):
  10. self.user = user
  11. self.session = session
  12. self.count = self.get_cached_count()
  13. def __int__(self):
  14. return self.count
  15. def __unicode__(self):
  16. return unicode(self.count)
  17. def __nonzero__( self) :
  18. return bool(self.count)
  19. def get_cached_count(self):
  20. count = self.session.get(self.name, None)
  21. if not count or not self.is_cache_valid(count):
  22. count = self.get_real_count()
  23. self.session[self.name] = count
  24. return count['threads']
  25. def is_cache_valid(self, cache):
  26. if cache.get('expires', 0) > time():
  27. return cache.get('user') == self.user.pk
  28. else:
  29. return False
  30. def get_expiration_timestamp(self):
  31. return time() + settings.MISAGO_CONTENT_COUNTING_FREQUENCY * 60
  32. def get_real_count(self):
  33. return {
  34. 'threads': self.Threads(self.user).get_queryset().count(),
  35. 'expires': self.get_expiration_timestamp()
  36. }
  37. def set(self, count):
  38. self.count = count
  39. self.session[self.name] = {
  40. 'user': self.user.pk,
  41. 'threads': count,
  42. 'expires': self.get_expiration_timestamp()
  43. }
  44. def decrease(self):
  45. if self.count > 0:
  46. self.count -= 1
  47. self.session[self.name] = {
  48. 'user': self.user.pk,
  49. 'threads': self.count,
  50. 'expires': self.session[self.name]['expires']
  51. }
  52. class NewThreadsCount(BaseCounter):
  53. Threads = NewThreads
  54. name = 'new_threads'
  55. class UnreadThreadsCount(BaseCounter):
  56. Threads = UnreadThreads
  57. name = 'unread_threads'