from patch.include import *
from tqdm import tqdm


@app_context(commit=True)
def personal_calendars():
    """
    Для тестирования патча: ( cd /opt/eva-app; python3 -m patch.202601291040_personal_calendars )
    45 cек / 1000 пользователей
    """
    print('Запуск патча personal_calendars')

    tz = datetime.datetime.now().astimezone().tzinfo
    server_timezone = int(datetime.datetime.now(tz).utcoffset().total_seconds())

    _filter = [['user_local', '==', True], ['name', 'NOT LIKE', 'PERF_%']]
    _fields = ['calendar.timezone', 'calendar.calc_num_years', 'calendar.calc_num_back_years', 'calendar.parent']

    i = 0
    step = 100
    while True:
        persons = models.CmfPerson.list(filter=_filter, fields=_fields, slice=[i, i + step])
        if not persons:
            break

        for person in persons:

            if person.calendar and person.calendar.parent == person:
                continue

            parent_calendar = person.calendar
            timezone = server_timezone
            calc_num_years = 5
            calc_num_back_years = 2
            today = datetime.date.today()
            calc_until = today.replace(year=today.year + calc_num_years)

            if parent_calendar:
                timezone = parent_calendar.timezone
                calc_num_years = parent_calendar.calc_num_years
                calc_num_back_years = parent_calendar.calc_num_back_years
                calc_until = today.replace(year=today.year + calc_num_years)

            new_calendar = models.CmfCalendar(
                name=f'Календарь {person.code.value}',
                parent=person,
                parent_calendar=parent_calendar,
                timezone=timezone,
                calc_num_years=calc_num_years,
                calc_num_back_years=calc_num_back_years,
                calc_until=calc_until,
                dirty=False,
            )
            new_calendar.save(only_data=True)

            person.calendar = new_calendar
            person.save(only_data=True)

            models.CmfTaskResAssign.bulk_update(filter=['person', '==', person], values={'calendar_id': new_calendar.id.value})

        cmf_commit()
        i = i + step

if __name__ == "__main__":
    personal_calendars()
