Merge remote-tracking branch 'refs/remotes/Gimli/data_migrations' into data_migrations
|  | @ -698,3 +698,27 @@ div.nahledy_cisel { | ||||||
| div.nahledy_cisel div, div.nahledy_cisel img { | div.nahledy_cisel div, div.nahledy_cisel img { | ||||||
|     position: absolute; |     position: absolute; | ||||||
| } | } | ||||||
|  | ul.form { | ||||||
|  | 	list-style-type: none;	 | ||||||
|  | 	padding-left: 0px; | ||||||
|  | } | ||||||
|  | label.field-label { | ||||||
|  | 	font-weight: normal;	 | ||||||
|  | } | ||||||
|  | label.field-required { | ||||||
|  | 	font-weight: bold;	 | ||||||
|  | } | ||||||
|  | .field-error { | ||||||
|  | 	font-size: 14px; | ||||||
|  | 	color: red; | ||||||
|  | } | ||||||
|  | ul.form li{ | ||||||
|  | 	margin-bottom: 3px;	 | ||||||
|  | } | ||||||
|  | p.gdpr { | ||||||
|  | 	font-size: 6pt; | ||||||
|  | 	margin-bottom: .66em; | ||||||
|  | } | ||||||
|  | div.gdpr { | ||||||
|  | 	font-size: 6pt; | ||||||
|  | } | ||||||
|  |  | ||||||
| Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 55 KiB | 
| Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 85 KiB | 
| Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 111 KiB | 
| Before Width: | Height: | Size: 101 KiB After Width: | Height: | Size: 105 KiB | 
| Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 71 KiB | 
| Before Width: | Height: | Size: 88 KiB After Width: | Height: | Size: 134 KiB | 
| Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 51 KiB | 
|  | @ -1,6 +1,25 @@ | ||||||
| from django import forms | from django import forms | ||||||
|  | from seminar.models import Resitel | ||||||
| 
 | 
 | ||||||
| class NameForm(forms.Form): | class PrihlaskaForm(forms.Form): | ||||||
| 	your_name = forms.CharField(label='Your name', max_length=100) | 	jmeno = forms.CharField(label='Jméno', max_length=256, required=True) | ||||||
|  | 	prijmeni = forms.CharField(label='Příjmení', max_length=256, required=True) | ||||||
|  | 	pohlavi = forms.ChoiceField(label='Pohlaví', | ||||||
|  | 			choices = ((True,'muž'),(False,'žena')), required=True) | ||||||
|  | 	email = forms.EmailField(label='E-mail',max_length=256, required=True) | ||||||
|  | 	telefon = forms.CharField(label='Telefon',max_length=256, required=False) | ||||||
|  | 	datum_narozeni = forms.DateField(label='Datum narození', required=False) | ||||||
|  | 	ulice = forms.CharField(label='Ulice', max_length=256, required=False) | ||||||
|  | 	mesto = forms.CharField(label='Město', max_length=256, required=False) | ||||||
|  | 	psc = forms.CharField(label='PSČ', max_length=32, required=False) | ||||||
|  | 	stat = forms.ChoiceField(label='Stát',  | ||||||
|  | 			choices = (('CZ', 'Česká Republika'), | ||||||
|  | 				('SK', 'Slovenská Republika'), | ||||||
|  | 				('other', 'Jiné')), | ||||||
|  | 			required=False) | ||||||
|  | 	#TODO skola | ||||||
|  | 	rok_maturity = forms.IntegerField(label='Rok maturity', min_value=2019, required=True) | ||||||
|  | 	zasilat = forms.ChoiceField(label='Kam zasílat čísla a řešení',choices = Resitel.ZASILAT_CHOICES, required=True) | ||||||
|  | 	gdpr = forms.BooleanField(label='Souhlasím se zpracováním osobních údajů', required=True) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										49
									
								
								seminar/templates/seminar/gdpr.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,49 @@ | ||||||
|  | <p> | ||||||
|  | TL;DR: | ||||||
|  | K tomu, abychom mohli zpracovávat Tvá data (uložit si tvou adresu, zobrazit Tvé jméno ve výsledkové listině, opravit Tvá řešení) od Tebe potřebujeme souhlas. | ||||||
|  | Pokud se zpracováváním souhlasíš dle níže uvedených podmínek, zaškrtni políčko níže. | ||||||
|  | </p> | ||||||
|  | <div class="gdpr"> | ||||||
|  | <p class="gdpr"> | ||||||
|  | Získáváme od Tebe údaje vyplněné v přihlášce do semináře (jméno, příjmení, poštovní a e-mailovou adresu, školu, kterou navštěvuješ a rok maturity), případně v přihlášce na soustředění (navíc datum narození, telefonní číslo). Také uchováváme všechna řešení, která nám pošleš, a jejich hodnocení. | ||||||
|  | </p> | ||||||
|  | <p class="gdpr"> | ||||||
|  | Slibujeme Ti, že Tvá osobní data nezneužijeme k ničemu, co by nesouviselo s M&M nebo s dalšími aktivitami Matfyzu, a nikdy je nepředáme nikomu cizímu. Údaje využíváme k zajištění chodu semináře a také je sdílíme s ostatními propagačními akcemi Matfyzu, abychom mohli vyhodnocovat úspěšnost akcí. Pokud budeš mít zájem, budeme Ti také posílat zajímavé zprávy a novinky týkajíci se Matfyzu. | ||||||
|  | </p> | ||||||
|  | <p class="gdpr"> | ||||||
|  | Veřejně vystavujeme pouze výsledkové listiny, které také uchováváme pro archivní účely. Pokud ale z nějakého důvodu nebudeš chtít mít své jméno či školu uvedené ve výsledkové listině, není problém to zařídit, napiš nám. Z tištěných materiálů samozřejmě údaje už odstranit nemůžeme. | ||||||
|  | </p> | ||||||
|  | <p class="gdpr"> | ||||||
|  | Na soustředěních a dalších akcích semináře navíc pořizujeme fotografie a videozáznamy a používáme je ke zpravodajským a propagačním účelům. Pro propagační účely si od Tebe vyžádáme samostatný souhlas na začátku akce. | ||||||
|  | </p> | ||||||
|  | <p class="gdpr"> | ||||||
|  | <i>Souhlas se zpracováním osobních údajů pro potřeby chodu semináře</i> | ||||||
|  | </p> | ||||||
|  | <p class="gdpr"> | ||||||
|  | Tímto uděluji souhlas Univerzitě Karlově, se sídlem Ovocný trh 560/5, 116 36 Praha 1, IČO 00216208 (dále jen UK), která je správcem osobních údajů všech fakult a součástí UK, ke zpracování osobních údajů pro potřeby Korespondenčního semináře M&M a Matematicko-fyzikální fakulty UK (dále jen M&M a MFF UK). | ||||||
|  | </p> | ||||||
|  | <p class="gdpr"> | ||||||
|  | Tento souhlas uděluji pro všechny výše uvedené osobní údaje, a to po dobu účasti v semináři a 10 let poté, a dále souhlasím s uchováváním potřebných dat pro archivní účely i po této lhůtě (vystavené výsledkové listiny aj.). | ||||||
|  | </p> | ||||||
|  | <p class="gdpr"> | ||||||
|  | MFF UK tyto údaje zpracovává za účelem evidence řešitelů a účastníků M&M, k zajištění celoročního fungování semináře, analýze účinnosti jednotlivých propagačních akcí MFF UK a zpravodajským účelům. Osobám, které o to projeví zájem v nastavení svého účtu, bude MFF UK také zasílat propagační materiály. | ||||||
|  | </p> | ||||||
|  | <p class="gdpr"> | ||||||
|  | Údaje nebudou předány třetí osobě ani využívány k jiným účelům, než ke kterým byly poskytnuty. | ||||||
|  | </p> | ||||||
|  | <p class="gdpr"> | ||||||
|  | Tento souhlas uděluji ze své vlastní a svobodné vůle a beru na vědomí, že jej mohu kdykoliv odvolat zasláním e-mailu na adresu mam@matfyz.cz. Stejně tak může být požadováno vymazání i z archivních údajů M&M, pokud to bude technicky možné. Beru na vědomí, že údaje z tištěných publikací není možné zpětně odstranit. | ||||||
|  | </p> | ||||||
|  | <p class="gdpr"> | ||||||
|  | Dále máte právo: | ||||||
|  | <ul> | ||||||
|  | <li>požádat o informaci, jaké osobní údaje jsou o vás zpracovávány, | ||||||
|  | <li>požadovat opravu osobních údajů, pokud jsou neplatné nebo zastaralé, | ||||||
|  | <li>požadovat, aby nebyly vaše osobní údaje zpracovávány do doby, než bude vyřešena oprávněnost výše uvedených požadavků, | ||||||
|  | <li>požadovat, aby byly vaše osobní údaje předány jinému správci, | ||||||
|  | <li>podat stížnost u dozorového úřadu. | ||||||
|  | </p> | ||||||
|  | <p class="gdpr"> | ||||||
|  | V případě jakéhokoliv dotazu nebo uplatnění svých práv můžete kontaktovat pověřence pro ochranu osobních údajů na e-mailové adrese gdpr@cuni.cz. | ||||||
|  | </p> | ||||||
|  | </div> | ||||||
|  | @ -1,5 +1,30 @@ | ||||||
|  | {% extends "seminar/zadani/base.html" %} | ||||||
|  | {% load staticfiles %} | ||||||
|  | 
 | ||||||
|  | {% block content %} | ||||||
|  |   <h1> | ||||||
|  |     {% block nadpis1a %}{% block nadpis1b %} | ||||||
|  |       Přihláška do semináře | ||||||
|  |     {% endblock %}{% endblock %} | ||||||
|  |   </h1> | ||||||
| <form action="/prihlaska/" method="post"> | <form action="/prihlaska/" method="post"> | ||||||
|     {% csrf_token %} |     {% csrf_token %} | ||||||
|     {{ form }} |     {{form.non_field_errors}} | ||||||
|     <input type="submit" value="Submit"> | <ul class="form"> | ||||||
|  |   {% for field in form %} | ||||||
|  |   <li> | ||||||
|  |     {% if forloop.last %} | ||||||
|  |     {% include "seminar/gdpr.html" %} | ||||||
|  |     {% endif %} | ||||||
|  |      <label class="field-label{% if field.field.required %} field-required{% endif %}" for="{{ field.name }}">{{ field.label }}:</label> | ||||||
|  |         {{ field }} | ||||||
|  |         {% if field.help_text %}<span class="field-helptext">{{ field.help_text|safe }}</span>{% endif %} | ||||||
|  |         {% if field.errors %}<span class="field-error">{{ field.errors }}</span>{% endif %} | ||||||
|  |   </li> | ||||||
|  |   {% endfor %} | ||||||
|  | </ul> | ||||||
|  |     <input type="submit" value="Odeslat"> | ||||||
| </form> | </form> | ||||||
|  | 
 | ||||||
|  | {% endblock %} | ||||||
|  | 
 | ||||||
|  |  | ||||||
|  | @ -283,7 +283,9 @@ def gen_konfery(size, rnd, organizatori, resitele, soustredeni): | ||||||
| 	logger.info('Generuji konfery (size={})...'.format(size)) | 	logger.info('Generuji konfery (size={})...'.format(size)) | ||||||
| 
 | 
 | ||||||
| 	konfery = [] | 	konfery = [] | ||||||
| 	for _ in range(1, size): #FIXME Tu range si změňte jak chcete, nevím, co přesně znamená size (asi Anet?)  | 	for _ in range(1, size): #FIXME Tu range si změňte jak chcete, nevím, co přesně znamená size (asi Anet?) | ||||||
|  | 		# Anet: size je parametr udávající velikost testovacích dat a dá se pomocí ní škálovat,  | ||||||
|  | 		# kolik dat se nageneruje  | ||||||
| 		konfera = Konfera.objects.create( | 		konfera = Konfera.objects.create( | ||||||
| 			nazev=rnd.choice(['Pozorování', 'Zkoumání', 'Modelování', 'Počítání', 'Zkoušení']) + rnd.choice([' vlastností', ' jevů', ' charakteristik']) + rnd.choice([' vektorových prostorů', ' kinetické terorie látek', ' molekulární biologie', ' syntentických stromů']), | 			nazev=rnd.choice(['Pozorování', 'Zkoumání', 'Modelování', 'Počítání', 'Zkoušení']) + rnd.choice([' vlastností', ' jevů', ' charakteristik']) + rnd.choice([' vektorových prostorů', ' kinetické terorie látek', ' molekulární biologie', ' syntentických stromů']), | ||||||
| 			anotace=lorem.paragraph(), | 			anotace=lorem.paragraph(), | ||||||
|  |  | ||||||
|  | @ -97,7 +97,7 @@ urlpatterns = [ | ||||||
| 		staff_member_required(views.texUploadView), | 		staff_member_required(views.texUploadView), | ||||||
| 		name='seminar_tex_upload' | 		name='seminar_tex_upload' | ||||||
| 	), | 	), | ||||||
| 	path('prihlaska/',views.get_name), | 	path('prihlaska/',views.prihlaskaView), | ||||||
| 	path('', views.TitulniStranaView.as_view(), name='titulni_strana'), | 	path('', views.TitulniStranaView.as_view(), name='titulni_strana'), | ||||||
| 
 | 
 | ||||||
| 	# Ceka na autocomplete v3 | 	# Ceka na autocomplete v3 | ||||||
|  |  | ||||||
|  | @ -15,7 +15,7 @@ from .models import Problem, Cislo, Reseni, Nastaveni, Rocnik, Soustredeni, Orga | ||||||
| #from .models import VysledkyZaCislo, VysledkyKCisluZaRocnik, VysledkyKCisluOdjakziva | #from .models import VysledkyZaCislo, VysledkyKCisluZaRocnik, VysledkyKCisluOdjakziva | ||||||
| from . import utils | from . import utils | ||||||
| from .unicodecsv import UnicodeWriter | from .unicodecsv import UnicodeWriter | ||||||
| from .forms import NameForm | from .forms import PrihlaskaForm | ||||||
| 
 | 
 | ||||||
| from datetime import timedelta, date, datetime | from datetime import timedelta, date, datetime | ||||||
| from django.utils import timezone | from django.utils import timezone | ||||||
|  | @ -950,11 +950,11 @@ def texDownloadView(request, rocnik, cislo): | ||||||
| 
 | 
 | ||||||
| ## Formulare | ## Formulare | ||||||
| 
 | 
 | ||||||
| def get_name(request): | def prihlaskaView(request): | ||||||
| 	# if this is a POST request we need to process the form data | 	# if this is a POST request we need to process the form data | ||||||
| 	if request.method == 'POST': | 	if request.method == 'POST': | ||||||
| 		# create a form instance and populate it with data from the request: | 		# create a form instance and populate it with data from the request: | ||||||
| 		form = NameForm(request.POST) | 		form = PrihlaskaForm(request.POST) | ||||||
| 		# check whether it's valid: | 		# check whether it's valid: | ||||||
| 		if form.is_valid(): | 		if form.is_valid(): | ||||||
| 			# process the data in form.cleaned_data as required | 			# process the data in form.cleaned_data as required | ||||||
|  | @ -964,7 +964,7 @@ def get_name(request): | ||||||
| 
 | 
 | ||||||
| 	# if a GET (or any other method) we'll create a blank form | 	# if a GET (or any other method) we'll create a blank form | ||||||
| 	else: | 	else: | ||||||
| 		form = NameForm() | 		form = PrihlaskaForm() | ||||||
| 
 | 
 | ||||||
| 	return render(request, 'seminar/prihlaska.html', {'form': form}) | 	return render(request, 'seminar/prihlaska.html', {'form': form}) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
 Pavel "LEdoian" Turinsky
						Pavel "LEdoian" Turinsky