Výroční sraz M&M #32

Merged
zelvuska merged 12 commits from vyroci into master 2023-06-15 16:57:27 +02:00
12 changed files with 196 additions and 0 deletions
Showing only changes of commit 32141d457f - Show all commits

View file

@ -150,6 +150,7 @@ INSTALLED_APPS = (
'personalni', 'personalni',
'soustredeni', 'soustredeni',
'treenode', 'treenode',
'vyroci',
# Admin upravy: # Admin upravy:

View file

@ -68,6 +68,9 @@ urlpatterns = [
# REST API # REST API
# path('api/', include(router.urls)), # path('api/', include(router.urls)),
# Výroční sraz
path('', include('vyroci.urls')),
zelvuska marked this conversation as resolved Outdated

Nechceš tomu radši vyrobit složku? Přijde mi, že zrovna tohle nemusí úplně plevelit kořenovou cestu, když je to jednorázová akce prakticky bez jakýchkoliv dalších souvislostí. A klidně i jako org-sraz nebo dokonce sraz-30-let, ať nám kdyžtak zbyde /sraz na nějaké častější aktivity (resp. ať až se to zruší nevzniknou falešně oživené odkazy, které ale povedou někam jinam)

Nechceš tomu radši vyrobit složku? Přijde mi, že zrovna tohle nemusí úplně plevelit kořenovou cestu, když je to jednorázová akce prakticky bez jakýchkoliv dalších souvislostí. A klidně i jako `org-sraz` nebo dokonce `sraz-30-let`, ať nám kdyžtak zbyde `/sraz` na nějaké častější aktivity (resp. ať až se to zruší nevzniknou falešně oživené odkazy, které ale povedou někam jinam)
] ]
# This is only needed when using runserver. # This is only needed when using runserver.

0
vyroci/__init__.py Normal file
View file

7
vyroci/admin.py Normal file
View file

@ -0,0 +1,7 @@
from django.contrib import admin
from .models import UcastnikVyroci
# Register your models here.
admin.register(UcastnikVyroci)

5
vyroci/apps.py Normal file
View file

@ -0,0 +1,5 @@
from django.apps import AppConfig
class VyrociConfig(AppConfig):
name = 'vyroci'

14
vyroci/forms.py Normal file
View file

@ -0,0 +1,14 @@
from django.forms import ModelForm
from .models import UcastnikVyroci
class UcastnikVyrociForm(ModelForm):
class Meta:
model = UcastnikVyroci
fields = "__all__"
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for field in ["kdy", "cojemam", "cislo", "dodat"]:
ledoian marked this conversation as resolved
Review

Neumí se tohle nějak odkázat na vlastní fieldy? Čekal bych tam nějaké self.fields. (Ale asi je to dost šumák, stejně se to jednou napíše, jednou použije a pak jednou možná smaže, takže je to spíš možnost se naučit nové triky s Djangem než potřeba upravit…)

Neumí se tohle nějak odkázat na vlastní fieldy? Čekal bych tam nějaké `self.fields`. (Ale asi je to dost šumák, stejně se to jednou napíše, jednou použije a pak jednou možná smaže, takže je to spíš možnost se naučit nové triky s Djangem než potřeba upravit…)
Review

Aha, to je jen podmnožina fieldů. OK then…

Aha, to je jen podmnožina fieldů. OK then…
self.fields[field].widget.attrs['rows'] = 2
self.fields[field].widget.attrs['cols'] = 22

View file

@ -0,0 +1,27 @@
# Generated by Django 2.2.28 on 2023-06-02 18:55
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='UcastnikVyroci',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('jmeno', models.CharField(help_text='Občanská identifikace účastníka víkendovky', max_length=256, verbose_name='Jméno a přijmení')),
('prezdivka', models.CharField(help_text='Veřejná identifikace účastníka víkendovky', max_length=256, verbose_name='Přezdívka')),
zelvuska marked this conversation as resolved Outdated

Zveřejňovaná

Zveřejňovaná

