""" employee/methods.py """ from employee.models import Employee from itertools import groupby from base.context_processors import get_intial_prefix def dynamic_prefix_sort(item): # Assuming the dynamic prefix length is 3 prefix = get_intial_prefix(None)["get_intial_prefix"] prefix_length = len(prefix) if len(prefix) >= 3 else 3 return item[:prefix_length] def get_ordered_badge_ids(): """ This method is used to return ordered badge ids """ employees = Employee.objects.all() data = ( employees.exclude(badge_id=None) .order_by("badge_id") .values_list("badge_id", flat=True) ) # Separate pure number strings and convert them to integers pure_numbers = [int(item) for item in data if item.isdigit()] # Remove pure number strings from the original data data = [item for item in data if not item.isdigit()] # Sort the remaining data by dynamic prefixes sorted_data = sorted(data, key=dynamic_prefix_sort) # Group the sorted data by dynamic prefixes grouped_data = [ list(group) for _, group in groupby(sorted_data, key=dynamic_prefix_sort) ] # Sort each subgroup alphabetically and numerically for group in grouped_data: group.sort() group.sort(key=lambda x: int("".join(filter(str.isdigit, x)))) # Create a list containing the first and last items from each group result = [[group[0], group[-1]] for group in grouped_data] # Add the list of pure numbers at the beginning result.insert(0, [pure_numbers[0], pure_numbers[-1]]) return result