Skip to content

Permitir customização de logo da coleção no header, menu, rodapé e páginas internas#405

Open
Copilot wants to merge 8 commits intomasterfrom
copilot/customize-collection-logo
Open

Permitir customização de logo da coleção no header, menu, rodapé e páginas internas#405
Copilot wants to merge 8 commits intomasterfrom
copilot/customize-collection-logo

Conversation

Copy link
Contributor

Copilot AI commented Mar 4, 2026

Os campos de logo (home_logo_pt/en/es, header_logo_pt/en/es, menu_logo_pt/en/es, logo_footer) já existiam no modelo Collection e as macros images.html já estavam parcialmente implementadas, mas nunca foram integradas aos templates.

O que esse PR faz?

  • Adiciona macro render_logo(logo_url, collection_name, href, img_class) em macros/images.html como fonte única (DRY) do padrão <a href="/"><img src="..." alt="..." class="..."></a> para todos os logos customizados
  • A macro render_logo constrói o atributo alt de forma descritiva e traduzível: "Página inicial da coleção [nome]" via {% trans %}Página inicial da coleção{% endtrans %} {{ collection_name }}, cobrindo todos os 5 locais de logo em uma única mudança
  • Adiciona nova macro get_footer_logo() em macros/images.html para o campo logo_footer (campo único, sem variantes por idioma, conforme modelagem do opac_schema)
  • Integra get_home_logo() ao collection/includes/header.html — exibe <a><img></a> quando configurado; caso contrário, mantém fallback com <h2 class="scielo__logo-scielo-caption">
  • Integra get_header_logo() ao journal/includes/header.html e article/includes/header.html — exibe o logo da coleção nas páginas internas de periódico e artigo; fallback mantém o nome textual com id="collectionNameInternal"
  • Integra get_menu_logo() ao collection/includes/nav.html e article/includes/alternative_header.html — exibe o logo no menu hamburger, envolto em <a href="/">; fallback mantém o ícone CSS scielo__logo-scielo--small
  • Integra get_footer_logo() ao includes/footer.html — exibe o logo no rodapé, envolto em <a href="/">; fallback mantém o ícone CSS scielo__logo-scielo--small
  • Em todos os locais com logo customizado: o padrão HTML segue <a href="/"><img src="..." alt="Página inicial da coleção [nome]" class="..."></a> — sem aria-label no <a>, acessibilidade garantida pelo alt descritivo da imagem
  • Aplica |default('')|trim nas chamadas às macros de logo para evitar renderização de <img src="None"> quando nenhum logo está configurado
  • Corrige o atributo alt inválido no <div> decorativo do rodapé, substituindo por aria-hidden="true"

Onde a revisão poderia começar?

  • opac/webapp/templates/macros/images.html — nova macro render_logo() (com alt descritivo e i18n), nova macro get_footer_logo() e macros existentes
  • opac/webapp/templates/collection/includes/header.html — bloco do logo da home
  • opac/webapp/templates/collection/includes/nav.html — logo no menu hamburger
  • opac/webapp/templates/journal/includes/header.html e article/includes/header.html — logo da coleção nas páginas internas
  • opac/webapp/templates/includes/footer.html — logo no rodapé

Como este poderia ser testado manualmente?

  1. No admin, acesse a edição da coleção e configure home_logo_pt com a URL de uma imagem
  2. Acesse a home em pt_BR e verifique que o elemento <a href="/"><img src="..." alt="Página inicial da coleção [nome]"></a> é exibido no lugar do texto
  3. Configure header_logo_pt e acesse uma página de periódico ou artigo — o logo deve aparecer no lugar do nome textual da coleção no cabeçalho, com alt descritivo
  4. Configure menu_logo_pt e abra o menu hamburger — o logo deve aparecer no lugar do ícone CSS, envolto em <a href="/">
  5. Configure logo_footer e verifique que o logo aparece no rodapé no lugar do ícone CSS, envolto em <a href="/"> (campo único sem variantes por idioma)
  6. Remova os logos e verifique que os fallbacks (texto ou ícone CSS) voltam a aparecer
  7. Troque o idioma e confirme que o logo correto para cada língua é exibido (para os campos com variantes pt/en/es)
  8. Verifique com um leitor de tela que o logo é anunciado com a descrição completa "Página inicial da coleção [nome]" (via alt da imagem)

