Upgrade odevzdavatka #30
					 13 changed files with 243 additions and 0 deletions
				
			
		| 
						 | 
					@ -150,6 +150,7 @@ INSTALLED_APPS = (
 | 
				
			||||||
	'personalni',
 | 
						'personalni',
 | 
				
			||||||
	'soustredeni',
 | 
						'soustredeni',
 | 
				
			||||||
	'treenode',
 | 
						'treenode',
 | 
				
			||||||
 | 
						'vyroci',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# Admin upravy:
 | 
						# Admin upravy:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -68,6 +68,9 @@ urlpatterns = [
 | 
				
			||||||
	# REST API
 | 
						# REST API
 | 
				
			||||||
#	path('api/', include(router.urls)),
 | 
					#	path('api/', include(router.urls)),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Výroční sraz
 | 
				
			||||||
 | 
						path('sraz/30-let/', include('vyroci.urls')),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# This is only needed when using runserver.
 | 
					# 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"]:
 | 
				
			||||||
 | 
								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>
 | 
				
			||||||
 | 
					          </tr>
 | 
				
			||||||
 | 
					        {% endif %}
 | 
				
			||||||
 | 
					      {% endfor %}
 | 
				
			||||||
 | 
					    </table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    {% 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