wagtail-enap-designsystem 1.2.1.202__py3-none-any.whl → 1.2.1.204__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.

@@ -6691,11 +6691,11 @@ from django.views.decorators.csrf import csrf_exempt
6691
6691
  from django.utils.decorators import method_decorator
6692
6692
  import json
6693
6693
 
6694
- # enap_designsystem/models.py
6694
+
6695
6695
 
6696
6696
  class QuizRotaPage(Page):
6697
6697
  """
6698
- Página principal do Quiz de Rotas Personalizadas
6698
+ Página principal do Quiz de Rotas Personalizadas - VERSÃO COM SELEÇÃO MÚLTIPLA
6699
6699
  """
6700
6700
  template = "enap_designsystem/pages/quiz_rota_page.html"
6701
6701
 
@@ -6729,8 +6729,8 @@ class QuizRotaPage(Page):
6729
6729
  content_panels = Page.content_panels + [
6730
6730
  FieldPanel('introducao'),
6731
6731
  FieldPanel('texto_resultado'),
6732
- FieldPanel('navbar'),
6733
- FieldPanel('footer'),
6732
+ FieldPanel('navbar'),
6733
+ FieldPanel('footer'),
6734
6734
  ]
6735
6735
 
6736
6736
  def serve(self, request):
@@ -6748,34 +6748,49 @@ class QuizRotaPage(Page):
6748
6748
  return super().serve(request)
6749
6749
 
6750
6750
  def salvar_respostas_url(self, request):
6751
- """Salva respostas vindas da URL na sessão"""
6751
+ """Salva respostas vindas da URL na sessão - com suporte a múltipla escolha"""
6752
6752
  respostas = {}
6753
6753
 
6754
- # Perfil profissional
6754
+ # Perfil profissional (múltiplos, separados por vírgula)
6755
6755
  if request.GET.get('perfil'):
6756
- perfil_valor = request.GET.get('perfil')
6757
- perfil_texto = request.GET.get('perfil_texto', perfil_valor)
6756
+ perfil_valores = request.GET.get('perfil').split(',')
6757
+ perfil_textos = request.GET.get('perfil_texto', '').split(', ')
6758
+
6759
+ # Garantir que temos o mesmo número de textos e valores
6760
+ if len(perfil_textos) < len(perfil_valores):
6761
+ perfil_textos.extend([perfil_valores[i] for i in range(len(perfil_textos), len(perfil_valores))])
6762
+
6758
6763
  respostas['perfil_profissional'] = {
6759
- 'valor': perfil_valor,
6760
- 'texto': perfil_texto
6764
+ 'valor': perfil_valores,
6765
+ 'texto': request.GET.get('perfil_texto') # Manter o texto original com vírgulas
6761
6766
  }
6762
6767
 
6763
- # Tipo de recurso
6768
+ # Tipo de recurso (múltiplos, separados por vírgula)
6764
6769
  if request.GET.get('recurso'):
6765
- recurso_valor = request.GET.get('recurso')
6766
- recurso_texto = request.GET.get('recurso_texto', recurso_valor)
6770
+ recurso_valores = request.GET.get('recurso').split(',')
6771
+ recurso_textos = request.GET.get('recurso_texto', '').split(', ')
6772
+
6773
+ # Garantir que temos o mesmo número de textos e valores
6774
+ if len(recurso_textos) < len(recurso_valores):
6775
+ recurso_textos.extend([recurso_valores[i] for i in range(len(recurso_textos), len(recurso_valores))])
6776
+
6767
6777
  respostas['tipo_recurso'] = {
6768
- 'valor': recurso_valor,
6769
- 'texto': recurso_texto
6778
+ 'valor': recurso_valores,
6779
+ 'texto': request.GET.get('recurso_texto') # Manter o texto original com vírgulas
6770
6780
  }
6771
6781
 
6772
- # Formato de ação
6782
+ # Formato de ação (múltiplos, separados por vírgula)
6773
6783
  if request.GET.get('formato'):
6774
- formato_valor = request.GET.get('formato')
6775
- formato_texto = request.GET.get('formato_texto', formato_valor)
6784
+ formato_valores = request.GET.get('formato').split(',')
6785
+ formato_textos = request.GET.get('formato_texto', '').split(', ')
6786
+
6787
+ # Garantir que temos o mesmo número de textos e valores
6788
+ if len(formato_textos) < len(formato_valores):
6789
+ formato_textos.extend([formato_valores[i] for i in range(len(formato_textos), len(formato_valores))])
6790
+
6776
6791
  respostas['formato_acao'] = {
6777
- 'valor': formato_valor,
6778
- 'texto': formato_texto
6792
+ 'valor': formato_valores,
6793
+ 'texto': request.GET.get('formato_texto') # Manter o texto original com vírgulas
6779
6794
  }
6780
6795
 
6781
6796
  # Salvar na sessão
@@ -6783,7 +6798,6 @@ class QuizRotaPage(Page):
6783
6798
 
6784
6799
  def servir_resultado(self, request):
6785
6800
  """Renderiza página de resultado com cápsulas filtradas"""
6786
- from django.shortcuts import render, redirect
6787
6801
 
6788
6802
  # Recuperar respostas da sessão
6789
6803
  respostas = request.session.get('quiz_respostas', {})
@@ -6805,40 +6819,90 @@ class QuizRotaPage(Page):
6805
6819
  return render(request, self.get_template(request), context)
6806
6820
 
