Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion config/menu.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
WAGTAIL_MENU_APPS_ORDER = [
"markup_doc",
"xml_manager",
"reference",
"tracker",
"model_ai",
"django_celery_beat",
]


def get_menu_order(app_name):
try:
return WAGTAIL_MENU_APPS_ORDER.index(app_name) + 1
except:
except ValueError:
return 9000
10 changes: 10 additions & 0 deletions config/settings/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,16 @@
# e.g. in notification emails. Don't include '/admin' or a trailing slash
WAGTAILADMIN_BASE_URL = "http://example.com"

WAGTAILIMAGES_EXTENSIONS = [
"avif",
"gif",
"jpg",
"jpeg",
"png",
"webp",
"svg",
]

# Allowed file extensions for documents in the document library.
# This can be omitted to allow all files, but note that this may present a security risk
# if untrusted users are allowed to upload files -
Expand Down
33 changes: 33 additions & 0 deletions core/migrations/0002_wagtailsearch_indexentry_text_defaults.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
from django.db import migrations


class Migration(migrations.Migration):
dependencies = [
("core", "0001_initial"),
]

operations = [
migrations.RunSQL(
sql="""
DO $$
BEGIN
IF EXISTS (
SELECT 1
FROM information_schema.columns
WHERE table_schema = current_schema()
AND table_name = 'wagtailsearch_indexentry'
AND column_name = 'title_text'
) THEN
UPDATE wagtailsearch_indexentry
SET title_text = COALESCE(title_text, ''),
body_text = COALESCE(body_text, '');

ALTER TABLE wagtailsearch_indexentry
ALTER COLUMN title_text SET DEFAULT '',
ALTER COLUMN body_text SET DEFAULT '';
END IF;
END $$;
""",
reverse_sql=migrations.RunSQL.noop,
),
]
16 changes: 16 additions & 0 deletions core/wagtail_hooks.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import os

from django.db.models.signals import pre_save
from wagtail.images import get_image_model


def ensure_image_title(sender, instance, **kwargs):
if (instance.title or "").strip():
return
if not instance.file:
return
basename = os.path.basename(instance.file.name)
instance.title = os.path.splitext(basename)[0]


pre_save.connect(ensure_image_title, sender=get_image_model())
12 changes: 12 additions & 0 deletions core_settings/static/core_settings/css/admin_logo.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
.custom-admin-logo {
display: block;
max-height: 2.5rem;
max-width: 100%;
width: auto;
height: auto;
}

.custom-admin-logo--login {
max-height: 4rem;
margin: 0 auto;
}
5 changes: 5 additions & 0 deletions core_settings/templates/wagtailadmin/base.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{% extends "wagtailadmin/base.html" %}

{% block branding_logo %}
{% include "wagtailadmin/includes/admin_logo.html" %}
{% endblock %}
9 changes: 9 additions & 0 deletions core_settings/templates/wagtailadmin/includes/admin_logo.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{% if settings.core_settings.customsettings.admin_logo %}
<img
src="{{ settings.core_settings.customsettings.admin_logo.file.url }}"
alt="{{ settings.core_settings.customsettings.name|default:'SciELO XML Tools' }}"
class="custom-admin-logo"
/>
{% else %}
{% include "wagtailadmin/logo.html" %}
{% endif %}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{% if settings.core_settings.customsettings.admin_logo %}
<img
src="{{ settings.core_settings.customsettings.admin_logo.file.url }}"
alt="{{ settings.core_settings.customsettings.name|default:'SciELO XML Tools' }}"
class="custom-admin-logo custom-admin-logo--login"
/>
{% else %}
{% include "wagtailadmin/logo.html" with wordmark="True" %}
{% endif %}
7 changes: 7 additions & 0 deletions core_settings/templates/wagtailadmin/login.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{% extends "wagtailadmin/login.html" %}

{% block branding_logo %}
<div class="login-logo">
{% include "wagtailadmin/includes/admin_logo_login.html" %}
</div>
{% endblock %}
11 changes: 11 additions & 0 deletions core_settings/wagtail_hooks.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from django.templatetags.static import static
from django.utils.html import format_html
from wagtail import hooks


@hooks.register("insert_global_admin_css")
def admin_logo_css():
return format_html(
'<link rel="stylesheet" href="{}">',
static("core_settings/css/admin_logo.css"),
)
13 changes: 5 additions & 8 deletions django_celery_beat/wagtail_hooks.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,9 @@
from django.utils.translation import gettext_lazy as _
from kombu.utils.json import loads
from wagtail import hooks
from wagtail_modeladmin.options import (
ModelAdmin,
ModelAdminGroup,
modeladmin_register,
)
from wagtail_modeladmin.options import ModelAdmin, ModelAdminGroup, modeladmin_register

