wagtail-enap-designsystem 1.2.1.151__py3-none-any.whl → 1.2.1.153__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.
@@ -533,21 +533,74 @@ class NewsCarouselBlock(BaseBlock):
533
533
  indexer = value["indexed_by"].specific
534
534
  num_posts = value["num_posts"]
535
535
 
536
- # pages = indexer.get_index_children()
537
- # pages = indexer.get_children().live()
538
- pages = indexer.get_children().live().order_by("-first_published_at")[:50]
536
+ # Import dinâmico para evitar imports circulares
537
+ try:
538
+ from django.apps import apps
539
+ ENAPNoticia = apps.get_model('enap_designsystem', 'ENAPNoticia')
540
+ except (ImportError, LookupError):
541
+ # Se não encontrar a classe, usar lógica original OTIMIZADA
542
+ pages = indexer.get_children().live().select_related('content_type').order_by("-first_published_at")[:50]
543
+
544
+ def get_page_date(page):
545
+ return getattr(page.specific, "date_display", None) or page.first_published_at.date()
546
+
547
+ pages_final = sorted(pages, key=get_page_date, reverse=True)[:num_posts]
548
+ context["pages"] = pages_final
549
+ return context
550
+
551
+
552
+ all_children = indexer.get_children().live().select_related('content_type')[:20]
553
+ enap_noticias = []
554
+ outras_pages = []
555
+ noticias_ids = set() # Usar set para busca O(1)
556
+
557
+ for page in all_children:
558
+ if isinstance(page.specific, ENAPNoticia):
559
+ enap_noticias.append(page.specific)
560
+ noticias_ids.add(page.specific.id)
561
+ else:
562
+ outras_pages.append(page)
563
+
564
+
565
+ if enap_noticias:
566
+ # Ordenar TODAS as notícias por data primeiro
567
+ def get_page_date(page):
568
+ return getattr(page, "date_display", None) or page.first_published_at.date()
569
+
570
+ todas_noticias_ordenadas = sorted(enap_noticias, key=get_page_date, reverse=True)
571
+
572
+ # Pegar a notícia em destaque (se estiver entre as filhas) COM PROTEÇÃO
573
+ destaque = None
574
+ try:
575
+ destaque_temp = ENAPNoticia.get_noticia_destaque()
576
+ if destaque_temp and destaque_temp.id in noticias_ids:
577
+ destaque = destaque_temp
578
+ except Exception:
579
+ destaque = None
580
+
581
+ if destaque:
582
+ # Remove o destaque da lista ordenada
583
+ noticias_sem_destaque = [n for n in todas_noticias_ordenadas if n.id != destaque.id]
584
+
585
+ # Destaque primeiro, depois as outras em ordem cronológica
586
+ pages_final = [destaque] + noticias_sem_destaque[:num_posts-1]
587
+ else:
588
+ # Não há destaque entre as filhas, ordenação normal
589
+ pages_final = todas_noticias_ordenadas[:num_posts]
539
590
 
540
- # Função personalizada para obter a data correta dependendo do tipo de página
541
- def get_page_date(page):
542
- return getattr(page.specific, "date_display", None) or page.first_published_at.date()
591
+ else:
592
+ pages = indexer.get_children().live().select_related('content_type').order_by("-first_published_at")[:50]
593
+
594
+ def get_page_date(page):
595
+ return getattr(page.specific, "date_display", None) or page.first_published_at.date()
543
596
 
544
- # Ordenar as páginas com base na data correta
545
- pages_ordered = sorted(pages, key=get_page_date, reverse=True)[:num_posts]
597
+ pages_final = sorted(pages, key=get_page_date, reverse=True)[:num_posts]
546
598
 
547
- # Limitar o número de páginas a ser exibido, conforme o valor de `num_posts`
548
- context["pages"] = pages_ordered
599
+ context["pages"] = pages_final
549
600
  return context
550
601
 
602
+
603
+
551
604
  class CoursesCarouselBlock(BaseBlock):
