mybuddy/core/views.py

547 lines
18 KiB
Python
Raw Permalink Normal View History

2017-08-15 19:14:03 +00:00
# -*- coding: utf-8 -*-
from django.contrib import messages
from django.contrib.messages.views import SuccessMessageMixin
from django.forms import Form
from django.http import HttpResponseRedirect
from django.urls import reverse, reverse_lazy
from django.utils import timezone
from django.utils.translation import gettext as _
2021-08-22 03:42:29 +00:00
from django.views.generic.base import RedirectView, TemplateView
2017-08-18 03:45:56 +00:00
from django.views.generic.detail import DetailView
2022-02-10 00:00:30 +00:00
from django.views.generic.edit import CreateView, UpdateView, DeleteView, FormView
from babybuddy.mixins import LoginRequiredMixin, PermissionRequiredMixin
from babybuddy.views import BabyBuddyFilterView
from core import filters, forms, models, timeline
2017-08-15 19:14:03 +00:00
2017-08-15 20:24:55 +00:00
2021-08-29 20:50:22 +00:00
def _prepare_timeline_context_data(context, date, child=None):
2022-02-10 00:00:30 +00:00
date = timezone.datetime.strptime(date, "%Y-%m-%d")
2021-08-29 20:50:22 +00:00
date = timezone.localtime(timezone.make_aware(date))
2022-02-10 00:00:30 +00:00
context["timeline_objects"] = timeline.get_objects(date, child)
context["date"] = date
context["date_previous"] = date - timezone.timedelta(days=1)
2021-08-29 20:50:22 +00:00
if date.date() < timezone.localdate():
2022-02-10 00:00:30 +00:00
context["date_next"] = date + timezone.timedelta(days=1)
2021-08-29 20:50:22 +00:00
pass
class CoreAddView(PermissionRequiredMixin, SuccessMessageMixin, CreateView):
def get_success_message(self, cleaned_data):
2022-02-10 00:00:30 +00:00
cleaned_data["model"] = self.model._meta.verbose_name.title()
if "child" in cleaned_data:
self.success_message = _("%(model)s entry for %(child)s added!")
else:
2022-02-10 00:00:30 +00:00
self.success_message = _("%(model)s entry added!")
return self.success_message % cleaned_data
def get_form_kwargs(self):
"""
Check for and add "child" and "timer" from request query parameters.
- "child" may provide a slug for a Child instance.
- "timer" may provided an ID for a Timer instance.
These arguments are used in some add views to pre-fill initial data in
the form fields.
:return: Updated keyword arguments.
"""
kwargs = super(CoreAddView, self).get_form_kwargs()
2022-02-10 00:00:30 +00:00
for parameter in ["child", "timer"]:
value = self.request.GET.get(parameter, None)
if value:
kwargs.update({parameter: value})
return kwargs
2022-02-10 00:00:30 +00:00
class CoreUpdateView(PermissionRequiredMixin, SuccessMessageMixin, UpdateView):
def get_success_message(self, cleaned_data):
2022-02-10 00:00:30 +00:00
cleaned_data["model"] = self.model._meta.verbose_name.title()
if "child" in cleaned_data:
self.success_message = _("%(model)s entry for %(child)s updated.")
else:
2022-02-10 00:00:30 +00:00
self.success_message = _("%(model)s entry updated.")
return self.success_message % cleaned_data
2022-01-16 03:32:18 +00:00
class CoreDeleteView(PermissionRequiredMixin, SuccessMessageMixin, DeleteView):
def get_success_message(self, cleaned_data):
2022-02-10 00:00:30 +00:00
return _("%(model)s entry deleted.") % {
"model": self.model._meta.verbose_name.title()
}
2022-04-16 20:29:40 +00:00
class BMIList(PermissionRequiredMixin, BabyBuddyFilterView):
model = models.BMI
template_name = "core/bmi_list.html"
permission_required = ("core.view_bmi",)
paginate_by = 10
filterset_class = filters.BMIFilter
2022-04-16 20:29:40 +00:00
class BMIAdd(CoreAddView):
model = models.BMI
permission_required = ("core.add_bmi",)
form_class = forms.BMIForm
success_url = reverse_lazy("core:bmi-list")
class BMIUpdate(CoreUpdateView):
model = models.BMI
permission_required = ("core.change_bmi",)
form_class = forms.BMIForm
success_url = reverse_lazy("core:bmi-list")
class BMIDelete(CoreDeleteView):
model = models.BMI
permission_required = ("core.delete_bmi",)
success_url = reverse_lazy("core:bmi-list")
class ChildList(PermissionRequiredMixin, BabyBuddyFilterView):
model = models.Child
2022-02-10 00:00:30 +00:00
template_name = "core/child_list.html"
permission_required = ("core.view_child",)
2017-09-10 21:02:57 +00:00
paginate_by = 10
2022-02-10 00:00:30 +00:00
filterset_fields = ("first_name", "last_name")
2017-08-16 13:12:49 +00:00
class ChildAdd(CoreAddView):
model = models.Child
2022-02-10 00:00:30 +00:00
permission_required = ("core.add_child",)
form_class = forms.ChildForm
2022-02-10 00:00:30 +00:00
success_url = reverse_lazy("core:child-list")
success_message = _("%(first_name)s %(last_name)s added!")
2017-08-15 20:24:55 +00:00
class ChildDetail(PermissionRequiredMixin, DetailView):
model = models.Child
2022-02-10 00:00:30 +00:00
permission_required = ("core.view_child",)
2017-10-20 19:23:26 +00:00
def get_context_data(self, **kwargs):
context = super(ChildDetail, self).get_context_data(**kwargs)
2022-02-10 00:00:30 +00:00
date = self.request.GET.get("date", str(timezone.localdate()))
2021-08-29 20:50:22 +00:00
_prepare_timeline_context_data(context, date, self.object)
return context
2017-10-20 19:23:26 +00:00
class ChildUpdate(CoreUpdateView):
model = models.Child
2022-02-10 00:00:30 +00:00
permission_required = ("core.change_child",)
form_class = forms.ChildForm
2022-02-10 00:00:30 +00:00
success_url = reverse_lazy("core:child-list")
2017-08-15 20:24:55 +00:00
class ChildDelete(CoreUpdateView):
model = models.Child
form_class = forms.ChildDeleteForm
2022-02-10 00:00:30 +00:00
template_name = "core/child_confirm_delete.html"
permission_required = ("core.delete_child",)
success_url = reverse_lazy("core:child-list")
2017-08-16 15:16:27 +00:00
def get_success_message(self, cleaned_data):
2022-02-10 00:00:30 +00:00
"""This class cannot use `CoreDeleteView` because of the confirmation
step required so the success message must be overridden."""
2022-02-10 00:00:30 +00:00
success_message = _("%(model)s entry deleted.") % {
"model": self.model._meta.verbose_name.title()
}
return success_message % cleaned_data
2017-08-16 15:16:27 +00:00
class DiaperChangeList(PermissionRequiredMixin, BabyBuddyFilterView):
model = models.DiaperChange
2022-02-10 00:00:30 +00:00
template_name = "core/diaperchange_list.html"
permission_required = ("core.view_diaperchange",)
2017-09-10 21:02:57 +00:00
paginate_by = 10
filterset_class = filters.DiaperChangeFilter
2017-08-16 15:16:27 +00:00
class DiaperChangeAdd(CoreAddView):
model = models.DiaperChange
2022-02-10 00:00:30 +00:00
permission_required = ("core.add_diaperchange",)
form_class = forms.DiaperChangeForm
2022-02-10 00:00:30 +00:00
success_url = reverse_lazy("core:diaperchange-list")
2017-08-16 15:16:27 +00:00
class DiaperChangeUpdate(CoreUpdateView):
model = models.DiaperChange
2022-02-10 00:00:30 +00:00
permission_required = ("core.change_diaperchange",)
form_class = forms.DiaperChangeForm
2022-02-10 00:00:30 +00:00
success_url = reverse_lazy("core:diaperchange-list")
2017-08-16 15:16:27 +00:00
class DiaperChangeDelete(CoreDeleteView):
model = models.DiaperChange
2022-02-10 00:00:30 +00:00
permission_required = ("core.delete_diaperchange",)
success_url = reverse_lazy("core:diaperchange-list")
2017-08-16 15:16:27 +00:00
class FeedingList(PermissionRequiredMixin, BabyBuddyFilterView):
model = models.Feeding
2022-02-10 00:00:30 +00:00
template_name = "core/feeding_list.html"
permission_required = ("core.view_feeding",)
2017-09-10 21:02:57 +00:00
paginate_by = 10
filterset_class = filters.FeedingFilter
2017-08-16 15:16:27 +00:00
class FeedingAdd(CoreAddView):
model = models.Feeding
2022-02-10 00:00:30 +00:00
permission_required = ("core.add_feeding",)
form_class = forms.FeedingForm
2022-02-10 00:00:30 +00:00
success_url = reverse_lazy("core:feeding-list")
2017-08-16 15:16:27 +00:00
class BottleFeedingAdd(CoreAddView):
model = models.Feeding
permission_required = ("core.add_feeding",)
form_class = forms.BottleFeedingForm
success_url = reverse_lazy("core:feeding-list")
class FeedingUpdate(CoreUpdateView):
model = models.Feeding
2022-02-10 00:00:30 +00:00
permission_required = ("core.change_feeding",)
form_class = forms.FeedingForm
2022-02-10 00:00:30 +00:00
success_url = reverse_lazy("core:feeding-list")
2017-08-16 15:16:27 +00:00
class FeedingDelete(CoreDeleteView):
model = models.Feeding
2022-02-10 00:00:30 +00:00
permission_required = ("core.delete_feeding",)
success_url = reverse_lazy("core:feeding-list")
2017-08-16 15:16:27 +00:00
2022-04-16 20:29:40 +00:00
class HeadCircumferenceList(PermissionRequiredMixin, BabyBuddyFilterView):
model = models.HeadCircumference
template_name = "core/head_circumference_list.html"
permission_required = ("core.view_head_circumference",)
paginate_by = 10
filterset_class = filters.HeadCircumferenceFilter
2022-04-16 20:29:40 +00:00
class HeadCircumferenceAdd(CoreAddView):
model = models.HeadCircumference
template_name = "core/head_circumference_form.html"
permission_required = ("core.add_head_circumference",)
form_class = forms.HeadCircumferenceForm
success_url = reverse_lazy("core:head-circumference-list")
class HeadCircumferenceUpdate(CoreUpdateView):
model = models.HeadCircumference
template_name = "core/head_circumference_form.html"
permission_required = ("core.change_head_circumference",)
form_class = forms.HeadCircumferenceForm
success_url = reverse_lazy("core:head-circumference-list")
class HeadCircumferenceDelete(CoreDeleteView):
model = models.HeadCircumference
template_name = "core/head_circumference_confirm_delete.html"
permission_required = ("core.delete_head_circumference",)
success_url = reverse_lazy("core:head-circumference-list")
class HeightList(PermissionRequiredMixin, BabyBuddyFilterView):
model = models.Height
template_name = "core/height_list.html"
permission_required = ("core.view_height",)
paginate_by = 10
filterset_class = filters.HeightFilter
2022-04-16 20:29:40 +00:00
class HeightAdd(CoreAddView):
model = models.Height
permission_required = ("core.add_height",)
form_class = forms.HeightForm
success_url = reverse_lazy("core:height-list")
class HeightUpdate(CoreUpdateView):
model = models.Height
permission_required = ("core.change_height",)
form_class = forms.HeightForm
success_url = reverse_lazy("core:height-list")
class HeightDelete(CoreDeleteView):
model = models.Height
permission_required = ("core.delete_height",)
success_url = reverse_lazy("core:height-list")
class NoteList(PermissionRequiredMixin, BabyBuddyFilterView):
model = models.Note
2022-02-10 00:00:30 +00:00
template_name = "core/note_list.html"
permission_required = ("core.view_note",)
2017-09-10 21:02:57 +00:00
paginate_by = 10
filterset_class = filters.NoteFilter
2017-08-16 15:16:27 +00:00
class NoteAdd(CoreAddView):
model = models.Note
2022-02-10 00:00:30 +00:00
permission_required = ("core.add_note",)
2017-11-10 00:50:54 +00:00
form_class = forms.NoteForm
2022-02-10 00:00:30 +00:00
success_url = reverse_lazy("core:note-list")
2017-08-16 15:16:27 +00:00
class NoteUpdate(CoreUpdateView):
model = models.Note
2022-02-10 00:00:30 +00:00
permission_required = ("core.change_note",)
form_class = forms.NoteForm
2022-02-10 00:00:30 +00:00
success_url = reverse_lazy("core:note-list")
2017-08-16 15:16:27 +00:00
class NoteDelete(CoreDeleteView):
model = models.Note
2022-02-10 00:00:30 +00:00
permission_required = ("core.delete_note",)
success_url = reverse_lazy("core:note-list")
2017-08-16 15:16:27 +00:00
2022-04-16 20:29:40 +00:00
class PumpingList(PermissionRequiredMixin, BabyBuddyFilterView):
model = models.Pumping
template_name = "core/pumping_list.html"
permission_required = ("core.view_pumping",)
paginate_by = 10
filterset_class = filters.PumpingFilter
2022-04-16 20:29:40 +00:00
class PumpingAdd(CoreAddView):
model = models.Pumping
permission_required = ("core.add_pumping",)
form_class = forms.PumpingForm
success_url = reverse_lazy("core:pumping-list")
success_message = _("%(model)s entry added!")
class PumpingUpdate(CoreUpdateView):
model = models.Pumping
permission_required = ("core.change_pumping",)
form_class = forms.PumpingForm
success_url = reverse_lazy("core:pumping-list")
success_message = _("%(model)s entry for %(child)s updated.")
class PumpingDelete(CoreDeleteView):
model = models.Pumping
permission_required = ("core.delete_pumping",)
success_url = reverse_lazy("core:pumping-list")
class SleepList(PermissionRequiredMixin, BabyBuddyFilterView):
model = models.Sleep
2022-02-10 00:00:30 +00:00
template_name = "core/sleep_list.html"
permission_required = ("core.view_sleep",)
2017-09-10 21:02:57 +00:00
paginate_by = 10
filterset_class = filters.SleepFilter
2017-08-16 15:16:27 +00:00
class SleepAdd(CoreAddView):
model = models.Sleep
2022-02-10 00:00:30 +00:00
permission_required = ("core.add_sleep",)
form_class = forms.SleepForm
2022-02-10 00:00:30 +00:00
success_url = reverse_lazy("core:sleep-list")
2017-08-16 15:16:27 +00:00
class SleepUpdate(CoreUpdateView):
model = models.Sleep
2022-02-10 00:00:30 +00:00
permission_required = ("core.change_sleep",)
form_class = forms.SleepForm
2022-02-10 00:00:30 +00:00
success_url = reverse_lazy("core:sleep-list")
2017-08-16 15:16:27 +00:00
class SleepDelete(CoreDeleteView):
model = models.Sleep
2022-02-10 00:00:30 +00:00
permission_required = ("core.delete_sleep",)
success_url = reverse_lazy("core:sleep-list")
2017-08-16 15:16:27 +00:00
class TemperatureList(PermissionRequiredMixin, BabyBuddyFilterView):
2019-05-17 04:33:26 +00:00
model = models.Temperature
2022-02-10 00:00:30 +00:00
template_name = "core/temperature_list.html"
permission_required = ("core.view_temperature",)
2019-05-17 04:33:26 +00:00
paginate_by = 10
filterset_class = filters.TemperatureFilter
2019-05-17 04:33:26 +00:00
class TemperatureAdd(CoreAddView):
model = models.Temperature
2022-02-10 00:00:30 +00:00
permission_required = ("core.add_temperature",)
2019-05-17 04:33:26 +00:00
form_class = forms.TemperatureForm
2022-02-10 00:00:30 +00:00
success_url = reverse_lazy("core:temperature-list")
success_message = _("%(model)s reading added!")
2019-05-17 04:33:26 +00:00
class TemperatureUpdate(CoreUpdateView):
model = models.Temperature
2022-02-10 00:00:30 +00:00
permission_required = ("core.change_temperature",)
form_class = forms.TemperatureForm
2022-02-10 00:00:30 +00:00
success_url = reverse_lazy("core:temperature-list")
success_message = _("%(model)s reading for %(child)s updated.")
2019-05-17 04:33:26 +00:00
class TemperatureDelete(CoreDeleteView):
model = models.Temperature
2022-02-10 00:00:30 +00:00
permission_required = ("core.delete_temperature",)
success_url = reverse_lazy("core:temperature-list")
2019-05-17 04:33:26 +00:00
2021-08-22 03:42:29 +00:00
class Timeline(LoginRequiredMixin, TemplateView):
2022-02-10 00:00:30 +00:00
template_name = "timeline/timeline.html"
2021-08-22 03:42:29 +00:00
# Show the overall timeline or a child timeline if one Child instance.
def get(self, request, *args, **kwargs):
children = models.Child.objects.count()
if children == 1:
return HttpResponseRedirect(
2022-02-10 00:00:30 +00:00
reverse("core:child", args={models.Child.objects.first().slug})
2021-08-22 03:42:29 +00:00
)
return super(Timeline, self).get(request, *args, **kwargs)
def get_context_data(self, **kwargs):
context = super(Timeline, self).get_context_data(**kwargs)
2022-02-10 00:00:30 +00:00
date = self.request.GET.get("date", str(timezone.localdate()))
2021-08-29 20:50:22 +00:00
_prepare_timeline_context_data(context, date)
2021-08-22 03:42:29 +00:00
return context
class TimerList(PermissionRequiredMixin, BabyBuddyFilterView):
model = models.Timer
2022-02-10 00:00:30 +00:00
template_name = "core/timer_list.html"
permission_required = ("core.view_timer",)
2017-09-10 21:02:57 +00:00
paginate_by = 10
filterset_fields = ("user",)
2017-09-09 15:54:34 +00:00
class TimerDetail(PermissionRequiredMixin, DetailView):
model = models.Timer
2022-02-10 00:00:30 +00:00
permission_required = ("core.view_timer",)
2017-08-18 03:45:56 +00:00
class TimerAdd(PermissionRequiredMixin, CreateView):
model = models.Timer
2022-02-10 00:00:30 +00:00
permission_required = ("core.add_timer",)
form_class = forms.TimerForm
2017-08-17 01:57:01 +00:00
def get_form_kwargs(self):
kwargs = super(TimerAdd, self).get_form_kwargs()
2022-02-10 00:00:30 +00:00
kwargs.update({"user": self.request.user})
return kwargs
def get_success_url(self):
2022-02-10 00:00:30 +00:00
return reverse("core:timer-detail", kwargs={"pk": self.object.pk})
2017-08-17 01:57:01 +00:00
class TimerUpdate(CoreUpdateView):
model = models.Timer
2022-02-10 00:00:30 +00:00
permission_required = ("core.change_timer",)
form_class = forms.TimerForm
2022-02-10 00:00:30 +00:00
success_url = reverse_lazy("core:timer-list")
2017-09-10 09:11:09 +00:00
2017-09-10 13:50:16 +00:00
def get_form_kwargs(self):
kwargs = super(TimerUpdate, self).get_form_kwargs()
2022-02-10 00:00:30 +00:00
kwargs.update({"user": self.request.user})
2017-09-10 13:50:16 +00:00
return kwargs
2017-09-10 09:11:09 +00:00
def get_success_url(self):
instance = self.get_object()
2022-02-10 00:00:30 +00:00
return reverse("core:timer-detail", kwargs={"pk": instance.pk})
2017-09-10 09:11:09 +00:00
class TimerAddQuick(PermissionRequiredMixin, RedirectView):
2022-02-10 00:00:30 +00:00
http_method_names = ["post"]
permission_required = ("core.add_timer",)
2017-08-18 03:10:07 +00:00
def post(self, request, *args, **kwargs):
instance = models.Timer.objects.create(user=request.user)
# Find child from child pk in POST
child_id = request.POST.get("child", False)
child = models.Child.objects.get(pk=child_id) if child_id else None
if child:
instance.child = child
# Add child relationship if there is only Child instance.
elif models.Child.count() == 1:
instance.child = models.Child.objects.first()
2017-08-18 03:10:07 +00:00
instance.save()
self.url = request.GET.get(
2022-02-10 00:00:30 +00:00
"next", reverse("core:timer-detail", args={instance.id})
)
2017-08-18 03:10:07 +00:00
return super(TimerAddQuick, self).get(request, *args, **kwargs)
class TimerRestart(PermissionRequiredMixin, RedirectView):
2022-02-10 00:00:30 +00:00
http_method_names = ["post"]
permission_required = ("core.change_timer",)
2021-07-31 20:16:50 +00:00
def post(self, request, *args, **kwargs):
2022-02-10 00:00:30 +00:00
instance = models.Timer.objects.get(id=kwargs["pk"])
instance.restart()
2022-02-10 00:00:30 +00:00
messages.success(request, "{} restarted.".format(instance))
return super(TimerRestart, self).get(request, *args, **kwargs)
def get_redirect_url(self, *args, **kwargs):
2022-02-10 00:00:30 +00:00
return reverse("core:timer-detail", kwargs={"pk": kwargs["pk"]})
class TimerDelete(CoreDeleteView):
model = models.Timer
2022-02-10 00:00:30 +00:00
permission_required = ("core.delete_timer",)
success_url = reverse_lazy("core:timer-list")
class TummyTimeList(PermissionRequiredMixin, BabyBuddyFilterView):
model = models.TummyTime
2022-02-10 00:00:30 +00:00
template_name = "core/tummytime_list.html"
permission_required = ("core.view_tummytime",)
2017-09-10 21:02:57 +00:00
paginate_by = 10
filterset_class = filters.TummyTimeFilter
2017-08-16 15:16:27 +00:00
class TummyTimeAdd(CoreAddView):
model = models.TummyTime
2022-02-10 00:00:30 +00:00
permission_required = ("core.add_tummytime",)
form_class = forms.TummyTimeForm
2022-02-10 00:00:30 +00:00
success_url = reverse_lazy("core:tummytime-list")
2017-08-16 15:16:27 +00:00
class TummyTimeUpdate(CoreUpdateView):
model = models.TummyTime
2022-02-10 00:00:30 +00:00
permission_required = ("core.change_tummytime",)
form_class = forms.TummyTimeForm
2022-02-10 00:00:30 +00:00
success_url = reverse_lazy("core:tummytime-list")
2017-08-16 15:16:27 +00:00
class TummyTimeDelete(CoreDeleteView):
model = models.TummyTime
2022-02-10 00:00:30 +00:00
permission_required = ("core.delete_tummytime",)
success_url = reverse_lazy("core:tummytime-list")
2017-11-10 02:15:09 +00:00
class WeightList(PermissionRequiredMixin, BabyBuddyFilterView):
2017-11-10 02:15:09 +00:00
model = models.Weight
2022-02-10 00:00:30 +00:00
template_name = "core/weight_list.html"
permission_required = ("core.view_weight",)
2017-11-10 02:15:09 +00:00
paginate_by = 10
filterset_class = filters.WeightFilter
2017-11-10 02:15:09 +00:00
class WeightAdd(CoreAddView):
2017-11-10 02:15:09 +00:00
model = models.Weight
2022-02-10 00:00:30 +00:00
permission_required = ("core.add_weight",)
2017-11-10 02:15:09 +00:00
form_class = forms.WeightForm
2022-02-10 00:00:30 +00:00
success_url = reverse_lazy("core:weight-list")
2017-11-10 02:15:09 +00:00
class WeightUpdate(CoreUpdateView):
2017-11-10 02:15:09 +00:00
model = models.Weight
2022-02-10 00:00:30 +00:00
permission_required = ("core.change_weight",)
form_class = forms.WeightForm
2022-02-10 00:00:30 +00:00
success_url = reverse_lazy("core:weight-list")
2017-11-10 02:15:09 +00:00
class WeightDelete(CoreDeleteView):
2017-11-10 02:15:09 +00:00
model = models.Weight
2022-02-10 00:00:30 +00:00
permission_required = ("core.delete_weight",)
success_url = reverse_lazy("core:weight-list")