Až na řešitelské články a aktuální zadání dokontrolované views, smazané věci ohledně tex->html mašinerie.
This commit is contained in:
		
							parent
							
								
									5fb3e9f39e
								
							
						
					
					
						commit
						29fa10049a
					
				
					 3 changed files with 15 additions and 223 deletions
				
			
		|  | @ -88,17 +88,9 @@ urlpatterns = [ | |||
| 		staff_member_required(views.StavDatabazeView), name='stav_databaze'), | ||||
| 	path('cislo/<int:rocnik>.<int:cislo>/obalkovani', | ||||
| 		staff_member_required(views.ObalkovaniView.as_view()), name='seminar_cislo_resitel_obalkovani'), | ||||
| 	path('cislo/<int:rocnik>.<int:cislo>/tex-download.json', | ||||
| 		staff_member_required(views.texDownloadView), name='seminar_tex_download'), | ||||
| 	path('soustredeni/<int:soustredeni>/obalky.pdf', | ||||
| 		staff_member_required(views.soustredeniObalkyView), name='seminar_soustredeni_obalky'), | ||||
| 
 | ||||
| 	path('tex-upload/login/', views.TeXUploadLoginView, name='seminar_login'), | ||||
| 	path( | ||||
| 		'tex-upload/', | ||||
| 		staff_member_required(views.texUploadView), | ||||
| 		name='seminar_tex_upload' | ||||
| 	), | ||||
| 	path('org/vloz_body/<int:tema>/', | ||||
| 		staff_member_required(views.VlozBodyView.as_view()),name='seminar_org_vlozbody'), | ||||
| 	path('auth/prihlaska/',views.prihlaskaView, name='seminar_prihlaska'), | ||||
|  |  | |||
|  | @ -49,40 +49,40 @@ def seznam_problemu(): | |||
| 
 | ||||
| 	# Pomocna fce k formatovani problemovych hlasek | ||||
| 	def prb(cls, msg, objs=None): | ||||
| 		s = u'<b>%s:</b> %s' % (cls.__name__, msg) | ||||
| 		s = '<b>%s:</b> %s' % (cls.__name__, msg) | ||||
| 		if objs: | ||||
| 			s += u' [' | ||||
| 			s += ' [' | ||||
| 			for o in objs: | ||||
| 				try: | ||||
| 					url = o.admin_url() | ||||
| 				except: | ||||
| 					url = None | ||||
| 				if url: | ||||
| 					s += u'<a href="%s">%s</a>, ' % (url, o.pk, ) | ||||
| 					s += '<a href="%s">%s</a>, ' % (url, o.pk, ) | ||||
| 				else: | ||||
| 					s += u'%s, ' % (o.pk, ) | ||||
| 			s = s[:-2] + u']' | ||||
| 					s += '%s, ' % (o.pk, ) | ||||
| 			s = s[:-2] + ']' | ||||
| 		problemy.append(s) | ||||
| 
 | ||||
| 	# Duplicita jmen | ||||
| 	jmena = {} | ||||
| 	for r in m.Resitel.objects.all(): | ||||
| 		j = r.plne_jmeno() | ||||
| 		j = r.osoba.plne_jmeno() | ||||
| 		if j not in jmena: | ||||
| 			jmena[j] = [] | ||||
| 		jmena[j].append(r) | ||||
| 	for j in jmena: | ||||
| 		if len(jmena[j]) > 1: | ||||
| 			prb(m.Resitel, u'Duplicitní jméno "%s"' % (j, ), jmena[j]) | ||||
| 			prb(m.Resitel, 'Duplicitní jméno "%s"' % (j, ), jmena[j]) | ||||
| 
 | ||||