6807
6821
  def filtrar_capsulas(self, respostas):
6808
- """Filtra cápsulas baseado nas respostas do quiz"""
6822
+ """
6823
+ Filtra cápsulas baseado nas respostas do quiz.
6824
+ MODIFICADO: Agora usa lógica de união (OR) para múltiplas seleções
6825
+ do mesmo tipo de filtro - uma cápsula é incluída se corresponder
6826
+ a pelo menos um dos valores selecionados para cada categoria.
6827
+ """
6809
6828
  from enap_designsystem.models import CapsulaPage
6810
6829
 
6811
6830
  # Começar com todas as cápsulas
6812
- capsulas = list(CapsulaPage.objects.live().public())
6813
-
6814
- # Perfil Profissional
6815
- if 'perfil_profissional' in respostas:
6816
- perfil = respostas['perfil_profissional']['valor']
6817
- capsulas = [
6818
- c for c in capsulas
6819
- if c.perfis_profissionais and perfil in c.perfis_profissionais
6820
- ]
6831
+ all_capsulas = list(CapsulaPage.objects.live().public())
6832
+
6833
+ # Lista resultante
6834
+ capsulas_filtradas = []
6835
+
6836
+ # Primeiro, filtrar por cada categoria separadamente
6837
+ perfis_filtrados = self._filtrar_por_categoria(
6838
+ all_capsulas,
6839
+ 'perfil_profissional' in respostas,
6840
+ 'perfis_profissionais',
6841
+ respostas.get('perfil_profissional', {}).get('valor', [])
6842
+ )
6843
+
6844
+ recursos_filtrados = self._filtrar_por_categoria(
6845
+ all_capsulas,
6846
+ 'tipo_recurso' in respostas,
6847
+ 'tipos_recurso',
6848
+ respostas.get('tipo_recurso', {}).get('valor', [])
6849
+ )
6850
+
6851
+ formatos_filtrados = self._filtrar_por_categoria(
6852
+ all_capsulas,
6853
+ 'formato_acao' in respostas,
6854
+ 'formatos_acao',
6855
+ respostas.get('formato_acao', {}).get('valor', [])
6856
+ )
6857
+
6858
+ # Intersecção das três listas para obter apenas cápsulas que atendem a todos os critérios
6859
+ # Para cada cápsula, verificamos se ela está presente em todas as listas filtradas relevantes
6860
+ for capsula in all_capsulas:
6861
+ deve_incluir = True
6862
+
6863
+ # Verificar se a cápsula está na lista de perfis filtrados (se houver filtro de perfil)
6864
+ if 'perfil_profissional' in respostas and capsula not in perfis_filtrados:
6865
+ deve_incluir = False
6866
+
6867
+ # Verificar se a cápsula está na lista de recursos filtrados (se houver filtro de recurso)
6868
+ if 'tipo_recurso' in respostas and capsula not in recursos_filtrados:
6869
+ deve_incluir = False
6870
+
6871
+ # Verificar se a cápsula está na lista de formatos filtrados (se houver filtro de formato)
6872
+ if 'formato_acao' in respostas and capsula not in formatos_filtrados:
6873
+ deve_incluir = False
6874
+
6875
+ # Se a cápsula atender a todos os critérios, inclua na lista final
6876
+ if deve_incluir:
6877
+ capsulas_filtradas.append(capsula)
6821
6878
 
6822
- # Tipo de Recurso
6823
- if 'tipo_recurso' in respostas:
6824
- recurso = respostas['tipo_recurso']['valor']
6825
- capsulas = [
6826
- c for c in capsulas
6827
- if c.tipos_recurso and recurso in c.tipos_recurso
6828
- ]
6879
+ # Ordenar por prioridade (obrigatório primeiro)
6880
+ capsulas_filtradas.sort(key=lambda c: (c.prioridade != 'obrigatorio', c.title))
6829
6881
 
6830
- # Formato de Ação
6831
- if 'formato_acao' in respostas:
6832
- formato = respostas['formato_acao']['valor']
6833
- capsulas = [
6834
- c for c in capsulas
6835
- if c.formatos_acao and formato in c.formatos_acao
6836
- ]
6882
+ return capsulas_filtradas
6883
+
6884
+ def _filtrar_por_categoria(self, capsulas, tem_filtro, campo_capsula, valores_filtro):
6885
+ """
6886
+ Filtra cápsulas por uma categoria específica.
6887
+ Usa lógica de união (OR) para múltiplas seleções do mesmo filtro.
6837
6888
 
6838
- # Ordenar por prioridade (obrigatório primeiro)
6839
- capsulas.sort(key=lambda c: (c.prioridade != 'obrigatorio', c.title))
6889
+ Retorna todas as cápsulas se não houver filtro para esta categoria.
6890
+ """
6891
+ if not tem_filtro or not valores_filtro:
6892
+ return capsulas
6893
+
6894
+ resultado = []
6895
+
6896
+ for capsula in capsulas:
6897
+ valores_capsula = getattr(capsula, campo_capsula, None)
6898
+
6899
+ if valores_capsula:
6900
+ # Verifica se há alguma correspondência entre os valores da cápsula
6901
+ # e os valores selecionados no filtro (lógica OR)
6902
+ if any(valor in valores_capsula for valor in valores_filtro):
6903
+ resultado.append(capsula)
6840
6904
 
6841
- return capsulas
6905
+ return resultado
6842
6906
 
6843
6907
  subpage_types = []
6844
6908