Návrh na webappku na šifrovačku (na Sklené)
This commit is contained in:
parent
aff9a39262
commit
1aa389414d
13 changed files with 199 additions and 0 deletions
|
@ -154,6 +154,7 @@ INSTALLED_APPS = (
|
||||||
'soustredeni',
|
'soustredeni',
|
||||||
'treenode',
|
'treenode',
|
||||||
'vyroci',
|
'vyroci',
|
||||||
|
'sifrovacka',
|
||||||
|
|
||||||
# Admin upravy:
|
# Admin upravy:
|
||||||
|
|
||||||
|
|
|
@ -71,6 +71,8 @@ urlpatterns = [
|
||||||
# Výroční sraz
|
# Výroční sraz
|
||||||
path('sraz/30-let/', include('vyroci.urls')),
|
path('sraz/30-let/', include('vyroci.urls')),
|
||||||
|
|
||||||
|
# Miniapka na šifrovačku
|
||||||
|
path('sifrovacka/', include('sifrovacka.urls')),
|
||||||
]
|
]
|
||||||
|
|
||||||
# This is only needed when using runserver.
|
# 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'
|
15
sifrovacka/forms.py
Normal file
15
sifrovacka/forms.py
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
from django.core.exceptions import ValidationError
|
||||||
|
from django.forms import ModelForm
|
||||||
|
from .models import OdpovedUcastnika, SpravnaOdpoved
|
||||||
|
|
||||||
|
|
||||||
|
class SifrovackaForm(ModelForm):
|
||||||
|
class Meta:
|
||||||
|
model = OdpovedUcastnika
|
||||||
|
fields = ["sifra", "odpoved", ]
|
||||||
|
|
||||||
|
def clean_sifra(self):
|
||||||
|
sifra = self.cleaned_data.get('sifra')
|
||||||
|
if SpravnaOdpoved.objects.filter(sifra=sifra).count() == 0:
|
||||||
|
raise ValidationError("Špatné číslo šifry")
|
||||||
|
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')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
0
sifrovacka/migrations/__init__.py
Normal file
0
sifrovacka/migrations/__init__.py
Normal file
18
sifrovacka/models.py
Normal file
18
sifrovacka/models.py
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
from django.db import models
|
||||||
|
|
||||||
|
from seminar.models.personalni import Resitel
|
||||||
|
|
||||||
|
|
||||||
|
# Create your models here.
|
||||||
|
|
||||||
|
|
||||||
|
class OdpovedUcastnika(models.Model):
|
||||||
|
resitel = models.ForeignKey(Resitel, blank=False, null=False, on_delete=models.CASCADE)
|
||||||
|
odpoved = models.TextField("Tajenka", blank=False, null=False,)
|
||||||
|
sifra = models.IntegerField("Číslo šifry", blank=False, null=False,)
|
||||||
|
|
||||||
|
|
||||||
|
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,)
|
23
sifrovacka/templates/sifrovacka/odpovedi_list.html
Normal file
23
sifrovacka/templates/sifrovacka/odpovedi_list.html
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
{% extends "base.html" %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
|
||||||
|
<h1>{% block nadpis1a %}Šifrovačka odpovědi{% endblock nadpis1a %}</h1>
|
||||||
|
|
||||||
|
<table class="dosla_reseni">
|
||||||
|
<tr>
|
||||||
|
<th>Řešitel</th>
|
||||||
|
<th>Šifra</th>
|
||||||
|
<th>Odpověď</th>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
{% for u in object_list %}
|
||||||
|
<tr>
|
||||||
|
<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_required
|
||||||
|
from .views import SifrovackaView, SifrovackaListView
|
||||||
|
|
||||||
|
urlpatterns = [
|
||||||
|
path(
|
||||||
|
'',
|
||||||
|
resitel_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'<p>Bohužel vám hvězdy nebyly nakloněny.</p> <p><a href="{reverse("sifrovacka")}">Zkusit znovu.</a></p><br><br><br>')
|
||||||
|
|
||||||
|
return formularOKView(self.request, f'<p>{sifra.skryty_text}</p> <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