From e51e379440bcc800309f2790f07cc0dd2b1392ef Mon Sep 17 00:00:00 2001 From: jburgos Date: Wed, 13 May 2026 13:45:56 +0000 Subject: [PATCH] inicio del repo --- __init__.py | 0 apps.py | 6 + media/js/views/components/plugins/resumen.js | 46 +++++++ migrations/0001_initial.py | 36 +++++ migrations/__init__.py | 0 models.py | 11 ++ resumen.json | 14 ++ templates/arches_urls.htm | 12 ++ .../views/components/plugins/resumen.htm | 123 ++++++++++++++++++ tests.py | 3 + urls.py | 6 + views/__init__.py | 0 views/resumen.py | 66 ++++++++++ 13 files changed, 323 insertions(+) create mode 100644 __init__.py create mode 100644 apps.py create mode 100644 media/js/views/components/plugins/resumen.js create mode 100644 migrations/0001_initial.py create mode 100644 migrations/__init__.py create mode 100644 models.py create mode 100644 resumen.json create mode 100644 templates/arches_urls.htm create mode 100644 templates/views/components/plugins/resumen.htm create mode 100644 tests.py create mode 100644 urls.py create mode 100644 views/__init__.py create mode 100644 views/resumen.py diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps.py b/apps.py new file mode 100644 index 0000000..03fcf51 --- /dev/null +++ b/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class ResumenConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'resumen' diff --git a/media/js/views/components/plugins/resumen.js b/media/js/views/components/plugins/resumen.js new file mode 100644 index 0000000..983ad89 --- /dev/null +++ b/media/js/views/components/plugins/resumen.js @@ -0,0 +1,46 @@ +define([ + 'knockout', + 'arches', + 'js-cookie', + 'templates/views/components/plugins/resumen.htm' +], function(ko, arches, Cookies, ResumenTemplate) { + + const ResumenViewModel = function() { + const self = this; + this.loading = ko.observable(true); + this.records = ko.observable(); + + this.getStatus = async function() { + const response = await window.fetch("resumen"); + const data = await response.json(); + self.bMueblesCount = data.b_muebles_count; + self.bInmueblesCount = data.b_inmuebles_count; + self.inmaterialCount = data.inmaterial_count; + self.sitiosArqCount = data.sitios_arq_count; + self.actoresCount = data.actores_count; + self.digitalesCount = data.digitales_count; + self.actividadesCount = data.actividades_count; + self.records(data.records); + self.loading(false); + }; + + this.saveStatus = async function() { + const response = await fetch("resumen", { + method: 'POST', + credentials: 'include', + headers: { + "X-CSRFToken": Cookies.get('csrftoken') + } + }); + const data = await response.json(); + self.records(data.records); + }; + + this.getStatus(); + }; + + return ko.components.register('resumen', { + viewModel: ResumenViewModel, + template: ResumenTemplate + }); +}); \ No newline at end of file diff --git a/migrations/0001_initial.py b/migrations/0001_initial.py new file mode 100644 index 0000000..4342754 --- /dev/null +++ b/migrations/0001_initial.py @@ -0,0 +1,36 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ] + + forward = """ + CREATE OR REPLACE VIEW resumen AS + SELECT g.name->>'es' AS modelo, COALESCE(COUNT(ri.resourceinstanceid),0) AS Cuenta + FROM graphs AS g LEFT JOIN resource_instances AS ri ON g.graphid = ri.graphid + WHERE g.isresource AND g.name ? 'es' + GROUP BY g.name; + """ + + reverse = """ + DROP VIEW IF EXISTS resumen; + DELETE FROM system_record; + """ + + operations = [ + migrations.CreateModel( + name='SystemRecord', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('state_details', models.JSONField(blank=True, null=True)), + ('state_time', models.DateTimeField(auto_now_add=True)), + ], + options={ + 'db_table': 'system_record', + 'managed': True, + }, + ), + migrations.RunSQL(forward, reverse), + ] diff --git a/migrations/__init__.py b/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/models.py b/models.py new file mode 100644 index 0000000..d73c2e1 --- /dev/null +++ b/models.py @@ -0,0 +1,11 @@ +from django.db import models +from django.db.models import JSONField + + +class SystemRecord(models.Model): + state_details = JSONField(blank=True, null=True) + state_time = models.DateTimeField(auto_now_add=True, blank=True) + + class Meta: + managed = True + db_table = "system_record" diff --git a/resumen.json b/resumen.json new file mode 100644 index 0000000..9cbbbec --- /dev/null +++ b/resumen.json @@ -0,0 +1,14 @@ +{ + "pluginid": "ba58b43b-5bd0-40f0-8876-78858a22cc77", + "name": "Resumen", + "icon": "fa fa-pie-chart", + "component": "views/components/plugins/resumen", + "componentname": "resumen", + "config": { + "show": true, + "is_workflow": false, + "description": "Resúmen estadístico de los registros patrimoniales" + }, + "slug": "resumen", + "sortorder": 1 +} \ No newline at end of file diff --git a/templates/arches_urls.htm b/templates/arches_urls.htm new file mode 100644 index 0000000..8686b89 --- /dev/null +++ b/templates/arches_urls.htm @@ -0,0 +1,12 @@ +{% extends "arches_urls.htm" %} + +{% load static %} +{% load l10n %} +{% load i18n %} + +{% block arches_urls %} +{{ block.super }} +
+{% endblock arches_urls %} \ No newline at end of file diff --git a/templates/views/components/plugins/resumen.htm b/templates/views/components/plugins/resumen.htm new file mode 100644 index 0000000..e76e6db --- /dev/null +++ b/templates/views/components/plugins/resumen.htm @@ -0,0 +1,123 @@ +{% load i18n %} + + + + +
+
+

