Merge pull request 'sifrovacka' (!40) from sifrovacka into master
Reviewed-on: #40
This commit is contained in:
		
						commit
						10c6f4be16
					
				
					 14 changed files with 237 additions and 0 deletions
				
			
		|  | @ -154,6 +154,7 @@ INSTALLED_APPS = ( | |||
| 	'soustredeni', | ||||
| 	'treenode', | ||||
| 	'vyroci', | ||||
| 	'sifrovacka', | ||||
| 
 | ||||
| 	# Admin upravy: | ||||
| 
 | ||||
|  |  | |||
|  | @ -71,6 +71,8 @@ urlpatterns = [ | |||
| 	# Výroční sraz | ||||
| 	path('sraz/30-let/', include('vyroci.urls')), | ||||
| 
 | ||||
| 	# Miniapka na šifrovačku | ||||
| 	path('sifrovacka/', include('sifrovacka.urls')), | ||||
| ] | ||||
| 
 | ||||
| # This is only needed when using runserver. | ||||
|  |  | |||
							
								
								
									
										0
									
								
								sifrovacka/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								sifrovacka/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										8
									
								
								sifrovacka/admin.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								sifrovacka/admin.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,8 @@ | |||
| from django.contrib import admin | ||||
| 
 | ||||
| from .models import OdpovedUcastnika, SpravnaOdpoved | ||||
| 
 | ||||
| # Register your models here. | ||||
| 
 | ||||
| admin.site.register(OdpovedUcastnika) | ||||
| admin.site.register(SpravnaOdpoved) | ||||
							
								
								
									
										5
									
								
								sifrovacka/apps.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								sifrovacka/apps.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,5 @@ | |||
| from django.apps import AppConfig | ||||
| 
 | ||||
| 
 | ||||
| class SifrovackaConfig(AppConfig): | ||||
|     name = 'sifrovacka' | ||||
							
								
								
									
										18
									
								
								sifrovacka/forms.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								sifrovacka/forms.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,18 @@ | |||
| from django.core.exceptions import ValidationError | ||||
| from django.forms import ModelForm, Textarea | ||||
| from .models import OdpovedUcastnika, SpravnaOdpoved | ||||
| 
 | ||||
| 
 | ||||
| class SifrovackaForm(ModelForm): | ||||
| 	class Meta: | ||||
| 		model = OdpovedUcastnika | ||||
| 		fields = ["sifra", "odpoved", ] | ||||
| 		widgets = { | ||||
| 			"odpoved": Textarea(attrs={'rows': 1, 'cols': 30}), | ||||
| 		} | ||||
| 
 | ||||
| 	def clean_sifra(self): | ||||
| 		sifra = self.cleaned_data.get('sifra') | ||||
| 		if SpravnaOdpoved.objects.filter(sifra=sifra).count() == 0: | ||||
| 			raise ValidationError("Tohle číslo šifry v databázi nemáme. Zkontrolujte si ho prosím.") | ||||
| 		return sifra | ||||
							
								
								
									
										34
									
								
								sifrovacka/migrations/0001_initial.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								sifrovacka/migrations/0001_initial.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,34 @@ | |||
| # Generated by Django 3.2.22 on 2023-10-14 09:20 | ||||
| 
 | ||||
| from django.db import migrations, models | ||||
| import django.db.models.deletion | ||||
| 
 | ||||
| 
 | ||||
| class Migration(migrations.Migration): | ||||
| 
 | ||||
|     initial = True | ||||
| 
 | ||||
|     dependencies = [ | ||||
|         ('seminar', '0113_resitel_zasilat_cislo_papirove'), | ||||
|     ] | ||||
| 
 | ||||
|     operations = [ | ||||
|         migrations.CreateModel( | ||||
|             name='SpravnaOdpoved', | ||||
|             fields=[ | ||||
|                 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | ||||
|                 ('odpoved', models.TextField()), | ||||
|                 ('sifra', models.IntegerField()), | ||||
|                 ('skryty_text', models.TextField()), | ||||
|             ], | ||||
|         ), | ||||
|         migrations.CreateModel( | ||||
|             name='OdpovedUcastnika', | ||||
|             fields=[ | ||||
|                 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | ||||
|                 ('odpoved', models.TextField(verbose_name='Tajenka')), | ||||
|                 ('sifra', models.IntegerField(verbose_name='Číslo šifry')), | ||||
|                 ('resitel', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='seminar.resitel')), | ||||
|             ], | ||||
|         ), | ||||
|     ] | ||||
							
								
								
									
										28
									
								
								sifrovacka/migrations/0002_auto_20231015_1944.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								sifrovacka/migrations/0002_auto_20231015_1944.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,28 @@ | |||