| 	# Data maturity a narození | ||||
| 	for r in m.Resitel.objects.all(): | ||||
| 		if not r.rok_maturity: | ||||
| 			prb(m.Resitel, u'Neznámý rok maturity', [r]) | ||||
| 			prb(m.Resitel, 'Neznámý rok maturity', [r]) | ||||
| 		if r.rok_maturity and (r.rok_maturity < 1990 or r.rok_maturity > datetime.date.today().year + 10): | ||||
| 			prb(m.Resitel, u'Podezřelé datum maturity', [r]) | ||||
| 		if r.datum_narozeni and (r.datum_narozeni.year < 1970 or r.datum_narozeni.year > datetime.date.today().year - 12): | ||||
| 			prb(m.Resitel, u'Podezřelé datum narození', [r]) | ||||
| 			prb(m.Resitel, 'Podezřelé datum maturity', [r]) | ||||
| 		if r.osoba.datum_narozeni and (r.osoba.datum_narozeni.year < 1970 or r.osoba.datum_narozeni.year > datetime.date.today().year - 12): | ||||
| 			prb(m.Resitel, 'Podezřelé datum narození', [r]) | ||||
| #        if not r.email: | ||||
| #            prb(Resitel, u'Neznámý email', [r]) | ||||
| 
 | ||||
|  |  | |||
|  | @ -1009,8 +1009,8 @@ class ClankyResitelView(generic.ListView): | |||
| def StavDatabazeView(request): | ||||
| #	nastaveni = Nastaveni.objects.get() | ||||
| 	problemy = utils.seznam_problemu() | ||||
| 	muzi = Resitel.objects.filter(pohlavi_muz=True) | ||||
| 	zeny = Resitel.objects.filter(pohlavi_muz=False) | ||||
| 	muzi = Resitel.objects.filter(osoba__pohlavi_muz=True) | ||||
| 	zeny = Resitel.objects.filter(osoba__pohlavi_muz=False) | ||||
| 	return render(request, 'seminar/stav_databaze.html', | ||||
| 			{ | ||||
| #				'nastaveni': nastaveni, | ||||
|  | @ -1019,211 +1019,11 @@ def StavDatabazeView(request): | |||
| 				'resitele': Resitel.objects.all(), | ||||
| 				'muzi': muzi, | ||||
| 				'zeny': zeny, | ||||
| 				'jmena_muzu': utils.histogram([r.jmeno for r in muzi]), | ||||
| 				'jmena_zen': utils.histogram([r.jmeno for r in zeny]), | ||||
| 				'jmena_muzu': utils.histogram([r.osoba.jmeno for r in muzi]), | ||||
| 				'jmena_zen': utils.histogram([r.osoba.jmeno for r in zeny]), | ||||
| 			}) | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| @ensure_csrf_cookie | ||||
| def TeXUploadLoginView(request): | ||||
| 	"""Pro přihlášení při nahrávání z texu""" | ||||
| 	q = request.POST | ||||
| 	# nastavení cookie csrftoken | ||||
| 	if not q: | ||||
| 		return JsonResponse({"ok": 1}) | ||||
| 
 | ||||
| 	if "username" in q: | ||||
| 		username = q["username"] | ||||
| 		password = q["password"] | ||||
| 		user = authenticate(username=username, password=password) | ||||
| 		if user is not None and user.is_staff: | ||||
| 			login(request, user) | ||||
| 			return JsonResponse({"ok": 1}) | ||||
| 		else: | ||||
| 			return JsonResponse({"error": "Neplatné uživatelské jméno nebo heslo"}) | ||||
| 
 | ||||
| 
 | ||||
| @ensure_csrf_cookie | ||||
| def texUploadView(request): | ||||
| 
 | ||||
| 	def uloz_soubory(files, rocnik, cislo): | ||||
| 		for filename, f in files: | ||||
| 			path = os.path.join( | ||||
| 				settings.MEDIA_ROOT, | ||||
| 				settings.CISLO_IMG_DIR, | ||||
| 				rocnik, | ||||
| 				cislo, | ||||
| 				filename | ||||
| 			) | ||||
| 
 | ||||
| 			adresar = os.path.dirname(path) | ||||
| 			if not os.path.exists(adresar): | ||||
| 				os.makedirs(adresar) | ||||
| 
 | ||||
| 			with open(path, "wb+") as fout: | ||||
| 				for chunk in f.chunks(): | ||||
| 					fout.write(chunk) | ||||
| 
 | ||||
| 	q = request.POST | ||||
| 	# nastavení cookie csrftoken | ||||
| 	if not q: | ||||
| 		return JsonResponse({"ok": 1}) | ||||
| 
 | ||||
