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
+
+
+
+
Patrimonio Inmaterial:
+
+
+
+
Sitios arqueológicos:
+
+
+
+
Organizaciones y Personas:
+
+
+
+
Adjuntos digitales:
+
+
+
+
+
+
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)
+