118 lines
3.1 KiB
Python
118 lines
3.1 KiB
Python
from django.conf import settings
|
|
from django.core.paginator import Paginator
|
|
from django import forms
|
|
from django.db import models
|
|
from django.views.generic import TemplateView
|
|
from django.shortcuts import get_object_or_404, render
|
|
|
|
|
|
class FilteredQuerysetMixin:
|
|
queryset = None
|
|
filter_class = None
|
|
|
|
def get_filter_class(self):
|
|
return self.filter_class
|
|
|
|
def get_queryset(self):
|
|
filter_cls = self.get_filter_class()
|
|
filter_obj = filter_cls(self.request.GET)
|
|
filter_obj.is_valid()
|
|
qs = filter_obj.filter_queryset(self.queryset)
|
|
return qs
|
|
|
|
|
|
class PaginatedQuerysetMixin:
|
|
objects_per_page = settings.ITEMS_PER_PAGE or 20
|
|
|
|
def get_paginated_queryset(self, qs):
|
|
paginator = Paginator(qs, self.objects_per_page)
|
|
page = self.request.GET.get("page", 1)
|
|
qs = paginator.get_page(page)
|
|
return qs
|
|
|
|
|
|
class StylingMixin:
|
|
placeholder_for_field = {}
|
|
styled_fields = []
|
|
classes = {
|
|
"my-2",
|
|
"bg-gray-50",
|
|
"border",
|
|
"border-gray-300",
|
|
"text-gray-900",
|
|
"sm:text-sm rounded-lg",
|
|
"focus:ring-primary-600",
|
|
"focus:border-primary-600",
|
|
"block",
|
|
"w-full",
|
|
"p-2.5",
|
|
"dark:bg-gray-700",
|
|
"dark:border-gray-600",
|
|
"dark:placeholder-gray-400",
|
|
"dark:text-white",
|
|
"dark:focus:ring-primary-500",
|
|
"dark:focus:border-primary-500",
|
|
}
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
super().__init__(*args, **kwargs)
|
|
self.style_fields()
|
|
|
|
def style_fields(self):
|
|
for field_name in self.styled_fields:
|
|
field = self.fields[field_name]
|
|
field.required = True
|
|
field.widget.attrs.update(
|
|
{
|
|
"class": ' '.join(self.classes)
|
|
}
|
|
)
|
|
|
|
if self.placeholder_for_field.get(field_name):
|
|
field.widget.attrs.update(
|
|
{
|
|
"placeholder": self.placeholder_for_field.get(field_name),
|
|
}
|
|
)
|
|
|
|
|
|
class ReadUpdateView(TemplateView):
|
|
model: models.Model = None
|
|
form_class: forms.ModelForm = None
|
|
template_name: str = ""
|
|
ok_template_name: str = ""
|
|
error_template_name: str = ""
|
|
|
|
def get_model(self):
|
|
return self.model
|
|
|
|
def get_object(self):
|
|
pk = self.kwargs.get('pk')
|
|
cls = self.get_model()
|
|
return get_object_or_404(cls, pk=pk)
|
|
|
|
def get_initial_values(self, instance):
|
|
return {}
|
|
|
|
def get_context_data(self, **kwargs):
|
|
instance = self.get_object()
|
|
form = self.form_class(initial=self.get_initial_values(instance))
|
|
|
|
return {
|
|
"form": form,
|
|
}
|
|
|
|
def post(self, request, *args, **kwargs):
|
|
form = self.form_class(request.POST)
|
|
|
|
if form.is_valid():
|
|
instance = form.save()
|
|
return render(request, self.ok_template_name, {
|
|
"form": form,
|
|
"instance": instance,
|
|
})
|
|
|
|
return render(request, self.error_template_name, {
|
|
"form": form,
|
|
})
|