wagtail-enap-designsystem 1.2.1.121__py3-none-any.whl → 1.2.1.123__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/__init__.py +4 -0
- enap_designsystem/blocks/form.py +101 -6
- enap_designsystem/blocks/html_blocks.py +199 -52
- enap_designsystem/blocks/semana_inovacao.py +7 -1
- enap_designsystem/middleware/aluno_sso.py +16 -0
- enap_designsystem/migrations/0382_alter_areaaluno_body_alter_cursoeadpage_curso_and_more.py +51080 -0
- enap_designsystem/migrations/0383_alter_areaaluno_body_alter_enapcomponentes_body_and_more.py +50922 -0
- enap_designsystem/migrations/0384_alter_areaaluno_body_alter_enapcomponentes_body_and_more.py +51606 -0
- enap_designsystem/migrations/0385_alter_areaaluno_body_alter_enapcomponentes_body_and_more.py +51947 -0
- enap_designsystem/migrations/0386_alter_areaaluno_body_alter_enapcomponentes_body_and_more.py +51809 -0
- enap_designsystem/models.py +0 -27
- enap_designsystem/templates/custom_404.html +1 -1
- enap_designsystem/templates/enap_designsystem/blocks/apresentacao_block.html +116 -0
- enap_designsystem/templates/enap_designsystem/blocks/apresentacao_simple_block.html +236 -0
- enap_designsystem/templates/enap_designsystem/form_templates/formulario_page.html +490 -13
- enap_designsystem/templates/enap_designsystem/includes/form_field.html +661 -4
- enap_designsystem/templates/enap_designsystem/pages/mba_especializacao.html +10 -0
- enap_designsystem/templates/enap_designsystem/sistema_votacao_page.html +194 -202
- enap_designsystem/urls.py +6 -3
- enap_designsystem/views.py +118 -153
- enap_designsystem/wagtail_hooks.py +235 -77
- {wagtail_enap_designsystem-1.2.1.121.dist-info → wagtail_enap_designsystem-1.2.1.123.dist-info}/METADATA +1 -1
- {wagtail_enap_designsystem-1.2.1.121.dist-info → wagtail_enap_designsystem-1.2.1.123.dist-info}/RECORD +26 -18
- {wagtail_enap_designsystem-1.2.1.121.dist-info → wagtail_enap_designsystem-1.2.1.123.dist-info}/WHEEL +0 -0
- {wagtail_enap_designsystem-1.2.1.121.dist-info → wagtail_enap_designsystem-1.2.1.123.dist-info}/licenses/LICENSE +0 -0
- {wagtail_enap_designsystem-1.2.1.121.dist-info → wagtail_enap_designsystem-1.2.1.123.dist-info}/top_level.txt +0 -0
|
@@ -26,6 +26,8 @@ from .html_blocks import (
|
|
|
26
26
|
TimelineBlock,
|
|
27
27
|
JobVacancyFilteredBlock,
|
|
28
28
|
FormularioDinamicoBlock,
|
|
29
|
+
ApresentacaoBlock,
|
|
30
|
+
ApresentacaoSimpleBlock,
|
|
29
31
|
)
|
|
30
32
|
|
|
31
33
|
from .semana_blocks import (
|
|
@@ -353,6 +355,8 @@ class ContentStreamBlock(StreamBlock):
|
|
|
353
355
|
feature_list = FeatureListBlock(label="📋 Lista de Features")
|
|
354
356
|
feature_list_text = FeatureWithLinksBlock(label="🔗 Features com Links")
|
|
355
357
|
html = HTMLCustomBlock(label="🔧 HTML Customizado")
|
|
358
|
+
apresentcao = ApresentacaoBlock(label="📰 Componente simples com título, quadrado de conteúdo e botão")
|
|
359
|
+
ApresentacaoBlock = ApresentacaoSimpleBlock(label="Componente com título, texto e grid flexível de cards")
|
|
356
360
|
|
|
357
361
|
class Meta:
|
|
358
362
|
label = "📰 Conteúdo e Texto"
|
enap_designsystem/blocks/form.py
CHANGED
|
@@ -546,17 +546,15 @@ class NomeCompletoFieldBlock(blocks.StructBlock):
|
|
|
546
546
|
|
|
547
547
|
|
|
548
548
|
|
|
549
|
+
|
|
549
550
|
BASE_FORM_FIELD_BLOCKS = [
|
|
550
551
|
('section_header', SectionHeaderBlock()),
|
|
551
|
-
('nome_completo_field', NomeCompletoFieldBlock()),
|
|
552
552
|
('text_field', TextFieldBlock()),
|
|
553
553
|
('email_field', EmailFieldBlock()),
|
|
554
|
-
('cnpj_field', CNPJFieldBlock()),
|
|
555
554
|
('cpf_field', CPFFieldBlock()),
|
|
556
555
|
('phone_field', PhoneFieldBlock()),
|
|
557
556
|
('textarea_field', TextAreaFieldBlock()),
|
|
558
557
|
('number_field', NumberFieldBlock()),
|
|
559
|
-
('estado_cidade_field', EstadoCidadeFieldBlock()),
|
|
560
558
|
('date_field', DateFieldBlock()),
|
|
561
559
|
('dropdown_field', DropdownFieldBlock()),
|
|
562
560
|
('country_field', CountryFieldBlock()),
|
|
@@ -569,6 +567,103 @@ BASE_FORM_FIELD_BLOCKS = [
|
|
|
569
567
|
('divider', DividerBlock()),
|
|
570
568
|
]
|
|
571
569
|
|
|
570
|
+
# 2. DEPOIS: Definir as classes que usam BASE_FORM_FIELD_BLOCKS
|
|
571
|
+
|
|
572
|
+
class CheckboxMultiRedirectFieldBlock(blocks.StructBlock):
|
|
573
|
+
"""Checkbox com múltiplas opções de redirecionamento - Sistema avançado"""
|
|
574
|
+
|
|
575
|
+
# Pergunta principal
|
|
576
|
+
label = blocks.CharBlock(
|
|
577
|
+
label="Pergunta/Título",
|
|
578
|
+
max_length=255,
|
|
579
|
+
help_text="Ex: Informações sobre dependentes"
|
|
580
|
+
)
|
|
581
|
+
|
|
582
|
+
help_text = blocks.CharBlock(
|
|
583
|
+
label="Texto de ajuda",
|
|
584
|
+
required=False,
|
|
585
|
+
help_text="Instrução adicional para o usuário"
|
|
586
|
+
)
|
|
587
|
+
|
|
588
|
+
required = blocks.BooleanBlock(
|
|
589
|
+
label="Obrigatório",
|
|
590
|
+
default=True
|
|
591
|
+
)
|
|
592
|
+
|
|
593
|
+
# Tipo do campo
|
|
594
|
+
field_type = blocks.ChoiceBlock(
|
|
595
|
+
label="Tipo de campo",
|
|
596
|
+
choices=[
|
|
597
|
+
('checkbox', '☑️ Checkbox único (sim/não)'),
|
|
598
|
+
('radio', '🔘 Múltiplas opções (radio)'),
|
|
599
|
+
('dropdown', '📋 Lista suspensa'),
|
|
600
|
+
],
|
|
601
|
+
default='checkbox',
|
|
602
|
+
help_text="Escolha como o usuário vai responder"
|
|
603
|
+
)
|
|
604
|
+
|
|
605
|
+
# Opções com redirecionamentos
|
|
606
|
+
redirect_options = blocks.StreamBlock([
|
|
607
|
+
('option', blocks.StructBlock([
|
|
608
|
+
('value', blocks.CharBlock(
|
|
609
|
+
label="Texto da opção",
|
|
610
|
+
max_length=255,
|
|
611
|
+
help_text="Ex: 'Sim, tenho filhos', 'Não tenho dependentes', 'Sou menor de idade'"
|
|
612
|
+
)),
|
|
613
|
+
|
|
614
|
+
('action', blocks.ChoiceBlock(
|
|
615
|
+
label="Ação quando escolher esta opção",
|
|
616
|
+
choices=[
|
|
617
|
+
('continue', '➡️ Continuar normalmente'),
|
|
618
|
+
('next_step', '⏩ Pular para próxima etapa'),
|
|
619
|
+
('specific_section', '🎯 Ir para seção específica'),
|
|
620
|
+
('skip_to_end', '⏭️ Finalizar formulário'),
|
|
621
|
+
('show_fields', '👁️ Mostrar campos condicionais'),
|
|
622
|
+
],
|
|
623
|
+
default='continue'
|
|
624
|
+
)),
|
|
625
|
+
|
|
626
|
+
('target_section_title', blocks.CharBlock(
|
|
627
|
+
label="Nome da seção de destino",
|
|
628
|
+
max_length=255,
|
|
629
|
+
required=False,
|
|
630
|
+
help_text="Nome exato do divisor (necessário se escolheu 'Ir para seção específica')"
|
|
631
|
+
)),
|
|
632
|
+
|
|
633
|
+
('redirect_message', blocks.RichTextBlock(
|
|
634
|
+
label="Mensagem explicativa",
|
|
635
|
+
required=False,
|
|
636
|
+
features=['bold', 'italic', 'link'],
|
|
637
|
+
help_text="Mensagem mostrada ao usuário antes do redirecionamento"
|
|
638
|
+
)),
|
|
639
|
+
|
|
640
|
+
('fields_to_show', blocks.StreamBlock(
|
|
641
|
+
BASE_FORM_FIELD_BLOCKS, # Agora já está definido acima
|
|
642
|
+
label="Campos condicionais",
|
|
643
|
+
required=False,
|
|
644
|
+
help_text="Campos que aparecem apenas se esta opção for escolhida"
|
|
645
|
+
)),
|
|
646
|
+
|
|
647
|
+
('delay_seconds', blocks.IntegerBlock(
|
|
648
|
+
label="Delay antes do redirecionamento (segundos)",
|
|
649
|
+
default=1,
|
|
650
|
+
min_value=0,
|
|
651
|
+
max_value=10,
|
|
652
|
+
required=False,
|
|
653
|
+
help_text="Tempo de espera antes de executar o redirecionamento"
|
|
654
|
+
))
|
|
655
|
+
], label="Opção com Redirecionamento"))
|
|
656
|
+
],
|
|
657
|
+
label="Opções e Ações",
|
|
658
|
+
help_text="Configure as opções e o que acontece para cada uma",
|
|
659
|
+
min_num=1,
|
|
660
|
+
max_num=5
|
|
661
|
+
)
|
|
662
|
+
|
|
663
|
+
class Meta:
|
|
664
|
+
icon = "redirect"
|
|
665
|
+
label = "☑️🔀 Checkbox Multi-Redirecionamento"
|
|
666
|
+
|
|
572
667
|
|
|
573
668
|
class ConditionalFieldBlock(blocks.StructBlock):
|
|
574
669
|
"""Campo com ramificações condicionais - Super simples!"""
|
|
@@ -617,7 +712,7 @@ class ConditionalFieldBlock(blocks.StructBlock):
|
|
|
617
712
|
default='nothing'
|
|
618
713
|
)),
|
|
619
714
|
('fields_to_show', blocks.StreamBlock(
|
|
620
|
-
BASE_FORM_FIELD_BLOCKS, #
|
|
715
|
+
BASE_FORM_FIELD_BLOCKS, # Agora já está definido acima
|
|
621
716
|
label="Campos que aparecem",
|
|
622
717
|
required=False,
|
|
623
718
|
help_text="Campos que só aparecem se esta opção for escolhida"
|
|
@@ -633,12 +728,12 @@ class ConditionalFieldBlock(blocks.StructBlock):
|
|
|
633
728
|
label = "🔗 Campo Condicional"
|
|
634
729
|
|
|
635
730
|
|
|
636
|
-
|
|
731
|
+
# 3. POR ÚLTIMO: Criar a lista final com os campos avançados
|
|
637
732
|
FORM_FIELD_BLOCKS = BASE_FORM_FIELD_BLOCKS + [
|
|
733
|
+
('checkbox_multi_redirect_field', CheckboxMultiRedirectFieldBlock()),
|
|
638
734
|
('conditional_field', ConditionalFieldBlock()),
|
|
639
735
|
]
|
|
640
736
|
|
|
641
|
-
|
|
642
737
|
class FormStepBlock(StructBlock):
|
|
643
738
|
"""Bloco para uma etapa do formulário - apenas logo e campos"""
|
|
644
739
|
|
|
@@ -100,16 +100,16 @@ GRADIENT_COLOR_CHOICES = [
|
|
|
100
100
|
|
|
101
101
|
# Cores para badges e botões
|
|
102
102
|
ACCENT_COLOR_CHOICES = [
|
|
103
|
-
('
|
|
104
|
-
('
|
|
105
|
-
('
|
|
106
|
-
('
|
|
107
|
-
('
|
|
108
|
-
('
|
|
109
|
-
('
|
|
110
|
-
('
|
|
111
|
-
('
|
|
112
|
-
('#FFFFFF', 'Branco
|
|
103
|
+
('#024248', 'Verde ENAP'),
|
|
104
|
+
('#007D7A', 'Verde Link ENAP'),
|
|
105
|
+
('#007D7A', 'Verde ENAP 60'),
|
|
106
|
+
('#024248', 'Verde ENAP 90'),
|
|
107
|
+
('#F5F7FA', 'ENAP Cinza'),
|
|
108
|
+
('#AD6BFC', 'Roxo Gnova'),
|
|
109
|
+
('#B396FC', 'Roxo Claro Gnova'),
|
|
110
|
+
('#AD6BFC', 'Gnova'),
|
|
111
|
+
('#6366F1', 'Roxo'),
|
|
112
|
+
('#FFFFFF', 'Branco'),
|
|
113
113
|
]
|
|
114
114
|
|
|
115
115
|
|
|
@@ -7045,48 +7045,6 @@ class CarouselResponsivoSnippetBlock(SnippetChooserBlock):
|
|
|
7045
7045
|
|
|
7046
7046
|
|
|
7047
7047
|
|
|
7048
|
-
class Error404Block(StructBlock):
|
|
7049
|
-
"""Componente para página de erro 404"""
|
|
7050
|
-
|
|
7051
|
-
titulo = CharBlock(
|
|
7052
|
-
max_length=100,
|
|
7053
|
-
default="Ops! Página não encontrada",
|
|
7054
|
-
help_text="Título principal da página 404"
|
|
7055
|
-
)
|
|
7056
|
-
|
|
7057
|
-
subtitulo = CharBlock(
|
|
7058
|
-
max_length=200,
|
|
7059
|
-
default="A página que você está procurando não existe ou foi movida.",
|
|
7060
|
-
help_text="Descrição do erro"
|
|
7061
|
-
)
|
|
7062
|
-
|
|
7063
|
-
mensagem_adicional = RichTextBlock(
|
|
7064
|
-
required=False,
|
|
7065
|
-
help_text="Texto adicional (opcional)"
|
|
7066
|
-
)
|
|
7067
|
-
|
|
7068
|
-
mostrar_busca = BooleanBlock(
|
|
7069
|
-
default=True,
|
|
7070
|
-
required=False,
|
|
7071
|
-
help_text="Mostrar campo de busca"
|
|
7072
|
-
)
|
|
7073
|
-
|
|
7074
|
-
mostrar_links_uteis = BooleanBlock(
|
|
7075
|
-
default=True,
|
|
7076
|
-
required=False,
|
|
7077
|
-
help_text="Mostrar links para páginas importantes"
|
|
7078
|
-
)
|
|
7079
|
-
|
|
7080
|
-
class Meta:
|
|
7081
|
-
template = "enap_designsystem/blocks/error_404_block.html"
|
|
7082
|
-
icon = "warning"
|
|
7083
|
-
label = "Erro 404"
|
|
7084
|
-
help_text = "Componente para página de erro 404"
|
|
7085
|
-
|
|
7086
|
-
|
|
7087
|
-
|
|
7088
|
-
|
|
7089
|
-
|
|
7090
7048
|
|
|
7091
7049
|
|
|
7092
7050
|
class TimelineEtapaBlock(blocks.StructBlock):
|
|
@@ -7446,5 +7404,194 @@ class FormularioDinamicoBlock(blocks.StructBlock):
|
|
|
7446
7404
|
|
|
7447
7405
|
|
|
7448
7406
|
|
|
7407
|
+
class ApresentacaoBlock(blocks.StructBlock):
|
|
7408
|
+
"""
|
|
7409
|
+
Componente simples de apresentação com título, texto e botão
|
|
7410
|
+
Reutilizável para diferentes seções
|
|
7411
|
+
"""
|
|
7412
|
+
|
|
7413
|
+
# Cor de fundo da seção
|
|
7414
|
+
cor_fundo = blocks.ChoiceBlock(
|
|
7415
|
+
choices=BACKGROUND_COLOR_CHOICES,
|
|
7416
|
+
required=False,
|
|
7417
|
+
default='#F8F9FA',
|
|
7418
|
+
help_text="Cor de fundo do componente"
|
|
7419
|
+
)
|
|
7420
|
+
|
|
7421
|
+
# Título
|
|
7422
|
+
titulo = blocks.CharBlock(
|
|
7423
|
+
required=True,
|
|
7424
|
+
max_length=100,
|
|
7425
|
+
help_text="Título principal"
|
|
7426
|
+
)
|
|
7427
|
+
|
|
7428
|
+
cor_titulo = blocks.ChoiceBlock(
|
|
7429
|
+
choices=ENAP_GREEN_COLORS,
|
|
7430
|
+
required=False,
|
|
7431
|
+
default='#024248',
|
|
7432
|
+
help_text="Cor do título"
|
|
7433
|
+
)
|
|
7434
|
+
|
|
7435
|
+
# Quadrado de conteúdo
|
|
7436
|
+
cor_quadrado = blocks.ChoiceBlock(
|
|
7437
|
+
choices=BACKGROUND_COLOR_CHOICES,
|
|
7438
|
+
required=False,
|
|
7439
|
+
default='#FFFFFF',
|
|
7440
|
+
help_text="Cor de fundo do quadrado de conteúdo"
|
|
7441
|
+
)
|
|
7442
|
+
|
|
7443
|
+
conteudo = blocks.RichTextBlock(
|
|
7444
|
+
required=True,
|
|
7445
|
+
help_text="Conteúdo do quadrado (rich text)"
|
|
7446
|
+
)
|
|
7447
|
+
|
|
7448
|
+
# Botão
|
|
7449
|
+
botao_texto = blocks.CharBlock(
|
|
7450
|
+
required=True,
|
|
7451
|
+
max_length=50,
|
|
7452
|
+
help_text="Texto do botão"
|
|
7453
|
+
)
|
|
7454
|
+
|
|
7455
|
+
botao_url = blocks.URLBlock(
|
|
7456
|
+
required=False,
|
|
7457
|
+
help_text="URL de destino do botão"
|
|
7458
|
+
)
|
|
7459
|
+
|
|
7460
|
+
botao_icone = blocks.ChoiceBlock(
|
|
7461
|
+
choices=FONTAWESOME_ICON_CHOICES,
|
|
7462
|
+
required=False,
|
|
7463
|
+
default='',
|
|
7464
|
+
help_text="Ícone do botão"
|
|
7465
|
+
)
|
|
7466
|
+
|
|
7467
|
+
cor_botao = blocks.ChoiceBlock(
|
|
7468
|
+
choices=ACCENT_COLOR_CHOICES,
|
|
7469
|
+
required=False,
|
|
7470
|
+
default='#AD6BFC',
|
|
7471
|
+
help_text="Cor do botão"
|
|
7472
|
+
)
|
|
7473
|
+
|
|
7474
|
+
cor_botao_hover = blocks.ChoiceBlock(
|
|
7475
|
+
choices=ACCENT_COLOR_CHOICES,
|
|
7476
|
+
required=False,
|
|
7477
|
+
default='#B396FC',
|
|
7478
|
+
help_text="Cor do botão no hover"
|
|
7479
|
+
)
|
|
7480
|
+
|
|
7481
|
+
class Meta:
|
|
7482
|
+
template = 'enap_designsystem/blocks/apresentacao_block.html'
|
|
7483
|
+
icon = 'doc-full'
|
|
7484
|
+
label = 'Apresentação'
|
|
7485
|
+
help_text = 'Componente simples com título, quadrado de conteúdo e botão'
|
|
7486
|
+
|
|
7487
|
+
|
|
7488
|
+
|
|
7489
|
+
|
|
7490
|
+
|
|
7491
|
+
|
|
7492
|
+
|
|
7493
|
+
class ApresentacaoCardBlock(blocks.StructBlock):
|
|
7494
|
+
"""
|
|
7495
|
+
Card individual para usar dentro da apresentação
|
|
7496
|
+
"""
|
|
7497
|
+
# Ícone
|
|
7498
|
+
icone = blocks.ChoiceBlock(
|
|
7499
|
+
choices=FONTAWESOME_ICON_CHOICES,
|
|
7500
|
+
required=False,
|
|
7501
|
+
default='fa-solid fa-lightbulb',
|
|
7502
|
+
help_text="Ícone do card"
|
|
7503
|
+
)
|
|
7504
|
+
|
|
7505
|
+
# Título do card
|
|
7506
|
+
titulo = blocks.CharBlock(
|
|
7507
|
+
required=True,
|
|
7508
|
+
max_length=100,
|
|
7509
|
+
help_text="Título do card"
|
|
7510
|
+
)
|
|
7511
|
+
|
|
7512
|
+
# Descrição
|
|
7513
|
+
descricao = blocks.TextBlock(
|
|
7514
|
+
required=True,
|
|
7515
|
+
help_text="Descrição do card"
|
|
7516
|
+
)
|
|
7517
|
+
|
|
7518
|
+
class Meta:
|
|
7519
|
+
icon = 'doc-empty'
|
|
7520
|
+
label = 'Card'
|
|
7449
7521
|
|
|
7450
7522
|
|
|
7523
|
+
class ApresentacaoSimpleBlock(blocks.StructBlock):
|
|
7524
|
+
"""
|
|
7525
|
+
Componente simples de apresentação com título, texto e grid de cards
|
|
7526
|
+
"""
|
|
7527
|
+
|
|
7528
|
+
# Background
|
|
7529
|
+
cor_fundo = blocks.ChoiceBlock(
|
|
7530
|
+
choices=BACKGROUND_COLOR_CHOICES,
|
|
7531
|
+
required=False,
|
|
7532
|
+
default='#6A1B9A', # Roxo como na imagem
|
|
7533
|
+
help_text="Cor de fundo do componente"
|
|
7534
|
+
)
|
|
7535
|
+
|
|
7536
|
+
# Título
|
|
7537
|
+
titulo = blocks.CharBlock(
|
|
7538
|
+
required=True,
|
|
7539
|
+
max_length=200,
|
|
7540
|
+
help_text="Título principal"
|
|
7541
|
+
)
|
|
7542
|
+
|
|
7543
|
+
cor_titulo = blocks.ChoiceBlock(
|
|
7544
|
+
choices=ENAP_GREEN_COLORS + [('#FFFFFF', 'Branco (#FFFFFF)')],
|
|
7545
|
+
required=False,
|
|
7546
|
+
default='#FFFFFF',
|
|
7547
|
+
help_text="Cor do título"
|
|
7548
|
+
)
|
|
7549
|
+
|
|
7550
|
+
# Quadrado de conteúdo
|
|
7551
|
+
cor_quadrado = blocks.ChoiceBlock(
|
|
7552
|
+
choices=BACKGROUND_COLOR_CHOICES,
|
|
7553
|
+
required=False,
|
|
7554
|
+
default='#FFFFFF',
|
|
7555
|
+
help_text="Cor de fundo do quadrado de conteúdo"
|
|
7556
|
+
)
|
|
7557
|
+
|
|
7558
|
+
# Rich text
|
|
7559
|
+
conteudo = blocks.RichTextBlock(
|
|
7560
|
+
required=True,
|
|
7561
|
+
help_text="Conteúdo descritivo (rich text)"
|
|
7562
|
+
)
|
|
7563
|
+
|
|
7564
|
+
cor_texto = blocks.ChoiceBlock(
|
|
7565
|
+
choices=ENAP_GREEN_COLORS,
|
|
7566
|
+
required=False,
|
|
7567
|
+
default='#024248',
|
|
7568
|
+
help_text="Cor do texto do conteúdo"
|
|
7569
|
+
)
|
|
7570
|
+
|
|
7571
|
+
# Grid de cards
|
|
7572
|
+
grid_tipo = blocks.ChoiceBlock(
|
|
7573
|
+
choices=[
|
|
7574
|
+
('cards-grid-1', '1 card por linha'),
|
|
7575
|
+
('cards-grid-2', 'Até 2 cards'),
|
|
7576
|
+
('cards-grid-3', 'Até 3 cards'),
|
|
7577
|
+
('cards-grid-4', 'Até 4 cards'),
|
|
7578
|
+
('cards-grid-5', 'Até 5 cards')
|
|
7579
|
+
],
|
|
7580
|
+
default='cards-grid-5',
|
|
7581
|
+
help_text="Quantos cards por linha",
|
|
7582
|
+
label="Cards por linha"
|
|
7583
|
+
)
|
|
7584
|
+
|
|
7585
|
+
# Stream de cards
|
|
7586
|
+
cards = blocks.StreamBlock([
|
|
7587
|
+
('card', ApresentacaoCardBlock()),
|
|
7588
|
+
],
|
|
7589
|
+
required=False,
|
|
7590
|
+
help_text="Adicione quantos cards precisar"
|
|
7591
|
+
)
|
|
7592
|
+
|
|
7593
|
+
class Meta:
|
|
7594
|
+
template = 'enap_designsystem/blocks/apresentacao_simple_block.html'
|
|
7595
|
+
icon = 'doc-full'
|
|
7596
|
+
label = 'Apresentação com Cards'
|
|
7597
|
+
help_text = 'Componente com título, texto e grid flexível de cards'
|
|
@@ -1251,4 +1251,10 @@ class SejaAvaliador(Page):
|
|
|
1251
1251
|
|
|
1252
1252
|
class Meta:
|
|
1253
1253
|
verbose_name = "Concurso de inovação - Seja Avaliador"
|
|
1254
|
-
verbose_name_plural = "Concurso de inovação - Seja Avaliador"
|
|
1254
|
+
verbose_name_plural = "Concurso de inovação - Seja Avaliador"
|
|
1255
|
+
|
|
1256
|
+
|
|
1257
|
+
|
|
1258
|
+
|
|
1259
|
+
|
|
1260
|
+
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
class AlunoSSOMiddleware:
|
|
2
|
+
def __init__(self, get_response):
|
|
3
|
+
self.get_response = get_response
|
|
4
|
+
|
|
5
|
+
def __call__(self, request):
|
|
6
|
+
aluno = request.session.get("aluno_sso")
|
|
7
|
+
if aluno:
|
|
8
|
+
request.aluno = aluno
|
|
9
|
+
nome_completo = aluno.get("nome", "")
|
|
10
|
+
request.primeiro_nome = nome_completo.split(" ")[0] if nome_completo else "Aluno"
|
|
11
|
+
else:
|
|
12
|
+
request.aluno = None
|
|
13
|
+
request.primeiro_nome = None
|
|
14
|
+
|
|
15
|
+
response = self.get_response(request)
|
|
16
|
+
return response
|