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.
- enap_designsystem/models.py +112 -48
- enap_designsystem/static/enap_designsystem/blocks/capsulas.css +1604 -40
- enap_designsystem/static/enap_designsystem/blocks/hero_animada_block.css +18 -0
- enap_designsystem/templates/enap_designsystem/pages/capsula_index.copy.html +351 -0
- enap_designsystem/templates/enap_designsystem/pages/capsula_index_page.html +473 -258
- enap_designsystem/templates/enap_designsystem/pages/capsula_page.html +390 -627
- enap_designsystem/templates/enap_designsystem/pages/mini/cards.html +0 -15
- enap_designsystem/templates/enap_designsystem/pages/quiz_rota_page.html +532 -308
- {wagtail_enap_designsystem-1.2.1.202.dist-info → wagtail_enap_designsystem-1.2.1.204.dist-info}/METADATA +1 -1
- {wagtail_enap_designsystem-1.2.1.202.dist-info → wagtail_enap_designsystem-1.2.1.204.dist-info}/RECORD +13 -12
- {wagtail_enap_designsystem-1.2.1.202.dist-info → wagtail_enap_designsystem-1.2.1.204.dist-info}/WHEEL +0 -0
- {wagtail_enap_designsystem-1.2.1.202.dist-info → wagtail_enap_designsystem-1.2.1.204.dist-info}/licenses/LICENSE +0 -0
- {wagtail_enap_designsystem-1.2.1.202.dist-info → wagtail_enap_designsystem-1.2.1.204.dist-info}/top_level.txt +0 -0
enap_designsystem/models.py
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
6733
|
-
|
|
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
|
-
|
|
6757
|
-
|
|
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':
|
|
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
|
-
|
|
6766
|
-
|
|
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':
|
|
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
|
-
|
|
6775
|
-
|
|
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':
|
|
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
|
-
"""
|
|
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
|
-
|
|
6813
|
-
|
|
6814
|
-
#
|
|
6815
|
-
|
|
6816
|
-
|
|
6817
|
-
|
|
6818
|
-
|
|
6819
|
-
|
|
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
|
-
#
|
|
6823
|
-
|
|
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
|
-
|
|
6831
|
-
|
|
6832
|
-
|
|
6833
|
-
|
|
6834
|
-
|
|
6835
|
-
|
|
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
|
-
|
|
6839
|
-
|
|
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
|
|
6905
|
+
return resultado
|
|
6842
6906
|
|
|
6843
6907
|
subpage_types = []
|
|
6844
6908
|
|