Výroční sraz M&M #32
13 changed files with 243 additions and 0 deletions
|
@ -150,6 +150,7 @@ INSTALLED_APPS = (
|
|||
'personalni',
|
||||
'soustredeni',
|
||||
'treenode',
|
||||
'vyroci',
|
||||
|
||||
# Admin upravy:
|
||||
|
||||
|
|
|
@ -68,6 +68,9 @@ urlpatterns = [
|
|||
# REST API
|
||||
# path('api/', include(router.urls)),
|
||||
|
||||
# Výroční sraz
|
||||
path('sraz/30-let/', include('vyroci.urls')),
|
||||
|
||||
]
|
||||
|
||||
# This is only needed when using runserver.
|
||||
|
|
0
vyroci/__init__.py
Normal file
0
vyroci/__init__.py
Normal file
7
vyroci/admin.py
Normal file
7
vyroci/admin.py
Normal file
|
@ -0,0 +1,7 @@
|
|||
from django.contrib import admin
|
||||
|
||||
from .models import UcastnikVyroci
|
||||
|
||||
# Register your models here.
|
||||
|
||||
admin.site.register(UcastnikVyroci)
|
5
vyroci/apps.py
Normal file
5
vyroci/apps.py
Normal file
|
@ -0,0 +1,5 @@
|
|||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class VyrociConfig(AppConfig):
|
||||
name = 'vyroci'
|
14
vyroci/forms.py
Normal file
14
vyroci/forms.py
Normal 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
|
||||
self.fields[field].widget.attrs['rows'] = 2
|
||||
self.fields[field].widget.attrs['cols'] = 22
|
27
vyroci/migrations/0001_initial.py
Normal file
27
vyroci/migrations/0001_initial.py
Normal 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říjmení')),
|
||||
('prezdivka', models.CharField(help_text='Zveřejňovaná identifikace účastníka víkendovky', max_length=256, verbose_name='Přezdívka (do seznamu účastníků, například Bětka N.)')),
|
||||
('email', models.EmailField(help_text='Kontakt na účastníka víkendovky', max_length=256, verbose_name='E-mail')),
|
||||
('kdy', models.TextField(verbose_name='Řešil nebo organizoval jsi M&M? Kdy?')),
|
||||
('cojemam', models.TextField(verbose_name='Co znamená M&M (a proč)?')),
|
||||
('cislo', models.TextField(verbose_name='Co v M&Mí historii značí číslo 265252859812191058636308480000000?')),
|
||||
('dodat', models.TextField(blank=True, null=True, verbose_name='Co chci ještě dodat?')),
|
||||
],
|
||||
),
|
||||
]
|
0
vyroci/migrations/__init__.py
Normal file
0
vyroci/migrations/__init__.py
Normal file
40
vyroci/models.py
Normal file
40
vyroci/models.py
Normal 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říjmení", max_length=256, blank=False, null=False,
|
||||
help_text="Občanská identifikace účastníka víkendovky"
|
||||
)
|
||||
|
||||
prezdivka = models.CharField(
|
||||
"Přezdívka (do seznamu účastníků, například Bětka N.)", max_length=256, blank=False, null=False,
|
||||
help_text="Zveřejňovaná 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?", blank=False,
|
||||
null=False,
|
||||
)
|
||||
|
||||
cojemam = models.TextField(
|
||||
"Co znamená M&M (a proč)?", blank=False, null=False,
|
||||
)
|
||||
|
||||
cislo = models.TextField(
|
||||
"Co v M&Mí historii značí číslo 265252859812191058636308480000000?",
|
||||
blank=False, null=False,
|
||||
)
|
||||
|
||||
dodat = models.TextField(
|
||||
"Co chci ještě dodat?", blank=True, null=True,
|
||||
)
|
||||
|
62
vyroci/templates/vyroci/vyroci.html
Normal file
62
vyroci/templates/vyroci/vyroci.html
Normal file
|
@ -0,0 +1,62 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<br>
|
||||
|
||||
<h1>{% block nadpis1a %}M&Mí 30!*{% endblock nadpis1a %}</h1>
|
||||
|
||||
<br>
|
||||
|
||||
<h4>*plným názvem M&Mí 265252859812191058636308480000000.</h4>
|
||||
|
||||
<br>
|
||||
|
||||
<p>Rádi bychom Tě pozvali na plánovaný M&Mí sraz, kde nalezneš možnost se setkat se současnými organizátory, 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 akcí.</p>
|
||||
|
||||
<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: {% for ucastnik in ucastnici %}{% if not forloop.first %}, {% endif %}{{ ucastnik.prezdivka }}{% endfor %}</li>
|
||||
</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">
|
||||
{{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>
|
||||
zelvuska marked this conversation as resolved
ledoian
commented
Non-field errors bych čekal spíš nahoře než dole… Non-field errors bych čekal spíš nahoře než dole…
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</table>
|
||||
|
||||
zelvuska marked this conversation as resolved
ledoian
commented
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á…
|
||||
{% csrf_token %}
|
||||
|
||||
<input type="submit" value="Přihlásit se!">
|
||||
</form>
|
||||
|
||||
{% endblock content %}
|
31
vyroci/templates/vyroci/vyroci_list.html
Normal file
31
vyroci/templates/vyroci/vyroci_list.html
Normal file
|
@ -0,0 +1,31 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<h1>{% block nadpis1a %}M&Mí 30! odpovědi{% endblock nadpis1a %}</h1>
|
||||
|
||||
<table class="dosla_reseni">
|
||||
<tr>
|
||||
<th>Jméno</th>
|
||||
<th>Přezdívka</th>
|
||||
<th>E-mail</th>
|
||||
<th>Kdy účastník/org</th>
|
||||
<th>Co znamená M&M?</th>
|
||||
<th>Co znamená číslo?</th>
|
||||
<th>Něco dodat?</th>
|
||||
</tr>
|
||||
|
||||
{% for u in object_list %}
|
||||
<tr>
|
||||
<td>{{ u.jmeno }}</td>
|
||||
<td>{{ u.prezdivka }}</td>
|
||||
<td>{{ u.email }}</td>
|
||||
<td style="word-break: break-all">{{ u.kdy }}</td>
|
||||
<td style="word-break: break-all">{{ u.cojemam }}</td>
|
||||
<td style="word-break: break-all">{{ u.cislo }}</td>
|
||||
<td style="word-break: break-all">{{ u.dodat }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
|
||||
{% endblock content %}
|
17
vyroci/urls.py
Normal file
17
vyroci/urls.py
Normal file
|
@ -0,0 +1,17 @@
|
|||
from django.urls import path
|
||||
|
||||
from seminar.utils import org_required
|
||||
from .views import VyrociView, VyrociListView
|
||||
|
||||
urlpatterns = [
|
||||
path(
|
||||
'',
|
||||
VyrociView.as_view(),
|
||||
name='vyrocni_sraz'
|
||||
),
|
||||
path(
|
||||
'ucastnici/',
|
||||
org_required(VyrociListView.as_view()),
|
||||
name='vyrocni_sraz_ucastnici'
|
||||
),
|
||||
]
|
36
vyroci/views.py
Normal file
36
vyroci/views.py
Normal file
|
@ -0,0 +1,36 @@
|
|||
from django.views.generic import FormView, ListView
|
||||
|
||||
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):
|
||||
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()
|
||||
|
||||
return formularOKView(self.request, "Úspěšně ses přihlásil na sraz")
|
||||
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
|
||||
|
||||
|
||||
class VyrociListView(ListView):
|
||||
template_name = 'vyroci/vyroci_list.html'
|
||||
model = UcastnikVyroci
|
Loading…
Reference in a new issue
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…)Aha, to je jen podmnožina fieldů. OK then…