add filter, search text and per page choices
This commit is contained in:
@@ -231,6 +231,71 @@ class ResolutionListView(LoginRequiredMixin, ListView):
|
||||
|
||||
ordering = ["-id"]
|
||||
paginate_by = 10
|
||||
_per_page = 10
|
||||
_per_page_lst = ["10", "20", "50", "Alle"]
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
self.q = request.GET.get("q", "")
|
||||
|
||||
self.options_filters = request.GET.getlist("options", [])
|
||||
|
||||
self._per_page = request.GET.get("paginate_by", "10")
|
||||
if self._per_page == "Alle":
|
||||
self.paginate_by = None
|
||||
else:
|
||||
self.paginate_by = self._per_page
|
||||
|
||||
return super().get(request, *args, **kwargs)
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super().get_context_data(**kwargs)
|
||||
|
||||
context["q"] = self.q
|
||||
|
||||
# Add selected and all options
|
||||
context["options"] = Resolution.Option.choices
|
||||
context["selected_options"] = self.options_filters
|
||||
|
||||
# Add current per page value and list
|
||||
context["per_page"] = self._per_page
|
||||
context["per_page_values"] = self._per_page_lst
|
||||
|
||||
# Add paginator links
|
||||
if context["is_paginated"]:
|
||||
_page_obj = context["page_obj"]
|
||||
|
||||
base_url = "?"
|
||||
for option in self.options_filters:
|
||||
base_url += f"options={option}&".replace(" ", "+")
|
||||
if self.q:
|
||||
base_url += f"q={self.q}&".replace(" ", "+")
|
||||
end_url = f"paginate_by={self._per_page}"
|
||||
|
||||
if _page_obj.has_previous():
|
||||
context["prev_page"] = (
|
||||
f"{base_url}page={_page_obj.previous_page_number()}&{end_url}"
|
||||
)
|
||||
context["first_page"] = f"{base_url}page=1&{end_url}"
|
||||
|
||||
if _page_obj.has_next():
|
||||
context["next_page"] = f"{base_url}page={_page_obj.next_page_number()}&{end_url}"
|
||||
context["last_page"] = f"{base_url}page={_page_obj.paginator.num_pages}&{end_url}"
|
||||
|
||||
return context
|
||||
|
||||
def get_queryset(self):
|
||||
qs = super().get_queryset()
|
||||
|
||||
if self.q:
|
||||
qs = qs.filter(Q(name__icontains=self.q) | Q(voting_text__icontains=self.q))
|
||||
|
||||
if self.options_filters:
|
||||
filter_lst = [
|
||||
elem[0] for elem in Resolution.Option.choices if elem[1] in self.options_filters
|
||||
]
|
||||
qs = qs.filter(option__in=filter_lst)
|
||||
|
||||
return qs
|
||||
|
||||
|
||||
class ResolutionUpdateView(LoginRequiredMixin, UpdateView):
|
||||
|
||||
Reference in New Issue
Block a user