Как обнаружить и правильно отобразить события в календаре, которые перекрывают месяцы, в Python?

Я использовал учебник, который нашел в Интернете, для создания календаря событий в Python. Я попытался улучшить его для планирования событий, которые могут иметь диапазон времени начала и окончания, перекрывающий месяцы. Например, событие может начаться в июне и закончиться в июле. Я частично разобрался с этим... Я могу отображать события, основываясь на том, что день начала является последним днем в модуле Python HTMLCalendar. Я не могу понять, как выбрать оставшийся день для 1 июля. Июнь отображается отлично. Заранее спасибо за любые мысли.

Вот мой код...

HTMLCALENDAR Utility...

class Calendar(HTMLCalendar):
    def __init__(self, year=None, month=None, dropdown=None):
        self.dropdown = dropdown
        self.year = year
        self.month = month
        super(Calendar, self).__init__()

# formats a day as a td
# filter events by day
def formatday(self, day, requests):
    requests_per_day = requests.filter(start_time__day__lte=day,start_time__month=self.month)
    d = ''
    for request in requests_per_day:
        d += f'<li> {request.get_html_url} </li>'

    if day != 0:
        return f"<td><span class='date'>{day}</span><ul> {d} </ul></td>"
    return '<td></td>'

# formats a week as a tr
def formatweek(self, theweek, requests):
    week = ''
    for d, weekday in theweek:
        week += self.formatday(d, requests)
    return f'<tr> {week} </tr>'

# formats a month as a table
# filter events by year and month
def formatmonth(self, withyear=True):
    # requests = VacationRequest.objects.filter(Q(vacation_calendar=self.dropdown,start_time__year=self.year,start_time__month=self.month) | Q(vacation_calendar=self.dropdown,start_time__year=self.year,end_time__month=self.month)).distinct()
    requests = VacationRequest.objects.filter(vacation_calendar=self.dropdown,start_time__year=self.year,start_time__month=self.month)
    cal = f'<table border="0" cellpadding="0" cellspacing="0" class="calendar">\n'
    cal += f'{self.formatmonthname(self.year, self.month, withyear=withyear)}\n'
    cal += f'{self.formatweekheader()}\n'
    for week in self.monthdays2calendar(self.year, self.month):
        cal += f'{self.formatweek(week, requests)}\n'
    cal += f'</table>\n'
    cal += f'<h1 class="title107">Vacation Schedule For {self.formatmonthname(self.year, self.month, withyear=withyear)}</h1>\n'
    return cal

Мое мнение...

class VacationRequestCalendarView(LoginRequiredMixin,generic.ListView):
    model = VacationRequest
    template_name = 'vacation_request_calendar_view.html'

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    dropdown = (self.request.GET.get("dropdown", None))
    d = get_date(self.request.GET.get('month', None))
    cal = Calendar(d.year, d.month, dropdown)
    cal.setfirstweekday(calendar.SUNDAY)
    html_cal = cal.formatmonth(withyear=True)
    vacation_calendar = VacationCalendar.objects.get(id=self.request.GET.get("dropdown", None))
    context['calendar'] = mark_safe(html_cal)
    context['dropdown'] = dropdown
    context['next_month'] = next_month(d)
    context['prev_month'] = prev_month(d)
    context['vacation_calendar'] = vacation_calendar
    return context

def get_object(self, queryset=None):
    return get_object_or_404(VacationCalendar, id=self.request.GET.get("dropdown"))

def get(self, request, *args, **kwargs):
    dropdown=self.request.GET.get("dropdown")
    if dropdown is not None:
        if VacationCalendar.objects.filter(id=dropdown,team_members=self.request.user):
            self.object_list = self.get_queryset()
            context = self.get_context_data(object=self.object_list)
            return self.render_to_response(context)
        else:
            raise Http404
    else:
        messages.add_message(self.request, messages.INFO, 'Vacation Calendar is required.')
        return HttpResponseRedirect(reverse('VacationRequests:vacation_request_by_calendar_name'))

def get_date(req_month):
    if req_month:
        year, month = (int(x) for x in req_month.split('-'))
        return date(year, month, day=1)
    return datetime.today()

def prev_month(d):
    first = d.replace(day=1)
    prev_month = first - timedelta(days=1)
    month = 'month=' + str(prev_month.year) + '-' + str(prev_month.month)
    return month

def next_month(d):
    days_in_month = calendar.monthrange(d.year, d.month)[1]
    last = d.replace(day=days_in_month)
    next_month = last + timedelta(days=1)
    month = 'month=' + str(next_month.year) + '-' + str(next_month.month)
    return month

Здесь отображаются мои события за июнь, как я и надеялся...

enter image description here

Но он не появляется 1 июля...

enter image description here

Мое событие имеет время окончания в июле... и время начала в июне....

enter image description here

Как сделать так, чтобы это событие появилось и 1 июля?

requests = VacationRequest.objects.filter(Q(vacation_calendar=self.dropdown,start_time__year=self.year,start_time__month=self.month)
        | Q(vacation_calendar=self.dropdown,start_time__year=self.year,end_time__month=self.month)).distinct()

Казалось, это помогло.

Вернуться на верх