from config.menu import get_menu_order
from django_celery_beat.models import (
ClockedSchedule,
CrontabSchedule,
Expand All @@ -24,7 +21,6 @@
from django_celery_beat.utils import is_database_scheduler

from .button_helper import PeriodicTaskHelper
from config.menu import get_menu_order


class PeriodicTaskAdmin(ModelAdmin):
Expand Down Expand Up @@ -190,8 +186,9 @@ class SolarScheduleAdmin(ModelAdmin):


class TasksModelsAdminGroup(ModelAdminGroup):
menu_label = _("Tasks")
menu_icon = "cogs"
menu_name = "django_celery_beat"
menu_label = _("Tarefas agendadas")
menu_icon = "time"
menu_order = get_menu_order("django_celery_beat")
items = (
PeriodicTaskAdmin,
Expand Down
82 changes: 82 additions & 0 deletions docs/pr/2026-05-15-reorder-menu-svg-admin-branding.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
# Menu admin RCT, SVG, indexação, logo e correções Wagtail

**Data:** 2026-05-15
**Branch:** `reorder_menu_enable_svg`

## Mensagem de commit

```
Reorganiza admin Wagtail, SVG, logo e indexação de imagens

Menu alinhado ao fluxo RCT; upload SVG; logo via admin_logo; corrige
title_text na indexação e imports em markup_doc/wagtail_hooks.
```

## O que esse PR faz?

Conjunto de melhorias no admin Wagtail e na configuração editorial do markapi:

### 1. Menu lateral (fluxo RCT)

Ordem centralizada em `config/menu.py`:

1. Marcação editorial (`markup_doc`)
2. Gestão de XML (`xml_manager`)
3. Referências bibliográficas (`reference`)
4. Rastreio de eventos (`tracker`)
5. Modelos de IA (`model_ai`)
6. Tarefas agendadas (`django_celery_beat`)

Rótulos e ícones atualizados em todos os `wagtail_hooks.py` dos módulos. Grupo **Marcação editorial**: Coleções → Periódicos → Carregar DOCX → XML SPS marcado. Removidos `ModelAdmin` legados não registados em `markup_doc`.

### 2. Upload de SVG

`WAGTAILIMAGES_EXTENSIONS` em `config/settings/base.py` inclui `svg` (e formatos raster habituais).

### 3. Logo do admin

Templates em `core_settings/templates/wagtailadmin/` usam `settings.core_settings.customsettings.admin_logo` na sidebar e no login. CSS em `core_settings/static/core_settings/css/admin_logo.css`. Fallback para logo Wagtail se não houver imagem.

### 4. Indexação de imagens (`title_text`)

Migração `core/migrations/0002_wagtailsearch_indexentry_text_defaults.py`: preenche `NULL` e define `DEFAULT ''` em `title_text`/`body_text` quando as colunas existem (corrige `IntegrityError` ao indexar imagens com schema Wagtail 7 e código de indexação que omite esses campos).

Signal em `core/wagtail_hooks.py`: define título da imagem a partir do nome do ficheiro quando vazio.

### 5. Correções em `markup_doc/wagtail_hooks.py`

Restaura imports (`path`, `format_html`, `static`, `TemplateResponse`, `update_xml`) e resolve conflito de merge.

## Onde a revisão poderia começar?

- [config/menu.py](config/menu.py)
- [markup_doc/wagtail_hooks.py](markup_doc/wagtail_hooks.py)
- [core_settings/templates/wagtailadmin/includes/admin_logo.html](core_settings/templates/wagtailadmin/includes/admin_logo.html)
- [core/migrations/0002_wagtailsearch_indexentry_text_defaults.py](core/migrations/0002_wagtailsearch_indexentry_text_defaults.py)

## Como este poderia ser testado manualmente?

1. `python manage.py migrate`
2. Reiniciar a aplicação e abrir `/admin/`
3. Confirmar ordem e rótulos do menu (Marcação editorial → … → Tarefas agendadas)
4. **Settings → Site configuration → Admin settings**: definir `admin_logo` (SVG) e recarregar admin — logo na sidebar e em `/admin/login/`
5. **Images**: upload de `.svg` sem erro
6. Se antes falhava indexação: repetir upload de logo e confirmar ausência de `IntegrityError` em `wagtailsearch_indexentry`

## Algum cenário de contexto que queira dar?

Alinhar versão instalada de `wagtail` com migrações já aplicadas na base (recomendado Wagtail 7.4 LTS se `wagtailsearch.0010_add_text_fields` existir). A migração em `core` mitiga desalinhamento entre schema e indexador. SVG em produção: restringir upload a utilizadores de confiança.

## Screenshots

N/A

## Quais são tickets relevantes?

N/A

## Referências

- SciELO RCT — `.cursor/rules/project-objectives.mdc`
- [Wagtail — customização do admin](https://docs.wagtail.org/en/stable/advanced_topics/customization/admin_templates.html)
- [Wagtail — SVG nas imagens](https://wagtail.org/blog/how-we-added-svg-support-to-wagtail-50/)
Loading
Loading