Algum cenário de contexto que queira dar?

Os campos de logo (home_logo_pt/en/es, header_logo_pt/en/es, menu_logo_pt/en/es, logo_footer) e as macros já existiam no codebase desde versões anteriores, mas foram desconectados dos templates durante alguma refatoração. Este PR reconecta toda essa infraestrutura sem adicionar nenhuma dependência nova. O campo logo_footer possui apenas uma variante (sem idioma), refletindo a modelagem do opac_schema.

O padrão de acessibilidade adotado (alt descritivo na <img> em vez de aria-label no <a>) foi validado por revisores do projeto. O texto "Página inicial da coleção [nome]" é construído dentro da macro render_logo usando {% trans %}, garantindo que a parte estática seja traduzível para en/es.

Testes adicionados em test_interface_home.py:

  • test_home_logo_shown_when_configured — verifica que o <img> aparece com a URL correta por idioma
  • test_home_logo_fallback_to_text_when_not_configured — verifica o fallback para id="collectionNameHome"
  • test_home_aria_label_uses_collection_name — verifica que o aria-label do nome da coleção está presente na navegação

Screenshots

A adicionar pelo revisor ou autor após deploy em staging.

Quais são tickets relevantes?

Relacionado à tarefa de customização de logo descrita na issue.

Referências

  • opac/webapp/templates/macros/images.html — macros de logo existentes, nova get_footer_logo() e nova render_logo() com alt descritivo e i18n
  • opac/webapp/admin/views.pyCollectionAdminView com os campos home_logo_pt/en/es, header_logo_pt/en/es, menu_logo_pt/en/es, logo_footer
  • opac_schema — modelagem dos campos de logo da coleção
Original prompt

This section details on the original issue you should resolve

<issue_title>Permitir customização de logo da coleçõa</issue_title>
<issue_description>### Descrição da tarefa

<div class="row">
        <div class="col text-center">
          <a href="/" alt="Brasil" aria-label="Acessar site coleção Brasil">
            <span class="visually-hidden">Logo SciELO</span>
            <h2 class="scielo__logo-scielo-caption mt-1">
              <small id="collectionNameHome">Brasil</small>
            </h2>
          </a>
        </div>
      </div>

Subtarefas

  • Localizar os templates html
  • Analisar os templates html relacionado com este código
  • Verificar mudanças que retiraram a customização que obtia o logo do admin (opac_schema)
  • Ajustar o template para que se houver dados de logo da coleção, adotar o logo, caso contrário manter este layout
  • Considerar ajustar para garantir a acessibilidade</issue_description>

Comments on the Issue (you are @copilot in this section)


💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

Co-authored-by: robertatakenaka <505143+robertatakenaka@users.noreply.github.com>
Copilot AI changed the title [WIP] Allow customization of collection logo Permitir customização de logo da coleção no header Mar 4, 2026
Copy link
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

Integra o logo configurado no admin ao header da home da coleção, com fallback para o nome em texto e correção do aria-label para usar o nome dinâmico da coleção.

Changes:

  • Importa e usa a macro get_home_logo() no header.html para renderizar <img> quando houver logo configurado.
  • Mantém fallback textual (collectionNameHome) quando não houver logo.
  • Adiciona testes de interface para validar logo/aria-label.

Reviewed changes

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

Show a summary per file
File Description
src/scieloh5m5 Atualiza referência de submódulo para incluir mudanças relacionadas ao logo/customização.
src/packtools Atualiza referência de submódulo (dependências do projeto).
src/opac-schema Atualiza referência de submódulo (modelo/admin relacionado aos campos de logo).
opac/webapp/templates/collection/includes/header.html Renderiza logo da coleção no header via macro e ajusta aria-label.
opac/tests/test_interface_home.py Adiciona testes garantindo exibição do logo, fallback e aria-label dinâmico.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

