diff --git a/RIGS/models.py b/RIGS/models.py index e6c85e08..20855251 100644 --- a/RIGS/models.py +++ b/RIGS/models.py @@ -390,15 +390,25 @@ class BaseEvent(models.Model, RevisionMixin): else: return endDate + @property + def length(self): + start = self.earliest_time + if isinstance(self.earliest_time, datetime.datetime): + start = self.earliest_time.date() + end = self.latest_time + if isinstance(self.latest_time, datetime.datetime): + end = self.latest_time.date() + return (end - start).days + def clean(self): errdict = {} if self.end_date and self.start_date > self.end_date: - errdict['end_date'] = ['Unless you\'ve invented time travel, the event can\'t finish before it has started.'] + errdict['end_date'] = ["Unless you've invented time travel, the event can't finish before it has started."] startEndSameDay = not self.end_date or self.end_date == self.start_date hasStartAndEnd = self.has_start_time and self.has_end_time if startEndSameDay and hasStartAndEnd and self.start_time > self.end_time: - errdict['end_time'] = ['Unless you\'ve invented time travel, the event can\'t finish before it has started.'] + errdict['end_time'] = ["Unless you've invented time travel, the event can't finish before it has started."] return errdict def __str__(self): @@ -606,6 +616,10 @@ class Subhire(BaseEvent): def get_edit_url(self): return reverse('subhire_update', kwargs={'pk': self.pk}) + @property + def earliest_time(self): + return find_earliest_event_time(self, []) + class InvoiceManager(models.Manager): def outstanding_invoices(self): diff --git a/RIGS/templates/calendar.html b/RIGS/templates/calendar.html index 78474244..628b2417 100644 --- a/RIGS/templates/calendar.html +++ b/RIGS/templates/calendar.html @@ -28,27 +28,70 @@ {% block css %} {% endblock %} {% block content %} -
+
Previous Month
@@ -60,7 +103,23 @@ th { Next Month
-
-{{ calendar }} +
+
Monday
+
Tuesday
+
Wednesday
+
Thursday
+
Friday
+
Saturday
+
Sunday
+{% for week in weeks %} +
+ {% for day in week %} +
+

{% if day.0 != 0 %}{{day.0}}{% endif %}

+ {{ day.2|safe }} +
+ {% endfor %} +
+{% endfor %} {% endblock %} diff --git a/RIGS/utils.py b/RIGS/utils.py index 9d53d309..0d4ad9bd 100644 --- a/RIGS/utils.py +++ b/RIGS/utils.py @@ -30,8 +30,7 @@ class Calendar(HTMLCalendar): # formats a day as a td # filter events by day def formatday(self, day, events, subhires): - events_per_day = events.order_by("start_date").filter(start_date__day__lte=day, end_date__day__gte=day) - subhires_per_day = subhires.order_by("start_date").filter(start_date__day__lte=day, end_date__day__gte=day) + d = get_html(events_per_day, day) + get_html(subhires_per_day, day) if day != 0: return f"{day}
{d}" @@ -44,17 +43,25 @@ class Calendar(HTMLCalendar): week += self.formatday(d, events, subhires) return f' {week} ' - # formats a month as a table - # filter events by year and month def formatmonth(self, withyear=True): events = Event.objects.filter(start_date__year=self.year, start_date__month=self.month) subhires = Subhire.objects.filter(start_date__year=self.year, start_date__month=self.month) + weeks = self.monthdays2calendar(self.year, self.month) + data = [] - cal = f'\n' - cal += f'{self.formatweekheader()}\n' - for week in self.monthdays2calendar(self.year, self.month): - cal += f'{self.formatweek(week, events, subhires)}\n' - return cal + for week in weeks: + weeks_events = [] + for day in week: + events_per_day = events.order_by("start_date").filter(start_date__day=day[0]) + subhires_per_day = subhires.order_by("start_date").filter(start_date__day=day[0]) + event_html = "" + for event in events_per_day: + event_html += f"
{event}
" + for sh in subhires_per_day: + event_html += f"
{sh}
" + weeks_events.append((day[0], day[1], event_html)) + data.append(weeks_events) + return data def get_date(req_day): diff --git a/RIGS/views/rigboard.py b/RIGS/views/rigboard.py index 9117b702..c68e1c96 100644 --- a/RIGS/views/rigboard.py +++ b/RIGS/views/rigboard.py @@ -57,7 +57,8 @@ class WebCalendar(generic.ListView): # Call the formatmonth method, which returns our calendar as a table html_cal = cal.formatmonth(withyear=True) - context['calendar'] = mark_safe(html_cal) + # context['calendar'] = mark_safe(html_cal) + context['weeks'] = html_cal context['page_title'] = d.strftime("%B %Y") return context