Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
89bdd86
chore(deps): atualiza packtools de 4.15.0 para 4.16.8
robertatakenaka Jul 20, 2026
81cedb8
feat(pid_provider): adiciona choices de status para XMLURL
robertatakenaka Jul 20, 2026
1914dfe
feat(pid_provider): adiciona exceção SkipSavePidProviderXML
robertatakenaka Jul 20, 2026
be764b8
refactor(pid_provider): reescreve QueryBuilderPidProviderXML e cria c…
robertatakenaka Jul 20, 2026
a14e345
refactor(pid_provider): reescreve fluxo de correspondência/registro d…
robertatakenaka Jul 20, 2026
0aef706
feat(pid_provider): migração para PidProviderXMLRegistration e remoçã…
robertatakenaka Jul 20, 2026
d65b561
feat(pid_provider): registra XMLURLViewSet e PidProviderXMLRegistrati…
robertatakenaka Jul 20, 2026
d163064
Apaga testes desatualizados
robertatakenaka Jul 20, 2026
eb7956a
Adiciona ReadOnlyPrettyJSONWidget
robertatakenaka Jul 21, 2026
2ca0ceb
pid_provider: restaura model XMLEvent e método add_event em PidProvid…
robertatakenaka Jul 21, 2026
49d4fb4
pid_provider: remove migration que excluía o model XMLEvent
robertatakenaka Jul 21, 2026
716c596
Corrige comparação com None e reduz ambiguidade na query de correspon…
robertatakenaka Jul 26, 2026
913fac0
Adota body_fragment_fingerprint e usa get_article_data_query no selec…
robertatakenaka Jul 26, 2026
2fc2500
Suporta dois formatos de hash em z_partial_body via novo partial_body…
robertatakenaka Jul 26, 2026
9d8746b
Adiciona __init__.py ao pacote de testes do pid_provider
robertatakenaka Jul 26, 2026
eb5d1c0
Adiciona testes unitários para QueryBuilderPidProviderXML
robertatakenaka Jul 26, 2026
531a725
Adiciona testes unitários para get_best_match
robertatakenaka Jul 26, 2026
a6130f1
Adiciona testes unitários para select_record
robertatakenaka Jul 26, 2026
42c0d7e
Adiciona testes unitários para select_records
robertatakenaka Jul 26, 2026
e79e595
Adiciona testes unitários para o fluxo de registro (register)
robertatakenaka Jul 26, 2026
9a6620e
chore(deps): atualiza packtools para 4.16.11
robertatakenaka Aug 3, 2026
b933644
fix(pid_provider): corrige uso de body_fragment_fingerprint em partia…
robertatakenaka Aug 3, 2026
6a04c49
test(pid_provider): cobre body_fingerprint e body_fragment_fingerprin…
robertatakenaka Aug 3, 2026
7faa324
Evita erro na representação de XMLVersion quando pid_provider_xml for…
pitangainnovare Aug 6, 2026
08db54d
Ajusta painéis de PidProviderXML no Wagtail removendo o campo collect…
pitangainnovare Aug 6, 2026
304bde6
Atualiza LIGHTWEIGHT_STATUSES em PidProviderXMLRegistration para usar…
pitangainnovare Aug 6, 2026
601f5c6
Adiciona modelo de configuração PidProviderSetting no Wagtail Admin p…
pitangainnovare Aug 6, 2026
2ef8de4
Atualiza search_fields em XMLVersionViewSet de file__path para file
pitangainnovare Aug 6, 2026
13c9bb1
Atualiza testes unitários para a configuração dinâmica PidProviderSet…
pitangainnovare Aug 6, 2026
b59fb22
Adiciona comparação por dict no teste de partial_body_query
pitangainnovare Aug 6, 2026
f9d916f
Atualiza atalhos do Makefile para Docker Compose v2
pitangainnovare Aug 6, 2026
61026c6
Adiciona migração para o modelo PidProviderSetting
pitangainnovare Aug 6, 2026
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
46 changes: 23 additions & 23 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -32,71 +32,71 @@ build_date: ## Show build date
@echo "Build date: " $(SCMS_BUILD_DATE)

############################################
## atalhos docker-compose desenvolvimento ##
## atalhos docker compose desenvolvimento ##
############################################

build: ## Build app using $(compose)
@docker-compose -f $(compose) build
@docker compose -f $(compose) build

build_no_cache: ## Build app using $(compose)
@docker-compose -f $(compose) build --no-cache
@docker compose -f $(compose) build --no-cache

up: ## Start app using $(compose)
@docker-compose -f $(compose) up -d
@docker compose -f $(compose) up -d

logs: ## See all app logs using $(compose)
@docker-compose -f $(compose) logs -f
@docker compose -f $(compose) logs -f

stop: ## Stop all app using $(compose)
@docker-compose -f $(compose) stop
@docker compose -f $(compose) stop

restart:
@docker-compose -f $(compose) restart
@docker compose -f $(compose) restart

