def handle(self, *args, **options): from sadiki.core.workflow import DECISION, PERMANENT_DECISION auto_distributions = Distribution.objects.filter( status=DISTRIBUTION_STATUS_AUTO) if auto_distributions.exists(): distribution = auto_distributions[0] age_groups = AgeGroup.objects.all() for age_group in age_groups: while True: queue_by_age = QueueByAge(distribution, age_group=age_group) sadik_group_ids = queue_by_age.vacancies.all().values_list('sadik_group__id', flat=True) sadik_groups = SadikGroup.objects.filter(id__in=sadik_group_ids) table = DataTable(sadik_groups, list(queue_by_age.competitors())) try: row = table.row_groups[0][0] except IndexError: break # Наименее востребованная и наиболее приоритетная группа selected_cell = None for cell in row: if cell.weight and table.cols.get_col(cell.sadik_group).popularity: factor = lambda cell: cell.weight / table.cols.get_col(cell.sadik_group).popularity if selected_cell is None or factor(cell) < factor(selected_cell): selected_cell = cell if selected_cell: requestion = row.instance sadik_group = selected_cell.sadik_group else: break # Зачисляем if requestion.status == STATUS_REQUESTER: requestion.status = STATUS_ON_DISTRIBUTION requestion.save() requestion.distribute_in_sadik_from_requester(sadik_group.sadik) Logger.objects.create_for_action(DECISION, extra={'user': None, 'obj': requestion}) if requestion.status == STATUS_TEMP_DISTRIBUTED: requestion.status = STATUS_ON_TEMP_DISTRIBUTION requestion.save() requestion.distribute_in_sadik_from_tempdistr(sadik_group.sadik) Logger.objects.create_for_action(PERMANENT_DECISION, extra={'user': None, 'obj': requestion}) distribution.status = DISTRIBUTION_STATUS_START distribution.save()
def test(): initial_distributions = Distribution.objects.filter( status__in=(DISTRIBUTION_STATUS_INITIAL, DISTRIBUTION_STATUS_AUTO)) if initial_distributions: distribution = initial_distributions[0] distribution.start_datetime = datetime.datetime.now() age_group = AgeGroup.objects.all()[0] queue_by_age = QueueByAge(distribution, age_group=age_group) sadik_group_ids = queue_by_age.vacancies.all().values_list('sadik_group__id', flat=True) sadik_groups = SadikGroup.objects.filter(id__in=sadik_group_ids) return DataTable(sadik_groups, list(queue_by_age.competitors()))