wagtail-enap-designsystem 1.2.1.194__py3-none-any.whl → 1.2.1.196__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of wagtail-enap-designsystem might be problematic. Click here for more details.
- enap_designsystem/blocks/form.py +45 -28
- enap_designsystem/blocks/html_blocks.py +15 -17
- enap_designsystem/blocks/layout_blocks.py +14 -1
- enap_designsystem/migrations/0467_alter_areaaluno_body_alter_cursoeadpage_curso_and_more.py +82760 -0
- enap_designsystem/migrations/0468_alter_areaaluno_body_alter_cursoeadpage_curso_and_more.py +82575 -0
- enap_designsystem/static/enap_designsystem/blocks/capsulas.css +618 -26
- enap_designsystem/templates/enap_designsystem/blocks/carousel_responsive.html +0 -3
- enap_designsystem/templates/enap_designsystem/blocks/carousel_responsivo_snippet.html +1 -3
- enap_designsystem/templates/enap_designsystem/form_templates/formulario_page.html +147 -16
- enap_designsystem/templates/enap_designsystem/form_templates/formulario_page_landing.html +0 -1
- enap_designsystem/templates/enap_designsystem/form_templates/formulario_page_success.html +0 -1
- enap_designsystem/templates/enap_designsystem/includes/form_field.html +96 -121
- enap_designsystem/templates/enap_designsystem/pages/capsula_page.html +85 -60
- enap_designsystem/templates/enap_designsystem/pages/quiz_rota_page.html +314 -829
- enap_designsystem/wagtail_hooks.py +150 -38
- {wagtail_enap_designsystem-1.2.1.194.dist-info → wagtail_enap_designsystem-1.2.1.196.dist-info}/METADATA +1 -1
- {wagtail_enap_designsystem-1.2.1.194.dist-info → wagtail_enap_designsystem-1.2.1.196.dist-info}/RECORD +20 -18
- {wagtail_enap_designsystem-1.2.1.194.dist-info → wagtail_enap_designsystem-1.2.1.196.dist-info}/WHEEL +0 -0
- {wagtail_enap_designsystem-1.2.1.194.dist-info → wagtail_enap_designsystem-1.2.1.196.dist-info}/licenses/LICENSE +0 -0
- {wagtail_enap_designsystem-1.2.1.194.dist-info → wagtail_enap_designsystem-1.2.1.196.dist-info}/top_level.txt +0 -0
enap_designsystem/blocks/form.py
CHANGED
|
@@ -1312,7 +1312,7 @@ class FormularioPage(Page):
|
|
|
1312
1312
|
return super().serve(request, *args, **kwargs)
|
|
1313
1313
|
|
|
1314
1314
|
def process_form_submission(self, request):
|
|
1315
|
-
"""Processa os dados do formulário"""
|
|
1315
|
+
"""Processa os dados do formulário com suporte para múltiplos arquivos"""
|
|
1316
1316
|
form_data = {}
|
|
1317
1317
|
files_data = {} # ← Separar arquivos dos dados
|
|
1318
1318
|
|
|
@@ -1327,21 +1327,49 @@ class FormularioPage(Page):
|
|
|
1327
1327
|
|
|
1328
1328
|
# PROCESSAR UPLOAD DE ARQUIVOS SEPARADAMENTE
|
|
1329
1329
|
if block.block_type == 'file_upload_field':
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
}
|
|
1330
|
+
# Verificar se é um campo que aceita múltiplos arquivos
|
|
1331
|
+
is_multiple = block.value.get('multiple_files', False)
|
|
1332
|
+
|
|
1333
|
+
if is_multiple:
|
|
1334
|
+
# O nome do campo no HTML tem [] anexado
|
|
1335
|
+
field_id_arr = f"{field_id}[]"
|
|
1336
|
+
# Usar getlist para pegar todos os arquivos
|
|
1337
|
+
uploaded_files = request.FILES.getlist(field_id_arr)
|
|
1339
1338
|
|
|
1340
|
-
|
|
1341
|
-
|
|
1339
|
+
if uploaded_files:
|
|
1340
|
+
# Lista para metadados de múltiplos arquivos
|
|
1341
|
+
files_info = []
|
|
1342
|
+
|
|
1343
|
+
# Processar cada arquivo
|
|
1344
|
+
for i, uploaded_file in enumerate(uploaded_files):
|
|
1345
|
+
# Metadados do arquivo
|
|
1346
|
+
file_info = {
|
|
1347
|
+
'filename': uploaded_file.name,
|
|
1348
|
+
'size': uploaded_file.size,
|
|
1349
|
+
'content_type': uploaded_file.content_type,
|
|
1350
|
+
}
|
|
1351
|
+
files_info.append(file_info)
|
|
1352
|
+
|
|
1353
|
+
# Cada arquivo tem sua própria chave
|
|
1354
|
+
files_data[f"{field_id}_{i}"] = uploaded_file
|
|
1355
|
+
|
|
1356
|
+
# Armazenar a lista com todos os metadados
|
|
1357
|
+
form_data[field_id] = files_info
|
|
1358
|
+
else:
|
|
1359
|
+
# Código original para campo com um único arquivo
|
|
1360
|
+
if field_id in request.FILES:
|
|
1361
|
+
uploaded_file = request.FILES[field_id]
|
|
1362
|
+
|
|
1363
|
+
form_data[field_id] = {
|
|
1364
|
+
'filename': uploaded_file.name,
|
|
1365
|
+
'size': uploaded_file.size,
|
|
1366
|
+
'content_type': uploaded_file.content_type,
|
|
1367
|
+
}
|
|
1368
|
+
|
|
1369
|
+
files_data[field_id] = uploaded_file
|
|
1342
1370
|
continue
|
|
1343
1371
|
|
|
1344
|
-
#
|
|
1372
|
+
# O restante do código permanece igual
|
|
1345
1373
|
if block.block_type == 'checkbox_multiple_field':
|
|
1346
1374
|
values = request.POST.getlist(field_id)
|
|
1347
1375
|
if values:
|
|
@@ -1351,7 +1379,7 @@ class FormularioPage(Page):
|
|
|
1351
1379
|
if value:
|
|
1352
1380
|
form_data[field_id] = value
|
|
1353
1381
|
|
|
1354
|
-
#
|
|
1382
|
+
# O restante da função permanece igual
|
|
1355
1383
|
errors = self.validate_form_data(form_data, request)
|
|
1356
1384
|
if errors:
|
|
1357
1385
|
context = self.get_context(request)
|
|
@@ -1359,23 +1387,12 @@ class FormularioPage(Page):
|
|
|
1359
1387
|
context['form_data'] = form_data
|
|
1360
1388
|
return render(request, self.get_template(request), context)
|
|
1361
1389
|
|
|
1362
|
-
# Salvar submissão
|
|
1363
1390
|
submission = self.save_form_submission(form_data, files_data, request)
|
|
1364
|
-
|
|
1365
|
-
# 📧 ENVIAR EMAILS COM SIMPLEEEMAILSERVICE
|
|
1366
1391
|
email_results = self.send_emails_with_service(form_data, submission)
|
|
1367
1392
|
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
# Redirecionar com status dos emails
|
|
1372
|
-
success_url = f'{request.path}?success=1'
|
|
1373
|
-
if email_results.get('user_sent'):
|
|
1374
|
-
success_url += '&email_sent=1'
|
|
1375
|
-
if email_results.get('admin_sent'):
|
|
1376
|
-
success_url += '&admin_notified=1'
|
|
1377
|
-
|
|
1378
|
-
return redirect(success_url)
|
|
1393
|
+
logger.info(f"Submissão {submission.id} processada.")
|
|
1394
|
+
# Redirecionar para página de sucesso
|
|
1395
|
+
return redirect(self.url + '?success=1')
|
|
1379
1396
|
|
|
1380
1397
|
def send_emails_with_service(self, form_data, submission):
|
|
1381
1398
|
"""Envia emails usando SimpleEmailService"""
|
|
@@ -2444,14 +2444,14 @@ class ENAPNoticia(Page):
|
|
|
2444
2444
|
),
|
|
2445
2445
|
]
|
|
2446
2446
|
|
|
2447
|
-
def save(self, *args, **kwargs):
|
|
2448
|
-
|
|
2449
|
-
|
|
2450
|
-
|
|
2451
|
-
|
|
2452
|
-
def desmarcar_destaques(self):
|
|
2453
|
-
|
|
2454
|
-
|
|
2447
|
+
# def save(self, *args, **kwargs):
|
|
2448
|
+
# if self.destaque_fixo:
|
|
2449
|
+
# self.desmarcar_destaques()
|
|
2450
|
+
# super().save(*args, **kwargs)
|
|
2451
|
+
|
|
2452
|
+
# def desmarcar_destaques(self):
|
|
2453
|
+
# ENAPNoticia.objects.all().update(destaque_fixo=False)
|
|
2454
|
+
# self.destaque_fixo=True
|
|
2455
2455
|
|
|
2456
2456
|
@property
|
|
2457
2457
|
def titulo_filter(self):
|
|
@@ -2555,14 +2555,13 @@ class ENAPNoticia(Page):
|
|
|
2555
2555
|
return cls.objects.filter(
|
|
2556
2556
|
live=True,
|
|
2557
2557
|
destaque_fixo=True
|
|
2558
|
-
).first()
|
|
2558
|
+
).order_by('-date_display', '-first_published_at').first()
|
|
2559
2559
|
|
|
2560
2560
|
@classmethod
|
|
2561
2561
|
def get_noticias_normais(cls, limit=5):
|
|
2562
2562
|
"""Retorna outras notícias (sem a de destaque) ordenadas por data"""
|
|
2563
2563
|
return cls.objects.filter(
|
|
2564
|
-
live=True
|
|
2565
|
-
destaque_fixo=False
|
|
2564
|
+
live=True
|
|
2566
2565
|
).order_by('-date_display', '-first_published_at')[:limit]
|
|
2567
2566
|
|
|
2568
2567
|
@classmethod
|
|
@@ -2572,13 +2571,12 @@ class ENAPNoticia(Page):
|
|
|
2572
2571
|
depois as outras por ordem cronológica
|
|
2573
2572
|
"""
|
|
2574
2573
|
destaque = cls.get_noticia_destaque()
|
|
2575
|
-
normais = cls.get_noticias_normais(limit
|
|
2574
|
+
normais = list(cls.get_noticias_normais(limit))
|
|
2576
2575
|
|
|
2577
|
-
if destaque:
|
|
2578
|
-
|
|
2579
|
-
|
|
2580
|
-
else
|
|
2581
|
-
return list(normais)
|
|
2576
|
+
if destaque and destaque in normais:
|
|
2577
|
+
normais.remove(destaque)
|
|
2578
|
+
|
|
2579
|
+
return [destaque] + normais if destaque else normais
|
|
2582
2580
|
|
|
2583
2581
|
search_fields = Page.search_fields + [
|
|
2584
2582
|
index.SearchField("title", boost=3),
|
|
@@ -204,11 +204,24 @@ class EnapSectionBlock(BaseLayoutBlock):
|
|
|
204
204
|
features=["bold", "italic", "ol", "ul", "hr", "link", "document-link"],
|
|
205
205
|
label=_("Subtitulo"),
|
|
206
206
|
)
|
|
207
|
+
|
|
208
|
+
def get_admin_text(self):
|
|
209
|
+
"""
|
|
210
|
+
Retorna texto personalizado para exibição no admin
|
|
211
|
+
Mostra o título da seção para facilitar identificação
|
|
212
|
+
"""
|
|
213
|
+
title = self.get('title')
|
|
214
|
+
if title:
|
|
215
|
+
return f"Seção: {title}"
|
|
216
|
+
return "Seção (sem título)"
|
|
207
217
|
|
|
208
218
|
class Meta:
|
|
209
219
|
template = "enap_designsystem/blocks/section_block.html"
|
|
210
|
-
icon = "
|
|
220
|
+
icon = "pilcrow"
|
|
211
221
|
label = _("Enap Section Block")
|
|
222
|
+
verbose_name = _("Seção com Título e Subtítulo")
|
|
223
|
+
form_classname = "struct-block enap-section-block"
|
|
224
|
+
admin_text = "Conteúdo: {{paragraph|truncatechars:50}}"
|
|
212
225
|
|
|
213
226
|
|
|
214
227
|
|