namechanges.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. """
  2. Service for tracking namechanges
  3. """
  4. from datetime import timedelta
  5. from django.utils import timezone
  6. from .models import UsernameChange
  7. def get_username_options(settings, user, user_acl):
  8. changes_left = get_left_namechanges(user, user_acl)
  9. next_on = get_next_available_namechange(user, user_acl, changes_left)
  10. return {
  11. "changes_left": changes_left,
  12. "next_on": next_on,
  13. "length_min": settings.username_length_min,
  14. "length_max": settings.username_length_max,
  15. }
  16. def get_left_namechanges(user, user_acl):
  17. name_changes_allowed = user_acl["name_changes_allowed"]
  18. if not name_changes_allowed:
  19. return 0
  20. valid_changes = get_valid_changes_queryset(user, user_acl)
  21. used_changes = valid_changes.count()
  22. if name_changes_allowed <= used_changes:
  23. left = 0
  24. return name_changes_allowed - used_changes
  25. def get_next_available_namechange(user, user_acl, changes_left):
  26. name_changes_expire = user_acl["name_changes_expire"]
  27. if changes_left or not name_changes_expire:
  28. return None
  29. valid_changes = get_valid_changes_queryset(user, user_acl)
  30. name_last_changed_on = valid_changes.latest().changed_on
  31. return name_last_changed_on + timedelta(days=name_changes_expire)
  32. def get_valid_changes_queryset(user, user_acl):
  33. name_changes_expire = user_acl["name_changes_expire"]
  34. queryset = user.namechanges.filter(changed_by=user)
  35. if user_acl["name_changes_expire"]:
  36. cutoff = timezone.now() - timedelta(days=name_changes_expire)
  37. return queryset.filter(changed_on__gte=cutoff)
  38. return queryset