| # Generated by Django 3.2.22 on 2023-10-15 17:44 | ||||
| 
 | ||||
| from django.db import migrations, models | ||||
| import django.utils.timezone | ||||
| 
 | ||||
| 
 | ||||
| class Migration(migrations.Migration): | ||||
| 
 | ||||
|     dependencies = [ | ||||
|         ('sifrovacka', '0001_initial'), | ||||
|     ] | ||||
| 
 | ||||
|     operations = [ | ||||
|         migrations.AlterModelOptions( | ||||
|             name='odpoveducastnika', | ||||
|             options={'ordering': ['-timestamp']}, | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name='odpoveducastnika', | ||||
|             name='timestamp', | ||||
|             field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='Timestamp'), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name='odpoveducastnika', | ||||
|             name='odpoved', | ||||
|             field=models.TextField(verbose_name='Tajenka bez diakritiky'), | ||||
|         ), | ||||
|     ] | ||||
							
								
								
									
										0
									
								
								sifrovacka/migrations/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								sifrovacka/migrations/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										23
									
								
								sifrovacka/models.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								sifrovacka/models.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,23 @@ | |||
| from django.db import models | ||||
| from django.utils import timezone | ||||
| 
 | ||||
| from seminar.models.personalni import Resitel | ||||
| 
 | ||||
| 
 | ||||
| # Create your models here. | ||||
| 
 | ||||
| 
 | ||||
| class OdpovedUcastnika(models.Model): | ||||
| 	class Meta: | ||||
| 		ordering = ["-timestamp"] | ||||
| 
 | ||||
| 	resitel = models.ForeignKey(Resitel, blank=False, null=False, on_delete=models.CASCADE) | ||||
| 	odpoved = models.TextField("Tajenka bez diakritiky", blank=False, null=False,) | ||||
| 	sifra = models.IntegerField("Číslo šifry", blank=False, null=False,) | ||||
| 	timestamp = models.DateTimeField("Timestamp", blank=False, null=False, default=timezone.now) | ||||
| 
 | ||||
| 
 | ||||
| class SpravnaOdpoved(models.Model): | ||||
| 	odpoved = models.TextField(blank=False, null=False,) | ||||
| 	sifra = models.IntegerField(blank=False, null=False,) | ||||
| 	skryty_text = models.TextField(blank=False, null=False,) | ||||
							
								
								
									
										25
									
								
								sifrovacka/templates/sifrovacka/odpovedi_list.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								sifrovacka/templates/sifrovacka/odpovedi_list.html
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | |||
| {% extends "base.html" %} | ||||
| 
 | ||||
| {% block content %} | ||||
| 
 | ||||
|   <h1>{% block nadpis1a %}Šifrovačka odpovědi{% endblock nadpis1a %}</h1> | ||||
| 
 | ||||
|   <table class="dosla_reseni"> | ||||
|     <tr> | ||||
|       <th>Timestamp</th> | ||||
|       <th>Řešitel</th> | ||||
|       <th>Šifra</th> | ||||
|       <th>Odpověď</th> | ||||
|     </tr> | ||||
| 
 | ||||
|     {% for u in object_list %} | ||||
|       <tr> | ||||
|         <td>{{ u.timestamp }}</td> | ||||
|         <td>{{ u.resitel }}</td> | ||||
|         <td>{{ u.sifra }}</td> | ||||
|         <td>{{ u.odpoved }}</td> | ||||
|       </tr> | ||||
|     {% endfor %} | ||||
|   </table> | ||||
| 
 | ||||
| {% endblock content %} | ||||
							
								
								
									
										46
									
								
								sifrovacka/templates/sifrovacka/sifrovacka.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								sifrovacka/templates/sifrovacka/sifrovacka.html
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,46 @@ | |||
| {% extends "base.html" %} | ||||
| 
 | ||||
| {% block content %} | ||||
| 
 | ||||
|   <br> | ||||
| 
 | ||||
