models.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. from django.db import models
  2. from django.utils import timezone
  3. from django.utils.translation import gettext_lazy as _
  4. from misago.conf import settings
  5. from misago.core.cache import cache
  6. CACHE_KEY = "misago_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, default=TYPE_TOS, choices=TYPE_CHOICES, db_index=True
  37. )
  38. title = models.CharField(max_length=255, null=True, blank=True)
  39. link = models.URLField(max_length=255, null=True, blank=True)
  40. text = models.TextField(null=True, blank=True)
  41. is_active = models.BooleanField(default=False)
  42. created_on = models.DateTimeField(default=timezone.now)
  43. created_by = models.ForeignKey(
  44. settings.AUTH_USER_MODEL,
  45. on_delete=models.SET_NULL,
  46. blank=True,
  47. null=True,
  48. related_name="+",
  49. )
  50. created_by_name = models.CharField(max_length=255, null=True, blank=True)
  51. last_modified_on = models.DateTimeField(null=True, blank=True)
  52. last_modified_by = models.ForeignKey(
  53. settings.AUTH_USER_MODEL,
  54. on_delete=models.SET_NULL,
  55. blank=True,
  56. null=True,
  57. related_name="+",
  58. )
  59. last_modified_by_name = models.CharField(max_length=255, null=True, blank=True)
  60. objects = AgreementManager()
  61. def get_final_title(self):
  62. return self.title or self.get_type_display()
  63. def set_created_by(self, user):
  64. self.created_by = user
  65. self.created_by_name = user.username
  66. def set_last_modified_by(self, user):
  67. self.last_modified_by = user
  68. self.last_modified_by_name = user.username
  69. class UserAgreement(models.Model):
  70. user = models.ForeignKey(settings.AUTH_USER_MODEL)
  71. agreement = models.ForeignKey(Agreement, related_name="accepted_by")
  72. accepted_on = models.DateTimeField(default=timezone.now)
  73. class Meta:
  74. ordering = ["-pk"]