models.py 3.2 KB

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