Skip to content

Adiciona às coleções a classificação quanto ao pertencimento à rede (Rede SciELO, temática ou independente) - #1482

Merged
robertatakenaka merged 14 commits into
scieloorg:mainfrom
robertatakenaka:completa_collection_
Sep 29, 2026
Merged

robertatakenaka merged 14 commits into
scieloorg:mainfrom
robertatakenaka:completa_collection_

Conversation

@robertatakenaka

Copy link
Copy Markdown
Member

O que esse PR faz?

Fale sobre o propósito do pull request, como por exemplo: quais problemas ele soluciona ou quais features ele adiciona.

Adiciona às coleções a classificação quanto ao pertencimento à rede (Rede SciELO, temática ou independente). Uma coleção pode ter mais de uma classificação. O campo é editável no admin Wagtail por meio de checkboxes, aparece na listagem de coleções e é exposto na API v1.

Também torna a carga de coleções mais robusta: create_or_update passa a aceitar names ausente (None) sem falhar.

Onde a revisão poderia começar?

Indique o caminho do arquivo e o arquivo onde o revisor deve iniciar a leitura do código.

  1. collection/choices.py: novas opções NETWORK_CLASSIFICATION
  2. collection/models.py: ChoiceArrayField e o campo Collection.network_classification
  3. collection/migrations/: migration do novo campo
  4. collection/api/v1/serializers.py e collection/wagtail_hooks.py: exposição na API e no admin

Como este poderia ser testado manualmente?

Estabeleça os passos necessários para que a funcionalidade seja testada manualmente pelo revisor.

  1. Aplicar as migrations: python manage.py migrate collection
  2. No admin Wagtail, acessar Coleções e editar uma coleção existente
  3. Verificar que o campo "Network classification" aparece como checkboxes com as três opções
  4. Marcar mais de uma opção, salvar e reabrir a coleção: as opções marcadas devem persistir
  5. Desmarcar todas as opções e salvar: o campo deve ficar vazio, sem erro de validação
  6. Na listagem de coleções, confirmar a presença da coluna "Network classification"
  7. Consultar o endpoint de coleções da API v1 e confirmar o campo network_classification no retorno
  8. Executar a carga de coleções com e sem a chave network_classification nos dados de origem e confirmar que ambas as situações funcionam

Algum cenário de contexto que queira dar?

Indique um contexto onde as modificações se fazem necessárias ou passe informações que contextualizam o revisor a fim de facilitar o entendimento da funcionalidade.

Até agora não havia no cadastro de coleções nenhuma forma de distinguir coleções da Rede SciELO, coleções temáticas e coleções independentes. Como uma coleção pode se enquadrar em mais de uma categoria, o campo foi modelado como ArrayField do PostgreSQL.

O ArrayField padrão do Django usa SimpleArrayField no formulário, um campo de texto com valores separados por vírgula, o que é inadequado para edição no admin. Por isso foi criado ChoiceArrayField, que sobrescreve formfield para usar TypedMultipleChoiceField com CheckboxSelectMultiple, restringindo os valores às opções definidas.

Na listagem do admin, o valor é exibido como lista dos códigos armazenados, sem os rótulos traduzidos.

Screenshots

Quando aplicável e se fizer possível, adicione screenshots que remetem à situação gráfica do problema que o pull request resolve.

N/A

Quais são os tickets relevantes?

Indique uma issue à qual o pull request faz relacionamento.

#1481

Referências

Indique as referências utilizadas para a elaboração do pull request.


Segurança da informação (NSI.04)

Seção obrigatória. Marque as opções aplicáveis e justifique quando necessário. Referência: NSI.04 - Norma de Desenvolvimento Seguro.

Este PR manipula dados sensíveis ou pessoais (LGPD)?

  • Sim — descreva os controles de proteção aplicados (criptografia, mascaramento, anonimização, etc.):
  • Não

Este PR altera autenticação, autorização, controle de acesso ou gerenciamento de sessão?

  • Sim — descreva o que mudou e por quê:
  • Não

Este PR introduz, atualiza ou remove dependências de terceiros?

  • Sim — as novas dependências foram verificadas no SBOM/Trivy sem vulnerabilidades críticas/altas em aberto?
    • Verificado e aprovado
    • Pendente / vulnerabilidade aceita com justificativa:
  • Não

Este PR foi validado pelo pipeline de segurança (SonarQube / Trivy)?

  • Sim — link do job:
  • Não aplicável a este PR (justifique):

Este PR concatena, monta ou executa comandos SQL, HTML ou JavaScript a partir de entrada externa?

  • Sim — confirme que há sanitização/parametrização (prepared statements, escaping, etc.):
  • Não

Este PR expõe novos endpoints, telas ou serviços?

  • Sim — HTTPS obrigatório está garantido e o acesso segue o princípio de menor privilégio?
  • Não

Algum segredo, senha, chave ou token está sendo adicionado ao código-fonte?

  • Não, nenhum segredo foi commitado
  • Sim (bloquear merge e corrigir antes de prosseguir)