ps: ## See all containers using $(compose)
@docker-compose -f $(compose) ps
@docker compose -f $(compose) ps

rm: ## Remove all containers using $(compose)
@docker-compose -f $(compose) rm -f
@docker compose -f $(compose) rm -f

django_shell: ## Open python terminal from django $(compose)
@docker-compose -f $(compose) run --rm django python manage.py shell
@docker compose -f $(compose) run --rm django python manage.py shell

wagtail_sync: ## Wagtail sync Page fields (repeat every time you add a new language and to update the wagtailcore_page translations) $(compose)
@docker-compose -f $(compose) run --rm django python manage.py sync_page_translation_fields
@docker compose -f $(compose) run --rm django python manage.py sync_page_translation_fields

wagtail_update_translation_field: ## Wagtail update translation fields, user this command first $(compose)
@docker-compose -f $(compose) run --rm django python manage.py update_translation_fields
@docker compose -f $(compose) run --rm django python manage.py update_translation_fields

django_createsuperuser: ## Create a super user from django $(compose)
@docker-compose -f $(compose) run --rm django python manage.py createsuperuser
@docker compose -f $(compose) run --rm django python manage.py createsuperuser

django_bash: ## Open a bash terminar from django container using $(compose)
@docker-compose -f $(compose) run --rm django bash
@docker compose -f $(compose) run --rm django bash

django_test: ## Run tests from django container using $(compose)
@docker-compose -f $(compose) run --rm django python manage.py test
@docker compose -f $(compose) run --rm django python manage.py test

django_fast: ## Run tests fast from django container using $(compose)
@docker-compose -f $(compose) run --rm django python manage.py test --failfast
@docker compose -f $(compose) run --rm django python manage.py test --failfast

django_makemigrations: ## Run makemigrations from django container using $(compose)
@docker-compose -f $(compose) run --rm django python manage.py makemigrations
@docker compose -f $(compose) run --rm django python manage.py makemigrations

django_migrate: ## Run migrate from django container using $(compose)
@docker-compose -f $(compose) run --rm django python manage.py migrate
@docker compose -f $(compose) run --rm django python manage.py migrate

django_makemessages: ## Run ./manage.py makemessages $(compose)
@docker-compose -f $(compose) run --rm django python manage.py makemessages --all
@docker compose -f $(compose) run --rm django python manage.py makemessages --all

django_compilemessages: ## Run ./manage.py compilemessages $(compose)
@docker-compose -f $(compose) run --rm django python manage.py compilemessages
@docker compose -f $(compose) run --rm django python manage.py compilemessages

django_dump_auth: ## Run manage.py dumpdata auth --indent=2 $(compose)
@docker-compose -f $(compose) run --rm django python manage.py dumpdata auth --indent=2 --output=fixtures/auth.json
@docker compose -f $(compose) run --rm django python manage.py dumpdata auth --indent=2 --output=fixtures/auth.json

django_load_auth: ## Run manage.py dumpdata auth --indent=2 $(compose)
@docker-compose -f $(compose) run --rm django python manage.py loaddata --database=default fixtures/auth.json
@docker compose -f $(compose) run --rm django python manage.py loaddata --database=default fixtures/auth.json

dump_data: ## Dump database into .sql $(compose)
docker exec -t scielo_core_local_postgres pg_dumpall -c -U debug > dump_`date +%d-%m-%Y"_"%H_%M_%S`.sql
Expand All @@ -121,7 +121,7 @@ clean_project_images: ## Remove all images with "core" on name
@docker rmi -f $$(docker images --filter=reference='*scielo_core*' -q)

volume_down: ## Remove all volume
@docker-compose -f $(compose) down -v
@docker compose -f $(compose) down -v

clean_migrations: ## Remove all migrations
@echo "Cleaning migrations..."
Expand Down
28 changes: 28 additions & 0 deletions core/widgets.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import json
from django import forms

class ReadOnlyPrettyJSONWidget(forms.Textarea):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.attrs.update({
'readonly': True,
'rows': 20,
'style': (
'font-family: monospace;'
),
})

def format_value(self, value):
if not value:
return ''
try:
parsed = json.loads(value) if isinstance(value, str) else value
return json.dumps(
parsed,
indent=2,
ensure_ascii=False,
sort_keys=True,
default=str, # fallback: converte qualquer coisa para str
)
except (json.JSONDecodeError, TypeError):
return value
9 changes: 8 additions & 1 deletion pid_provider/choices.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,14 @@

ENDPOINTS = (("fix-pid-v2", "fix-pid-v2"),)

