mybuddy/core/views.py

548 lines
18 KiB
Python
Raw 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 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()
}
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
2022-02-10 00:00:30 +00:00
filterset_fields = ("child", "wet", "solid", "color")
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
2022-02-10 00:00:30 +00:00
filterset_fields = ("child", "type", "method")
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 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
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
2022-02-10 00:00:30 +00:00
filterset_fields = ("child",)
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
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
2022-02-10 00:00:30 +00:00
filterset_fields = ("child",)
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
2022-02-10 00:00:30 +00:00
filterset_fields = ("child",)
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
2022-02-10 00:00:30 +00:00
filterset_fields = ("active", "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)
# Add child relationship if there is only Child instance.
if 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 TimerStop(PermissionRequiredMixin, SuccessMessageMixin, RedirectView):
2022-02-10 00:00:30 +00:00
http_method_names = ["post"]
permission_required = ("core.change_timer",)
success_message = _("%(timer)s stopped.")
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.stop()
2022-02-10 00:00:30 +00:00
messages.success(request, "{} stopped.".format(instance))
return super(TimerStop, 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")
2022-02-10 00:00:30 +00:00
class TimerDeleteInactive(PermissionRequiredMixin, SuccessMessageMixin, FormView):
permission_required = ("core.delete_timer",)
form_class = Form
2022-02-10 00:00:30 +00:00
template_name = "core/timer_confirm_delete_inactive.html"
success_url = reverse_lazy("core:timer-list")
success_message = _("All inactive timers deleted.")
def get_context_data(self, **kwargs):
kwargs = super().get_context_data(**kwargs)
2022-02-10 00:00:30 +00:00
kwargs["timer_count"] = self.get_instances().count()
return kwargs
def get(self, request, *args, **kwargs):
# Redirect back to list if there are no inactive timers.
if self.get_instances().count() == 0:
2022-02-10 00:00:30 +00:00
messages.warning(request, _("No inactive timers exist."))
return HttpResponseRedirect(self.success_url)
return super().get(request, *args, **kwargs)
def form_valid(self, form):
self.get_instances().delete()
return super().form_valid(form)
@staticmethod
def get_instances():
return models.Timer.objects.filter(active=False)
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
2022-02-10 00:00:30 +00:00
filterset_fields = ("child",)
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
2022-02-10 00:00:30 +00:00
filterset_fields = ("child",)
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")
2021-12-30 03:32:55 +00:00
class HeightList(PermissionRequiredMixin, BabyBuddyFilterView):
model = models.Height
2022-02-10 00:00:30 +00:00
template_name = "core/height_list.html"
permission_required = ("core.view_height",)
paginate_by = 10
2022-02-10 00:00:30 +00:00
filterset_fields = ("child",)
class HeightAdd(CoreAddView):
model = models.Height
2022-02-10 00:00:30 +00:00
permission_required = ("core.add_height",)
form_class = forms.HeightForm
2022-02-10 00:00:30 +00:00
success_url = reverse_lazy("core:height-list")
class HeightUpdate(CoreUpdateView):
model = models.Height
2022-02-10 00:00:30 +00:00
permission_required = ("core.change_height",)
form_class = forms.HeightForm
2022-02-10 00:00:30 +00:00
success_url = reverse_lazy("core:height-list")
class HeightDelete(CoreDeleteView):
model = models.Height
2022-02-10 00:00:30 +00:00
permission_required = ("core.delete_height",)
success_url = reverse_lazy("core:height-list")
2021-12-30 03:32:55 +00:00
class HeadCircumferenceList(PermissionRequiredMixin, BabyBuddyFilterView):
model = models.HeadCircumference
2022-02-10 00:00:30 +00:00
template_name = "core/head_circumference_list.html"
permission_required = ("core.view_head_circumference",)
paginate_by = 10
2022-02-10 00:00:30 +00:00
filterset_fields = ("child",)
class HeadCircumferenceAdd(CoreAddView):
model = models.HeadCircumference
2022-02-10 00:00:30 +00:00
template_name = "core/head_circumference_form.html"
permission_required = ("core.add_head_circumference",)
form_class = forms.HeadCircumferenceForm
2022-02-10 00:00:30 +00:00
success_url = reverse_lazy("core:head-circumference-list")
class HeadCircumferenceUpdate(CoreUpdateView):
model = models.HeadCircumference
2022-02-10 00:00:30 +00:00
template_name = "core/head_circumference_form.html"
permission_required = ("core.change_head_circumference",)
form_class = forms.HeadCircumferenceForm
2022-02-10 00:00:30 +00:00
success_url = reverse_lazy("core:head-circumference-list")
class HeadCircumferenceDelete(CoreDeleteView):
model = models.HeadCircumference
2022-02-10 00:00:30 +00:00
template_name = "core/head_circumference_delete.html"
permission_required = ("core.delete_head_circumference",)
success_url = reverse_lazy("core:head-circumference-list")
2021-12-30 03:32:55 +00:00
class BMIList(PermissionRequiredMixin, BabyBuddyFilterView):
model = models.BMI
2022-02-10 00:00:30 +00:00
template_name = "core/bmi_list.html"
permission_required = ("core.view_bmi",)
paginate_by = 10
2022-02-10 00:00:30 +00:00
filterset_fields = ("child",)
class BMIAdd(CoreAddView):
model = models.BMI
2022-02-10 00:00:30 +00:00
permission_required = ("core.add_bmi",)
form_class = forms.BMIForm
2022-02-10 00:00:30 +00:00
success_url = reverse_lazy("core:bmi-list")
class BMIUpdate(CoreUpdateView):
model = models.BMI
2022-02-10 00:00:30 +00:00
permission_required = ("core.change_bmi",)
form_class = forms.BMIForm
2022-02-10 00:00:30 +00:00
success_url = reverse_lazy("core:bmi-list")
class BMIDelete(CoreDeleteView):
model = models.BMI
2022-02-10 00:00:30 +00:00
permission_required = ("core.delete_bmi",)
success_url = reverse_lazy("core:bmi-list")