models.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. from django.db import models
  2. from django.utils import timezone
  3. from django.utils.translation import ugettext_lazy as _
  4. from misago.conf import settings
  5. from misago.core.cache import cache
  6. CACHE_KEY = 'agreements'
  7. class AgreementManager(models.Manager):
  8. def invalidate_cache(self):
  9. cache.delete(CACHE_KEY)
  10. def get_agreements(self):
  11. agreements = self.get_agreements_from_cache()
  12. if agreements == 'nada':
  13. agreements = self.get_agreements_from_db()
  14. cache.set(CACHE_KEY, agreements)
  15. return agreements
  16. def get_agreements_from_cache(self):
  17. return cache.get(CACHE_KEY, 'nada')
  18. def get_agreements_from_db(self):
  19. agreements = {}
  20. for agreement in Agreement.objects.filter(is_active=True):
  21. agreements[agreement.type] = {
  22. 'id': agreement.id,
  23. 'title': agreement.get_final_title(),
  24. 'link': agreement.link,
  25. 'text': bool(agreement.text),
  26. }
  27. return agreements
  28. class Agreement(models.Model):
  29. TYPE_TOS = 'terms_of_service'
  30. TYPE_PRIVACY = 'privacy_policy'
  31. TYPE_CHOICES = [
  32. (TYPE_TOS, _('Terms of service')),
  33. (TYPE_PRIVACY, _('Privacy policy')),
  34. ]
  35. type = models.CharField(
  36. max_length=20,
  37. default=TYPE_TOS,
  38. choices=TYPE_CHOICES,
  39. db_index=True,
  40. )
  41. title = models.CharField(max_length=255, null=True, blank=True)
  42. link = models.URLField(max_length=255, null=True, blank=True)
  43. text = models.TextField(null=True, blank=True)
  44. is_active = models.BooleanField(default=False)
  45. created_on = models.DateTimeField(default=timezone.now)
  46. created_by = models.ForeignKey(
  47. settings.AUTH_USER_MODEL,
  48. on_delete=models.SET_NULL,
  49. blank=True,
  50. null=True,
  51. related_name='+',
  52. )
  53. created_by_name = models.CharField(max_length=255, null=True, blank=True)
  54. last_modified_on = models.DateTimeField(null=True, blank=True)
  55. last_modified_by = models.ForeignKey(
  56. settings.AUTH_USER_MODEL,
  57. on_delete=models.SET_NULL,
  58. blank=True,
  59. null=True,
  60. related_name='+',
  61. )
  62. last_modified_by_name = models.CharField(max_length=255, null=True, blank=True)
  63. objects = AgreementManager()
  64. def get_final_title(self):
  65. return self.title or self.get_type_display()
  66. def set_created_by(self, user):
  67. self.created_by = user
  68. self.created_by_name = user.username
  69. def set_last_modified_by(self, user):
  70. self.last_modified_by = user
  71. self.last_modified_by_name = user.username
  72. class UserAgreement(models.Model):
  73. user = models.ForeignKey(
  74. settings.AUTH_USER_MODEL,
  75. blank=True,
  76. null=True
  77. )
  78. agreement = models.ForeignKey(Agreement, related_name='accepted_by')
  79. accepted_on = models.DateTimeField(default=timezone.now)
  80. class Meta:
  81. ordering = ["-accepted_on"]