Add Generování hesla v registraci.
This commit is contained in:
		
							parent
							
								
									9a90648f29
								
							
						
					
					
						commit
						8572264845
					
				
					 3 changed files with 49 additions and 49 deletions
				
			
		|  | @ -1,5 +1,6 @@ | ||||||
| from django import forms | from django import forms | ||||||
| from dal import autocomplete | from dal import autocomplete | ||||||
|  | from django.contrib.auth.forms import PasswordResetForm | ||||||
| from django.core.exceptions import ObjectDoesNotExist | from django.core.exceptions import ObjectDoesNotExist | ||||||
| from django.contrib.auth.models import User | from django.contrib.auth.models import User | ||||||
| from django.forms import formset_factory | from django.forms import formset_factory | ||||||
|  | @ -37,21 +38,11 @@ class LoginForm(forms.Form): | ||||||
| 			widget=forms.PasswordInput()) | 			widget=forms.PasswordInput()) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class PrihlaskaForm(forms.Form): | class PrihlaskaForm(PasswordResetForm): | ||||||
| 	username = forms.CharField(label='Přihlašovací jméno',  | 	username = forms.CharField(label='Přihlašovací jméno',  | ||||||
| 			max_length=256,  | 			max_length=256,  | ||||||
| 			required=True, | 			required=True, | ||||||
| 			help_text='Tímto jménem se následně budeš přihlašovat pro odevzdání řešení a další činnosti v semináři') | 			help_text='Tímto jménem se následně budeš přihlašovat pro odevzdání řešení a další činnosti v semináři') | ||||||
| 	password = forms.CharField( |  | ||||||
| 			label='Heslo', |  | ||||||
| 			max_length=256, |  | ||||||
| 			required=True, |  | ||||||
| 			widget=forms.PasswordInput()) |  | ||||||
| 	password_check = forms.CharField( |  | ||||||
| 			label='Ověření hesla', |  | ||||||
| 			max_length=256, |  | ||||||
| 			required=True, |  | ||||||
| 			widget=forms.PasswordInput()) |  | ||||||
| 
 | 
 | ||||||
