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