counts.py 1.9 KB

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