feat: criar e disponibilizar a página de política de atualização (crossmark)#420
feat: criar e disponibilizar a página de política de atualização (crossmark)#420
Conversation
- Add get_update_policy_page_by_journal_acron_lang() to controllers.py - Add create_update_policy_page() to utils/utils.py with URL pattern check - Add /j/<url_seg>/update_policy/ route to views.py - Create journal/update_policy.html template - Update journal_info.html: fix #item-2 → #editorialpolicy, add conditional update policy link - Update header.html: fix #item2 → #editorialpolicy in mobile dropdowns, add conditional update policy link - Register get_update_policy_page as Jinja2 global in __init__.py - Add tests for update_policy view and create_update_policy_page utility Co-authored-by: robertatakenaka <505143+robertatakenaka@users.noreply.github.com>
There was a problem hiding this comment.
Pull request overview
Implementa a página de Política de atualização (Crossmark) por periódico, adicionando criação/consulta via Pages, rota dedicada e exibição condicional de link no menu.
Changes:
- Adiciona utilitário
create_update_policy_page()para criar/recuperarPagesdo tipo “update-policy” conforme padrão de URL. - Cria controller + rota
GET /j/<url_seg>/update_policy/para servir a página e retornar 404 quando inexistente. - Inclui template
journal/update_policy.htmle adiciona link condicional (“Política de atualização”) nos menus do periódico.
Reviewed changes
Copilot reviewed 9 out of 9 changed files in this pull request and generated 6 comments.
Show a summary per file
| File | Description |
|---|---|
| opac/webapp/utils/utils.py | Novo helper para criação condicional de Pages para update policy (crossmark). |
| opac/webapp/controllers.py | Novo método de consulta de Pages por periódico/idioma/slug. |
| opac/webapp/main/views.py | Nova rota/view update_policy servindo o template e aplicando regras de visibilidade do periódico. |
| opac/webapp/init.py | Registro de função global Jinja2 para consultar a página de update policy via templates. |
| opac/webapp/templates/journal/update_policy.html | Novo template para renderizar o conteúdo da página. |
| opac/webapp/templates/journal/includes/journal_info.html | Ajuste de âncora de política editorial e inclusão de link condicional para update policy. |
| opac/webapp/templates/journal/includes/header.html | Ajuste de âncora de política editorial e inclusão de item condicional no dropdown. |
| opac/tests/test_utils.py | Testes unitários para create_update_policy_page(). |
| opac/tests/test_main_views.py | Testes de integração para a rota/view update_policy. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| return None | ||
|
|
||
| existing = Pages.objects( | ||
| journal=journal_acron, slug_name="update-policy", language=language |
There was a problem hiding this comment.
A busca por página existente não filtra por is_draft. Se existir uma página de rascunho com slug_name="update-policy", este código pode retornar o rascunho e impedir a criação/uso de uma página publicada, além de ficar inconsistente com o padrão de controllers (que sempre filtra is_draft). Sugestão: incluir is_draft=False (ou aceitar um parâmetro is_draft) no .objects(...) desta verificação.
| journal=journal_acron, slug_name="update-policy", language=language | |
| journal=journal_acron, | |
| slug_name="update-policy", | |
| language=language, | |
| is_draft=False, |
| {% set update_policy_page = get_update_policy_page(journal.acronym, session.get('lang', 'pt_BR')) %} | ||
| {% if update_policy_page %} | ||
| <li> | ||
| <a href="{{ url_for('.update_policy', url_seg=journal.url_segment) }}" class="dropdown-item"><span class="material-icons-outlined">update</span> {% trans %}Política de atualização{% endtrans %}</a> |
There was a problem hiding this comment.
Aqui há uma chamada a get_update_policy_page(...) dentro do template, que (via controllers) faz query em Pages. Como este header tem dois menus (breakpoints diferentes), isso vira pelo menos 2 queries por request só neste arquivo (mais outra no journal_info.html). Sugestão: calcular update_policy_page uma única vez por request (ex.: via context processor / g / variável de contexto do view) e reutilizar nos includes.
| {% set update_policy_page = get_update_policy_page(journal.acronym, session.get('lang', 'pt_BR')) %} | ||
| {% if update_policy_page %} | ||
| <li> | ||
| <a href="{{ url_for('.update_policy', url_seg=journal.url_segment) }}" class="dropdown-item"><span class="material-icons-outlined">update</span> {% trans %}Política de atualização{% endtrans %}</a> |
There was a problem hiding this comment.
Mesma questão de performance do outro menu: esta chamada a get_update_policy_page(...) dispara nova query no Mongo para cada renderização deste bloco. Sugestão: reutilizar o mesmo valor calculado uma vez (evitar duplicar queries entre os dois menus responsivos).
| {% set update_policy_page = get_update_policy_page(journal.acronym, session.get('lang', 'pt_BR')) %} | ||
| {% if update_policy_page %} | ||
| <a class="list-group-item" href="{{ url_for('.update_policy', url_seg=journal.url_segment) }}"><span class="material-icons-outlined">update</span> {% trans %}Política de atualização{% endtrans %}</a> |
There was a problem hiding this comment.
Este include também consulta get_update_policy_page(...) (query em Pages) e, junto com as duas chamadas no journal/includes/header.html, pode adicionar 3 queries extras por request em páginas que incluem ambos. Sugestão: centralizar esse cálculo (context processor/variável de contexto) para reaproveitar o resultado em todos os templates incluídos.
| {% endif %} | ||
| <a class="list-group-item" href="{{ url_for('.about_journal', url_seg=journal.url_segment) }}#about" class="scroll"><span class="material-icons-outlined">info</span> {% trans %}Sobre o periódico{% endtrans %}</a> | ||
| <a class="list-group-item" href="{{ url_for('.about_journal', url_seg=journal.url_segment) }}#item-2" class="scroll"><span class="material-icons-outlined">article</span> {% trans %}Política editorial{% endtrans %}</a> | ||
| <a class="list-group-item" href="{{ url_for('.about_journal', url_seg=journal.url_segment) }}#editorialpolicy" class="scroll"><span class="material-icons-outlined">article</span> {% trans %}Política editorial{% endtrans %}</a> |
There was a problem hiding this comment.
A âncora do link de Política editorial foi alterada para #editorialpolicy, mas ainda há referências no código para #item2 e #item-2 (ex.: templates/article/includes/header.html e templates/collection/includes/journal_list_row.html). Isso pode causar navegação inconsistente entre páginas/menus. Sugestão: padronizar todas as ocorrências para a mesma âncora (ou garantir compatibilidade no HTML da página about).
| </div> | ||
| <div class="row"> | ||
| <div class="col"> | ||
| {% include "includes/page_updated_at_info.html" %} |
There was a problem hiding this comment.
O include includes/page_updated_at_info.html depende de uma variável page_updated_at, mas este template não a define (nem o view adiciona ao contexto). Do jeito que está, a informação de “atualizado em” não será exibida. Sugestão: passar page.updated_at via um {% with page_updated_at=page.updated_at %} (como em collection/about.html) ou remover o include se não for necessário.
| {% include "includes/page_updated_at_info.html" %} | |
| {% with page_updated_at=page.updated_at %} | |
| {% include "includes/page_updated_at_info.html" %} | |
| {% endwith %} |
Implementa a página de política de atualização (crossmark) por periódico, com criação condicional via
Pages, rota dedicada e link condicional no menu lateral.O que esse PR faz?
create_update_policy_page()— cria registro emPagescomslug_name="update-policy"associado ao periódico, mas somente secrossmark_urlestiver ausente ou seguir o padrãohttps://domain/j/{acronym}/update_policy/. Retorna a página existente se já cadastrada; retornaNonepara URLs externas não-padrão.get_update_policy_page_by_journal_acron_lang()— consultaPagesporjournal,languageeslug_name="update-policy".GET /j/<url_seg>/update_policy/— serve a página do periódico; retorna 404 se não houverPagescadastrado para aquele periódico.journal/update_policy.html— estrutura idêntica aoabout.html, exibepage.contentvia|safe.journal_info.htmleheader.html— link "Política editorial" corrigido de#item-2→#editorialpolicy; link "Política de atualização" adicionado condicionalmente abaixo via global Jinja2get_update_policy_page.__init__.py—get_update_policy_page_by_journal_acron_langregistrado como global Jinja2 para uso direto nos templates sem alterar todos os views.Onde a revisão poderia começar?
opac/webapp/utils/utils.py→create_update_policy_page()— lógica central de criação condicional.Em seguida:
opac/webapp/main/views.py→update_policy()eopac/webapp/templates/journal/includes/journal_info.html.Como este poderia ser testado manualmente?
Pagecomname=update_policy,slug_name=update-policy, idioma e acrônimo do periódico./j/<acronym>/update_policy/e confirme que o conteúdo é exibido.#editorialpolicyem vez de#item-2.Algum cenário de contexto que queira dar?
A lógica condicional de criação existe para preservar periódicos que já possuam URL de crossmark externa personalizada (ex.:
https://doi.org/...). Nesses casos,create_update_policy_page()retornaNonee nenhuma página interna é criada. A consulta aoPagesocorre via global Jinja2 para evitar replicar a lógica em todos os views que incluemjournal_info.html(journal_detail,about_journal,issue_toc, etc.).Screenshots
N/A — alterações de backend e template condicional.
Quais são tickets relevantes?
Criar e disponibilizar a página de política de atualização (crossmark).
Referências
Pagesemopac_schemav2.9.0Original prompt
✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.