|   <h1>{% block nadpis1a %}M&Mí šifrovačka{% endblock nadpis1a %}</h1> | ||||
| 
 | ||||
|   <br> | ||||
| 
 | ||||
|   <h2>Zadat tajenku šifry:</h2> | ||||
| 
 | ||||
|   <form action="{% url 'sifrovacka' %}" method="post"> | ||||
|     <table class="form"> | ||||
|       {{form.non_field_errors}} | ||||
|       {% for field in form %} | ||||
|         <tr> | ||||
|           <td> | ||||
|             <label class="field-label{% if field.field.required %} field-required{% endif %}" for="{{ field.id_for_label }}"> | ||||
|               {{ field.label }} | ||||
|             </label> | ||||
| 
 | ||||
|           </td> | ||||
| 
 | ||||
|           <td {% if field.help_text %} class="field-with-comment"{% endif %}> | ||||
|             {{ field }} | ||||
|             <span class="field-comment">{{ field.help_text|safe }}</span> | ||||
|           </td> | ||||
| 
 | ||||
|         </tr> | ||||
| 
 | ||||
| 
 | ||||
|         {% if field.errors %} | ||||
|           <tr> | ||||
|             <td colspan="2"><span class="field-error">{{ field.errors }}</span></td> | ||||
|           </tr> | ||||
|         {% endif %} | ||||
|       {% endfor %} | ||||
|     </table> | ||||
| 
 | ||||
|     {% csrf_token %} | ||||
| 
 | ||||
|     <input type="submit" value="Tak pravím!"> | ||||
|   </form> | ||||
| 
 | ||||
| {% endblock content %} | ||||
							
								
								
									
										17
									
								
								sifrovacka/urls.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								sifrovacka/urls.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,17 @@ | |||
| from django.urls import path | ||||
| 
 | ||||
| from seminar.utils import org_required, resitel_or_org_required | ||||
| from .views import SifrovackaView, SifrovackaListView | ||||
| 
 | ||||
| urlpatterns = [ | ||||
| 	path( | ||||
| 		'', | ||||
| 		resitel_or_org_required(SifrovackaView.as_view()), | ||||
| 		name='sifrovacka' | ||||
| 	), | ||||
| 	path( | ||||
| 		'odpovedi/', | ||||
| 		org_required(SifrovackaListView.as_view()), | ||||
| 		name='sifrovacka_odpovedi' | ||||
| 	), | ||||
| ] | ||||
							
								
								
									
										30
									
								
								sifrovacka/views.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								sifrovacka/views.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,30 @@ | |||
| from django.urls import reverse | ||||
| from django.views.generic import FormView, ListView | ||||
| 
 | ||||
| from seminar.views import formularOKView | ||||
| from .forms import SifrovackaForm | ||||
| from .models import OdpovedUcastnika, SpravnaOdpoved | ||||
| from seminar.models.personalni import Resitel | ||||
| 
 | ||||
| 
 | ||||
| # Create your views here. | ||||
| 
 | ||||
| class SifrovackaView(FormView): | ||||
| 	template_name = 'sifrovacka/sifrovacka.html' | ||||
| 	form_class = SifrovackaForm | ||||
| 
 | ||||
| 	def form_valid(self, form): | ||||
| 		instance = form.save(commit=False) | ||||
| 		resitel = Resitel.objects.get(osoba__user=self.request.user) | ||||
| 		instance.resitel = resitel | ||||
| 		instance.save() | ||||
| 		sifra = SpravnaOdpoved.objects.filter(sifra=instance.sifra, odpoved__iexact=instance.odpoved.strip()).first() | ||||
| 		if sifra is None: | ||||
| 			return formularOKView(self.request, f'<h1>Bohužel vám hvězdy nebyly nakloněny. Rozumějte <i>máte to blbě</i>.</h1> <p><a href="{reverse("sifrovacka")}">Zkusit znovu.</a></p><br><br><br>') | ||||
| 
 | ||||
| 		return formularOKView(self.request, f'<h1>{sifra.skryty_text}</h1> <p><a href="{reverse("sifrovacka")}">Odevzdat další.</a></p><br><br><br>') | ||||
| 
 | ||||
| 
 | ||||
| class SifrovackaListView(ListView): | ||||
| 	template_name = 'sifrovacka/odpovedi_list.html' | ||||
| 	model = OdpovedUcastnika | ||||
		Loading…
	
		Reference in a new issue