Fix AttributeError: 'Issue' object has no attribute 'code_sections'#1369
Fix AttributeError: 'Issue' object has no attribute 'code_sections'#1369robertatakenaka merged 5 commits intomainfrom
Conversation
Co-authored-by: robertatakenaka <505143+robertatakenaka@users.noreply.github.com>
|
@copilot crie testes automatizados |
Co-authored-by: robertatakenaka <505143+robertatakenaka@users.noreply.github.com>
Added unit tests in
|
There was a problem hiding this comment.
Pull request overview
Atualiza a exportação do Issue para ArticleMeta corrigindo a referência ao atributo removido Issue.code_sections, alinhando o formatter ao novo relacionamento Issue.table_of_contents → TableOfContents.journal_toc, e adiciona testes unitários para _format_code_sections.
Changes:
- Troca o acesso de
code_sectionsparatable_of_contentsem_format_code_sections, navegando viatoc.journal_toc. - Ajusta os campos exportados (code/language/text) para a nova estrutura e corrige bug que podia gerar
NameErrorquandocodeeraNone. - Adiciona testes unitários com mocks cobrindo os cenários principais de formatação/omissão de chaves.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.
| File | Description |
|---|---|
issue/formats/articlemeta_format.py |
Corrige o formatter para ler seções via table_of_contents e evita erro ao montar v49. |
issue/test_format_code_sections.py |
Inclui testes unitários para _format_code_sections com cenários de presença/ausência de code/idioma/texto. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
issue/formats/articlemeta_format.py
Outdated
| for toc in self.obj.table_of_contents.all(): | ||
| journal_toc = toc.journal_toc | ||
| code = getattr(journal_toc, "code", None) | ||
| lang = getattr(journal_toc.language, "code2", None) if journal_toc.language else None | ||
| text = journal_toc.text |
There was a problem hiding this comment.
self.obj.table_of_contents.all() returns TOC rows, but each toc.journal_toc (and then journal_toc.language) can trigger extra DB queries per row. Consider using self.obj.table_of_contents.select_related("journal_toc__language").all() (or equivalent prefetching upstream) to avoid an N+1 query pattern during exports.
There was a problem hiding this comment.
Applied in commit 1223bed. Changed self.obj.table_of_contents.all() to self.obj.table_of_contents.select_related("journal_toc__language").all() to fetch journal_toc and its language in a single query. Updated the test mock and assertions to match the chained call.
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: robertatakenaka <505143+robertatakenaka@users.noreply.github.com>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| for toc in self.obj.table_of_contents.select_related("journal_toc__language").all(): | ||
| journal_toc = toc.journal_toc | ||
| code = getattr(journal_toc, "code", None) | ||
| lang = getattr(journal_toc.language, "code2", None) if journal_toc.language else None | ||
| text = journal_toc.text |
There was a problem hiding this comment.
JournalTableOfContents is collection-specific, but _format_code_sections currently iterates over all issue.table_of_contents rows without filtering by the formatter’s collection_acron (or self.scielo_journal.collection). If an Issue has TOC entries loaded for multiple collections (possible via multiple AMIssue imports), the export can mix sections from different collections into v49. Filter the queryset by the active collection before formatting, and add/adjust a unit test to cover the multi-collection case.
…cieloorg#1369) * Initial plan * Fix AttributeError: 'Issue' object has no attribute 'code_sections' Co-authored-by: robertatakenaka <505143+robertatakenaka@users.noreply.github.com> * Add unit tests for _format_code_sections using table_of_contents Co-authored-by: robertatakenaka <505143+robertatakenaka@users.noreply.github.com> * Update issue/test_format_code_sections.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Use select_related to avoid N+1 queries in _format_code_sections Co-authored-by: robertatakenaka <505143+robertatakenaka@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: robertatakenaka <505143+robertatakenaka@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
code_sectionsfoi removido do modelIssuena migration0020e substituído portable_of_contents, masarticlemeta_format.pyainda referenciava o atributo antigo, quebrando a exportação de artigos para o AM.O que esse PR faz?
self.obj.code_sections.all()porself.obj.table_of_contents.select_related("journal_toc__language").all()em_format_code_sections, eliminando o padrão de N+1 queries ao iterar as linhas do TOCTableOfContents → JournalTableOfContents:section.code_section.code→toc.journal_toc.codesection.language.code2→toc.journal_toc.language.code2section.text→toc.journal_toc.textdata.append(item)estava fora do blocoif code:, causandoNameErrorquandocodeéNoneissue/test_format_code_sections.pycobrindo os cenários do método_format_code_sectionsOnde a revisão poderia começar?
issue/formats/articlemeta_format.py→ método_format_code_sectionsissue/test_format_code_sections.py→ testes unitários do métodoComo este poderia ser testado manualmente?
Disparar a exportação de um artigo para o ArticleMeta (
articlemeta_format) e verificar que o processo conclui semAttributeError. Confirmar que o campov49do fascículo é populado corretamente quando há seções associadas viatable_of_contents.Para executar os testes automatizados:
Algum cenário de contexto que queira dar?
A migration
0020removeucode_sectionsesectionsdoIssue, consolidando ambos emtable_of_contents(FK paraJournalTableOfContents). O formatter de ArticleMeta não foi atualizado junto, deixando a exportação quebrada.O uso de
select_related("journal_toc__language")garante quejournal_toce seulanguagesejam carregados em uma única query, evitando consultas extras por linha durante a exportação.Os testes unitários utilizam
SimpleTestCaseeMagicMockpara evitar dependência de banco de dados, verificando: entradasv49corretas com código/idioma/texto; omissão das chavesletquando ausentes; ausência dev49quando não há seções ou nenhuma seção possui código; queselect_related("journal_toc__language")é chamado corretamente; e que o atributo removidocode_sections.allnunca é acionado.Screenshots
N/A
Quais são tickets relevantes?
#1368
Referências
Original prompt
This section details on the original issue you should resolve
<issue_title>AttributeError: 'Issue' object has no attribute 'code_sections'</issue_title>
<issue_description>### Descrição do problema
Erro obtido ao executar a exportação de artigo para AM.
Note que
code_sectionsestava excedente, há outro atributo que faz o mesmo papel. Encontrar outras ocorrêcias de code_sections e trocar pelo atributo correto.