Compare commits

...

11 Commits

  1. 1
      mamweb/settings_common.py
  2. 18
      soustredeni/migrations/0011_soustredeni_kontaktnicek_pdf.py
  3. 23
      soustredeni/migrations/0012_soustredeni_kontaktnicek_vcf_and_more.py
  4. 15
      soustredeni/models.py
  5. 8
      soustredeni/templates/soustredeni/seznam_soustredeni.html
  6. 12
      soustredeni/urls.py
  7. 34
      soustredeni/views.py

1
mamweb/settings_common.py

@ -342,6 +342,7 @@ SEMINAR_KONFERY_DIR = os.path.join('konfery')
KOREKTURY_PDF_DIR = os.path.join('korektury', 'pdf') KOREKTURY_PDF_DIR = os.path.join('korektury', 'pdf')
KOREKTURY_IMG_DIR = os.path.join('korektury', 'img') KOREKTURY_IMG_DIR = os.path.join('korektury', 'img')
CISLO_IMG_DIR = os.path.join('cislo', 'img') CISLO_IMG_DIR = os.path.join('cislo', 'img')
SOUSTREDENI_KONTAKTNICKY_DIR = os.path.join('soustredeni', 'kontaktnicky')

18
soustredeni/migrations/0011_soustredeni_kontaktnicek_pdf.py

@ -0,0 +1,18 @@
# Generated by Django 4.2.13 on 2024-11-05 21:02
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('soustredeni', '0010_tvorba_post'),
]
operations = [
migrations.AddField(
model_name='soustredeni',
name='kontaktnicek_pdf',
field=models.FileField(blank=True, upload_to='kontaktnicky', verbose_name='kontaktníček'),
),
]

23
soustredeni/migrations/0012_soustredeni_kontaktnicek_vcf_and_more.py

@ -0,0 +1,23 @@
# Generated by Django 4.2.13 on 2024-11-05 21:07
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('soustredeni', '0011_soustredeni_kontaktnicek_pdf'),
]
operations = [
migrations.AddField(
model_name='soustredeni',
name='kontaktnicek_vcf',
field=models.FileField(blank=True, upload_to='kontaktnicky', verbose_name='kontaktníček vcf'),
),
migrations.AlterField(
model_name='soustredeni',
name='kontaktnicek_pdf',
field=models.FileField(blank=True, upload_to='kontaktnicky', verbose_name='kontaktníček pdf'),
),
]

15
soustredeni/models.py

@ -11,6 +11,17 @@ from personalni.models import Resitel, Organizator
from various.models import SeminarModelBase from various.models import SeminarModelBase
from tvorba.models import Rocnik, Problem, aux_generate_filename from tvorba.models import Rocnik, Problem, aux_generate_filename
import secrets
import string
from django.utils import timezone
def generate_filename_kontaktnicek(self, filename, file_type):
# generate random string
length = 32
fname = timezone.now().strftime('%Y-%m-%d-%H_%M') + "-"
fname += ''.join(secrets.choice(string.ascii_uppercase + string.digits) for _ in range(length))
fname += '.' + file_type
return os.path.join(settings.SOUSTREDENI_KONTAKTNICKY_DIR, fname)
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -65,7 +76,9 @@ class Soustredeni(SeminarModelBase):
exportovat = models.BooleanField('export do AESOPa', db_column='exportovat', default=False, exportovat = models.BooleanField('export do AESOPa', db_column='exportovat', default=False,
help_text='Exportuje se jen podle tohoto flagu (ne veřejnosti)') help_text='Exportuje se jen podle tohoto flagu (ne veřejnosti)')
#using lambda to avoid circular import
kontaktnicek_vcf = models.FileField('kontaktníček vcf', upload_to=lambda instance, filename: generate_filename_kontaktnicek(instance, filename, 'vcf'), blank=True, null=True)
kontaktnicek_pdf = models.FileField('kontaktníček pdf', upload_to=lambda instance, filename: generate_filename_kontaktnicek(instance, filename, 'pdf'), blank=True, null=True)
def __str__(self): def __str__(self):
return '{} ({})'.format(self.misto, self.datum_zacatku) return '{} ({})'.format(self.misto, self.datum_zacatku)