"http://example.com/logo_en.png",
response.data.decode("utf-8"),
)

Copy link

Copilot AI Mar 4, 2026

Choose a reason for hiding this comment

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

O template busca o logo por idioma (pt/en/es), mas o teste cobre apenas pt_BR e en. Como o comportamento adicionado explicitamente suporta es, vale incluir uma asserção adicional para lang_code=\"es\" verificando a presença de home_logo_es para evitar regressões específicas desse idioma.

Suggested change
# idioma em 'es'
response = c.get(
url_for("main.set_locale", lang_code="es"),
headers={"Referer": "/"},
follow_redirects=True,
)
self.assertStatus(response, 200)
self.assertIn(
"http://example.com/logo_es.png",
response.data.decode("utf-8"),
)

Copilot uses AI. Check for mistakes.
Comment on lines +141 to +144
self.assertIn(
'aria-label="Acessar site coleção coleção falsa"',
response.data.decode("utf-8"),
)
Copy link

Copilot AI Mar 4, 2026

Choose a reason for hiding this comment

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

Esse teste fica bem frágil por depender de uma string HTML completa e exata (incluindo aspas/ordem/possíveis mudanças de espaçamento/alterações de tradução). Sugestão: tornar a asserção mais resiliente checando separadamente que o HTML contém aria-label= e que o valor contém o nome dinâmico da coleção (ex.: procurar apenas pelo fragmento com coleção falsa, ou usar uma asserção menos estrita para o atributo).

Suggested change
self.assertIn(
'aria-label="Acessar site coleção coleção falsa"',
response.data.decode("utf-8"),
)
html = response.data.decode("utf-8")
# Garante que existe um atributo aria-label na página
self.assertIn("aria-label=", html)
# Garante que algum aria-label contém o nome dinâmico da coleção,
# sem depender da string completa exata.
self.assertRegex(html, r'aria-label="[^"]*coleção falsa[^"]*"')

Copilot uses AI. Check for mistakes.
robertatakenaka and others added 2 commits March 4, 2026 07:28
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
{%- set logo_url = img_macro.get_home_logo(g.collection, session.lang)|default('')|trim -%}
<a href="/" aria-label="{% trans %}Acessar site coleção{% endtrans %} {{ coll_macro.get_collection_name() }}">
{%- if logo_url -%}
<img src="{{ logo_url }}" alt="{{ coll_macro.get_collection_name() }}" class="img-fluid scielo__logo-img">
Copy link
Member

Choose a reason for hiding this comment

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

@copilot Adicione antes de <img src=":

<span class="visually-hidden">Logo {{ coll_macro.get_collection_name() }}</span>

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Done in commit 64d654f. Added <span class="visually-hidden">Logo {{ coll_macro.get_collection_name() }}</span> immediately before the <img> tag.

Co-authored-by: robertatakenaka <505143+robertatakenaka@users.noreply.github.com>
Copy link
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

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


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +95 to +100
<a href="/" aria-label="{% trans %}Acessar site coleção{% endtrans %} {{ coll_macro.get_collection_name() }}">
{%- if logo_url -%}
<span class="visually-hidden">Logo {{ coll_macro.get_collection_name() }}</span>
<img src="{{ logo_url }}" alt="{{ coll_macro.get_collection_name() }}" class="img-fluid scielo__logo-img">
{%- else -%}
<span class="visually-hidden">Logo SciELO</span>
Copy link

Copilot AI Mar 6, 2026

Choose a reason for hiding this comment

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

As strings exibidas para leitores de tela e o aria-label estão parcialmente hardcoded em PT e montadas por concatenação fora do bloco de tradução. Isso limita a internacionalização (ex.: ordem das palavras/declinações em outros idiomas). Sugestão: colocar as frases completas dentro de {% trans %} usando placeholder (ex.: variável com o nome da coleção) e também traduzir o “Logo …”/“Logo SciELO”.

