namechanges.py 1.5 KB

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