models.py 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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 = '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,
  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(settings.AUTH_USER_MODEL)
  74. agreement = models.ForeignKey(Agreement, related_name='accepted_by')
  75. accepted_on = models.DateTimeField(default=timezone.now)
  76. class Meta:
  77. ordering = ["-pk"]