Skip to content

Adiciona filtro de coleção na listagem administrativa de Articles#946

Open
Copilot wants to merge 6 commits intomainfrom
copilot/add-collection-field-to-articles-again
Open

Adiciona filtro de coleção na listagem administrativa de Articles#946
Copilot wants to merge 6 commits intomainfrom
copilot/add-collection-field-to-articles-again

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Apr 28, 2026

O que esse PR faz?

Adiciona a coluna e o filtro de Coleção na listagem administrativa de Articles > Articles, permitindo identificar a qual coleção cada registro pertence, filtrar por coleção e combinar esse filtro com os demais (journal, status) e com a caixa de busca. Adicionalmente, expõe properties reutilizáveis de coleções vinculadas em Article, Journal e Issue, todas resolvidas via reverse FK lookup em Collection a partir dos respectivos *Proc (ArticleProc, JournalProc, IssueProc).

Onde a revisão poderia começar?

  • article/wagtail_hooks.pyArticleSnippetViewSet (list_display, list_filter, search_fields)
  • article/models.py — novas properties Article.collections, Article.collections_acron, Article.collections_name e Article.display_collections
  • journal/models.py — novas properties Journal.collections, Journal.collections_acron, Journal.collections_name
  • issue/models.py — novas properties Issue.collections, Issue.collections_acron, Issue.collections_name

Como este poderia ser testado manualmente?

  1. Acessar Admin > Snippets > Articles > Articles.
  2. Verificar a nova coluna Display collections exibindo os acrônimos das coleções de cada artigo.
  3. No painel lateral de filtros, selecionar uma coleção e confirmar que a lista é restrita aos artigos vinculados àquela coleção (via ArticleProc).
  4. Combinar o filtro de coleção com o filtro de journal e/ou status.
  5. Combinar o filtro com a caixa de busca (ex.: PID, acrônimo/nome da coleção).
  6. Em um shell Django, validar as novas properties:
    • article.collections, article.collections_acron, article.collections_name
    • journal.collections, journal.collections_acron, journal.collections_name
    • issue.collections, issue.collections_acron, issue.collections_name

Algum cenário de contexto que queira dar?

Article não possui FK direta para Collection. A coleção é obtida a partir do *Proc correspondente, que já mantém uma FK direta para Collection:

  • Articlesps_pkgArticleProc.collection
  • IssueIssueProc.collection
  • JournalJournalProc.collection

Portanto:

  • list_filter e search_fields do ArticleSnippetViewSet usam o lookup sps_pkg__articleproc__collection (em vez de journal__journal_collections__collection).
  • Journal.collections* consultam Collection.objects.filter(journalproc__journal=self).
  • Issue.collections* consultam Collection.objects.filter(issueproc__issue=self) (não delegam ao journal — um issue pode ter sua própria associação via proc).
  • Article.collections* consultam Collection.objects.filter(articleproc__sps_pkg=self.sps_pkg), seguindo o mesmo padrão de Issue e Journal.
  • Article.display_collections reutiliza collections_acron para formatar os acrônimos ordenados.

As properties *_acron e *_name retornam listas ordenadas (via order_by no banco) e usam .distinct() para evitar duplicatas. O get_queryset existente do viewset também aplica .distinct(), evitando duplicatas geradas pelo JOIN.

Pontos a avaliar na revisão:

  • Performance (N+1): display_collections faz uma query por linha. Se desejado, pode-se adicionar prefetch_related("sps_pkg__articleproc_set__collection") em get_queryset.
  • Escopo por permissão: o viewset ainda não restringe o queryset por coleções do usuário (comportamento prévio mantido — fora do escopo desta issue).

Screenshots

N/A (mudanças requerem ambiente Wagtail com dados para visualização).

Quais são tickets relevantes?

Issue referenciada nos comentários do PR.

Referências

  • Padrão análogo em proc/wagtail_hooks.py (ArticleProcViewSet), que já utiliza collection em list_filter.
  • Property display_sections em article/models.py como modelo para display_collections.

Copilot AI changed the title [WIP] Add collection field to articles records Adiciona filtro de coleção na listagem administrativa de Articles Apr 28, 2026
Copilot AI requested a review from robertatakenaka April 28, 2026 20:30
@robertatakenaka robertatakenaka marked this pull request as ready for review April 28, 2026 23:02
Copilot AI review requested due to automatic review settings April 28, 2026 23:02
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adiciona suporte a Coleção na listagem administrativa de Snippets > Articles > Articles, permitindo exibição em coluna, filtro lateral e busca por atributos da coleção via relacionamento indireto Article.journal -> JournalCollection.collection.

