counts.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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. 'user': self.user.pk,
  35. 'threads': self.Threads(self.user).get_queryset().count(),
  36. 'expires': self.get_expiration_timestamp()
  37. }
  38. def set(self, count):
  39. self.count = count
  40. self.session[self.name] = {
  41. 'user': self.user.pk,
  42. 'threads': count,
  43. 'expires': self.get_expiration_timestamp()
  44. }
  45. def decrease(self):
  46. if self.count > 0:
  47. self.count -= 1
  48. self.session[self.name] = {
  49. 'user': self.user.pk,
  50. 'threads': self.count,
  51. 'expires': self.session[self.name]['expires']
  52. }
  53. class NewThreadsCount(BaseCounter):
  54. Threads = NewThreads
  55. name = 'new_threads'
  56. class UnreadThreadsCount(BaseCounter):
  57. Threads = UnreadThreads
  58. name = 'unread_threads'