8
soustredeni/templates/soustredeni/seznam_soustredeni.html

@ -35,6 +35,14 @@
{% endif %} {% endif %}
{% endfor %} {% endfor %}
{% endif %} {% endif %}
{% for i in soustredeni.ucastnici.all %}
{% if i.osoba.user == user %}
<li><a href="../{{soustredeni.pk}}/kontaktnicek_pdf">kontaktnicek pdf</a></li>
<li><a href="../{{soustredeni.pk}}/kontaktnicek_vcf">kontaktnicek vcf</a></li>
{% endif %}
{% endfor %}
</ul> </ul>
{% if user.je_org %} {% if user.je_org %}
<div class="mam-org-only"> <div class="mam-org-only">

12
soustredeni/urls.py

@ -44,11 +44,21 @@ urlpatterns = [
org_required(views.SoustredeniAbstraktyView.as_view()), org_required(views.SoustredeniAbstraktyView.as_view()),
name='soustredeni_abstrakty' name='soustredeni_abstrakty'
), ),
path(
'kontaktnicek_pdf',
views.soustredeniKontaktnicekPdfView,
name='soustredeni_kontaktnicek_pdf'
),
path(
'kontaktnicek_vcf',
views.soustredeniKontaktnicekVcfView,
name='soustredeni_kontaktnicek_vcf'
),
path( path(
'fotogalerie/', 'fotogalerie/',
include('galerie.urls') include('galerie.urls')
), ),
] ]
) )
) )
] ]

34
soustredeni/views.py

@ -2,6 +2,8 @@ from django.shortcuts import get_object_or_404
from django.http import HttpResponse from django.http import HttpResponse
from django.views import generic from django.views import generic
from django.contrib.staticfiles.finders import find from django.contrib.staticfiles.finders import find
from django.http import Http404
from django.core.exceptions import PermissionDenied
import csv import csv
@ -107,3 +109,35 @@ class SoustredeniAbstraktyView(generic.DetailView):
model = Soustredeni model = Soustredeni
template_name = 'soustredeni/export_do_abstraktu.html' template_name = 'soustredeni/export_do_abstraktu.html'
pk_url_kwarg = 'soustredeni' # v url bude <int:soustredeni> místo defaultně požadovaného <int:pk> pk_url_kwarg = 'soustredeni' # v url bude <int:soustredeni> místo defaultně požadovaného <int:pk>
# Kontaktníčky
def soustredeniKontaktnicekPdfView(request, soustredeni):
return soustredeniKontaktnicekView(request, soustredeni, "pdf")
def soustredeniKontaktnicekVcfView(request, soustredeni):
return soustredeniKontaktnicekView(request, soustredeni, "vcf")
def soustredeniKontaktnicekView(request, soustredeni, typ):
soustredeni = get_object_or_404(Soustredeni, id=soustredeni)
# nebyl jsi tam, nebo nejsi org
if (not request.user in [u.osoba.user for u in soustredeni.ucastnici.all()]) and not request.user.je_org:
raise PermissionDenied()
kontaktnicky = {
'pdf': (soustredeni.kontaktnicek_pdf, 'applcation/pdf', 'rb'),
'vcf': (soustredeni.kontaktnicek_vcf, 'text/vcard', 'rb'),
}
try:
field, mime, otevreni = kontaktnicky[typ]
except KeyError as e:
raise ValueError("Neznámý typ kontaktníčku") from e
# není k dispozici
if not field:
raise Http404()
with open(field.path, otevreni) as kontaktnicek:
response = HttpResponse(kontaktnicek.read(), content_type=mime)
response['Content-Disposition'] = 'attachment; filename="kontaktnicek.{}"'.format(typ)
return response

Loading…
Cancel
Save