utils.py 2.0 KB

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