counts.py 2.1 KB

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