Copilot uses AI. Check for mistakes.
expected_anchor = "colección falsa"
self.assertIn(expected_anchor, response.data.decode("utf-8"))

def test_home_logo_shown_when_configured(self):
Copy link

Copilot AI Mar 6, 2026

Choose a reason for hiding this comment

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

O template escolhe o logo por idioma (pt/en/es), mas o teste só valida pt_BR e en. Para cobrir o comportamento introduzido (seleção por idioma), faltou validar também es. Além disso, os asserts atuais checam apenas a presença da URL no HTML; para reduzir falso-positivo, vale checar uma substring mais específica (ex.: <img src="...">) e, no cenário de fallback, afirmar que não existe <img quando não há logo configurado.

Copilot uses AI. Check for mistakes.
@robertatakenaka
Copy link
Member

@copilot há 3 outros lugares no site (header_logo, menu_logo, foot_logo) em que há o logo scielo, então realizar a possibilidade de customização. Considere os campos relacionados com os logos da coleção modelados no opac_schema https://github.com/scieloorg/opac_schema/blob/812713d4698cae9980e159851ed1497d33e7ca0c/opac_schema/v1/models.py#L434

@robertatakenaka robertatakenaka changed the title Permitir customização de logo da coleção no header Permitir customização de logo da coleção no site inteiro Mar 9, 2026
…locations

Co-authored-by: robertatakenaka <505143+robertatakenaka@users.noreply.github.com>
Copy link
Contributor Author

Copilot AI commented Mar 9, 2026

@copilot há 3 outros lugares no site (header_logo, menu_logo, foot_logo) em que há o logo scielo, então realizar a possibilidade de customização. Considere os campos relacionado...

Done in commit 648dddb. Extended logo customization to the 3 other locations using the existing model fields:

  • menu_logo_pt/en/escollection/includes/nav.html and article/includes/alternative_header.html (hamburger/collapsed menus)
  • header_logo_pt/en/esjournal/includes/header.html and article/includes/header.html (collection logo in journal/article pages)
  • logo_footerincludes/footer.html (footer SciELO logo)

A new get_footer_logo(collection) macro was also added to macros/images.html since logo_footer is a single field (no language variants, unlike the others). All locations use the same |default('')|trim guard and visually-hidden span pattern for accessibility, falling back to the existing CSS-based logo when no custom logo is configured.

Copilot AI changed the title Permitir customização de logo da coleção no site inteiro Permitir customização de logo da coleção no header, menu, rodapé e páginas internas Mar 9, 2026
@ramoncordini
Copy link
Contributor

ramoncordini commented Mar 9, 2026

Após testar o PR verifiquei que apenas o logo do header é trocado ao ser adicionado via painel admin. Ao acessar o painel admin é possível observar que existem outros locais afetados com a troca do logo como o menu sanduiche e o footer. Estes não estão funcionais.

Sobre o html gerado ao trocar o logo do header, sugiro que o código seja o seguinte, já validados atributos de acessibilidade:


    <a href="/">
      <img
        src="logo.jpg"
        alt="Página inicial da coleção Brasil"
        class="img-fluid scielo__logo-img"
      >
    </a>

Removendo o aria-label do link e mantendo apenas o alt na imagem que aponta para a página inicial do sistema.

@robertatakenaka
Copy link
Member

@copilot do not repeat yourself e garantir que o html do logo customizado siga o padrão:

    <a href="/">
      <img
        src="logo.jpg"
        alt="Página inicial da coleção Brasil"
        class="img-fluid scielo__logo-img"
      >
    </a>

…a11y pattern

Co-authored-by: robertatakenaka <505143+robertatakenaka@users.noreply.github.com>
Copy link
Contributor Author

Copilot AI commented Mar 9, 2026

Após testar o PR verifiquei que apenas o logo do header é trocado ao ser adicionado via painel admin. Ao acessar o painel admin é possível observar que existem outros locais afetados com a troca d...