Permite distinguir coleções da Rede SciELO, temáticas e independentes.

Detalhes de implementação:
- Adiciona NETWORK_CLASSIFICATION com as opções scielonetwork, thematic e independent
- Corrige a ausência de quebra de linha no final do arquivo
Uma coleção pode ter mais de uma classificação ao mesmo tempo. Por isso o
campo aceita múltiplos valores, e o admin os apresenta como checkboxes.

Detalhes de implementação:
- Cria ChoiceArrayField, um ArrayField cujo formfield é TypedMultipleChoiceField
  com CheckboxSelectMultiple, sem usar o SimpleArrayField padrão
- Adiciona Collection.network_classification (ArrayField de CharField, opcional)
- Inclui o campo no painel de edição, no dicionário de dados da coleção e
  no carregamento via collection_data
- create_or_update aceita network_classification (padrão None) e grava None
  quando a lista vem vazia
- Protege a iteração de names contra valor None
Detalhes de implementação:
- Inclui network_classification nos campos de CollectionSerializer
Detalhes de implementação:
- Inclui network_classification em list_display de CollectionAdmin
A classificação de rede passa a ter um único valor por coleção, e não mais
uma lista. Os dados de origem (ArticleMeta) continuam a fornecer uma lista;
nesse caso, somente o primeiro valor é armazenado.

Detalhes de implementação:
- Substitui ChoiceArrayField por CharField com choices NETWORK_CLASSIFICATION
- Remove a classe ChoiceArrayField e os imports de forms e ArrayField
- create_or_update converte a lista recebida em seu primeiro elemento,
  ou None quando a lista está vazia
Detalhes de implementação:
- Regenera 0008_collection_network_classification com CharField no lugar de ChoiceArrayField
- Remove a dependência da migration em collection.models
A classificação de rede passa a aceitar múltiplos valores, refletindo o que o ArticleMeta já informa como lista, em vez de descartar tudo além do primeiro valor. No admin, as opções são apresentadas como checkboxes.

Detalhes de implementação:
- Adiciona ChoiceArrayField, subclasse de ArrayField cujo formfield usa TypedMultipleChoiceField com CheckboxSelectMultiple, em vez de SimpleArrayField (texto separado por vírgula)
- Collection.network_classification passa de CharField para ChoiceArrayField de CharField com choices NETWORK_CLASSIFICATION
- FieldPanel de network_classification usa widget CheckboxSelectMultiple
- create_or_update: valor str é convertido em lista de um elemento; lista vazia é armazenada como None
Adiciona uma consulta que reúne as coleções de periódicos classificadas exclusivamente como pertencentes à Rede SciELO, excluindo as temáticas e as independentes.

Detalhes de implementação:
- Adiciona o classmethod Collection.get_national_journal_collections
- Filtra collection_type="journals" e network_classification=["scielonetwork"]
- A comparação é por igualdade exata do array, portanto coleções com scielonetwork combinado a outra classificação ficam de fora
Comment thread collection/models.py Outdated
from . import choices


class ChoiceArrayField(ArrayField):

@samuelveigarangel samuelveigarangel Sep 25, 2026 •

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

class MultipleChoiceArrayField(ArrayField): deixa mais explícita a finalidade

@samuelveigarangel

Copy link
Copy Markdown
Collaborator

Unificar as migraçõs 0008 e 0009

Renomeada a classe ChoiceArrayField para MultipleChoiceArrayField no arquivo de modelos do app collection, adequando a nomenclatura e atualizando as importações internas.

- Alterado o nome da classe de  para  em  para descrever melhor o componente.
- Ajustada a importação de  no modelo para utilizar o caminho explícito .
- Atualizado o campo  do model  para utilizar a nova classe .
Removido o arquivo de migração individual antigo da classificação de rede da coleção para unificação do histórico de banco de dados.

- Excluído o arquivo collection/migrations/0008_collection_network_classification.py.
- Eliminada a adição isolada do campo network_classification em formato simples para substituição por migração unificada.
Removido o arquivo de migração de alteração do campo network_classification para ArrayField.

- Excluído o arquivo collection/migrations/0009_alter_collection_network_classification.py.
- Removidas as instruções SQL customizadas (SeparateDatabaseAndState e RunSQL) que convertiam o tipo de coluna de texto simples para vetor no PostgreSQL.
…nd status fields

Adicionada a nova migração consolidada para o campo network_classification com suporte a ArrayField e ajustes no platform_status.

- Criado o arquivo collection/migrations/0008_collection_network_classification_and_more.py.
- Incluídas as operações de alteração do campo platform_status e adição do campo network_classification.
- Configurada a definição do novo campo utilizando a classe MultipleChoiceArrayField atualizada.
@robertatakenaka
robertatakenaka merged commit c0aeff3 into scieloorg:main Sep 29, 2026
3 of 5 checks passed
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.

2 participants