552
605
  """
553
606
  Renders a carousel of selected news pages.
@@ -1902,7 +1955,6 @@ class ENAPNoticiasIndexPage(Page):
1902
1955
  return context
1903
1956
 
1904
1957
 
1905
-
1906
1958
  class ENAPNoticia(Page):
1907
1959
  """Modelo base para novas notícias (customizável depois)."""
1908
1960
 
@@ -1938,6 +1990,12 @@ class ENAPNoticia(Page):
1938
1990
  help_text=_("Imagem principal da notícia para exibição externa (listagens, cards, etc)."),
1939
1991
  )
1940
1992
 
1993
+ destaque_fixo = models.BooleanField(
1994
+ default=False,
1995
+ verbose_name=_("Destaque Fixo na Home"),
1996
+ help_text=_("Marque para manter esta notícia fixa em destaque na página inicial, independente da ordem cronológica."),
1997
+ )
1998
+
1941
1999
  author = models.ForeignKey(
1942
2000
  settings.AUTH_USER_MODEL,
1943
2001
  null=True,
@@ -1996,6 +2054,7 @@ class ENAPNoticia(Page):
1996
2054
  FieldPanel('subtitulo'),
1997
2055
  FieldPanel('legenda_home'),
1998
2056
  FieldPanel('imagem_externa'),
2057
+ FieldPanel('destaque_fixo'),
1999
2058
  ],
2000
2059
  heading=_("Informações Básicas"),
2001
2060
  ),
@@ -2108,6 +2167,41 @@ class ENAPNoticia(Page):
2108
2167
 
2109
2168
  return re.sub(r"\s+", " ", " ".join([t for t in textos if t])).strip()
2110
2169
 
2170
+ # ========================================
2171
+ # MÉTODOS PARA CONSULTAR NOTÍCIAS
2172
+ # ========================================
2173
+
2174
+ @classmethod
2175
+ def get_noticia_destaque(cls):
2176
+ """Retorna a notícia marcada como destaque fixo"""
2177
+ return cls.objects.filter(
2178
+ live=True,
2179
+ destaque_fixo=True
2180
+ ).first()
2181
+
2182
+ @classmethod
2183
+ def get_noticias_normais(cls, limit=5):
2184
+ """Retorna outras notícias (sem a de destaque) ordenadas por data"""
2185
+ return cls.objects.filter(
2186
+ live=True,
2187
+ destaque_fixo=False
2188
+ ).order_by('-date_display', '-first_published_at')[:limit]
2189
+
2190
+ @classmethod
2191
+ def get_todas_noticias_ordenadas(cls, limit=6):
2192
+ """
2193
+ Retorna todas as notícias com a de destaque primeiro,
2194
+ depois as outras por ordem cronológica
2195
+ """
2196
+ destaque = cls.get_noticia_destaque()
2197
+ normais = cls.get_noticias_normais(limit - 1 if destaque else limit)
2198
+
2199
+ if destaque:
2200
+ # Destaque primeiro, depois as normais
2201
+ return [destaque] + list(normais)
2202
+ else:
2203
+ return list(normais)
2204
+
2111
2205
  search_fields = Page.search_fields + [
2112
2206
  index.SearchField("title", boost=3),
2113
2207
  index.SearchField("titulo_filter", name="titulo"),
@@ -2126,7 +2220,6 @@ class ENAPNoticia(Page):
2126
2220
 
2127
2221
  template = "enap_designsystem/pages/article/enap_noticia.html"
2128
2222
 
2129
-
2130
2223
  class ENAPNoticiaImportada(Page):
2131
2224
  """Página exclusiva para exibir artigos importados do Joomla, sem edição."""
2132
2225
 
@@ -1298,6 +1298,11 @@ class MenuNavigationBlock(blocks.StructBlock):
1298
1298
  help_text="Imagem de logo da esquerda"
1299
1299
  )
1300
1300
 
1301
+ logo_url = blocks.URLBlock(
1302
+ required=False,
1303
+ help_text="Link ao clicar na logo"
1304
+ )
1305
+
1301
1306
  cor_fundo = blocks.CharBlock(
1302
1307
  default='#132929',
1303
1308
  help_text="Cor de fundo do menu"