Fixed in commit a66b849. The HTML for all logo locations now follows <a href="/"><img src="..." alt="..." class="..."></a>aria-label removed from the link, with accessibility relying solely on the img's alt. The menu (hamburger) and footer logos were missing the <a> wrapper entirely; that's now fixed via the shared render_logo macro.

@copilot do not repeat yourself e garantir que o html do logo customizado siga o padrão:

...

Done in commit a66b849. Added a render_logo(logo_url, alt_text, href, img_class) macro to macros/images.html as the single source of truth for the <a><img></a> pattern. All 5 logo locations (home, header, menu, alternative menu, footer) now call this macro instead of repeating the markup.

@robertatakenaka robertatakenaka marked this pull request as ready for review March 9, 2026 18:45
@robertatakenaka robertatakenaka requested a review from Copilot March 9, 2026 21:02
Copy link
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

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


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

</div>
<div class="col col-md-3">
<a href="/" title="{% trans %}Ir para a homepage da coleção: {% endtrans %}{{ coll_macro.get_collection_name() }}">
{%- set header_logo_url = cimages.get_header_logo(g.collection, session.lang)|default('')|trim -%}
Copy link

Copilot AI Mar 9, 2026

Choose a reason for hiding this comment

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

default('') (sem o segundo parâmetro) só substitui valores undefined, não cobre None. Se get_header_logo(...) retornar None, o filtro trim tende a produzir a string 'None', tornando a condição verdadeira e podendo renderizar <img src=\"None\">. Use default('', true) antes do trim (ex.: |default('', true)|trim). O mesmo padrão aparece nos outros templates alterados neste PR (ex.: collection/includes/header.html, article/includes/header.html, collection/includes/nav.html, article/includes/alternative_header.html).

Suggested change
{%- set header_logo_url = cimages.get_header_logo(g.collection, session.lang)|default('')|trim -%}
{%- set header_logo_url = cimages.get_header_logo(g.collection, session.lang)|default('', true)|trim -%}

Copilot uses AI. Check for mistakes.
{%- endif -%}
</li>
<li>
<a href="{{ url_for('.index') }}" alt="{% trans %}Acessar site coleção{% endtrans %} {{ coll_macro.get_collection_name() }}" aria-label="{% trans %}Acessar site coleção{% endtrans %} {{ coll_macro.get_collection_name() }}">
Copy link

Copilot AI Mar 9, 2026

Choose a reason for hiding this comment

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

