122 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			122 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """
 | |
| 	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 tvorba.models import Problem
 | |
| from various.models 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
 |