wagtail-enap-designsystem 1.2.1.170__py3-none-any.whl → 1.2.1.172__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 (21) hide show
  1. enap_designsystem/blocks/content_blocks.py +2 -0
  2. enap_designsystem/blocks/html_blocks.py +4 -1
  3. enap_designsystem/migrations/0441_perguntaquiz_quizrotapage_alter_areaaluno_body_and_more.py +56121 -0
  4. enap_designsystem/migrations/0442_remove_perguntaquiz_page_delete_opcaoresposta_and_more.py +26 -0
  5. enap_designsystem/migrations/0443_capsulaindexpage_footer_capsulaindexpage_navbar_and_more.py +56029 -0
  6. enap_designsystem/migrations/0444_alter_areaaluno_body_alter_cursoeadpage_curso_and_more.py +70304 -0
  7. enap_designsystem/models.py +208 -2
  8. enap_designsystem/static/enap_designsystem/blocks/capsulas.css +0 -1
  9. enap_designsystem/static/enap_designsystem/blocks/cards.css +1 -0
  10. enap_designsystem/templates/enap_designsystem/blocks/card_block.html +158 -1
  11. enap_designsystem/templates/enap_designsystem/blocks/section_block.html +5 -5
  12. enap_designsystem/templates/enap_designsystem/pages/capsula_index_page.html +137 -128
  13. enap_designsystem/templates/enap_designsystem/pages/capsula_page.html +135 -276
  14. enap_designsystem/templates/enap_designsystem/pages/page_search.html +1 -1
  15. enap_designsystem/templates/enap_designsystem/pages/quiz_rota_page.html +922 -0
  16. enap_designsystem/templates/enap_designsystem/semana_inovacao/blocks_menu_navigation.html +6 -2
  17. {wagtail_enap_designsystem-1.2.1.170.dist-info → wagtail_enap_designsystem-1.2.1.172.dist-info}/METADATA +1 -1
  18. {wagtail_enap_designsystem-1.2.1.170.dist-info → wagtail_enap_designsystem-1.2.1.172.dist-info}/RECORD +21 -16
  19. {wagtail_enap_designsystem-1.2.1.170.dist-info → wagtail_enap_designsystem-1.2.1.172.dist-info}/WHEEL +0 -0
  20. {wagtail_enap_designsystem-1.2.1.170.dist-info → wagtail_enap_designsystem-1.2.1.172.dist-info}/licenses/LICENSE +0 -0
  21. {wagtail_enap_designsystem-1.2.1.170.dist-info → wagtail_enap_designsystem-1.2.1.172.dist-info}/top_level.txt +0 -0
@@ -6067,6 +6067,22 @@ class CapsulaIndexPage(Page):
6067
6067
  Página mãe que lista todas as cápsulas com sistema de filtros
6068
6068
  """
6069
6069
  template = "enap_designsystem/pages/capsula_index_page.html"
6070
+
6071
+ navbar = models.ForeignKey(
6072
+ "EnapNavbarSnippet",
6073
+ null=True,
6074
+ blank=True,
6075
+ on_delete=models.SET_NULL,
6076
+ related_name="+",
6077
+ )
6078
+
6079
+ footer = models.ForeignKey(
6080
+ "EnapFooterSnippet",
6081
+ null=True,
6082
+ blank=True,
6083
+ on_delete=models.SET_NULL,
6084
+ related_name="+",
6085
+ )
6070
6086
 
6071
6087
  intro = RichTextField(
6072
6088
  blank=True,
@@ -6076,6 +6092,8 @@ class CapsulaIndexPage(Page):
6076
6092
 
6077
6093
  content_panels = Page.content_panels + [
6078
6094
  FieldPanel('intro'),
6095
+ FieldPanel('navbar'),
6096
+ FieldPanel('footer'),
6079
6097
  ]
6080
6098
 
6081
6099
  # Não restringe onde pode ser criada
@@ -6197,8 +6215,25 @@ from django import forms
6197
6215
  class CapsulaPage(Page):
6198
6216
  """
6199
6217
  Página individual de cada cápsula de acessibilidade