| 	jmeno = forms.CharField(label='Jméno', max_length=256, required=True) | 	jmeno = forms.CharField(label='Jméno', max_length=256, required=True) | ||||||
| 	prijmeni = forms.CharField(label='Příjmení', max_length=256, required=True) | 	prijmeni = forms.CharField(label='Příjmení', max_length=256, required=True) | ||||||
|  |  | ||||||
|  | @ -33,8 +33,8 @@ | ||||||
|          </h4> |          </h4> | ||||||
|          <table class="form"> |          <table class="form"> | ||||||
|            {% include "seminar/profil/prihlaska_field.html" with field=form.username %} |            {% include "seminar/profil/prihlaska_field.html" with field=form.username %} | ||||||
|            {% include "seminar/profil/prihlaska_field.html" with field=form.password %} | {#           {% include "seminar/profil/prihlaska_field.html" with field=form.password %}#} | ||||||
|            {% include "seminar/profil/prihlaska_field.html" with field=form.password_check %} | {#           {% include "seminar/profil/prihlaska_field.html" with field=form.password_check %}#} | ||||||
|          </table> |          </table> | ||||||
| 
 | 
 | ||||||
| <hr> | <hr> | ||||||
|  |  | ||||||
|  | @ -1,10 +1,12 @@ | ||||||
| 
 | from django.contrib.auth.tokens import PasswordResetTokenGenerator | ||||||
| 
 | from django.contrib.sites.shortcuts import get_current_site | ||||||
| from django.shortcuts import get_object_or_404, render, redirect | from django.shortcuts import get_object_or_404, render, redirect | ||||||
| from django.http import HttpResponse, HttpResponseRedirect, HttpResponseForbidden, JsonResponse | from django.http import HttpResponse, HttpResponseRedirect, HttpResponseForbidden, JsonResponse | ||||||
| from django.urls import reverse,reverse_lazy | from django.urls import reverse,reverse_lazy | ||||||
| from django.core.exceptions import PermissionDenied, ObjectDoesNotExist | from django.core.exceptions import PermissionDenied, ObjectDoesNotExist | ||||||
| from django.core.mail import send_mail | from django.core.mail import send_mail | ||||||
|  | from django.utils.encoding import force_bytes | ||||||
|  | from django.utils.http import urlsafe_base64_encode | ||||||
| from django.views import generic | from django.views import generic | ||||||
| from django.utils.translation import ugettext as _ | from django.utils.translation import ugettext as _ | ||||||
| from django.http import Http404,HttpResponseBadRequest,HttpResponseRedirect | from django.http import Http404,HttpResponseBadRequest,HttpResponseRedirect | ||||||
|  | @ -79,7 +81,7 @@ class ObalkovaniView(generic.ListView): | ||||||
| 	def get_context_data(self, **kwargs): | 	def get_context_data(self, **kwargs): | ||||||
| 		context = super(ObalkovaniView, self).get_context_data(**kwargs) | 		context = super(ObalkovaniView, self).get_context_data(**kwargs) | ||||||
| 		print(self.cislo) | 		print(self.cislo) | ||||||
| 		context['cislo'] = self.cislo  | 		context['cislo'] = self.cislo | ||||||
| 		return context | 		return context | ||||||
| 
 | 
 | ||||||
| class TNLData(object): | class TNLData(object): | ||||||
|  | @ -97,7 +99,7 @@ class TNLData(object): | ||||||
| 			self.tema_in_path = True | 			self.tema_in_path = True | ||||||
| 
 | 
 | ||||||
| 	def add_edit_options(self): | 	def add_edit_options(self): | ||||||
| 		self.deletable = tnltt.deletable(self)  | 		self.deletable = tnltt.deletable(self) | ||||||
| 		self.editable_siblings = tnltt.editableSiblings(self) | 		self.editable_siblings = tnltt.editableSiblings(self) | ||||||
| 		self.editable_children = tnltt.editableChildren(self) | 		self.editable_children = tnltt.editableChildren(self) | ||||||
| 		self.text_only_subtree = tnltt.textOnlySubtree(self) | 		self.text_only_subtree = tnltt.textOnlySubtree(self) | ||||||
|  | @ -117,7 +119,7 @@ class TNLData(object): | ||||||
| 		while True: | 		while True: | ||||||
| 			rocnik = isinstance(parent, s.RocnikNode) | 			rocnik = isinstance(parent, s.RocnikNode) | ||||||
| 			cislo = isinstance(parent, s.CisloNode) | 			cislo = isinstance(parent, s.CisloNode) | ||||||
| 			uloha = (isinstance(parent, s.UlohaVzorakNode) or  | 			uloha = (isinstance(parent, s.UlohaVzorakNode) or | ||||||
| 				isinstance(parent, s.UlohaZadaniNode)) | 				isinstance(parent, s.UlohaZadaniNode)) | ||||||
| 			tema = isinstance(parent, s.TemaVCisleNode) | 			tema = isinstance(parent, s.TemaVCisleNode) | ||||||
| 
 | 
 | ||||||
|  | @ -137,7 +139,7 @@ class TNLData(object): | ||||||
| 			print("Existuje TreeNode, který není pod číslem, ročníkem, úlohou" | 			print("Existuje TreeNode, který není pod číslem, ročníkem, úlohou" | ||||||
| 			"ani tématem. {}".format(anode)) | 			"ani tématem. {}".format(anode)) | ||||||
| 			return False | 			return False | ||||||
| 	 | 
 | ||||||
| 	@classmethod | 	@classmethod | ||||||
| 	def all_public_children(cls, anode): | 	def all_public_children(cls, anode): | ||||||
| 		for ch in treelib.all_children(anode): | 		for ch in treelib.all_children(anode): | ||||||
|  | @ -156,14 +158,14 @@ class TNLData(object): | ||||||
| 		if user.has_perm('auth.org'): | 		if user.has_perm('auth.org'): | ||||||
| 			enum_children = enumerate(treelib.all_children(anode)) | 			enum_children = enumerate(treelib.all_children(anode)) | ||||||
| 		else: | 		else: | ||||||
| 			enum_children = enumerate(TNLData.all_public_children(anode))	 | 			enum_children = enumerate(TNLData.all_public_children(anode)) | ||||||
| 	 | 
 | ||||||
| 		for (idx,ch) in enum_children: | 		for (idx,ch) in enum_children: | ||||||
| 			outitem = cls.from_treenode(ch, user, out,  idx) | 			outitem = cls.from_treenode(ch, user, out,  idx) | ||||||
| 			out.children.append(outitem) | 			out.children.append(outitem) | ||||||
| 		out.add_edit_options() | 		out.add_edit_options() | ||||||
| 		return out | 		return out | ||||||
| 	 | 
 | ||||||
| 	@classmethod | 	@classmethod | ||||||
| 	def from_tnldata_list(cls, tnllist): | 	def from_tnldata_list(cls, tnllist): | ||||||
| 		"""Vyrobíme virtuální TNL, který nemá obsah, ale má za potomky všechna zadaná TNLData""" | 		"""Vyrobíme virtuální TNL, který nemá obsah, ale má za potomky všechna zadaná TNLData""" | ||||||
|  | @ -192,7 +194,7 @@ class TNLData(object): | ||||||
| 				for tnl in result: | 				for tnl in result: | ||||||
| 					found.append(tnl) | 					found.append(tnl) | ||||||
| 			return found | 			return found | ||||||
| 	 | 
 | ||||||
| 	def to_json(self): | 	def to_json(self): | ||||||
| 		#self.node = anode | 		#self.node = anode | ||||||
| 		#self.children = [] | 		#self.children = [] | ||||||
|  | @ -264,7 +266,7 @@ class TreeNodePridatView(generic.View): | ||||||
| 
 | 
 | ||||||
| 		if kam not in ('pred','syn','za'): | 		if kam not in ('pred','syn','za'): | ||||||
| 			raise ValidationError('Přidat lze pouze před nebo za node nebo jako syna') | 			raise ValidationError('Přidat lze pouze před nebo za node nebo jako syna') | ||||||
| 		 | 
 | ||||||
| 		if co == m.TextNode: | 		if co == m.TextNode: | ||||||
| 			new_obj = m.Text() | 			new_obj = m.Text() | ||||||
| 			new_obj.save() | 			new_obj.save() | ||||||
|  | @ -303,7 +305,7 @@ class TreeNodePridatView(generic.View): | ||||||
| 				node = treelib.create_node_after(node,typ) | 				node = treelib.create_node_after(node,typ) | ||||||
| 
 | 
 | ||||||
| 		return redirect(node.get_admin_url()) | 		return redirect(node.get_admin_url()) | ||||||
| 		 | 
 | ||||||
| 
 | 
 | ||||||
| class TreeNodeSmazatView(generic.base.View): | class TreeNodeSmazatView(generic.base.View): | ||||||
| 	def post(self, request, *args, **kwargs): | 	def post(self, request, *args, **kwargs): | ||||||
|  | @ -343,7 +345,7 @@ class TreeNodeProhoditView(generic.base.View): | ||||||
| class SirotcinecView(generic.ListView): | class SirotcinecView(generic.ListView): | ||||||
| 	model = s.TreeNode | 	model = s.TreeNode | ||||||
| 	template_name = 'seminar/orphanage.html' | 	template_name = 'seminar/orphanage.html' | ||||||
| 	 | 
 | ||||||
| 	def get_queryset(self): | 	def get_queryset(self): | ||||||
| 		return s.TreeNode.objects.not_instance_of(s.RocnikNode).filter(root=None,prev=None,succ=None,father_of_first=None) | 		return s.TreeNode.objects.not_instance_of(s.RocnikNode).filter(root=None,prev=None,succ=None,father_of_first=None) | ||||||
| 
 | 
 | ||||||
|  | @ -548,7 +550,7 @@ class TitulniStranaView(generic.ListView): | ||||||
| 	def get_context_data(self, **kwargs): | 	def get_context_data(self, **kwargs): | ||||||
| 		context = super(TitulniStranaView, self).get_context_data(**kwargs) | 		context = super(TitulniStranaView, self).get_context_data(**kwargs) | ||||||
| 		nastaveni = get_object_or_404(Nastaveni) | 		nastaveni = get_object_or_404(Nastaveni) | ||||||
| 		 | 
 | ||||||
| 		deadline_soustredeni = (nastaveni.aktualni_cislo.datum_deadline_soustredeni, "soustredeni") | 		deadline_soustredeni = (nastaveni.aktualni_cislo.datum_deadline_soustredeni, "soustredeni") | ||||||
| 		preddeadline = (nastaveni.aktualni_cislo.datum_preddeadline, "preddeadline") | 		preddeadline = (nastaveni.aktualni_cislo.datum_preddeadline, "preddeadline") | ||||||
| 		deadline = (nastaveni.aktualni_cislo.datum_deadline, "deadline") | 		deadline = (nastaveni.aktualni_cislo.datum_deadline, "deadline") | ||||||
|  | @ -564,7 +566,7 @@ class TitulniStranaView(generic.ListView): | ||||||
| 			context['nejblizsi_deadline'] = datetime.combine(nejblizsi_deadline[0], datetime.max.time()) | 			context['nejblizsi_deadline'] = datetime.combine(nejblizsi_deadline[0], datetime.max.time()) | ||||||
| 		else: | 		else: | ||||||
| 			context['nejblizsi_deadline'] = None | 			context['nejblizsi_deadline'] = None | ||||||
| 		 | 
 | ||||||
| 		context['typ_deadline'] = nejblizsi_deadline[1] | 		context['typ_deadline'] = nejblizsi_deadline[1] | ||||||
| 
 | 
 | ||||||
| 		# Aktuální témata | 		# Aktuální témata | ||||||
|  | @ -637,10 +639,10 @@ class ArchivView(generic.ListView): | ||||||
| 				urls[c.rocnik] = c.titulka_nahled.url | 				urls[c.rocnik] = c.titulka_nahled.url | ||||||
| 
 | 
 | ||||||
| 		context["object_list"] = urls | 		context["object_list"] = urls | ||||||
| 		 | 
 | ||||||
| 		return context | 		return context | ||||||
| 
 | 
 | ||||||
| 	 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -762,7 +764,7 @@ class OdmenyView(generic.TemplateView): | ||||||
| 				outlist.append({'jmeno': resitel.osoba.plne_jmeno(), 'ftitul': ftitul, 'ttitul': ttitul}) | 				outlist.append({'jmeno': resitel.osoba.plne_jmeno(), 'ftitul': ftitul, 'ttitul': ttitul}) | ||||||
| 		context['zmeny'] = outlist | 		context['zmeny'] = outlist | ||||||
| 		return context | 		return context | ||||||
| 		 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -852,7 +854,7 @@ class OrgoRozcestnikView(TemplateView): | ||||||
| 		os = s.Osoba.objects.get(user=u) | 		os = s.Osoba.objects.get(user=u) | ||||||
| 		organizator = s.Organizator.objects.get(osoba=os) | 		organizator = s.Organizator.objects.get(osoba=os) | ||||||
| 		#FIXME: přidat stav='STAV_ZADANY' | 		#FIXME: přidat stav='STAV_ZADANY' | ||||||
| 		temata = s.Tema.objects.filter(Q(garant=organizator) | Q(autor=organizator) | Q(opravovatele__in=[organizator]),  | 		temata = s.Tema.objects.filter(Q(garant=organizator) | Q(autor=organizator) | Q(opravovatele__in=[organizator]), | ||||||
| 			rocnik=aktualni_rocnik).distinct() | 			rocnik=aktualni_rocnik).distinct() | ||||||
| 		ulohy = s.Uloha.objects.filter(Q(garant=organizator) | Q(autor=organizator) | Q(opravovatele__in=[organizator]), | 		ulohy = s.Uloha.objects.filter(Q(garant=organizator) | Q(autor=organizator) | Q(opravovatele__in=[organizator]), | ||||||
| 			cislo_zadani__rocnik=aktualni_rocnik).distinct() | 			cislo_zadani__rocnik=aktualni_rocnik).distinct() | ||||||
|  | @ -877,7 +879,7 @@ def TitulyView(request, rocnik, cislo): | ||||||
| 	cislo_obj = Cislo.objects.get(rocnik = rocnik_obj, poradi = cislo) | 	cislo_obj = Cislo.objects.get(rocnik = rocnik_obj, poradi = cislo) | ||||||
| 
 | 
 | ||||||
| 	asciijmena = [] | 	asciijmena = [] | ||||||
| 	jmenovci = False # detekuje, zda jsou dva řešitelé jmenovci (modulo nabodeníčka),  | 	jmenovci = False # detekuje, zda jsou dva řešitelé jmenovci (modulo nabodeníčka), | ||||||
| 		# pokud ano, vrátí se jako true | 		# pokud ano, vrátí se jako true | ||||||
| 	slovnik_s_body = body_resitelu(resitele, rocnik_obj) | 	slovnik_s_body = body_resitelu(resitele, rocnik_obj) | ||||||
| 
 | 
 | ||||||
|  | @ -893,7 +895,7 @@ def TitulyView(request, rocnik, cislo): | ||||||
| 			asciijmena.append(resitel.ascii) | 			asciijmena.append(resitel.ascii) | ||||||
| 		else: | 		else: | ||||||
| 			jmenovci = True | 			jmenovci = True | ||||||
| 	 | 
 | ||||||
| 	return render(request, 'seminar/archiv/tituly.tex', | 	return render(request, 'seminar/archiv/tituly.tex', | ||||||
| 		{'resitele': resitele,'jmenovci':jmenovci},content_type="text/plain") | 		{'resitele': resitele,'jmenovci':jmenovci},content_type="text/plain") | ||||||
| 
 | 
 | ||||||
|  | @ -966,7 +968,7 @@ def group_by_rocnik(clanky): | ||||||
| 			rocnik = clanek.cislo.rocnik.rocnik | 			rocnik = clanek.cislo.rocnik.rocnik | ||||||
| 	skupiny_clanku.append(skupina) | 	skupiny_clanku.append(skupina) | ||||||
| 	return skupiny_clanku | 	return skupiny_clanku | ||||||
| 	 | 
 | ||||||
| 
 | 
 | ||||||
| # FIXME: clanky jsou vsechny, pokud budou i neresitelske, tak se take zobrazi | # FIXME: clanky jsou vsechny, pokud budou i neresitelske, tak se take zobrazi | ||||||
| # FIXME: Původně tu byl kód přímo v těle třídy, což rozbíjelo migrace. Opravil jsem, ale vůbec nevím, jestli to funguje. | # FIXME: Původně tu byl kód přímo v těle třídy, což rozbíjelo migrace. Opravil jsem, ale vůbec nevím, jestli to funguje. | ||||||
|  | @ -1055,9 +1057,9 @@ class NahrajReseniView(LoginRequiredMixin, CreateView): | ||||||
| 	def get_context_data(self,**kwargs): | 	def get_context_data(self,**kwargs): | ||||||
| 		data = super().get_context_data(**kwargs) | 		data = super().get_context_data(**kwargs) | ||||||
| 		if self.request.POST: | 		if self.request.POST: | ||||||
| 			data['prilohy'] = f.ReseniSPrilohamiFormSet(self.request.POST,self.request.FILES)  | 			data['prilohy'] = f.ReseniSPrilohamiFormSet(self.request.POST,self.request.FILES) | ||||||
| 		else: | 		else: | ||||||
| 			data['prilohy'] = f.ReseniSPrilohamiFormSet()  | 			data['prilohy'] = f.ReseniSPrilohamiFormSet() | ||||||
| 		return data | 		return data | ||||||
| 
 | 
 | ||||||
| 	# FIXME prepsat tak, aby form_valid se volalo jen tehdy, kdyz je form i formset validni | 	# FIXME prepsat tak, aby form_valid se volalo jen tehdy, kdyz je form i formset validni | ||||||
|  | @ -1070,13 +1072,13 @@ class NahrajReseniView(LoginRequiredMixin, CreateView): | ||||||
| 		with transaction.atomic(): | 		with transaction.atomic(): | ||||||
| 			self.object = form.save() | 			self.object = form.save() | ||||||
| 			self.object.resitele.add(Resitel.objects.get(osoba__user = self.request.user)) | 			self.object.resitele.add(Resitel.objects.get(osoba__user = self.request.user)) | ||||||
| 			self.object.cas_doruceni = timezone.now()  | 			self.object.cas_doruceni = timezone.now() | ||||||
| 			self.object.forma = s.Reseni.FORMA_UPLOAD | 			self.object.forma = s.Reseni.FORMA_UPLOAD | ||||||
| 			self.object.save() | 			self.object.save() | ||||||
| 
 | 
 | ||||||
| 			prilohy.instance = self.object | 			prilohy.instance = self.object | ||||||
| 			prilohy.save() | 			prilohy.save() | ||||||
| 		 | 
 | ||||||
| 		# Pošleme mail opravovatelům a garantovi | 		# Pošleme mail opravovatelům a garantovi | ||||||
| 		# FIXME: Nechat spočítat databázi? Je to pár dotazů (pravděpodobně), takže to za to možná nestojí | 		# FIXME: Nechat spočítat databázi? Je to pár dotazů (pravděpodobně), takže to za to možná nestojí | ||||||
| 		prijemci = set() | 		prijemci = set() | ||||||
|  | @ -1099,7 +1101,7 @@ class NahrajReseniView(LoginRequiredMixin, CreateView): | ||||||
| def prihlaska_log_gdpr_safe(logger, gdpr_logger, msg, form_data): | def prihlaska_log_gdpr_safe(logger, gdpr_logger, msg, form_data): | ||||||
| 	msg = "{}, form_hash:{}".format(msg,hash(frozenset(form_data.items))) | 	msg = "{}, form_hash:{}".format(msg,hash(frozenset(form_data.items))) | ||||||
| 	logger.warn(msg) | 	logger.warn(msg) | ||||||
| 	gdpr_logger.warn(msg+", form:{}".format(form_data))		 | 	gdpr_logger.warn(msg+", form:{}".format(form_data)) | ||||||
| 
 | 
 | ||||||
| from django.forms.models import model_to_dict | from django.forms.models import model_to_dict | ||||||
| def resitelEditView(request): | def resitelEditView(request): | ||||||
|  | @ -1185,11 +1187,10 @@ def prihlaskaView(request): | ||||||
| 			fcd = form.cleaned_data | 			fcd = form.cleaned_data | ||||||
| 			form_hash = hash(frozenset(fcd.items())) | 			form_hash = hash(frozenset(fcd.items())) | ||||||
| 			form_logger.info(str(fcd) + str(form_hash))  # TODO možná logovat jinak | 			form_logger.info(str(fcd) + str(form_hash))  # TODO možná logovat jinak | ||||||
| 			 | 
 | ||||||
| 			with transaction.atomic(): | 			with transaction.atomic(): | ||||||
| 				u = User.objects.create_user( | 				u = User.objects.create_user( | ||||||
| 					username=fcd['username'], | 					username=fcd['username'], | ||||||
| 					password=fcd['password'], |  | ||||||
| 					email = fcd['email']) | 					email = fcd['email']) | ||||||
| 				u.save() | 				u.save() | ||||||
| 				resitel_perm = Permission.objects.filter(codename__exact='resitel').first() | 				resitel_perm = Permission.objects.filter(codename__exact='resitel').first() | ||||||
|  | @ -1229,7 +1230,7 @@ def prihlaskaView(request): | ||||||
| 					zasilat = fcd['zasilat'], | 					zasilat = fcd['zasilat'], | ||||||
| 					zasilat_cislo_emailem = fcd['zasilat_cislo_emailem'] | 					zasilat_cislo_emailem = fcd['zasilat_cislo_emailem'] | ||||||
| 					) | 					) | ||||||
| 				 | 
 | ||||||