Možná „Přezdívka (bude výše)“

Možná „Přezdívka (bude výše)“
('email', models.EmailField(help_text='Kontakt na účastníka víkendovky', max_length=256, verbose_name='E-mail')),
('kdy', models.TextField(max_length=256, verbose_name='Řešil nebo organizoval jsi M&M? Kdy?')),
('cojemam', models.TextField(max_length=256, verbose_name='Co znamená M&M (a proč)?')),
('cislo', models.TextField(max_length=256, verbose_name='Co v M&Mí historii značí číslo 265252859812191058636308480000000?')),
('dodat', models.TextField(blank=True, max_length=256, null=True, verbose_name='Co chci ještě dodat?')),
zelvuska marked this conversation as resolved Outdated

Tyhle fieldy vůbec nemusejí být krátké. Zvlášť dodat je potenciálně dlouhé a může mít i víc, než 256 znaků. (Pro srovnání, tenhle komentář sám o sobě má 188 znaků, resp. 214 bytů v UTF-8.)

Tyhle fieldy vůbec nemusejí být krátké. Zvlášť dodat je potenciálně dlouhé a může mít i víc, než 256 znaků. (Pro srovnání, tenhle komentář sám o sobě má 188 znaků, resp. 214 bytů v UTF-8.)

Jo, a tenhle komentář se spíš týká modelu než migrace, ale podruhé se mi ho psát nechce :-) (103 znaků)

Jo, a tenhle komentář se spíš týká modelu než migrace, ale podruhé se mi ho psát nechce :-) (103 znaků)
],
),
]

View file

40
vyroci/models.py Normal file
View file

@ -0,0 +1,40 @@
from django.db import models
# Create your models here.
class UcastnikVyroci(models.Model):
jmeno = models.CharField(
"Jméno a přijmení", max_length=256, blank=False, null=False,
zelvuska marked this conversation as resolved Outdated

„příjmení“

„příjmení“
help_text="Občanská identifikace účastníka víkendovky"
)
prezdivka = models.CharField(
"Přezdívka", max_length=256, blank=False, null=False,
help_text="Veřejná identifikace účastníka víkendovky"
)
email = models.EmailField(
"E-mail", max_length=256, blank=False, null=False,
help_text="Kontakt na účastníka víkendovky"
)
kdy = models.TextField(
"Řešil nebo organizoval jsi M&M? Kdy?", max_length=256, blank=False,
null=False,
)
cojemam = models.TextField(
"Co znamená M&M (a proč)?", max_length=256, blank=False, null=False,
)
cislo = models.TextField(
"Co v M&Mí historii značí číslo 265252859812191058636308480000000?",
max_length=256, blank=False, null=False,
)
dodat = models.TextField(
"Co chci ještě dodat?", max_length=256, blank=True, null=True,
)

View file

@ -0,0 +1,56 @@
{% extends "base.html" %}
{% block content %}
<h1>{% block nadpis1a %}M&Mí 30!*{% endblock nadpis1a %}</h1>
<h4>*plným názvem M&Mí 265252859812191058636308480000000.</h4>
<p>Rádi bychom Tě pozvali na plánovaný M&Mí sraz, kde nalezneš možnost se setkat se současnými organizátory a účastníky, minulými organizátory a účastníky, předminulými organizátory a účastníky, předpředminulými organizátory a účastníky a jinými M&Mími legendami.</p>
<p>Těšit se můžeš na zábavnou akci pro všechny věkové kategorie. Pokud máš chuť se zúčastnit, tak neváhej a vyplň přihlašovací formulář níže (pokud plánuješ přijet jen na část víkendu, nebo s sebou někoho vzít třeba děti, tak to napiš do poznámky). Podrobnější informace o akci budeme rozesílat přibližně dva týdny před akci.</p>
zelvuska marked this conversation as resolved Outdated

Nakonci „akcí“ místo „akci“.