| 	# Odchytíme všechny výjimky a traceback pošleme v odpovědi | ||||
| 	try: | ||||
| 		meta = json.loads(q["meta"]) | ||||
| 		html = q["html"] | ||||
| 
 | ||||
| 		if meta["typ"] in ["uloha", "serial", "reseni", "tema"]: | ||||
| 
 | ||||
| 			# Uložíme soubory | ||||
| 			if meta["typ"] != "reseni": | ||||
| 				c = meta["cislo"] | ||||
| 			else: | ||||
| 				# Řešení má nastavené číslo svojí úlohy, ale obrázky jsou | ||||
| 				# ukládány do čísla, kde řešení vyšlo | ||||
| 				c = meta["cislo_reseni"] | ||||
| 
 | ||||
| 			# Zjistíme typ ukládaného problému | ||||
| 			typy = { | ||||
| 				"uloha": Problem.TYP_ULOHA, | ||||
| 				"serial": Problem.TYP_SERIAL, | ||||
| 				"reseni": Problem.TYP_ULOHA, | ||||
| 				"tema": Problem.TYP_TEMA, | ||||
| 			} | ||||
| 			problem_typ = typy[meta["typ"]] | ||||
| 
 | ||||
| 			# Pokud už problém existuje, vytáhneme jej z db a upravíme. | ||||
| 			# Pokud neexistuje, vytvoříme jej jedině pokud je to vynucené. | ||||
| 
 | ||||
| 			# Pokud ročník/číslo ještě neexistuje, vyhodí to výjimku -> | ||||
| 			# číslo/ročník se musí založit ručně v adminu. | ||||
| 			rocnik = Rocnik.objects.get(rocnik=meta["rocnik"]) | ||||
| 			cislo = Cislo.objects.get(rocnik=rocnik, cislo=meta["cislo"]) | ||||
| 
 | ||||
| 			existujici = Problem.objects.filter( | ||||
| 				typ=problem_typ, | ||||
| 				stav=Problem.STAV_ZADANY, | ||||
| 				cislo_zadani=cislo, | ||||
| 				kod=meta["kod"] | ||||
| 			) | ||||
| 
 | ||||
| 			problem = None | ||||
| 			if existujici: | ||||
| 				problem = existujici[0] | ||||
| 			elif "vytvor" in q: | ||||
| 				# vytvoříme nový | ||||
| 				problem = Problem( | ||||
| 					typ=problem_typ, | ||||
| 					stav=Problem.STAV_ZADANY, | ||||
| 					kod=meta["kod"], | ||||
| 					cislo_zadani=cislo | ||||
| 				) | ||||
| 			else: | ||||
| 				return JsonResponse({ | ||||
| 					"error": "Problém neexistuje: {} {}.{} kód {}".format( | ||||
| 						meta["typ"], meta["rocnik"], meta["cislo"], meta["kod"] | ||||
| 					) | ||||
| 				}) | ||||
| 
 | ||||
| 			uloz_soubory(request.FILES.items(), meta["rocnik"], c) | ||||
| 
 | ||||
| 			if meta["typ"] == "reseni": | ||||
| 				problem.text_reseni = html | ||||
| 
 | ||||
| 				# Pokud ročník/číslo ještě neexistuje, vyhodí to výjimku -> | ||||
| 				# číslo/ročník se musí založit ručně v adminu | ||||
| 				problem.cislo_reseni = Cislo.objects.get( | ||||
| 					rocnik=rocnik, | ||||
| 					cislo=meta["cislo_reseni"] | ||||
| 				) | ||||
| 				# při nahrávání řešení už původní zadání atd. neměníme | ||||
| 			else: | ||||
| 				problem.text_zadani = html | ||||
| 				problem.nazev = meta["nazev"] | ||||
| 				if meta["typ"] != "tema": | ||||
| 					problem.body = meta["body"] | ||||
| 
 | ||||
| 			problem.save() | ||||
| 			cislo.faze = cislo.FAZE_NAHRANO | ||||
| 			cislo.save() | ||||
| 
 | ||||
