mamweb/api/views/autocomplete.py

123 lines
4.1 KiB
Python
Raw Normal View History

2022-02-15 17:48:16 +01:00
"""
Views k :mod:`dal.autocomplete` pro vyhledávání objektů nějaké třídy v databázi.
"""
2020-03-03 21:48:55 +01:00
from dal import autocomplete
from django.shortcuts import get_object_or_404
2021-01-26 21:01:19 +01:00
from django.db.models import Q
2020-03-03 21:48:55 +01:00
from personalni.models import Skola, Resitel
from tvorba.models import Problem
from various.models import Nastaveni
2020-03-03 21:48:55 +01:00
from .helpers import LoginRequiredAjaxMixin
# TODO filosofie - zkratky, jak v databázi, tak ve vyhledávání (SPŠE, GASOŠ, Kpt., soukr)
2020-03-03 21:48:55 +01:00
class SkolaAutocomplete(autocomplete.Select2QuerySetView):
2022-02-15 17:48:16 +01:00
""" View k :mod:`dal.autocomplete` pro vyhledávání škol hlavně při registraci. """
2020-03-03 21:48:55 +01:00
def get_queryset(self):
# Don't forget to filter out results depending on the visitor !
qs = Skola.objects.all()
2020-03-03 21:48:55 +01:00
if self.q:
words = self.q.split(' ') #TODO re split podle bileho znaku
partq = Q()
for w in words: # Hledej po slovech, zahoď čárky a tečky z konců.
if len(w) == 0:
continue
if w[-1] in (".",","):
w = w[:-1]
partq &= (Q(nazev__icontains=w)|Q(kratky_nazev__icontains=w)|Q(ulice__icontains=w)|Q(mesto__icontains=w))
qs = qs.filter(partq)
2020-03-03 21:48:55 +01:00
return qs
class ResitelAutocomplete(LoginRequiredAjaxMixin,autocomplete.Select2QuerySetView):
2022-02-15 17:48:16 +01:00
""" View k :mod:`dal.autocomplete` pro vyhledávání řešitelů především v odevzdávátku. """
2020-03-03 21:48:55 +01:00
def get_queryset(self):
qs = Resitel.objects.all()
2020-03-03 21:48:55 +01:00
if self.q:
parts = self.q.split()
query = Q()
for part in parts:
query &= (
Q(osoba__jmeno__istartswith=part)|
Q(osoba__prijmeni__istartswith=part)|
Q(osoba__prezdivka__istartswith=part)
2020-03-03 21:48:55 +01:00
)
qs = qs.filter(query)
2020-03-03 21:48:55 +01:00
return qs
2022-11-22 00:15:20 +01:00
class PublicResitelAutocomplete(LoginRequiredAjaxMixin, autocomplete.Select2QuerySetView):
"""
View k :mod:`dal.autocomplete` pro vyhledávání řešitelů podle přezdívky
především v odevzdávátku.
"""
def get_queryset(self):
letos = Nastaveni.get_solo().aktualni_rocnik
qs = Resitel.objects.filter(
rok_maturity__gte=letos.druhy_rok()
).filter(
2022-11-22 00:15:20 +01:00
prezdivka_resitele__isnull=False
).exclude(
prezdivka_resitele=""
).filter(
prezdivka_resitele__icontains=self.q
2022-11-22 00:15:20 +01:00
).all()
return qs
def get_result_label(self, result):
return result.prezdivka_resitele
2020-03-03 21:48:55 +01:00
class OdevzdatelnyProblemAutocomplete(autocomplete.Select2QuerySetView):
2022-02-15 17:48:16 +01:00
""" View k :mod:`dal.autocomplete` pro vyhledávání problémů především v odevzdávátku. """
2020-03-03 21:48:55 +01:00
def get_queryset(self):
qs = Problem.objects.filter(stav=Problem.STAV_ZADANY)
2020-03-03 21:48:55 +01:00
if self.q:
qs = qs.filter(
Q(nazev__icontains=self.q))
nadproblem_id = int(self.forwarded.get("nadproblem_id", -1))
if nadproblem_id != -1:
# Seřadíme tak, aby ty s nadproblem==None byly dole (větší motivace tam naklikat konkrétní úlohy) a pak nějak rozumně.
# Tohle je řazení pro odevzdávátko, kde je definován nadproblém, proto je to v tomto ifu. (Jinde si to netroufám řadit)
qs = qs.order_by("nadproblem", "kod", "nazev")
2023-06-19 20:06:18 +02:00
qs = list(filter(lambda problem: problem.hlavni_problem.id == nadproblem_id, qs))
2020-03-03 21:48:55 +01:00
return qs
class ProblemAutocomplete(autocomplete.Select2QuerySetView):
""" View k :mod:`dal.autocomplete` pro vyhledávání problémů především v odevzdávátku. """
def get_queryset(self):
# FIXME i starší úlohy
nastaveni = get_object_or_404(Nastaveni)
rocnik = nastaveni.aktualni_rocnik
temaQ = Q(Tema___rocnik = rocnik)
ulohaQ = Q(Uloha___cislo_zadani__rocnik=rocnik)
clanekQ = Q(Clanek___cislo__rocnik=rocnik)
qs = Problem.objects.filter(temaQ | ulohaQ | clanekQ).order_by("-stav", "nazev")
if self.q:
qs = qs.filter(
Q(nazev__icontains=self.q))
return qs
2020-03-03 21:48:55 +01:00
# Ceka na autocomplete v3
# class OrganizatorAutocomplete(autocomplete.Select2QuerySetView):
# def get_queryset(self):
# if not self.request.user.is_authenticated():
# return Organizator.objects.none()
#
# qs = aktivniOrganizatori()
#
# if self.q:
# if self.q[0] == "!":
# qs = Organizator.objects.all()
# query = self.q[1:]
# else:
# query = self.q
# qs = qs.filter(
# Q(prezdivka__isstartswith=query)|
# Q(user__first_name__isstartswith=query)|
# Q(user__last_name__isstartswith=query))
#
# return qs