| 				r.save() | 				r.save() | ||||||
| 				r.osoba = o | 				r.osoba = o | ||||||
| 				if fcd.get('skola'): | 				if fcd.get('skola'): | ||||||
|  | @ -1240,11 +1241,19 @@ def prihlaskaView(request): | ||||||
| 					err_logger.warn(msg + str(form_hash)) | 					err_logger.warn(msg + str(form_hash)) | ||||||
| 				r.save() | 				r.save() | ||||||
| 
 | 
 | ||||||
| 			send_mail( | 			uid = urlsafe_base64_encode(force_bytes(u.pk)) | ||||||
|  | 			token = PasswordResetTokenGenerator().make_token(u) | ||||||
|  | 			url = "https://%s%s" % ( | ||||||
|  | 				str(get_current_site(request)), | ||||||
|  | 				str(reverse_lazy("password_reset_confirm", args=[uid, token])) | ||||||
|  | 			) | ||||||
|  | 
 | ||||||
|  | 			u.email_user( | ||||||
| 				subject="Registrace na M&M", | 				subject="Registrace na M&M", | ||||||
| 				message=f"Tento e-mail byl právě zaregistrován na mam.matfyz.cz.", # TODO: Dovymyslet text. | 				message=f"Tento e-mail byl právě zaregistrován na mam.matfyz.cz. Nové heslo si nastavíš na: " + url, | ||||||
|  | 				# TODO: templates/seminar/registrace a django/contrib/auth/forms.py říkají, jak na to lépe | ||||||
|  | 				# TODO: Dovymyslet text. | ||||||
| 				from_email="registrace@mam.mff.cuni.cz",  # FIXME: Chceme to mít radši tady, nebo v nastavení? | 				from_email="registrace@mam.mff.cuni.cz",  # FIXME: Chceme to mít radši tady, nebo v nastavení? | ||||||
| 				recipient_list=list([fcd['email']]), |  | ||||||
| 			) | 			) | ||||||
| 
 | 
 | ||||||
