utils.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. from hashlib import md5
  2. from django.conf import settings
  3. from django.core.cache import cache
  4. from django.utils.encoding import force_bytes
  5. from ..markup import common_flavour
  6. from .models import Agreement, UserAgreement
  7. def set_agreement_as_active(agreement, commit=False):
  8. agreement.is_active = True
  9. Agreement.objects.filter(type=agreement.type).exclude(pk=agreement.pk).update(
  10. is_active=False
  11. )
  12. if commit:
  13. agreement.save(update_fields=["is_active"])
  14. Agreement.objects.invalidate_cache()
  15. def disable_agreement(agreement, commit=False):
  16. agreement.is_active = False
  17. if commit:
  18. agreement.save(update_fields=["is_active"])
  19. Agreement.objects.invalidate_cache()
  20. def get_required_user_agreement(user, agreements):
  21. if user.is_anonymous:
  22. return None
  23. for agreement_type, _ in Agreement.TYPE_CHOICES:
  24. agreement = agreements.get(agreement_type)
  25. if agreement and agreement["id"] not in user.agreements:
  26. try:
  27. return Agreement.objects.get(id=agreement["id"])
  28. except Agreement.DoesNotExist:
  29. # possible stale cache
  30. Agreement.invalidate_cache()
  31. def get_parsed_agreement_text(request, agreement):
  32. if not agreement.text:
  33. return None
  34. cache_name = "misago_legal_%s_%s" % (agreement.pk, agreement.last_modified_on or "")
  35. cached_content = cache.get(cache_name)
  36. unparsed_content = agreement.text
  37. checksum_source = force_bytes("%s:%s" % (unparsed_content, settings.SECRET_KEY))
  38. unparsed_checksum = md5(checksum_source).hexdigest()
  39. if cached_content and cached_content.get("checksum") == unparsed_checksum:
  40. return cached_content["parsed"]
  41. parsed = common_flavour(request, None, unparsed_content)["parsed_text"]
  42. cached_content = {"checksum": unparsed_checksum, "parsed": parsed}
  43. cache.set(cache_name, cached_content)
  44. return cached_content["parsed"]
  45. def save_user_agreement_acceptance(user, agreement, commit=False):
  46. user.agreements.append(agreement.id)
  47. UserAgreement.objects.create(agreement=agreement, user=user)
  48. if commit:
  49. user.save(update_fields=["agreements"])