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()))