| 			return formularOKView(request) | 			return formularOKView(request) | ||||||
|  | @ -1319,7 +1328,7 @@ class NahrajObrazekKTreeNoduView(LoginRequiredMixin, CreateView): | ||||||
| 
 | 
 | ||||||
| 		return JsonResponse({"url":self.object.na_web.url}) | 		return JsonResponse({"url":self.object.na_web.url}) | ||||||
| 
 | 
 | ||||||
| 	 | 
 | ||||||
| 
 | 
 | ||||||
| # Jen hloupé rozhazovátko | # Jen hloupé rozhazovátko | ||||||
| def profilView(request): | def profilView(request): | ||||||
|  | @ -1345,10 +1354,10 @@ def formularOKView(request): | ||||||
| 	return render(request, template_name, context) | 	return render(request, template_name, context) | ||||||
| 
 | 
 | ||||||
| #------------------ Jak řešit - možná má být udělané úplně jinak | #------------------ Jak řešit - možná má být udělané úplně jinak | ||||||
|      | 
 | ||||||
| class JakResitView(generic.ListView): | class JakResitView(generic.ListView): | ||||||
| 	template_name = 'seminar/jak-resit.html' | 	template_name = 'seminar/jak-resit.html' | ||||||
|      | 
 | ||||||
| 	def get_queryset(self): | 	def get_queryset(self): | ||||||
| 		return None | 		return None | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Jonas Havelka
						Jonas Havelka