mirror of
https://github.com/nottinghamtec/PyRIGS.git
synced 2026-01-17 05:22:16 +00:00
Reimplemented calendar mostly working
Multi day alignment puzzle is pretty hard...
This commit is contained in:
@@ -401,10 +401,6 @@ class BaseEvent(models.Model, RevisionMixin):
|
||||
errdict['end_time'] = ['Unless you\'ve invented time travel, the event can\'t finish before it has started.']
|
||||
return errdict
|
||||
|
||||
@property
|
||||
def get_html_url(self):
|
||||
return f'<a href="{self.get_edit_url()}"><span class="badge badge-{self.color}">{self}</span></a>'
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.display_id}: {self.name}"
|
||||
|
||||
@@ -503,7 +499,7 @@ class Event(BaseEvent):
|
||||
|
||||
@property
|
||||
def authorised(self):
|
||||
if self.internal:
|
||||
if self.internal and hasattr(self, 'authorisation'):
|
||||
return self.authorisation.amount == self.total
|
||||
else:
|
||||
return bool(self.purchase_order)
|
||||
|
||||
@@ -1,59 +1,66 @@
|
||||
{% extends 'base_rigs.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}Calendar{% endblock %}
|
||||
{% block js %}
|
||||
<script src="{% static 'js/moment.js' %}"></script>
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
// set some button listeners
|
||||
$('#today-button').click(function(){ calendar.today(); });
|
||||
$('#go-to-date-input').change(function(){
|
||||
if(moment($('#go-to-date-input').val()).isValid()){
|
||||
$('#go-to-date-button').prop('disabled', false);
|
||||
} else{
|
||||
$('#go-to-date-button').prop('disabled', true);
|
||||
}
|
||||
});
|
||||
$('#go-to-date-button').click(function(){
|
||||
day = moment($('#go-to-date-input').val());
|
||||
if(day.isValid()){
|
||||
calendar.gotoDate(day.format("YYYY-MM-DD"));
|
||||
} else{
|
||||
alert('Invalid Date');
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
{% block css %}
|
||||
<style>
|
||||
|
||||
.calendar {
|
||||
width: 98%;
|
||||
margin: auto;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
.calendar tr, .calendar td {
|
||||
border: 1px solid black;
|
||||
border: 1px solid grey;
|
||||
}
|
||||
|
||||
.calendar th {
|
||||
padding: 10px;
|
||||
text-align: center;
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
.calendar td {
|
||||
width: 200px;
|
||||
height: 150px;
|
||||
padding: 20px 0px 0px 5px;
|
||||
}
|
||||
|
||||
.month {
|
||||
font-size: 25px;
|
||||
}
|
||||
|
||||
.date {
|
||||
font-size: 16px;
|
||||
float: right;
|
||||
}
|
||||
|
||||
ul {
|
||||
height: 100%;
|
||||
padding: 0px 5px 0px 20px;
|
||||
.days {
|
||||
height: 20vh;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #17a2b8;
|
||||
td {
|
||||
width: calc(100% / 7);
|
||||
}
|
||||
.badge-purple, .bg-purple {
|
||||
background-color: #800080 !important;
|
||||
th {
|
||||
margin: 0.5em;
|
||||
border-bottom: 3px solid grey;
|
||||
}
|
||||
</style>
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="clearfix">
|
||||
<a class="btn btn-info left" href="{% url 'web_calendar' %}?{{ prev_month }}"> Previous Month </a>
|
||||
<a class="btn btn-info right" href="{% url 'web_calendar' %}?{{ next_month }}"> Next Month </a>
|
||||
<div class="row justify-content-center">
|
||||
<a class="btn btn-info col-2" href="{% url 'web_calendar' %}?{{ prev_month }}"><span class="fas fa-chevron-left"></span> Previous Month</a>
|
||||
<div class="input-group col-4">
|
||||
<input type="date" id="go-to-date-input" placeholder="Go to date...">
|
||||
<span class="input-group-append">
|
||||
<button class="btn btn-success" id="go-to-date-button" type="button" disabled>Go!</button>
|
||||
</span>
|
||||
</div>
|
||||
<button type="button" class="btn btn-primary col-2" id="today-button">Today</button>
|
||||
<a class="btn btn-info mx-2 col-2" href="{% url 'web_calendar' %}?{{ next_month }}"><span class="fas fa-chevron-right"></span> Next Month</a>
|
||||
</div>
|
||||
|
||||
<div class="table-responsive-md pt-2">
|
||||
{{ calendar }}
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
@@ -3,6 +3,24 @@ import calendar
|
||||
from calendar import HTMLCalendar
|
||||
from RIGS.models import BaseEvent, Event, Subhire
|
||||
|
||||
def get_html(events, day):
|
||||
d = ''
|
||||
for event in events:
|
||||
# Open shared stuff
|
||||
d += f'<a href="{event.get_edit_url()}" class="modal-href"><span class="badge badge-{event.color} w-100 text-left"'
|
||||
if event.start_date.day != event.end_date.day:
|
||||
if day == event.start_date.day:
|
||||
d += f'style="border-top-right-radius: 0; border-bottom-right-radius: 0;">{event}'
|
||||
elif day == event.end_date.day:
|
||||
d += f'style="border-top-left-radius: 0; border-bottom-left-radius: 0;"> '
|
||||
else:
|
||||
d += f'style="border-radius: 0;"> '
|
||||
else:
|
||||
d += f'{event}'
|
||||
# Close shared stuff
|
||||
d += "</span></a>"
|
||||
return d
|
||||
|
||||
class Calendar(HTMLCalendar):
|
||||
def __init__(self, year=None, month=None):
|
||||
self.year = year
|
||||
@@ -12,16 +30,11 @@ class Calendar(HTMLCalendar):
|
||||
# formats a day as a td
|
||||
# filter events by day
|
||||
def formatday(self, day, events, subhires):
|
||||
events_per_day = events.filter(start_date__day=day)
|
||||
subhires_per_day = subhires.filter(start_date__day=day)
|
||||
d = ''
|
||||
for event in events_per_day:
|
||||
d += f'{event.get_html_url}<br>'
|
||||
for subhire in subhires_per_day:
|
||||
d += f'{subhire.get_html_url}<br>'
|
||||
|
||||
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"<td><span class='date'>{day}</span><ul> {d} </ul></td>"
|
||||
return f"<td valign='top' class='days'><span class='date'>{day}</span><br>{d}</td>"
|
||||
return '<td></td>'
|
||||
|
||||
# formats a week as a tr
|
||||
@@ -37,8 +50,7 @@ class Calendar(HTMLCalendar):
|
||||
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)
|
||||
|
||||
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'<table cellpadding="0" cellspacing="0" class="calendar">\n'
|
||||
cal += f'{self.formatweekheader()}\n'
|
||||
for week in self.monthdays2calendar(self.year, self.month):
|
||||
cal += f'{self.formatweek(week, events, subhires)}\n'
|
||||
|
||||
@@ -47,7 +47,6 @@ class WebCalendar(generic.ListView):
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super().get_context_data(**kwargs)
|
||||
|
||||
# use today's date for the calendar
|
||||
d = utils.get_date(self.request.GET.get('month', None))
|
||||
context['prev_month'] = utils.prev_month(d)
|
||||
@@ -59,6 +58,7 @@ 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['page_title'] = d.strftime("%B %Y")
|
||||
return context
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user