Nakonci „akcí“ místo „akci“.
<ul>
<li> Kdy: pátek 22. neděle 24. 9. 2023 </li>
<li> Kde: <a href="https://borovice.cz/inzerat/2587-zakladna-pratel-prirody-upirci-2">Klubovna Upírků v Libčicích n.V.</a></li>
<li> Kdo jede: Káťa, (R)adim{% for ucastnik in ucastnici %}, {{ ucastnik.prezdivka }}{% endfor %}</li>
zelvuska marked this conversation as resolved Outdated

Nevím, jaká je dohoda, ale možná je spíš žádoucí, aby byli všichni účastníci v databázi, protože jinak se na Káťu a (R)adima bude snadno zapomínat a nebude to vidět.

Klidně bych je rovnou přidal v rámci migrace (a do kontextu pak klidně narval seznam_ucastniku = ', '.join(u.prezdivka for u in ucastnici)

Nevím, jaká je dohoda, ale možná je spíš žádoucí, aby byli všichni účastníci v databázi, protože jinak se na Káťu a (R)adima bude snadno zapomínat a nebude to vidět. Klidně bych je rovnou přidal v rámci migrace (a do kontextu pak klidně narval `seznam_ucastniku = ', '.join(u.prezdivka for u in ucastnici)`

Přijde mi, že jednodušší bude je tam naházet ručně po nasazení…

Přijde mi, že jednodušší bude je tam naházet ručně po nasazení…

Klidně, když se na to nezapomene (nebo když těm dvěma někdo řekne, že se mají prostě normálně zaregistrovat), spíš mi jde o to, aby tady nebyli nahardcodění, protože „určitě pojedou“.

Klidně, když se na to nezapomene (nebo když těm dvěma někdo řekne, že se mají prostě normálně zaregistrovat), spíš mi jde o to, aby tady nebyli nahardcodění, protože „určitě pojedou“.
</ul>
<h2>Přihlašovací formulář</h2>
<p><b>Tučně</b> popsaná pole jsou povinná.</p>
<form action="{% url 'vyrocni_sraz' %}" method="post">
<table class="form">
{% 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 %}
{{form.non_field_errors}}
zelvuska marked this conversation as resolved
Review

Non-field errors bych čekal spíš nahoře než dole…

Non-field errors bych čekal spíš nahoře než dole…
<input type="submit" value="Přihlásit se!">
</form>
{% endblock content %}
zelvuska marked this conversation as resolved
Review

Template prohlížím jen zběžně, pokud to dobře vypadá (i ve Chrome a Edgi :-P), tak je mi asi jedno, jak to vypadá…

Template prohlížím jen zběžně, pokud to dobře vypadá (i ve Chrome a Edgi :-P), tak je mi asi jedno, jak to vypadá…

11
vyroci/urls.py Normal file
View file

@ -0,0 +1,11 @@
from django.urls import path
from .views import VyrociView
urlpatterns = [
path(
'sraz/',
VyrociView.as_view(),
name='vyrocni_sraz'
),
]

32
vyroci/views.py Normal file
View file

@ -0,0 +1,32 @@
from django.views.generic import FormView
from seminar.models import Osoba
from seminar.views import formularOKView
from .forms import UcastnikVyrociForm
from .models import UcastnikVyroci
# Create your views here.
class VyrociView(FormView):
""" Zobrazí organizátorský rozcestník."""
template_name = 'vyroci/vyroci.html'
form_class = UcastnikVyrociForm
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['ucastnici'] = UcastnikVyroci.objects.all()
return context
def form_valid(self, form):
form.save()
zelvuska marked this conversation as resolved Outdated

„ses přihlásil na sraz“

„ses přihlásil na sraz“
return formularOKView(self.request, "Úspěšně jsi se přihlásil na víkendovku")
def get_initial(self):
initial = super().get_initial()
if self.request.user.is_authenticated:
osoba = Osoba.objects.filter(user=self.request.user).first()
if osoba is not None:
initial["jmeno"] = osoba.plne_jmeno()
initial["email"] = osoba.email
return initial