Skip to content

Commit 2f3fd64

Browse files
Merge pull request #1466 from pitangainnovare/feature/pid-provider
[Evolução do PR #1449] Atualiza o serviço de registro de XMLs do PID Provider com auditoria por documento e controle dinâmico no Wagtail
2 parents 2101bed + 61026c6 commit 2f3fd64

19 files changed

Lines changed: 2819 additions & 1668 deletions

Makefile

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -32,71 +32,71 @@ build_date: ## Show build date
3232
@echo "Build date: " $(SCMS_BUILD_DATE)
3333

3434
############################################
35-
## atalhos docker-compose desenvolvimento ##
35+
## atalhos docker compose desenvolvimento ##
3636
############################################
3737

3838
build: ## Build app using $(compose)
39-
@docker-compose -f $(compose) build
39+
@docker compose -f $(compose) build
4040

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

4444
up: ## Start app using $(compose)
45-
@docker-compose -f $(compose) up -d
45+
@docker compose -f $(compose) up -d
4646

4747
logs: ## See all app logs using $(compose)
48-
@docker-compose -f $(compose) logs -f
48+
@docker compose -f $(compose) logs -f
4949

5050
stop: ## Stop all app using $(compose)
51-
@docker-compose -f $(compose) stop
51+
@docker compose -f $(compose) stop
5252

5353
restart:
54-
@docker-compose -f $(compose) restart
54+
@docker compose -f $(compose) restart
5555

5656
ps: ## See all containers using $(compose)
57-
@docker-compose -f $(compose) ps
57+
@docker compose -f $(compose) ps
5858

5959
rm: ## Remove all containers using $(compose)
60-
@docker-compose -f $(compose) rm -f
60+
@docker compose -f $(compose) rm -f
6161

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

126126
clean_migrations: ## Remove all migrations
127127
@echo "Cleaning migrations..."

core/widgets.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import json
2+
from django import forms
3+
4+
class ReadOnlyPrettyJSONWidget(forms.Textarea):
5+
def __init__(self, *args, **kwargs):
6+
super().__init__(*args, **kwargs)
7+
self.attrs.update({
8+
'readonly': True,
9+
'rows': 20,
10+
'style': (
11+
'font-family: monospace;'
12+
),
13+
})
14+
15+
def format_value(self, value):
16+
if not value:
17+
return ''
18+
try:
19+
parsed = json.loads(value) if isinstance(value, str) else value
20+
return json.dumps(
21+
parsed,
22+
indent=2,
23+
ensure_ascii=False,
24+
sort_keys=True,
25+
default=str, # fallback: converte qualquer coisa para str
26+
)
27+
except (json.JSONDecodeError, TypeError):
28+
return value

pid_provider/choices.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,14 @@
22

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

5-
# article is not public
5+
XMLURL_STATUS_SUCCESS = "success"
6+
XMLURL_STATUS_XML_FETCH_FAILED = "xml_fetch_failed"
7+
XMLURL_STATUS_PID_PROVIDER_XML_FAILED = "pid_provider_xml_failed"
8+
XMLURL_STATUS = (
9+
(XMLURL_STATUS_SUCCESS, _("Success")),
10+
(XMLURL_STATUS_XML_FETCH_FAILED, _("XML fetch failed")),
11+
(XMLURL_STATUS_PID_PROVIDER_XML_FAILED, _("PID provider XML failed")),
12+
)
613
PPXML_STATUS_WAIT = "WAIT"
714
#
815
PPXML_STATUS_IGNORED = "IGNORE"

pid_provider/exceptions.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
class SkipSavePidProviderXML(Exception): ...
2+
3+
14
class APIPidProviderPostError(Exception): ...
25

36

Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
# Generated by Django 5.2.7 on 2026-07-21 14:25
2+
3+
import django.db.models.deletion
4+
from django.conf import settings
5+
from django.db import migrations, models
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
dependencies = [
11+
("pid_provider", "0016_alter_pidproviderxml_proc_status_xmlevent"),
12+
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
13+
]
14+
15+
operations = [
16+
migrations.CreateModel(
17+
name="PidProviderXMLRegistration",
18+
fields=[
19+
(
20+
"id",
21+
models.BigAutoField(
22+
auto_created=True,
23+
primary_key=True,
24+
serialize=False,
25+
verbose_name="ID",
26+
),
27+
),
28+
(
29+
"created",
30+
models.DateTimeField(
31+
auto_now_add=True, verbose_name="Creation date"
32+
),
33+
),
34+
(
35+
"updated",
36+
models.DateTimeField(
37+
auto_now=True, verbose_name="Last update date"
38+
),
39+
),
40+
(
41+
"pkg_name",
42+
models.CharField(
43+
blank=True,
44+
max_length=100,
45+
null=True,
46+
verbose_name="Package name",
47+
),
48+
),
49+
(
50+
"event_status",
51+
models.CharField(
52+
blank=True,
53+
choices=[
54+
("created", "created"),
55+
("updated", "updated"),
56+
("skipped", "skipped"),
57+
("forbidden", "forbidden"),
58+
("conflict", "conflict"),
59+
("unmatched", "unmatched"),
60+
("bad_request", "bad_request"),
61+
("error", "error"),
62+
],
63+
max_length=15,
64+
null=True,
65+
verbose_name="Event status",
66+
),
67+
),
68+
(
69+
"detail",
70+
models.JSONField(blank=True, null=True, verbose_name="Detail"),
71+
),
72+
],
73+
options={
74+
"verbose_name": "PidProviderXML Registration",
75+
"verbose_name_plural": "PidProviderXML Registrations",
76+
"ordering": ["-created"],
77+
},
78+
),
79+
migrations.AddField(
80+
model_name="pidproviderxml",
81+
name="readable_data",
82+
field=models.JSONField(blank=True, null=True, verbose_name="Readable data"),
83+
),
84+
migrations.AddField(
85+
model_name="xmlurl",
86+
name="detail",
87+
field=models.JSONField(blank=True, null=True, verbose_name="Detail"),
88+
),
89+
migrations.AddField(
90+
model_name="xmlurl",
91+
name="is_public",
92+
field=models.BooleanField(
93+
blank=True, default=None, null=True, verbose_name="Is Public"
94+
),
95+
),
96+
migrations.AlterField(
97+
model_name="xmlurl",
98+
name="status",
99+
field=models.CharField(
100+
blank=True,
101+
choices=[
102+
("success", "Success"),
103+
("xml_fetch_failed", "XML fetch failed"),
104+
("pid_provider_xml_failed", "PID provider XML failed"),
105+
],
106+
max_length=50,
107+
null=True,
108+
verbose_name="Status",
109+
),
110+
),
111+
migrations.AddIndex(
112+
model_name="xmlurl",
113+
index=models.Index(fields=["is_public"], name="pid_provide_is_public_idx"),
114+
),
115+
migrations.AddField(
116+
model_name="pidproviderxmlregistration",
117+
name="creator",
118+
field=models.ForeignKey(
119+
editable=False,
120+
null=True,
121+
on_delete=django.db.models.deletion.SET_NULL,
122+
related_name="%(class)s_creator",
123+
to=settings.AUTH_USER_MODEL,
124+
verbose_name="Creator",
125+
),
126+
),
127+
migrations.AddField(
128+
model_name="pidproviderxmlregistration",
129+
name="pid_provider_xml",
130+
field=models.ForeignKey(
131+
blank=True,
132+
null=True,
133+
on_delete=django.db.models.deletion.SET_NULL,
134+
related_name="registration_events",
135+
to="pid_provider.pidproviderxml",
136+
),
137+
),
138+
migrations.AddField(
139+
model_name="pidproviderxmlregistration",
140+
name="updated_by",
141+
field=models.ForeignKey(
142+
blank=True,
143+
editable=False,
144+
null=True,
145+
on_delete=django.db.models.deletion.SET_NULL,
146+
related_name="%(class)s_last_mod_user",
147+
to=settings.AUTH_USER_MODEL,
148+
verbose_name="Updater",
149+
),
150+
),
151+
migrations.AddIndex(
152+
model_name="pidproviderxmlregistration",
153+
index=models.Index(
154+
fields=["pkg_name"], name="pid_provide_pkg_nam_2db0b2_idx"
155+
),
156+
),
157+
migrations.AddIndex(
158+
model_name="pidproviderxmlregistration",
159+
index=models.Index(
160+
fields=["event_status"], name="pid_provide_event_s_3c9ae7_idx"
161+
),
162+
),
163+
migrations.AddIndex(
164+
model_name="pidproviderxmlregistration",
165+
index=models.Index(
166+
fields=["-created"], name="pid_provide_created_94fb08_idx"
167+
),
168+
),
169+
migrations.AddIndex(
170+
model_name="pidproviderxmlregistration",
171+
index=models.Index(
172+
fields=["pid_provider_xml"], name="pid_provide_pid_pro_c9fb0e_idx"
173+
),
174+
),
175+
]
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# Generated by Django 5.2.7 on 2026-08-06 20:33
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
("pid_provider", "0017_pidproviderxmlregistration_and_more"),
10+
]
11+
12+
operations = [
13+
migrations.CreateModel(
14+
name="PidProviderSetting",
15+
fields=[
16+
(
17+
"id",
18+
models.BigAutoField(
19+
auto_created=True,
20+
primary_key=True,
21+
serialize=False,
22+
verbose_name="ID",
23+
),
24+
),
25+
(
26+
"record_all_registration_events",
27+
models.BooleanField(
28+
default=False,
29+
help_text="Quando ativo, grava auditoria em PidProviderXMLRegistration mesmo para fluxos limpos (created, updated, skipped).",
30+
verbose_name="Gravar todos os eventos de auditoria",
31+
),
32+
),
33+
],
34+
options={
35+
"verbose_name": "Configurações do PID Provider",
36+
},
37+
),
38+
]

0 commit comments

Comments
 (0)