6200
- Compatível com PostgreSQL (produção) e SQLite (desenvolvimento)
6201
6218
  """
6219
+
6220
+ navbar = models.ForeignKey(
6221
+ "EnapNavbarSnippet",
6222
+ null=True,
6223
+ blank=True,
6224
+ on_delete=models.SET_NULL,
6225
+ related_name="+",
6226
+ )
6227
+
6228
+ footer = models.ForeignKey(
6229
+ "EnapFooterSnippet",
6230
+ null=True,
6231
+ blank=True,
6232
+ on_delete=models.SET_NULL,
6233
+ related_name="+",
6234
+ )
6235
+
6236
+
6202
6237
  template = "enap_designsystem/pages/capsula_page.html"
6203
6238
 
6204
6239
  # ==========================================
@@ -6467,6 +6502,8 @@ class CapsulaPage(Page):
6467
6502
  content_panels = Page.content_panels + [
6468
6503
 
6469
6504
  MultiFieldPanel([
6505
+ FieldPanel('navbar'),
6506
+ FieldPanel('footer'),
6470
6507
  FieldPanel('resumo_card'),
6471
6508
  FieldPanel('prioridade'),
6472
6509
  FieldPanel('destaque_home'),
@@ -6559,4 +6596,173 @@ class CapsulaPage(Page):
6559
6596
 
6560
6597
  context['capsulas_relacionadas'] = capsulas_relacionadas
6561
6598
 
6562
- return context
6599
+ return context
6600
+
6601
+
6602
+
6603
+
6604
+
6605
+
6606
+
6607
+
6608
+
6609
+
6610
+ from django.http import JsonResponse
6611
+ from django.views.decorators.csrf import csrf_exempt
6612
+ from django.utils.decorators import method_decorator
6613
+ import json
6614
+
6615
+ # enap_designsystem/models.py
6616
+
6617
+ class QuizRotaPage(Page):
6618
+ """
6619
+ Página principal do Quiz de Rotas Personalizadas
6620
+ """
6621
+ template = "enap_designsystem/pages/quiz_rota_page.html"
6622
+
6623
+ navbar = models.ForeignKey(
6624
+ "EnapNavbarSnippet",
6625
+ null=True,
6626
+ blank=True,
6627
+ on_delete=models.SET_NULL,
6628
+ related_name="+",
6629
+ )
6630
+
6631
+ footer = models.ForeignKey(
6632
+ "EnapFooterSnippet",
6633
+ null=True,
6634
+ blank=True,
6635
+ on_delete=models.SET_NULL,
6636
+ related_name="+",
6637
+ )
6638
+
6639
+ introducao = RichTextField(
6640
+ verbose_name="Texto introdutório",
6641
+ help_text="Explica como funciona o direcionamento personalizado"
6642
+ )
6643
+
6644
+ texto_resultado = RichTextField(
6645
+ blank=True,
6646
+ verbose_name="Texto de apresentação do resultado",
6647
+ help_text="Aparece na página de resultado antes das cápsulas"
6648
+ )
6649
+
6650
+ content_panels = Page.content_panels + [
6651
+ FieldPanel('introducao'),
6652
+ FieldPanel('texto_resultado'),
6653
+ FieldPanel('navbar'),
6654
+ FieldPanel('footer'),
6655
+ ]
6656
+
6657
+ def serve(self, request):
6658
+ """Override para gerenciar requisições de resultado"""
6659
+
6660
+ # Se tiver parâmetros de resposta na URL, salvar na sessão
6661
+ if request.GET.get('perfil') or request.GET.get('recurso') or request.GET.get('formato'):
6662
+ self.salvar_respostas_url(request)
6663
+
6664
+ # Se for requisição de resultado
6665
+ if request.GET.get('resultado') == '1':
6666
+ return self.servir_resultado(request)
6667
+
6668
+ # Renderização normal do quiz
6669
+ return super().serve(request)
6670
+
6671
+ def salvar_respostas_url(self, request):
6672
+ """Salva respostas vindas da URL na sessão"""
6673
+ respostas = {}
6674
+
6675
+ # Perfil profissional
6676
+ if request.GET.get('perfil'):
6677
+ perfil_valor = request.GET.get('perfil')
6678
+ perfil_texto = request.GET.get('perfil_texto', perfil_valor)
6679
+ respostas['perfil_profissional'] = {
6680
+ 'valor': perfil_valor,
6681
+ 'texto': perfil_texto
6682
+ }
6683
+
6684
+ # Tipo de recurso
6685
+ if request.GET.get('recurso'):
6686
+ recurso_valor = request.GET.get('recurso')
6687
+ recurso_texto = request.GET.get('recurso_texto', recurso_valor)
6688
+ respostas['tipo_recurso'] = {
6689
+ 'valor': recurso_valor,
6690
+ 'texto': recurso_texto
6691
+ }
6692
+
6693
+ # Formato de ação
6694
+ if request.GET.get('formato'):
6695
+ formato_valor = request.GET.get('formato')
6696
+ formato_texto = request.GET.get('formato_texto', formato_valor)
6697
+ respostas['formato_acao'] = {
6698
+ 'valor': formato_valor,
6699
+ 'texto': formato_texto
6700
+ }
6701
+
6702
+ # Salvar na sessão
6703
+ request.session['quiz_respostas'] = respostas
6704
+
6705
+ def servir_resultado(self, request):
6706
+ """Renderiza página de resultado com cápsulas filtradas"""
6707
+ from django.shortcuts import render, redirect
6708
+
6709
+ # Recuperar respostas da sessão
6710
+ respostas = request.session.get('quiz_respostas', {})
6711
+
6712
+ if not respostas:
6713
+ return redirect(self.url)
6714
+
6715
+ # Buscar cápsulas baseadas nas respostas
6716
+ capsulas = self.filtrar_capsulas(respostas)
6717
+
6718
+ context = self.get_context(request)
6719
+ context.update({
6720
+ 'e_resultado': True,
6721
+ 'respostas': respostas,
6722
+ 'capsulas_recomendadas': capsulas,
6723
+ 'total_capsulas': len(capsulas),
6724
+ })
6725
+
6726
+ return render(request, self.get_template(request), context)
6727
+
6728
+ def filtrar_capsulas(self, respostas):
6729
+ """Filtra cápsulas baseado nas respostas do quiz"""
6730
+ from enap_designsystem.models import CapsulaPage
6731
+
6732
+ # Começar com todas as cápsulas
6733
+ capsulas = list(CapsulaPage.objects.live().public())
6734
+
6735
+ # Perfil Profissional
6736
+ if 'perfil_profissional' in respostas:
6737
+ perfil = respostas['perfil_profissional']['valor']
6738
+ capsulas = [
6739
+ c for c in capsulas
6740
+ if c.perfis_profissionais and perfil in c.perfis_profissionais
6741
+ ]
6742
+
6743
+ # Tipo de Recurso
6744
+ if 'tipo_recurso' in respostas:
6745
+ recurso = respostas['tipo_recurso']['valor']
6746
+ capsulas = [
6747
+ c for c in capsulas
6748
+ if c.tipos_recurso and recurso in c.tipos_recurso
6749
+ ]
6750
+
6751
+ # Formato de Ação
6752
+ if 'formato_acao' in respostas:
6753
+ formato = respostas['formato_acao']['valor']
6754
+ capsulas = [
6755
+ c for c in capsulas
6756
+ if c.formatos_acao and formato in c.formatos_acao
6757
+ ]
6758
+
6759
+ # Ordenar por prioridade (obrigatório primeiro)
6760
+ capsulas.sort(key=lambda c: (c.prioridade != 'obrigatorio', c.title))
6761
+
6762
+ return capsulas
6763
+
6764
+ subpage_types = []
6765
+
6766
+ class Meta:
6767
+ verbose_name = "Quiz de Rotas"
6768
+ verbose_name_plural = "Quiz de Rotas"
@@ -262,7 +262,6 @@
262
262
  border-radius: 4px;
263
263
  font-size: 0.75rem;
264
264
  font-weight: 600;
265
- text-transform: uppercase;
266
265
  letter-spacing: 0.5px;
267
266
  margin-bottom: 1rem;
268
267
  }
@@ -174,6 +174,7 @@
174
174
  gap: 16px;
175
175
  justify-content: space-between;
176
176
  height: auto;
177
+ text-align: center;
177
178
  }
178
179
 
179
180
  .card-secondary .wrapper-text-card{
@@ -5,7 +5,55 @@
5
5
  <link rel="stylesheet" type="text/css" href="{% static 'enap_designsystem/blocks/cards.css' %}">
6
6
 
7
7
  <div class="{{ value.type }} enap-card-wrapper">
8
- {% if value.type == 'card-bgimage' %}
8
+ {% if value.type == 'card-info-white' or value.type == 'card-info-dark' %}
9
+ <!-- Cards Informativos -->
10
+ <div class="card-info-container">
11
+ <!-- Link overlay para o primeiro botão -->
12
+ {% if value.links %}
13
+ {% for link_block in value.links %}
14
+ {% if forloop.first and link_block.block_type == 'button' %}
15
+ {% with button_value=link_block.value %}
16
+ {% if button_value.link_url %}
17
+ <a href="{{ button_value.link_url }}" class="card-overlay-link"
18
+ {% if button_value.link_target %}target="{{ button_value.link_target }}"{% endif %}></a>
19
+ {% elif button_value.link_page %}
20
+ <a href="{{ button_value.link_page.url }}" class="card-overlay-link"></a>
21
+ {% endif %}
22
+ {% endwith %}
23
+ {% endif %}
24
+ {% endfor %}
25
+ {% endif %}
26
+
27
+ <div class="card-info-icon-container">
28
+ {% if value.image %}
29
+ {% image value.image fill-120x120 format-webp preserve-svg as card_img %}
30
+ <div class="card-info-icon" style="background-image: url('{{ card_img.url }}');"></div>
31
+ {% elif value.icone %}
32
+ <i class="card-info-icone {{ value.icone }}"></i>
33
+ {% endif %}
34
+ </div>
35
+
36
+ <div class="card-info-content">
37
+ {% if value.title %}
38
+ <h3 class="card-info-title">{{ value.title }}</h3>
39
+ {% endif %}
40
+
41
+ {% if value.description %}
42
+ <div class="card-info-description">{{ value.description|richtext }}</div>
43
+ {% endif %}
44
+
45
+ {% if value.links %}
46
+ <div class="card-info-buttons">
47
+ {% for link_block in value.links %}
48
+ {% if link_block.block_type == 'button' %}
49
+ {% include_block link_block %}
50
+ {% endif %}
51
+ {% endfor %}
52
+ </div>
53
+ {% endif %}
54
+ </div>
55
+ </div>
56
+ {% elif value.type == 'card-bgimage' %}
9
57
  {% if value.image %}
10
58
  {% image value.image original format-webp as card_bg_img %}
11
59
  <div class="card-bgimage" style="background-image: url('{{ card_bg_img.url }}');">
@@ -231,7 +279,116 @@
231
279
  </div>
232
280
  {% endif %}
233
281
  </div>
282
+
234
283
  <style>
284
+ /* Cards Informativos */
285
+ .card-info-white .card-info-container {
286
+ display: flex;
287
+ align-items: flex-start;
288
+ gap: 20px;
289
+ padding: 24px;
290
+ border-left: 4px solid #024248;
291
+ background-color: #FFFFFF;
292
+ position: relative;
293
+ flex-direction: column;
294
+ }
295
+
296
+ .card-info-dark .card-info-container {
297
+ display: flex;
298
+ align-items: flex-start;
299
+ gap: 20px;
300
+ padding: 24px;
301
+ border-left: 4px solid #AFF0ED;
302
+ background-color: #024248;
303
+ position: relative;
304
+ flex-direction: column;
305
+ }
306
+
307
+ .card-info-icon-container {
308
+ flex-shrink: 0;
309
+ }
310
+
311
+ .card-info-icone {
312
+ font-size: 56px;
313
+ }
314
+
315
+ .card-info-white .card-info-icone {
316
+ color: #024248;
317
+ }
318
+
319
+ .card-info-dark .card-info-icone {
320
+ color: #AFF0ED;
321
+ }
322
+
323
+ .card-info-icon {
324
+ width: 56px;
325
+ height: 56px;
326
+ background-size: contain;
327
+ background-repeat: no-repeat;
328
+ background-position: center;
329
+ }
330
+
331
+ .card-info-content {
332
+ flex: 1;
333
+ display: flex;
334
+ flex-direction: column;
335
+ gap: 12px;
336
+ }
337
+
338
+ .card-info-title {
339
+ font-size: 18px;
340
+ font-weight: 600;
341
+ margin: 0;
342
+ line-height: 1.4;
343
+ }
344
+
345
+ .card-info-white .card-info-title {
346
+ color: #1F2933;
347
+ }
348
+
349
+ .card-info-dark .card-info-title {
350
+ color: #FFFFFF;
351
+ }
352
+
353
+ .card-info-description p{
354
+ font-size: 16px;
355
+ line-height: 1.6;
356
+ margin: 0;
357
+ }
358
+
359
+ .card-info-white .card-info-description,
360
+ .card-info-white .card-info-description p {
361
+ color: #3E4C59;
362
+ }
363
+
364
+ .card-info-dark .card-info-description,
365
+ .card-info-dark .card-info-description p {
366
+ color: #E4E7EB;
367
+ }
368
+
369
+ .card-info-buttons {
370
+ margin-top: 8px;
371
+ }
372
+
373
+ /* Responsive */
374
+ @media (max-width: 768px) {
375
+ .card-info-white .card-info-container,
376
+ .card-info-dark .card-info-container {
377
+ flex-direction: column;
378
+ align-items: center;
379
+ text-align: center;
380
+ padding: 20px;
381
+ }
382
+
383
+ .card-info-title {
384
+ font-size: 18px;
385
+ }
386
+
387
+ .card-info-description {
388
+ font-size: 14px;
389
+ }
390
+ }
391
+
235
392
  .card-icone{
236
393
  text-align: center;
237
394
  font-size: 72px;
@@ -2,9 +2,9 @@
2
2
  {% load static %}
3
3
 
4
4
  {% block content %}
5
- <section class="section-card {{self.custom_class}}"
5
+ <section class="section-card"
6
6
  {% if self.id_slug %}id="{{self.id_slug}}"{% endif %}
7
- style="{% if self.custom_class == 'bg-enap-100' %}background-color: #02333A;{% elif self.custom_class == 'bg-enap-90' %}background-color: #024248;{% elif self.custom_class == 'bg-enap-80' %}background-color: #025257;{% elif self.custom_class == 'bg-enap-70' %}background-color: #006969;{% elif self.custom_class == 'bg-enap-50' %}background-color: #10A39E;{% elif self.custom_class == 'bg-enap-40' %}background-color: #30BFBC;{% elif self.custom_class == 'bg-enap-30' %}background-color: #70E0DF;{% elif self.custom_class == 'bg-enap-20' %}background-color: #AFF0ED;{% elif self.custom_class == 'bg-enap-10' %}background-color: #D6F9F8;{% elif self.custom_class == 'bg-blue' %}background-color: #EBEFF5;{% elif self.custom_class == 'bg-gray' %}background-color: #F5F7FA;{% elif self.custom_class == 'bg-whitetwo' %}background-color: #F7F7F7;{% elif self.custom_class == 'bg-darkgreen' %}background-color: #012124;{% elif self.custom_class == 'bg-gray-light' %}background-color: #F8F9FA;{% elif self.custom_class == 'bg-gray-medium' %}background-color: #E9ECEF;{% else %}background-color: #ffffff;{% endif %} {% if value.cor_fundo %}background-color: {{ value.cor_fundo }} !important{% endif %}">
7
+ style="background-color: {{ self.custom_class }};">
8
8
 
9
9
  <!-- Espaçamento superior baseado na escolha do admin -->
10
10
  <div style="height: {% if self.spacing == 'none' %}0px{% elif self.spacing == 'small' %}20px{% elif self.spacing == 'medium' %}40px{% elif self.spacing == 'large' %}60px{% elif self.spacing == 'extra-large' %}80px{% else %}40px{% endif %};"></div>
@@ -13,12 +13,12 @@
13
13
  {% if self.title or self.subtitle %}
14
14
  <div class="container-medium">
15
15
  <div>
16
- <div class="wrapper-text-blue" style="max-width: {{value.max_width}};">
16
+ <div class="wrapper-text-blue" style="max-width: {{self.max_width}};">
17
17
  {% if self.title %}
18
- <h2 style="color: {{ value.cor_titulo }}" class="h2-blue-large {% if self.custom_class == 'bg-darkgreen' or self.custom_class == 'bg-enap-100' or self.custom_class == 'bg-enap-90' or self.custom_class == 'bg-enap-80' or self.custom_class == 'bg-enap-70' or self.custom_class == 'bg-enap-50' or self.custom_class == 'bg-enap-40' %}white{% endif %}">{{self.title}}</h2>
18
+ <h2 class="h2-blue-large {% if self.custom_class == '#02333A' or self.custom_class == '#024248' or self.custom_class == '#025257' or self.custom_class == '#006969' or self.custom_class == '#2F134F' or self.custom_class == '#132929' or self.custom_class == '#25552A' or self.custom_class == '#DB8C3F' or self.custom_class == '#3A8A9C' or self.custom_class == '#818C27' %}white{% endif %}">{{self.title}}</h2>
19
19
  {% endif %}
20
20
  {% if self.subtitle %}
21
- <div class="{% if self.custom_class == 'bg-darkgreen' or self.custom_class == 'bg-enap-100' or self.custom_class == 'bg-enap-90' or self.custom_class == 'bg-enap-80' or self.custom_class == 'bg-enap-70' or self.custom_class == 'bg-enap-50' or self.custom_class == 'bg-enap-40' %}white{% endif %}">
21
+ <div class="{% if self.custom_class == '#02333A' or self.custom_class == '#024248' or self.custom_class == '#025257' or self.custom_class == '#006969' or self.custom_class == '#2F134F' or self.custom_class == '#132929' or self.custom_class == '#25552A' or self.custom_class == '#DB8C3F' or self.custom_class == '#3A8A9C' or self.custom_class == '#818C27' %}white{% endif %}">
22
22
  {{self.subtitle}}
23
23
  </div>
24
24
  {% endif %}