Advertisement
Mochinov

Untitled

Aug 23rd, 2021
892
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.26 KB | None | 0 0
  1. import calendar
  2. from dateutil import rrule
  3. from datetime import datetime, timedelta
  4. from collections import defaultdict
  5. from datetime import datetime
  6. from django.contrib.auth.models import User
  7. from .models import (Account, Doctor, Ticket, DoctorOfftime, Appointments,
  8.                     Personal_Workchedule, DoctorMedicalPositions, MedicalPositions)
  9. # from pprint import pprint
  10.  
  11.  
  12. _slice_previous_week = lambda index_week, month : [month.pop(0) for index in range(len(month)) if index < index_week]
  13. def get_free_ticket(date: datetime, select_reception: str, user: int, positionId: int,  doctor: list = []) -> list:
  14.     # Проверяю передан ли конкретный врач
  15.     if doctor:
  16.         listDoctor = [doctor]
  17.     else:
  18.         if positionId: # Формирую список врачей (их id) если конкретный доктор не выбран , получаю их по выбранной специализации
  19.                         # и проверяю их выходные дни
  20.             _check_doctorOfftime = lambda id: not DoctorOfftime.objects.filter(doctor__id = id, start_date__gte = date, end_date__lte = date).exists()
  21.             listDoctor = list(filter( _check_doctorOfftime ,
  22.             [positions.doctor.id for positions in DoctorMedicalPositions.objects.filter(
  23.                 polyclinic__id = Account.objects.get(user = user).polyclinic.id,
  24.                 position__id = positionId,
  25.             )]))
  26.         else:
  27.             listDoctor = []
  28.  
  29.     list_talons = [] # Получаю список талонов на конкретный день из календаря и устанавляиваю json с талонами , если время у врачей совпадает то записываю их в список по ключу
  30.     for ticket in Appointments.objects.filter(appointment_date = datetime.strptime(date, '%Y-%m-%d'), doctor__id__in = listDoctor):
  31.         ticketTime = f"{ticket.appointment_time.hour}:{ticket.appointment_time.minute}"
  32.         if list_talons:
  33.             for value in list_talons:
  34.                 if ticketTime in value:
  35.                     value[ticketTime].append((ticket.doctor.id, ticket.id))
  36.                 else:
  37.                     value[ticketTime] = [(ticket.doctor.id, ticket.id)]
  38.         else:
  39.             list_talons.append({f'{ticketTime}' : [(ticket.doctor.id, ticket.id)]})
  40.            
  41.     if list_talons:
  42.         countTicket = len(list_talons[0])
  43.     else: countTicket = len(list_talons)
  44.     return (date, countTicket, list_talons)
  45.  
  46. def generate_month(year: int, month: int, select_reception: str, user: id, positionId: id, doctorId: int = 0) -> tuple:
  47.  
  48.     print(year, month, select_reception, doctorId,positionId)
  49.  
  50.     """Первый день месяца"""
  51.     first_day_of_month = datetime(year, month, 1)
  52.  
  53.     """Последний день месяца"""
  54.     last_day_of_month = first_day_of_month.replace(day=calendar.monthrange(year, month)[1])
  55.  
  56.     """Сгенерированные календарные дни"""
  57.     range_date = rrule.rrule(rrule.DAILY, dtstart=first_day_of_month, until=last_day_of_month)
  58.  
  59.     """Последний день предыдущего месяца"""
  60.     last_day_of_last_month = first_day_of_month - timedelta(days=1)
  61.  
  62.     """Кол-во недель в месяце"""
  63.     max_week = len(calendar.monthcalendar(year, month))
  64.  
  65.     """Кол-во дней в недели"""
  66.     DAYS_WEEK = 7
  67.  
  68.     dict_days = defaultdict(lambda: [])
  69.     for i in range(DAYS_WEEK):
  70.         for day in range_date:
  71.             if day.weekday() == i:
  72.                 dict_days[i].append(day)
  73.  
  74.     """Получаем индекс элемента с первым и последним числом"""
  75.     first_day_of_week = 0
  76.  
  77.     for index, value in dict_days.items():
  78.         for date in value:
  79.             if first_day_of_month.day == date.day:
  80.                 first_day_of_week = index
  81.             if last_day_of_month.day == date.day:
  82.                 last_day_of_week = index
  83.  
  84.     month_list = []  # Список с неделями
  85.     """Заполнием пустую матрицу"""
  86.     for i in range(max_week):
  87.         week = [0 for i in range(DAYS_WEEK)]
  88.         month_list.append(week)
  89.  
  90.     index = 0
  91.     """Индекс последнего дня предыдущего месяца"""
  92.     pre_date = first_day_of_week
  93.     while pre_date:
  94.         pre_date -= 1
  95.         date = datetime.strftime(last_day_of_last_month-timedelta(days=pre_date), '%Y-%m-%d')
  96.         tikets = get_free_ticket(date, select_reception,user,positionId, doctorId)
  97.         month_list[0][index] = {
  98.             'date': tikets[0],
  99.             'count_ticket' : tikets[1] ,
  100.             'ticket' : tikets[2],
  101.             'is_weekend' : True if index in [5,6] else False
  102.         }
  103.         index += 1
  104.  
  105.     index = 0
  106.     """Первого дня следующего месяца"""
  107.     last_index = last_day_of_week
  108.     while last_index < DAYS_WEEK:
  109.         date = datetime.strftime(last_day_of_month + timedelta(days=index), '%Y-%m-%d')
  110.         tikets = get_free_ticket(date, select_reception,user,positionId, doctorId)
  111.         month_list[-1][last_index] = {
  112.             'date': tikets[0],
  113.             'count_ticket' : tikets[1],
  114.             'ticket' : tikets[2],
  115.             'is_weekend' : True if index in [5,6] else False
  116.         }
  117.  
  118.         last_index += 1
  119.         index += 1
  120.  
  121.  
  122.     """Формируем календарь с вложенными параметрами"""
  123.     for week_num, weeks in enumerate(month_list):
  124.         for index, value in enumerate(weeks):
  125.             if first_day_of_week <= index and week_num < len(dict_days[index]):
  126.                 date = datetime.strftime(dict_days[index][week_num], '%Y-%m-%d')
  127.                 tikets = get_free_ticket(date,  select_reception, user, positionId, doctorId)
  128.                 month_list[week_num][index] =  {
  129.                     'date': tikets[0],
  130.                     'count_ticket' : tikets[1] ,
  131.                     'ticket' : tikets[2],
  132.                     'is_weekend' : True if index in [5,6] else False
  133.                 }
  134.  
  135.             if index < first_day_of_week and len(dict_days[index]) > week_num >= 0:
  136.                 date = datetime.strftime(dict_days[index][week_num], '%Y-%m-%d')
  137.                 tikets = get_free_ticket(date, select_reception, user, positionId, doctorId)
  138.                 month_list[week_num + 1][index] = {
  139.                     'date': tikets[0],
  140.                     'count_ticket' : tikets[1] ,
  141.                     'ticket' : tikets[2],
  142.                     'is_weekend' : True if index in [5,6] else False
  143.                 }
  144.  
  145.  
  146.  
  147.     """Удаление прошедшей недели"""
  148.     if datetime.today().month == month:
  149.         for element in range(len(month_list)):
  150.             if element < len(month_list):
  151.                 for value in month_list[element]:
  152.                     if datetime.strftime(datetime.today(), '%Y-%m-%d')  == value['date']:
  153.                         _slice_previous_week(element, month_list)
  154.                         break
  155.     return (
  156.         (first_day_of_month.strftime('%b').title(), year),
  157.         month_list,
  158.         [doctor.id for doctor in Doctor.objects.filter(id = doctorId)]
  159.     )
  160.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement