From 026efe2467646fc8aa95eba5c7f67da103ee310a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Sun, 14 Apr 2024 15:09:03 +0200 Subject: [PATCH] =?UTF-8?q?N=C3=A1pov=C4=9Bdy=20v=20=C5=A1ifrova=C4=8Dce?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sifrovacka/admin.py | 4 +- sifrovacka/forms.py | 14 +++- .../0004_napoveda_napovezenoucastnikovi.py | 65 +++++++++++++++++++ sifrovacka/models.py | 17 +++++ sifrovacka/templates/sifrovacka/napoveda.html | 48 ++++++++++++++ .../templates/sifrovacka/napovedy_list.html | 23 +++++++ .../templates/sifrovacka/sifrovacka.html | 2 + sifrovacka/urls.py | 12 +++- sifrovacka/views.py | 27 +++++++- 9 files changed, 206 insertions(+), 6 deletions(-) create mode 100644 sifrovacka/migrations/0004_napoveda_napovezenoucastnikovi.py create mode 100644 sifrovacka/templates/sifrovacka/napoveda.html create mode 100644 sifrovacka/templates/sifrovacka/napovedy_list.html diff --git a/sifrovacka/admin.py b/sifrovacka/admin.py index 71d191d4..5099c241 100644 --- a/sifrovacka/admin.py +++ b/sifrovacka/admin.py @@ -1,8 +1,10 @@ from django.contrib import admin -from .models import OdpovedUcastnika, SpravnaOdpoved +from .models import OdpovedUcastnika, SpravnaOdpoved, NapovezenoUcastnikovi, Napoveda # Register your models here. admin.site.register(OdpovedUcastnika) admin.site.register(SpravnaOdpoved) +admin.site.register(Napoveda) +admin.site.register(NapovezenoUcastnikovi) diff --git a/sifrovacka/forms.py b/sifrovacka/forms.py index e3eba7c7..8a1e16d1 100644 --- a/sifrovacka/forms.py +++ b/sifrovacka/forms.py @@ -1,6 +1,6 @@ from django.core.exceptions import ValidationError from django.forms import ModelForm, Textarea -from .models import OdpovedUcastnika, SpravnaOdpoved +from .models import OdpovedUcastnika, SpravnaOdpoved, NapovezenoUcastnikovi, Napoveda class SifrovackaForm(ModelForm): @@ -16,3 +16,15 @@ class SifrovackaForm(ModelForm): 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 + + +class NapovedaForm(ModelForm): + class Meta: + model = NapovezenoUcastnikovi + fields = ["sifra",] + + def clean_sifra(self): + sifra = self.cleaned_data.get('sifra') + if Napoveda.objects.filter(sifra=sifra).count() == 0: + raise ValidationError("K tomuto číslu šifry nemáme nápovědu. Zkonstolujte si ho prosím.") + return sifra diff --git a/sifrovacka/migrations/0004_napoveda_napovezenoucastnikovi.py b/sifrovacka/migrations/0004_napoveda_napovezenoucastnikovi.py new file mode 100644 index 00000000..cba7ae8f --- /dev/null +++ b/sifrovacka/migrations/0004_napoveda_napovezenoucastnikovi.py @@ -0,0 +1,65 @@ +# Generated by Django 4.2.8 on 2024-04-14 12:57 + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + dependencies = [ + ( + "seminar", + "0114_related_name_se_zmenilo_a_django_chce_migraci_tak_dostane_migraci", + ), + ("sifrovacka", "0003_odpoveducastnika_uspech"), + ] + + operations = [ + migrations.CreateModel( + name="Napoveda", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("text", models.TextField()), + ("sifra", models.IntegerField()), + ], + ), + migrations.CreateModel( + name="NapovezenoUcastnikovi", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("sifra", models.IntegerField(verbose_name="Číslo šifry")), + ( + "timestamp", + models.DateTimeField( + default=django.utils.timezone.now, verbose_name="Timestamp" + ), + ), + ( + "resitel", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="seminar.resitel", + ), + ), + ], + options={ + "ordering": ["-timestamp"], + }, + ), + ] diff --git a/sifrovacka/models.py b/sifrovacka/models.py index 6517c2e0..beabd0a7 100644 --- a/sifrovacka/models.py +++ b/sifrovacka/models.py @@ -25,3 +25,20 @@ class SpravnaOdpoved(models.Model): def __str__(self): return f"{self.sifra}: {self.odpoved}" + + +class NapovezenoUcastnikovi(models.Model): + class Meta: + ordering = ["-timestamp"] + + resitel = models.ForeignKey(Resitel, blank=False, null=False, on_delete=models.CASCADE) + sifra = models.IntegerField("Číslo šifry", blank=False, null=False,) + timestamp = models.DateTimeField("Timestamp", blank=False, null=False, default=timezone.now) + + +class Napoveda(models.Model): + text = models.TextField(blank=False, null=False,) + sifra = models.IntegerField(blank=False, null=False,) + + def __str__(self): + return f"{self.sifra}: {self.text}" diff --git a/sifrovacka/templates/sifrovacka/napoveda.html b/sifrovacka/templates/sifrovacka/napoveda.html new file mode 100644 index 00000000..88944216 --- /dev/null +++ b/sifrovacka/templates/sifrovacka/napoveda.html @@ -0,0 +1,48 @@ +{% extends "base.html" %} + +{% block content %} + +
+ +

{% block nadpis1a %}M&Mí šifrovačka{% endblock nadpis1a %}

+ +
+ +

Získat nápovědu k šifře:

+ +
+ + {{form.non_field_errors}} + {% for field in form %} + + + + + + + + + {% if field.errors %} + + + + {% endif %} + {% endfor %} +
+ + + + {{ field }} + {{ field.help_text|safe }} +
{{ field.errors }}
+ + {% csrf_token %} + + +
+ + Nechceme nápovědu, známe řešení! + +{% endblock content %} diff --git a/sifrovacka/templates/sifrovacka/napovedy_list.html b/sifrovacka/templates/sifrovacka/napovedy_list.html new file mode 100644 index 00000000..dc729947 --- /dev/null +++ b/sifrovacka/templates/sifrovacka/napovedy_list.html @@ -0,0 +1,23 @@ +{% extends "base.html" %} + +{% block content %} + +

{% block nadpis1a %}Šifrovačka vzaté nápovědy{% endblock nadpis1a %}

+ + + + + + + + + {% for u in object_list %} + + + + + + {% endfor %} +
TimestampŘešitelŠifra
{{ u.timestamp }}{{ u.resitel }}{{ u.sifra }}
+ +{% endblock content %} diff --git a/sifrovacka/templates/sifrovacka/sifrovacka.html b/sifrovacka/templates/sifrovacka/sifrovacka.html index 4e0cc15a..74943406 100644 --- a/sifrovacka/templates/sifrovacka/sifrovacka.html +++ b/sifrovacka/templates/sifrovacka/sifrovacka.html @@ -43,4 +43,6 @@ + Získat nápovědu + {% endblock content %} diff --git a/sifrovacka/urls.py b/sifrovacka/urls.py index a7af5e54..916d73ec 100644 --- a/sifrovacka/urls.py +++ b/sifrovacka/urls.py @@ -1,7 +1,7 @@ from django.urls import path from seminar.utils import org_required, resitel_or_org_required -from .views import SifrovackaView, SifrovackaListView +from .views import SifrovackaView, SifrovackaListView, NapovedaView, NapovedaListView urlpatterns = [ path( @@ -14,4 +14,14 @@ urlpatterns = [ org_required(SifrovackaListView.as_view()), name='sifrovacka_odpovedi' ), + path( + 'napoveda/', + resitel_or_org_required(NapovedaView.as_view()), + name='sifrovacka_napoveda' + ), + path( + 'napovedy/', + org_required(NapovedaListView.as_view()), + name='sifrovacka_napovedy' + ), ] diff --git a/sifrovacka/views.py b/sifrovacka/views.py index 9c4af3ed..5537344b 100644 --- a/sifrovacka/views.py +++ b/sifrovacka/views.py @@ -2,8 +2,8 @@ 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 .forms import SifrovackaForm, NapovedaForm +from .models import OdpovedUcastnika, SpravnaOdpoved, Napoveda, NapovezenoUcastnikovi from seminar.models.personalni import Resitel @@ -24,10 +24,31 @@ class SifrovackaView(FormView): instance.uspech = True instance.save() - + return formularOKView(self.request, f'

{sifra.skryty_text}

Odevzdat další.




') class SifrovackaListView(ListView): template_name = 'sifrovacka/odpovedi_list.html' model = OdpovedUcastnika + + +class NapovedaView(FormView): + template_name = 'sifrovacka/napoveda.html' + form_class = NapovedaForm + + def form_valid(self, form): + instance = form.save(commit=False) + resitel = Resitel.objects.get(osoba__user=self.request.user) + instance.resitel = resitel + + if NapovezenoUcastnikovi.objects.filter(resitel=resitel, sifra=instance.sifra).first() is None: + instance.save() + + napoveda = Napoveda.objects.filter(sifra=instance.sifra).first() + return formularOKView(self.request, f'

Nápověda k šifře číslo {instance.sifra} je:

{napoveda.text}

Odevzdat řešení.




') + + +class NapovedaListView(ListView): + template_name = 'sifrovacka/napovedy_list.html' + model = NapovezenoUcastnikovi