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.

Files changed (20) hide show
  1. enap_designsystem/blocks/form.py +45 -28
  2. enap_designsystem/blocks/html_blocks.py +15 -17
  3. enap_designsystem/blocks/layout_blocks.py +14 -1
  4. enap_designsystem/migrations/0467_alter_areaaluno_body_alter_cursoeadpage_curso_and_more.py +82760 -0
  5. enap_designsystem/migrations/0468_alter_areaaluno_body_alter_cursoeadpage_curso_and_more.py +82575 -0
  6. enap_designsystem/static/enap_designsystem/blocks/capsulas.css +618 -26
  7. enap_designsystem/templates/enap_designsystem/blocks/carousel_responsive.html +0 -3
  8. enap_designsystem/templates/enap_designsystem/blocks/carousel_responsivo_snippet.html +1 -3
  9. enap_designsystem/templates/enap_designsystem/form_templates/formulario_page.html +147 -16
  10. enap_designsystem/templates/enap_designsystem/form_templates/formulario_page_landing.html +0 -1
  11. enap_designsystem/templates/enap_designsystem/form_templates/formulario_page_success.html +0 -1
  12. enap_designsystem/templates/enap_designsystem/includes/form_field.html +96 -121
  13. enap_designsystem/templates/enap_designsystem/pages/capsula_page.html +85 -60
  14. enap_designsystem/templates/enap_designsystem/pages/quiz_rota_page.html +314 -829
  15. enap_designsystem/wagtail_hooks.py +150 -38
  16. {wagtail_enap_designsystem-1.2.1.194.dist-info → wagtail_enap_designsystem-1.2.1.196.dist-info}/METADATA +1 -1
  17. {wagtail_enap_designsystem-1.2.1.194.dist-info → wagtail_enap_designsystem-1.2.1.196.dist-info}/RECORD +20 -18
  18. {wagtail_enap_designsystem-1.2.1.194.dist-info → wagtail_enap_designsystem-1.2.1.196.dist-info}/WHEEL +0 -0
  19. {wagtail_enap_designsystem-1.2.1.194.dist-info → wagtail_enap_designsystem-1.2.1.196.dist-info}/licenses/LICENSE +0 -0
  20. {wagtail_enap_designsystem-1.2.1.194.dist-info → wagtail_enap_designsystem-1.2.1.196.dist-info}/top_level.txt +0 -0
@@ -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
- if field_id in request.FILES:
1331
- uploaded_file = request.FILES[field_id]
1332
-
1333
- # Salvar informações do arquivo (não o arquivo em si) no form_data
1334
- form_data[field_id] = {
1335
- 'filename': uploaded_file.name,
1336
- 'size': uploaded_file.size,
1337
- 'content_type': uploaded_file.content_type,
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
- # Salvar arquivo real em files_data para processamento
1341
- files_data[field_id] = uploaded_file
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
- # Processar outros tipos de campo
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
- # Validar dados obrigatórios
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
- # Log dos resultados
1369
- logger.info(f"Submissão {submission.id} processada. Emails: {email_results}")
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
- 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
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 - 1 if destaque else limit)
2574
+ normais = list(cls.get_noticias_normais(limit))
2576
2575
 
2577
- if destaque:
2578
- # Destaque primeiro, depois as normais
2579
- return [destaque] + list(normais)
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 = "cr-th-large"
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