# article is not public
XMLURL_STATUS_SUCCESS = "success"
XMLURL_STATUS_XML_FETCH_FAILED = "xml_fetch_failed"
XMLURL_STATUS_PID_PROVIDER_XML_FAILED = "pid_provider_xml_failed"
XMLURL_STATUS = (
(XMLURL_STATUS_SUCCESS, _("Success")),
(XMLURL_STATUS_XML_FETCH_FAILED, _("XML fetch failed")),
(XMLURL_STATUS_PID_PROVIDER_XML_FAILED, _("PID provider XML failed")),
)
PPXML_STATUS_WAIT = "WAIT"
#
PPXML_STATUS_IGNORED = "IGNORE"
Expand Down
3 changes: 3 additions & 0 deletions pid_provider/exceptions.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
class SkipSavePidProviderXML(Exception): ...


class APIPidProviderPostError(Exception): ...


Expand Down
175 changes: 175 additions & 0 deletions pid_provider/migrations/0017_pidproviderxmlregistration_and_more.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,175 @@
# Generated by Django 5.2.7 on 2026-07-21 14:25

import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("pid_provider", "0016_alter_pidproviderxml_proc_status_xmlevent"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]

operations = [
migrations.CreateModel(
name="PidProviderXMLRegistration",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
(
"created",
models.DateTimeField(
auto_now_add=True, verbose_name="Creation date"
),
),
(
"updated",
models.DateTimeField(
auto_now=True, verbose_name="Last update date"
),
),
(
"pkg_name",
models.CharField(
blank=True,
max_length=100,
null=True,
verbose_name="Package name",
),
),
(
"event_status",
models.CharField(
blank=True,
choices=[
("created", "created"),
("updated", "updated"),
("skipped", "skipped"),
("forbidden", "forbidden"),
("conflict", "conflict"),
("unmatched", "unmatched"),
("bad_request", "bad_request"),
("error", "error"),
],
max_length=15,
null=True,
verbose_name="Event status",
),
),
(
"detail",
models.JSONField(blank=True, null=True, verbose_name="Detail"),
),
],
options={
"verbose_name": "PidProviderXML Registration",
"verbose_name_plural": "PidProviderXML Registrations",
"ordering": ["-created"],
},
),
migrations.AddField(
model_name="pidproviderxml",
name="readable_data",
field=models.JSONField(blank=True, null=True, verbose_name="Readable data"),
),
migrations.AddField(
model_name="xmlurl",
name="detail",
field=models.JSONField(blank=True, null=True, verbose_name="Detail"),
),
migrations.AddField(
model_name="xmlurl",
name="is_public",
field=models.BooleanField(
blank=True, default=None, null=True, verbose_name="Is Public"
),
),
migrations.AlterField(
model_name="xmlurl",
name="status",
field=models.CharField(
blank=True,
choices=[
("success", "Success"),
("xml_fetch_failed", "XML fetch failed"),
("pid_provider_xml_failed", "PID provider XML failed"),
],
max_length=50,
null=True,
verbose_name="Status",
),
),
migrations.AddIndex(
model_name="xmlurl",
index=models.Index(fields=["is_public"], name="pid_provide_is_public_idx"),
),
migrations.AddField(
model_name="pidproviderxmlregistration",
name="creator",
field=models.ForeignKey(
editable=False,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="%(class)s_creator",
to=settings.AUTH_USER_MODEL,
verbose_name="Creator",
),
),
migrations.AddField(
model_name="pidproviderxmlregistration",
name="pid_provider_xml",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="registration_events",
to="pid_provider.pidproviderxml",
),
),
migrations.AddField(
model_name="pidproviderxmlregistration",
name="updated_by",
field=models.ForeignKey(
blank=True,
editable=False,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="%(class)s_last_mod_user",
to=settings.AUTH_USER_MODEL,
verbose_name="Updater",
),
),
migrations.AddIndex(
model_name="pidproviderxmlregistration",
index=models.Index(
fields=["pkg_name"], name="pid_provide_pkg_nam_2db0b2_idx"
),
),
migrations.AddIndex(
model_name="pidproviderxmlregistration",
index=models.Index(
fields=["event_status"], name="pid_provide_event_s_3c9ae7_idx"
),
),
migrations.AddIndex(
model_name="pidproviderxmlregistration",
index=models.Index(
fields=["-created"], name="pid_provide_created_94fb08_idx"
),
),
migrations.AddIndex(
model_name="pidproviderxmlregistration",
index=models.Index(
fields=["pid_provider_xml"], name="pid_provide_pid_pro_c9fb0e_idx"
),
),
]
38 changes: 38 additions & 0 deletions pid_provider/migrations/0018_pidprovidersetting.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# Generated by Django 5.2.7 on 2026-08-06 20:33

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("pid_provider", "0017_pidproviderxmlregistration_and_more"),
]

operations = [
migrations.CreateModel(
name="PidProviderSetting",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
(
"record_all_registration_events",
models.BooleanField(
default=False,
help_text="Quando ativo, grava auditoria em PidProviderXMLRegistration mesmo para fluxos limpos (created, updated, skipped).",
verbose_name="Gravar todos os eventos de auditoria",
),
),
],
options={
"verbose_name": "Configurações do PID Provider",
},
),
]
Loading