O atributo alt não é válido em <a> (apenas em <img>/<area>/<input type=\"image\">). Aqui ele é redundante com o aria-label e gera HTML inválido; remova o alt e mantenha apenas aria-label (ou deixe o texto do link nomear o elemento quando aplicável).

Suggested change
<a href="{{ url_for('.index') }}" alt="{% trans %}Acessar site coleção{% endtrans %} {{ coll_macro.get_collection_name() }}" aria-label="{% trans %}Acessar site coleção{% endtrans %} {{ coll_macro.get_collection_name() }}">
<a href="{{ url_for('.index') }}" aria-label="{% trans %}Acessar site coleção{% endtrans %} {{ coll_macro.get_collection_name() }}">

Copilot uses AI. Check for mistakes.
Comment on lines +24 to +29
{%- set footer_logo_url = img_macro.get_footer_logo(g.collection)|default('')|trim -%}
{%- if footer_logo_url -%}
{{ img_macro.render_logo(footer_logo_url, coll_macro.get_collection_name()) }}
{%- else -%}
<div class="scielo__logo-scielo--small" aria-hidden="true"></div>
{%- endif -%}
Copy link

Copilot AI Mar 9, 2026

Choose a reason for hiding this comment

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

O get_footer_logo() já faz |default(\"\", true), então repetir |default('')|trim aqui é redundante e mantém o risco do caso None (ver sugestão sobre default('', true) caso a macro mude). Para simplificar e padronizar, considere: (1) remover o default/trim do call-site e deixar a macro garantir string vazia; ou (2) se quiser manter no template, usar default('', true)|trim.

Copilot uses AI. Check for mistakes.
Comment on lines +48 to +50
{%- set menu_logo_url = cimages.get_menu_logo(g.collection, session.lang)|default('')|trim -%}
{%- if menu_logo_url -%}
{{ cimages.render_logo(menu_logo_url, coll_macro.get_collection_name(), img_class='img-fluid') }}
Copy link

Copilot AI Mar 9, 2026

Choose a reason for hiding this comment

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

O PR altera comportamento visível também para logo no menu (hamburger/alternative header), headers internos (journal/article) e rodapé, mas os testes adicionados cobrem apenas a home. Como já existe suíte de testes de interface neste módulo, adicione casos que validem: (1) logo no menu quando configurado e fallback quando ausente; (2) logo no header interno (journal/article) e fallback para collectionNameInternal; e (3) logo no rodapé vs. fallback com aria-hidden=\"true\".

Copilot uses AI. Check for mistakes.
@ramoncordini
Copy link
Contributor

@robertatakenaka

Ao efetuar os testes no ajuste realizado, verifiquei que:

  • o logo do footer não muda de acordo com o idioma selecionado, como ocorre com os demais. No painel adimin, a opção de cadastrar logos para diferentes idiomas no footer não existe. O atributo alt exibido no logo do footer assim como os demais exibe apenas o nome da coleção = "Brazil". O ideal é que a mensagem seja mais explicativa como sugerido anteriormente:
    alt="Página inicial da coleção Brasil"

  • logo da home e internas é alterado corretamente porém o atributo alt contido na imagem continua com a descrição muito vaga = "Brasil". O ideal é que a mensagem seja mais explicativa como sugerido anteriormente:
    alt="Página inicial da coleção Brasil"

  • a alteração do logo drop menu pode quebrar a exibição completa dos itens desde menu. Os últimos itens podem ficar fora do campo de visão. Ajuste este que deve ser feito no design system, prevendo altura variada de logo ou altura fixada.

@robertatakenaka
Copy link
Member

@copilot Ao efetuar os testes no ajuste realizado, verifiquei que:

o logo do footer não muda de acordo com o idioma selecionado, como ocorre com os demais. No painel adimin, a opção de cadastrar logos para diferentes idiomas no footer não existe. O atributo alt exibido no logo do footer assim como os demais exibe apenas o nome da coleção = "Brazil". O ideal é que a mensagem seja mais explicativa como sugerido anteriormente:
alt="Página inicial da coleção Brasil"

logo da home e internas é alterado corretamente porém o atributo alt contido na imagem continua com a descrição muito vaga = "Brasil". O ideal é que a mensagem seja mais explicativa como sugerido anteriormente:
alt="Página inicial da coleção Brasil"

a alteração do logo drop menu pode quebrar a exibição completa dos itens desde menu. Os últimos itens podem ficar fora do campo de visão. Ajuste este que deve ser feito no design system, prevendo altura variada de logo ou altura fixada.

…ll logo locations

Co-authored-by: robertatakenaka <505143+robertatakenaka@users.noreply.github.com>
Copy link
Contributor Author

Copilot AI commented Mar 11, 2026

@copilot Ao efetuar os testes no ajuste realizado, verifiquei que:

o logo do footer não muda de acordo com o idioma selecionado, como ocorre com os demais. No painel adimin, a op...

Fixed in commit 8a31e89. The render_logo macro (the single source of truth for all logo locations) now builds the alt text as "Página inicial da coleção [nome]" using {% trans %}Página inicial da coleção{% endtrans %} {{ collection_name }}, covering home, header, menu, alternative menu, and footer logos in one change.

Regarding the menu logo potentially obscuring menu items — per your comment, that should be addressed in the design system, so it's out of scope for this PR.

The footer logo having only one variant (no language) is by design, reflecting the logo_footer field in opac_schema (no pt/en/es variants).

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.

Permitir customização de logo da coleçõa

4 participants