verejny kontaktnicek #71

Merged
ticvac merged 10 commits from kontaktnicek_pro_vsecny into master 1 month ago
  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'
),
zelvuska marked this conversation as resolved
Review

Tady je nějaké divné odsazení…

Tady je nějaké divné odsazení…
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")
ledoian marked this conversation as resolved
Review

Ty views jsou OK-ish. (Šlo by mít URL typu kontaktnicek_<typ:str> a rovnou používat výsledný view, ale asi to nepřidává moc a spíš to zhoršuje čitelnost…)

Ty views jsou OK-ish. (Šlo by mít URL typu `kontaktnicek_<typ:str>` a rovnou používat výsledný view, ale asi to nepřidává moc a spíš to zhoršuje čitelnost…)
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