Resúmen estadístico

+
+

Bienes Muebles:

+
+
+
+

Bienes Inmuebles:

+
+
+
+

Patrimonio Inmaterial:

+
+
+
+

Sitios arqueológicos:

+
+
+
+

Organizaciones y Personas:

+
+
+
+

Adjuntos digitales:

+
+
+
+

Actividades:

+
+
+ +
+

Historial de resúmenes

+
+

B. Muebles:

+

B. Inmuebles:

+

Inmaterial:

+

S. arqueológicos:

+

Org. y personas:

+

Adj. digitales:

+

Actividades:

+

Guardado:

+ +
+
+
+
+
+
+
+
+ +
+
+
+
+ \ No newline at end of file diff --git a/tests.py b/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/urls.py b/urls.py new file mode 100644 index 0000000..a625064 --- /dev/null +++ b/urls.py @@ -0,0 +1,6 @@ +from django.urls import re_path +from resumen.views.resumen import Resumen + +urlpatterns = [ + re_path(r"^resumen/", Resumen.as_view(), name="resumen"), +] \ No newline at end of file diff --git a/views/__init__.py b/views/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/views/resumen.py b/views/resumen.py new file mode 100644 index 0000000..fa7188e --- /dev/null +++ b/views/resumen.py @@ -0,0 +1,66 @@ +from django.utils.decorators import method_decorator +from django.views.generic import View +from django.views.decorators.csrf import csrf_exempt +from arches.app.models.models import ResourceInstance +from django.http import JsonResponse +from resumen.models import SystemRecord + +@method_decorator(csrf_exempt, name="dispatch") +class Resumen(View): + + def serialize_system_records(self): + res = [{ + "b_muebles": v["state_details"]["b_muebles"], + "b_inmuebles": v["state_details"]["b_inmuebles"], + "inmaterial": v["state_details"]["inmaterial"], + "sitios_arq": v["state_details"]["sitios_arq"], + "actores": v["state_details"]["actores"], + "digitales": v["state_details"]["digitales"], + "actividades": v["state_details"]["actividades"], + "statetime": v["state_time"].strftime("%d/%m/%Y, %H:%M:%S") + } for v in SystemRecord.objects.all().values().order_by('-state_time')] + return res + + def get(self, request): + data = { + "records": self.serialize_system_records(), + "b_muebles_count": ResourceInstance.objects.filter(graph_id='10b03fec-4d85-11ee-a708-ffcd06c08a5d').count() if \ + isinstance(ResourceInstance.objects.filter(graph_id='10b03fec-4d85-11ee-a708-ffcd06c08a5d').count(),int) else 0, + "b_inmuebles_count": ResourceInstance.objects.filter(graph_id='8ea3bf67-89ce-474c-b3cb-6dd5ee3d6198').count() if \ + isinstance(ResourceInstance.objects.filter(graph_id='8ea3bf67-89ce-474c-b3cb-6dd5ee3d6198').count(),int) else 0, + "inmaterial_count": ResourceInstance.objects.filter(graph_id='9b0e22c7-5c56-4be6-aa89-ae2632ba28e8').count() if \ + isinstance(ResourceInstance.objects.filter(graph_id='9b0e22c7-5c56-4be6-aa89-ae2632ba28e8').count(),int) else 0, + "sitios_arq_count": ResourceInstance.objects.filter(graph_id='76331d8a-4d85-11ee-a708-ffcd06c08a5d').count() if \ + isinstance(ResourceInstance.objects.filter(graph_id='76331d8a-4d85-11ee-a708-ffcd06c08a5d').count(),int) else 0, + "actores_count": ResourceInstance.objects.filter(graph_id='72420da0-db59-4048-aea2-03b0bc5cdcdf').count() if \ + isinstance(ResourceInstance.objects.filter(graph_id='72420da0-db59-4048-aea2-03b0bc5cdcdf').count(),int) else 0, + "digitales_count": ResourceInstance.objects.filter(graph_id='6afc4e9e-727e-4152-8084-309267752650').count() if \ + isinstance(ResourceInstance.objects.filter(graph_id='6afc4e9e-727e-4152-8084-309267752650').count(),int) else 0, + "actividades_count": ResourceInstance.objects.filter(graph_id='2bf240e6-718e-44f0-8073-4962d84931fe').count() if \ + isinstance(ResourceInstance.objects.filter(graph_id='2bf240e6-718e-44f0-8073-4962d84931fe').count(),int) else 0 + } + return JsonResponse(data) + + def post(self, request): + state = { + "b_muebles": ResourceInstance.objects.filter(graph_id='10b03fec-4d85-11ee-a708-ffcd06c08a5d').count() if \ + isinstance(ResourceInstance.objects.filter(graph_id='10b03fec-4d85-11ee-a708-ffcd06c08a5d').count(),int) else 0, + "b_inmuebles": ResourceInstance.objects.filter(graph_id='8ea3bf67-89ce-474c-b3cb-6dd5ee3d6198').count() if \ + isinstance(ResourceInstance.objects.filter(graph_id='8ea3bf67-89ce-474c-b3cb-6dd5ee3d6198').count(),int) else 0, + "inmaterial": ResourceInstance.objects.filter(graph_id='9b0e22c7-5c56-4be6-aa89-ae2632ba28e8').count() if \ + isinstance(ResourceInstance.objects.filter(graph_id='9b0e22c7-5c56-4be6-aa89-ae2632ba28e8').count(),int) else 0, + "sitios_arq": ResourceInstance.objects.filter(graph_id='76331d8a-4d85-11ee-a708-ffcd06c08a5d').count() if \ + isinstance(ResourceInstance.objects.filter(graph_id='76331d8a-4d85-11ee-a708-ffcd06c08a5d').count(),int) else 0, + "actores": ResourceInstance.objects.filter(graph_id='72420da0-db59-4048-aea2-03b0bc5cdcdf').count() if \ + isinstance(ResourceInstance.objects.filter(graph_id='72420da0-db59-4048-aea2-03b0bc5cdcdf').count(),int) else 0, + "digitales": ResourceInstance.objects.filter(graph_id='6afc4e9e-727e-4152-8084-309267752650').count() if \ + isinstance(ResourceInstance.objects.filter(graph_id='6afc4e9e-727e-4152-8084-309267752650').count(),int) else 0, + "actividades": ResourceInstance.objects.filter(graph_id='2bf240e6-718e-44f0-8073-4962d84931fe').count() if \ + isinstance(ResourceInstance.objects.filter(graph_id='2bf240e6-718e-44f0-8073-4962d84931fe').count(),int) else 0 + } + record = SystemRecord() + record.state_details = state + record.save() + data = {"records": self.serialize_system_records()} + return JsonResponse(data) +