""" Service for tracking namechanges """ from datetime import timedelta from django.utils import timezone from .models import UsernameChange def get_username_options(settings, user, user_acl): changes_left = get_left_namechanges(user, user_acl) next_on = get_next_available_namechange(user, user_acl, changes_left) return { "changes_left": changes_left, "next_on": next_on, "length_min": settings.username_length_min, "length_max": settings.username_length_max, } def get_left_namechanges(user, user_acl): name_changes_allowed = user_acl["name_changes_allowed"] if not name_changes_allowed: return 0 valid_changes = get_valid_changes_queryset(user, user_acl) used_changes = valid_changes.count() if name_changes_allowed <= used_changes: left = 0 return name_changes_allowed - used_changes def get_next_available_namechange(user, user_acl, changes_left): name_changes_expire = user_acl["name_changes_expire"] if changes_left or not name_changes_expire: return None valid_changes = get_valid_changes_queryset(user, user_acl) name_last_changed_on = valid_changes.latest().changed_on return name_last_changed_on + timedelta(days=name_changes_expire) def get_valid_changes_queryset(user, user_acl): name_changes_expire = user_acl["name_changes_expire"] queryset = user.namechanges.filter(changed_by=user) if user_acl["name_changes_expire"]: cutoff = timezone.now() - timedelta(days=name_changes_expire) return queryset.filter(changed_on__gte=cutoff) return queryset