Web M&M
https://mam.matfyz.cz
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
4.1 KiB
122 lines
4.1 KiB
"""
|
|
Views k :mod:`dal.autocomplete` pro vyhledávání objektů nějaké třídy v databázi.
|
|
"""
|
|
from dal import autocomplete
|
|
from django.shortcuts import get_object_or_404
|
|
from django.db.models import Q
|
|
|
|
from personalni.models import Skola, Resitel
|
|
from seminar.models.tvorba import Problem
|
|
from seminar.models.nastaveni import Nastaveni
|
|
from .helpers import LoginRequiredAjaxMixin
|
|
|
|
# TODO filosofie - zkratky, jak v databázi, tak ve vyhledávání (SPŠE, GASOŠ, Kpt., soukr)
|
|
class SkolaAutocomplete(autocomplete.Select2QuerySetView):
|
|
""" View k :mod:`dal.autocomplete` pro vyhledávání škol hlavně při registraci. """
|
|
def get_queryset(self):
|
|
# Don't forget to filter out results depending on the visitor !
|
|
qs = Skola.objects.all()
|
|
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)
|
|
|
|
return qs
|
|
|
|
class ResitelAutocomplete(LoginRequiredAjaxMixin,autocomplete.Select2QuerySetView):
|
|
""" View k :mod:`dal.autocomplete` pro vyhledávání řešitelů především v odevzdávátku. """
|
|
def get_queryset(self):
|
|
qs = Resitel.objects.all()
|
|
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)
|
|
)
|
|
qs = qs.filter(query)
|
|
return qs
|
|
|
|
|
|
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(
|
|
prezdivka_resitele__isnull=False
|
|
).exclude(
|
|
prezdivka_resitele=""
|
|
).filter(
|
|
prezdivka_resitele__icontains=self.q
|
|
).all()
|
|
return qs
|
|
|
|
def get_result_label(self, result):
|
|
return result.prezdivka_resitele
|
|
|
|
|
|
class OdevzdatelnyProblemAutocomplete(autocomplete.Select2QuerySetView):
|
|
""" View k :mod:`dal.autocomplete` pro vyhledávání problémů především v odevzdávátku. """
|
|
def get_queryset(self):
|
|
qs = Problem.objects.filter(stav=Problem.STAV_ZADANY)
|
|
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")
|
|
qs = list(filter(lambda problem: problem.hlavni_problem.id == nadproblem_id, qs))
|
|
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
|
|
|
|
# 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
|
|
|