| 			# Vrátíme id dané úlohy, aby se k ní dala případně připojit pohádka | ||||
| 			return JsonResponse({"db_id": problem.id}) | ||||
| 
 | ||||
| 		elif meta["typ"] == "pohadka": | ||||
| 			uloha = Problem.objects.get(typ=Problem.TYP_ULOHA, pk=meta["uloha"]) | ||||
| 
 | ||||
| 			# Pokud už příslušná pohádka existuje, jen ji upravíme | ||||
| 			existujici = Pohadka.objects.filter(uloha=uloha, pred=meta["pred"]) | ||||
| 			pohadka = None | ||||
| 			if existujici: | ||||
| 				pohadka = existujici[0] | ||||
| 			else: | ||||
| 				pohadka = Pohadka(uloha=uloha, pred=meta["pred"]) | ||||
| 			pohadka.text = q["html"] | ||||
| 			pohadka.save() | ||||
| 
 | ||||
| 			return JsonResponse({"db_id": pohadka.id}) | ||||
| 
 | ||||
| 	except Exception as e: | ||||
| 		# Pošleme zpátky traceback, ať uživatel ví, v čem je problém | ||||
| 		tb = "".join(traceback.format_exception(type(e), e, sys.exc_info()[2])) | ||||
| 		return JsonResponse({"error": tb}) | ||||
| 
 | ||||
| 
 | ||||
| def texDownloadView(request, rocnik, cislo): | ||||
| 	"""View posílající JSON se zadanými a řešenými problémy pro založení čísla | ||||
| 	""" | ||||
| 	cislo = Cislo.objects.get(rocnik__rocnik=rocnik, cislo=cislo) | ||||
| 	if cislo.faze == cislo.FAZE_NAHRANO: | ||||
| 		# obsah byl nahrán z TeXu na web, už je příliš složitý | ||||
| 		return JsonResponse( | ||||
| 			{"error": "Obsah čísla už byl nahrán z TeXu na web."} | ||||
| 		) | ||||
| 
 | ||||
| 	zadane = Problem.objects.filter( | ||||
| 		cislo_zadani=cislo, | ||||
| 		stav=Problem.STAV_ZADANY | ||||
| 	) | ||||
| 	resene = Problem.objects.filter( | ||||
| 		cislo_reseni=cislo, | ||||
| 		stav=Problem.STAV_ZADANY, | ||||
| 		typ=Problem.TYP_ULOHA | ||||
| 	) | ||||
| 	pred_pohadky = Pohadka.objects.filter(uloha__cislo_zadani=cislo, pred=True) | ||||
| 	po_pohadky = Pohadka.objects.filter(uloha__cislo_zadani=cislo, pred=False) | ||||
| 
 | ||||
| 	response = { | ||||
| 		"zadane": [ | ||||
| 			{ | ||||
| 				"nazev": p.nazev, | ||||
| 				"typ": p.typ, | ||||
| 				"kod": p.kod, | ||||
| 				"body": p.body, | ||||
| 				"zadani": p.text_zadani, | ||||
| 				"pred_pohadky": [x.text for x in pred_pohadky.filter(uloha=p)], | ||||
| 				"po_pohadky": [x.text for x in po_pohadky.filter(uloha=p)], | ||||
| 			} for p in zadane | ||||
| 		], | ||||
| 		"resene": [ | ||||
| 			{ | ||||
| 				"nazev": p.nazev, | ||||
| 				"typ": p.typ, | ||||
| 				"kod": p.kod, | ||||
| 				"body": p.body, | ||||
| 				"zadani": p.text_zadani, | ||||
| 				"reseni": p.text_reseni, | ||||
| 				"cislo_zadani": p.cislo_zadani.poradi, | ||||
| 			} for p in resene | ||||
| 		], | ||||
| 	} | ||||
| 
 | ||||
| 	cislo.faze = Cislo.FAZE_TEX | ||||
| 	cislo.save() | ||||
| 	return JsonResponse(response) | ||||
| 
 | ||||
| class ResitelView(LoginRequiredMixin,generic.DetailView): | ||||
| 	model = Resitel | ||||
| 	template_name = 'seminar/resitel.html' | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Anet
						Anet