Changes:

  • Inclui display_collections em list_display para exibir acrônimos das coleções associadas ao journal do artigo.
  • Adiciona filtro por coleção via journal__journal_collections__collection e amplia search_fields para collection__acron e collection__name.
  • Cria a property Article.display_collections para renderização do valor na listagem.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.

File Description
article/wagtail_hooks.py Adiciona coluna, filtro e campos de busca para Coleção na listagem do snippet de Article.
article/models.py Implementa display_collections para obter e formatar os acrônimos das coleções do journal do artigo.

Comment thread article/models.py Outdated
Comment on lines +413 to +418
acrons = (
self.journal.journal_collections.filter(collection__isnull=False)
.values_list("collection__acron", flat=True)
.distinct()
)
return ", ".join(sorted(a for a in acrons if a))
Comment thread article/models.py Outdated
Comment on lines +410 to +418
def display_collections(self):
if not self.journal_id:
return ""
acrons = (
self.journal.journal_collections.filter(collection__isnull=False)
.values_list("collection__acron", flat=True)
.distinct()
)
return ", ".join(sorted(a for a in acrons if a))
@robertatakenaka
Copy link
Copy Markdown
Member

@copilot verifique se journal e issue tem property que retornam as coleções vinculadas. Se Journal e Issue não os tem, crie para Journal e Issue uma property que retorne nome ou acron das coleções a quais estão vinculados

Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 29, 2026

@copilot verifique se journal e issue tem property que retornam as coleções vinculadas. Se Journal e Issue não os tem, crie para Journal e Issue uma property que retorne nome ou acron das coleçõe...

Verifiquei: nem Journal nem Issue tinham essa property. Em 79e213e adicionei em Journal as properties collections (queryset de Collection), collections_acron e collections_name, e em Issue as mesmas properties que delegam para self.journal. Article.display_collections foi refatorado para reutilizar journal.collections_acron.

@robertatakenaka
Copy link
Copy Markdown
Member

@copilot a collection pode ser obtida acessando o ArticleProc / IssueProc / JournalProc vinculados

Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 29, 2026

@copilot a collection pode ser obtida acessando o ArticleProc / IssueProc / JournalProc vinculados

Atualizado em 23d9c75:

  • Journal.collections* agora consultam JournalProc.objects.filter(journal=self).
  • Issue.collections* consultam IssueProc.objects.filter(issue=self) (em vez de delegar ao journal).
  • Article.display_collections consulta ArticleProc.objects.filter(sps_pkg_id=self.sps_pkg_id).
  • O list_filter/search_fields do ArticleSnippetViewSet passou a usar sps_pkg__articleproc__collection (em vez de journal__journal_collections__collection).

@robertatakenaka
Copy link
Copy Markdown
Member

@copilot pode ser mais simples, veja

Para Issue:

@property
def collections(self):
    from collection.models import Collection

    return Collection.objects.filter(
        issueproc__issue=self,
    ).distinct()

@property
def collections_acron(self):
    from collection.models import Collection

    return list(
        Collection.objects.filter(
            issueproc__issue=self,
        )
        .values_list("acron", flat=True)
        .distinct()
        .order_by("acron")
    )

@property
def collections_name(self):
    from collection.models import Collection

    return list(
        Collection.objects.filter(
            issueproc__issue=self,
        )
        .values_list("name", flat=True)
        .distinct()
        .order_by("name")
    )

Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 29, 2026

@copilot pode ser mais simples, veja

Para Issue:
...

Aplicado em e801e3e — properties de Issue e Journal simplificadas no padrão sugerido (Collection.objects.filter(issueproc__issue=self) / journalproc__journal=self), e Article.display_collections segue o mesmo padrão via articleproc__sps_pkg_id=self.sps_pkg_id.

@robertatakenaka
Copy link
Copy Markdown
Member

@copilot veja como foi feito para Issue e faça análogo para Article e Journal

Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 29, 2026

@copilot veja como foi feito para Issue e faça análogo para Article e Journal

Aplicado em 310c9f5 — adicionei em Article as properties collections, collections_acron e collections_name no mesmo padrão de Issue (filtrando Collection.objects.filter(articleproc__sps_pkg=self.sps_pkg)), e display_collections agora reutiliza collections_acron. Journal já segue esse mesmo padrão (journalproc__journal=self).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Articles] Informação sobre a coleção

3 participants