Enable editing of shifts. With timezone rabbit hole.

This commit is contained in:
Víðir Valberg Guðmundsson 2018-07-03 07:15:42 +02:00
parent 102dfa7330
commit c103400046
5 changed files with 83 additions and 7 deletions

View file

@ -309,6 +309,10 @@ class TeamTask(CampRelatedModel):
class TeamShift(CampRelatedModel): class TeamShift(CampRelatedModel):
class Meta:
ordering = ("shift_range",)
team = models.ForeignKey( team = models.ForeignKey(
'teams.Team', 'teams.Team',
related_name='shifts', related_name='shifts',

View file

@ -5,6 +5,13 @@
{% block content %} {% block content %}
<a class="btn btn-info"
href="{% url 'teams:shift_list' camp_slug=camp.slug team_slug=team.slug %}">
<i class="fas fa-chevron-left"></i> Cancel
</a>
<hr />
{% if form.errors %} {% if form.errors %}
{{ form.errors }} {{ form.errors }}
{% endif %} {% endif %}
@ -13,7 +20,7 @@
{% csrf_token %} {% csrf_token %}
{% bootstrap_form form %} {% bootstrap_form form %}
<button type="submit" class="btn btn-success"> <button type="submit" class="btn btn-success">
Create {% if object.pk %}Update{% else %}Create{% endif %}
</button> </button>
</form> </form>

View file

@ -37,6 +37,8 @@
People required People required
<th> <th>
People People
<th>
Actions
{% endifchanged %} {% endifchanged %}
<tr> <tr>
@ -47,7 +49,17 @@
<td> <td>
{{ shift.people_required }} {{ shift.people_required }}
<td> <td>
{{ shift.team_members}} {{ shift.team_members }}
<td>
{% if request.user in team.responsible_members.all %}
<a class="btn btn-info"
href="{% url 'teams:shift_update' camp_slug=camp.slug team_slug=team.slug pk=shift.pk %}">
<i class="fas fa-edit"></i> Edit
</a>
<a class="btn btn-danger" href="">
<i class="fas fa-trash"></i> Delete
</a>
{% endif %}
{% endfor %} {% endfor %}
</table> </table>
{% endblock %} {% endblock %}

View file

@ -21,6 +21,7 @@ from teams.views.tasks import (
from teams.views.shifts import ( from teams.views.shifts import (
ShiftListView, ShiftListView,
ShiftCreateView, ShiftCreateView,
ShiftUpdateView,
) )
app_name = 'teams' app_name = 'teams'
@ -130,6 +131,11 @@ urlpatterns = [
ShiftCreateView.as_view(), ShiftCreateView.as_view(),
name="shift_create" name="shift_create"
), ),
path(
'<int:pk>/',
ShiftUpdateView.as_view(),
name="shift_update"
)
])) ]))
]), ]),
), ),

View file

@ -4,6 +4,7 @@ from django import forms
from django.contrib.postgres.forms.ranges import RangeWidget from django.contrib.postgres.forms.ranges import RangeWidget
from django.utils import timezone from django.utils import timezone
from django.urls import reverse from django.urls import reverse
from psycopg2.extras import DateTimeTZRange from psycopg2.extras import DateTimeTZRange
from camps.mixins import CampViewMixin from camps.mixins import CampViewMixin
@ -61,8 +62,26 @@ class ShiftForm(forms.ModelForm):
'people_required' 'people_required'
] ]
def __init__(self, instance=None, **kwargs):
super().__init__(instance=instance, **kwargs)
if instance:
current_tz = timezone.get_current_timezone()
lower = instance.shift_range.lower.astimezone(current_tz)
upper = instance.shift_range.upper.astimezone(current_tz)
from_date = lower.strftime('%Y-%m-%d')
from_time = lower.strftime('%H:%M')
to_date = upper.strftime('%Y-%m-%d')
to_time = upper.strftime('%H:%M')
self.fields['from_date'].initial = from_date
self.fields['from_time'].initial = from_time
self.fields['to_date'].initial = to_date
self.fields['to_time'].initial = to_time
from_date = forms.DateField( from_date = forms.DateField(
help_text="Format is YYYY-MM-DD - ie. 2018-08-15" help_text="Format is YYYY-MM-DD"
) )
from_time = forms.ChoiceField( from_time = forms.ChoiceField(
@ -70,7 +89,7 @@ class ShiftForm(forms.ModelForm):
) )
to_date = forms.DateField( to_date = forms.DateField(
help_text="Format is YYYY-MM-DD - ie. 2018-08-15" help_text="Format is YYYY-MM-DD"
) )
to_time = forms.ChoiceField( to_time = forms.ChoiceField(
@ -87,10 +106,18 @@ class ShiftForm(forms.ModelForm):
self.cleaned_data['to_time'] self.cleaned_data['to_time']
) )
datetime_format = '%Y-%m-%d %H:%M' datetime_format = '%Y-%m-%d %H:%M'
self.instance.shift_range = DateTimeTZRange( current_timezone = timezone.get_current_timezone()
timezone.datetime.strptime(from_string, datetime_format), lower = (
timezone.datetime.strptime(to_string, datetime_format) timezone.datetime
.strptime(from_string, datetime_format)
.astimezone(current_timezone)
) )
upper = (
timezone.datetime
.strptime(to_string, datetime_format)
.astimezone(current_timezone)
)
self.instance.shift_range = DateTimeTZRange(lower, upper)
return super().save(commit=commit) return super().save(commit=commit)
@ -113,8 +140,28 @@ class ShiftCreateView(LoginRequiredMixin, CampViewMixin, CreateView):
kwargs=self.kwargs kwargs=self.kwargs
) )
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['team'] = Team.objects.get(
camp=self.camp,
slug=self.kwargs['team_slug']
)
return context
class ShiftUpdateView(LoginRequiredMixin, CampViewMixin, UpdateView): class ShiftUpdateView(LoginRequiredMixin, CampViewMixin, UpdateView):
model = TeamShift model = TeamShift
template_name = "shifts/shift_form.html" template_name = "shifts/shift_form.html"
form_class = ShiftForm
def get_success_url(self):
self.kwargs.pop('pk')
return reverse(
'teams:shift_list',
kwargs=self.kwargs
)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['team'] = self.object.team
return context