djgentelella 0.3.29__py3-none-any.whl → 0.4.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- djgentelella/__init__.py +4 -1
- djgentelella/admin.py +4 -3
- djgentelella/fields/files.py +27 -1
- djgentelella/firmador_digital/__init__.py +0 -0
- djgentelella/firmador_digital/config/__init__.py +0 -0
- djgentelella/firmador_digital/config/asgi_config.py +32 -0
- djgentelella/firmador_digital/config/asgi_worker.py +5 -0
- djgentelella/firmador_digital/config/websocket_urls.py +4 -0
- djgentelella/firmador_digital/consumers/__init__.py +0 -0
- djgentelella/firmador_digital/consumers/pdf_render.py +8 -0
- djgentelella/firmador_digital/consumers/sign.py +148 -0
- djgentelella/firmador_digital/forms.py +28 -0
- djgentelella/firmador_digital/gunicorn/config_asgi.py +12 -0
- djgentelella/firmador_digital/gunicorn/config_wsgi.py +13 -0
- djgentelella/firmador_digital/models.py +33 -0
- djgentelella/firmador_digital/signvalue_utils.py +41 -0
- djgentelella/firmador_digital/utils.py +154 -0
- djgentelella/firmador_digital/viewsets.py +77 -0
- djgentelella/forms/forms.py +10 -2
- djgentelella/locale/es/LC_MESSAGES/django.mo +0 -0
- djgentelella/locale/es/LC_MESSAGES/django.po +103 -6
- djgentelella/locale/es/LC_MESSAGES/djangojs.mo +0 -0
- djgentelella/locale/es/LC_MESSAGES/djangojs.po +107 -8
- djgentelella/management/commands/createbasejs.py +3 -0
- djgentelella/management/commands/loaddevstatic.py +18 -0
- djgentelella/migrations/0013_usersignatureconfig.py +25 -0
- djgentelella/serializers/firmador_digital.py +103 -0
- djgentelella/settings.py +4 -2
- djgentelella/static/djgentelella.readonly.vendors.min.css +1 -1
- djgentelella/static/djgentelella.readonly.vendors.min.js +1 -1
- djgentelella/static/djgentelella.vendors.header.min.js +1 -1
- djgentelella/static/djgentelella.vendors.min.css +2 -2
- djgentelella/static/gentelella/css/pdfviewer.css +147 -0
- djgentelella/static/gentelella/images/firmador.ico +0 -0
- djgentelella/static/gentelella/js/base/digital_signature.js +945 -0
- djgentelella/static/gentelella/js/base.js +947 -0
- djgentelella/static/gentelella/js/datatables.js +2 -2
- djgentelella/static/gentelella/js/widgets.js +72 -59
- djgentelella/static/vendors/friconix/friconix.js +1 -1
- djgentelella/static/vendors/pdfjs/images/altText_add.svg +3 -0
- djgentelella/static/vendors/pdfjs/images/altText_disclaimer.svg +3 -0
- djgentelella/static/vendors/pdfjs/images/altText_done.svg +3 -0
- djgentelella/static/vendors/pdfjs/images/altText_spinner.svg +30 -0
- djgentelella/static/vendors/pdfjs/images/altText_warning.svg +3 -0
- djgentelella/static/vendors/pdfjs/images/cursor-editorFreeHighlight.svg +6 -0
- djgentelella/static/vendors/pdfjs/images/cursor-editorFreeText.svg +3 -0
- djgentelella/static/vendors/pdfjs/images/cursor-editorInk.svg +4 -0
- djgentelella/static/vendors/pdfjs/images/cursor-editorTextHighlight.svg +8 -0
- djgentelella/static/vendors/pdfjs/images/editor-toolbar-delete.svg +5 -0
- djgentelella/static/vendors/pdfjs/images/loading-icon.gif +0 -0
- djgentelella/static/vendors/pdfjs/images/messageBar_closingButton.svg +3 -0
- djgentelella/static/vendors/pdfjs/images/messageBar_warning.svg +3 -0
- djgentelella/static/vendors/pdfjs/images/toolbarButton-editorHighlight.svg +6 -0
- djgentelella/static/vendors/pdfjs/images/toolbarButton-menuArrow.svg +3 -0
- djgentelella/static/vendors/timeline/css/timeline.css +1 -1
- djgentelella/static/vendors/timeline/js/timeline.js +1 -1
- djgentelella/templates/forms/as_grid.html +2 -2
- djgentelella/templates/forms/as_inline.html +3 -5
- djgentelella/templates/gentelella/registration/login.html +38 -42
- djgentelella/templates/gentelella/registration/reset_done.html +24 -0
- djgentelella/templates/gentelella/statics/javascript.html +75 -61
- djgentelella/templates/gentelella/statics/stylesheets.html +11 -10
- djgentelella/templates/gentelella/widgets/addtreeselect.html +1 -1
- djgentelella/templates/gentelella/widgets/chunkedupload.html +2 -2
- djgentelella/templates/gentelella/widgets/digital_signature.html +208 -0
- djgentelella/templates/gentelella/widgets/file.html +15 -16
- djgentelella/templatetags/gtsettings.py +4 -0
- djgentelella/urls.py +2 -1
- djgentelella/widgets/core.py +5 -2
- djgentelella/widgets/digital_signature.py +116 -0
- {djgentelella-0.3.29.dist-info → djgentelella-0.4.1.dist-info}/METADATA +18 -20
- {djgentelella-0.3.29.dist-info → djgentelella-0.4.1.dist-info}/RECORD +76 -38
- {djgentelella-0.3.29.dist-info → djgentelella-0.4.1.dist-info}/WHEEL +1 -1
- {djgentelella-0.3.29.dist-info → djgentelella-0.4.1.dist-info}/AUTHORS +0 -0
- {djgentelella-0.3.29.dist-info → djgentelella-0.4.1.dist-info}/LICENSE.txt +0 -0
- {djgentelella-0.3.29.dist-info → djgentelella-0.4.1.dist-info}/top_level.txt +0 -0
djgentelella/forms/forms.py
CHANGED
|
@@ -69,6 +69,11 @@ class GTForm(forms.Form):
|
|
|
69
69
|
case _:
|
|
70
70
|
self.renderer.form_template_name = self.template_name_horizontal
|
|
71
71
|
|
|
72
|
+
def get_error_for_grid(self, name):
|
|
73
|
+
if name in self.errors:
|
|
74
|
+
return self.errors[name]
|
|
75
|
+
return None
|
|
76
|
+
|
|
72
77
|
@property
|
|
73
78
|
def grid(self):
|
|
74
79
|
"""
|
|
@@ -97,10 +102,13 @@ class GTForm(forms.Form):
|
|
|
97
102
|
row_list = []
|
|
98
103
|
for field in col:
|
|
99
104
|
if field in dic_fields and dic_fields[field]:
|
|
100
|
-
row_list.append(
|
|
105
|
+
row_list.append(
|
|
106
|
+
(dic_fields[field], self.get_error_for_grid(field))
|
|
107
|
+
)
|
|
101
108
|
else:
|
|
102
109
|
if hasattr(self, field):
|
|
103
|
-
row_list.append(getattr(self, field)()
|
|
110
|
+
row_list.append((getattr(self, field)(),
|
|
111
|
+
self.get_error_for_grid(field)))
|
|
104
112
|
col_list.append(row_list)
|
|
105
113
|
grid.append(col_list)
|
|
106
114
|
return grid
|
|
Binary file
|
|
@@ -7,8 +7,8 @@ msgid ""
|
|
|
7
7
|
msgstr ""
|
|
8
8
|
"Project-Id-Version: \n"
|
|
9
9
|
"Report-Msgid-Bugs-To: \n"
|
|
10
|
-
"POT-Creation-Date: 2025-
|
|
11
|
-
"PO-Revision-Date: 2025-
|
|
10
|
+
"POT-Creation-Date: 2025-03-29 22:37+0000\n"
|
|
11
|
+
"PO-Revision-Date: 2025-03-29 16:43-0600\n"
|
|
12
12
|
"Last-Translator: \n"
|
|
13
13
|
"Language-Team: \n"
|
|
14
14
|
"Language: es\n"
|
|
@@ -103,6 +103,36 @@ msgstr ""
|
|
|
103
103
|
"Estructura inválida, necesitas proporcionar {name: 'nombre del archivo', "
|
|
104
104
|
"value:'representación en cadena base64'}"
|
|
105
105
|
|
|
106
|
+
msgid "Invalid request."
|
|
107
|
+
msgstr "Petición inválida."
|
|
108
|
+
|
|
109
|
+
msgid "An unexpected error occurred."
|
|
110
|
+
msgstr "Ha ocurrido un error inesperado.."
|
|
111
|
+
|
|
112
|
+
msgid "Card"
|
|
113
|
+
msgstr "Carta"
|
|
114
|
+
|
|
115
|
+
msgid "Invalid value not encoded as b64 o json parser error"
|
|
116
|
+
msgstr ""
|
|
117
|
+
"Valor inválido, debe ser un documento base64 o un error al parsear el json"
|
|
118
|
+
|
|
119
|
+
msgid "An unexpected error occurred during the signing process."
|
|
120
|
+
msgstr ""
|
|
121
|
+
"Un error inesperado ha ocurrido durante el proceso de firmado de documentos."
|
|
122
|
+
|
|
123
|
+
msgid "An error occurred while communicating with the signing service."
|
|
124
|
+
msgstr ""
|
|
125
|
+
"Ha ocurrido un error al conectar con los servicios de firmado de documentos."
|
|
126
|
+
|
|
127
|
+
msgid "Unable to connect to the signing service."
|
|
128
|
+
msgstr "No se puede conectar con los servicios de firmado."
|
|
129
|
+
|
|
130
|
+
msgid "The request to the signing service timed out."
|
|
131
|
+
msgstr "El tiempo de espera del servicio de firma ha expirado."
|
|
132
|
+
|
|
133
|
+
msgid "An exception ocurred el request to the signing service."
|
|
134
|
+
msgstr "Un error ha ocurrido enviando la petición a los servicios de firmado."
|
|
135
|
+
|
|
106
136
|
#, python-brace-format
|
|
107
137
|
msgid "Do you want to delete {obj}?"
|
|
108
138
|
msgstr "¿Desea eliminar {obj}?"
|
|
@@ -333,9 +363,6 @@ msgstr "Enlace es válido por %(expiration_days)s días."
|
|
|
333
363
|
msgid "Account activation on"
|
|
334
364
|
msgstr "Activación de cuentas"
|
|
335
365
|
|
|
336
|
-
msgid "vendors/animate.css/animate.min.css"
|
|
337
|
-
msgstr "vendors/animate.css/animate.min.css"
|
|
338
|
-
|
|
339
366
|
msgid "Login"
|
|
340
367
|
msgstr "Iniciar sesión"
|
|
341
368
|
|
|
@@ -345,7 +372,7 @@ msgstr ""
|
|
|
345
372
|
|
|
346
373
|
msgid ""
|
|
347
374
|
"Your account doesn't have access to this page. To proceed,\n"
|
|
348
|
-
"
|
|
375
|
+
"\t\t\t\t\t\t\tplease login with an account that has access."
|
|
349
376
|
msgstr ""
|
|
350
377
|
"Su cuenta no tiene permisos de acceso para ver esta página. Para proceder,\n"
|
|
351
378
|
" por favor inicie sesión con otra cuenta con permisos "
|
|
@@ -514,6 +541,76 @@ msgstr "Sí"
|
|
|
514
541
|
msgid "Delete this file"
|
|
515
542
|
msgstr "Eliminar este archivo"
|
|
516
543
|
|
|
544
|
+
msgid "Reload"
|
|
545
|
+
msgstr "Recargar"
|
|
546
|
+
|
|
547
|
+
msgid "The signed option is not available."
|
|
548
|
+
msgstr "La opción firmada no está disponible."
|
|
549
|
+
|
|
550
|
+
msgid "We did not find an electronic signature card."
|
|
551
|
+
msgstr "No encontramos una tarjeta de firma electrónica."
|
|
552
|
+
|
|
553
|
+
msgid "Please make sure to comply with the notices or resolve the errors."
|
|
554
|
+
msgstr "Asegúrese de cumplir con los avisos o resuelva los errores."
|
|
555
|
+
|
|
556
|
+
msgid "Choose your signature card"
|
|
557
|
+
msgstr "Selecciona tu tarjeta de firma"
|
|
558
|
+
|
|
559
|
+
msgid "Electronic signature card"
|
|
560
|
+
msgstr "Tarjeta de firma electrónica"
|
|
561
|
+
|
|
562
|
+
msgid "Sign"
|
|
563
|
+
msgstr "Firmar"
|
|
564
|
+
|
|
565
|
+
msgid "Notices"
|
|
566
|
+
msgstr "Avisos"
|
|
567
|
+
|
|
568
|
+
msgid "You need Firmador Libre installed in order to sign."
|
|
569
|
+
msgstr "Necesitas instalar Firmador Libre para firmar."
|
|
570
|
+
|
|
571
|
+
msgid "Make sure your version is 1.9.8 or later."
|
|
572
|
+
msgstr "Asegúrate de que tu versión sea 1.9.8 o posterior."
|
|
573
|
+
|
|
574
|
+
msgid "Run the application before proceeding with the signature."
|
|
575
|
+
msgstr "Ejecuta la aplicación antes de proceder con la firma."
|
|
576
|
+
|
|
577
|
+
msgid "If the autolauncher doesn't work, I used this command line."
|
|
578
|
+
msgstr "Si el lanzador automático no funciona, usé esta línea de comandos."
|
|
579
|
+
|
|
580
|
+
msgid "Show command"
|
|
581
|
+
msgstr "Mostrar comando"
|
|
582
|
+
|
|
583
|
+
msgid "Copied to clipboard"
|
|
584
|
+
msgstr "Copiado al portapapeles"
|
|
585
|
+
|
|
586
|
+
msgid "Copy to clipboard"
|
|
587
|
+
msgstr "Copiar al portapapeles"
|
|
588
|
+
|
|
589
|
+
msgid "Download Firmador Libre"
|
|
590
|
+
msgstr "Descargar Firmador Libre"
|
|
591
|
+
|
|
592
|
+
msgid "Download app"
|
|
593
|
+
msgstr "Descargar aplicación"
|
|
594
|
+
|
|
595
|
+
msgid "Run Firmador Libre"
|
|
596
|
+
msgstr "Ejecutar Firmador Libre"
|
|
597
|
+
|
|
598
|
+
msgid "Run app"
|
|
599
|
+
msgstr "Ejecutar aplicación"
|
|
600
|
+
|
|
601
|
+
msgid ""
|
|
602
|
+
"Please go to the last page, in the signature space, try to place your "
|
|
603
|
+
"signature vertically centered."
|
|
604
|
+
msgstr ""
|
|
605
|
+
"Por favor, vaya a la última página, en el espacio de firma, intente colocar "
|
|
606
|
+
"su firma verticalmente centrada."
|
|
607
|
+
|
|
608
|
+
msgid "Loading..."
|
|
609
|
+
msgstr "Cargando..."
|
|
610
|
+
|
|
611
|
+
msgid "Please wait while the document is being signed."
|
|
612
|
+
msgstr "Por favor, espere mientras se firma el documento."
|
|
613
|
+
|
|
517
614
|
msgid "Start"
|
|
518
615
|
msgstr "Iniciar"
|
|
519
616
|
|
|
Binary file
|
|
@@ -7,8 +7,8 @@ msgid ""
|
|
|
7
7
|
msgstr ""
|
|
8
8
|
"Project-Id-Version: \n"
|
|
9
9
|
"Report-Msgid-Bugs-To: \n"
|
|
10
|
-
"POT-Creation-Date:
|
|
11
|
-
"PO-Revision-Date:
|
|
10
|
+
"POT-Creation-Date: 2025-03-29 16:37-0600\n"
|
|
11
|
+
"PO-Revision-Date: 2025-03-29 16:45-0600\n"
|
|
12
12
|
"Last-Translator: \n"
|
|
13
13
|
"Language-Team: \n"
|
|
14
14
|
"Language: es\n"
|
|
@@ -45,6 +45,111 @@ msgstr "Grabar"
|
|
|
45
45
|
msgid "Recording..."
|
|
46
46
|
msgstr "Grabando..."
|
|
47
47
|
|
|
48
|
+
msgid "Error when applying setting to signature: "
|
|
49
|
+
msgstr "Error aplicando las propiedades de firma digital "
|
|
50
|
+
|
|
51
|
+
msgid "Error loading content: "
|
|
52
|
+
msgstr "Error cargando contenido: "
|
|
53
|
+
|
|
54
|
+
msgid "Error loading image"
|
|
55
|
+
msgstr "Error cargando imagen"
|
|
56
|
+
|
|
57
|
+
msgid "Error"
|
|
58
|
+
msgstr "Error"
|
|
59
|
+
|
|
60
|
+
msgid "Errors"
|
|
61
|
+
msgstr "Errores"
|
|
62
|
+
|
|
63
|
+
msgid "Warning"
|
|
64
|
+
msgstr "Advertencia"
|
|
65
|
+
|
|
66
|
+
msgid "The signing was successfully completed."
|
|
67
|
+
msgstr "La firma se ha completado correctamente."
|
|
68
|
+
|
|
69
|
+
msgid "Success"
|
|
70
|
+
msgstr "Éxito"
|
|
71
|
+
|
|
72
|
+
msgid ""
|
|
73
|
+
"An error has occurred in the internal server of the uncontrolled 'Firmador "
|
|
74
|
+
"Libre'."
|
|
75
|
+
msgstr ""
|
|
76
|
+
"Ha ocurrido un error en el servidor interno del no controlado 'Firmador "
|
|
77
|
+
"Libre'."
|
|
78
|
+
|
|
79
|
+
msgid ""
|
|
80
|
+
"Make sure to start the 'Firmador Libre' application. If it is already "
|
|
81
|
+
"running, please press the reload button."
|
|
82
|
+
msgstr ""
|
|
83
|
+
"Asegúrate de iniciar la aplicación 'Firmador Libre'. Si ya está en "
|
|
84
|
+
"ejecución, presiona el botón de recarga."
|
|
85
|
+
|
|
86
|
+
msgid ""
|
|
87
|
+
"There is no card connected to the device. Please press the reload button and "
|
|
88
|
+
"connect your card."
|
|
89
|
+
msgstr ""
|
|
90
|
+
"No hay tarjeta conectada al dispositivo. Presiona el botón de recarga y "
|
|
91
|
+
"conecta tu tarjeta."
|
|
92
|
+
|
|
93
|
+
msgid ""
|
|
94
|
+
"The internal signature service does not work. Please contact the support."
|
|
95
|
+
msgstr "El servicio de firma interna no funciona. Contacta con el soporte."
|
|
96
|
+
|
|
97
|
+
msgid ""
|
|
98
|
+
"Authentication failed because the PIN entry window was detected closed, "
|
|
99
|
+
"please try again."
|
|
100
|
+
msgstr ""
|
|
101
|
+
"La autenticación falló porque la ventana de entrada PIN fue detectada "
|
|
102
|
+
"cerrada, intenta de nuevo."
|
|
103
|
+
|
|
104
|
+
msgid ""
|
|
105
|
+
"The device was disconnected, possibly the window was closed for signature. "
|
|
106
|
+
"Please close the window for the authentication PIN."
|
|
107
|
+
msgstr ""
|
|
108
|
+
"El dispositivo se desconectó, posiblemente la ventana para la firma se "
|
|
109
|
+
"cerró. Cierra la ventana para la autenticación PIN."
|
|
110
|
+
|
|
111
|
+
msgid "The new signature field position overlaps with an existing signature."
|
|
112
|
+
msgstr "El nuevo campo de firma se superpone con una firma existente."
|
|
113
|
+
|
|
114
|
+
msgid "The new signature field position is outside the page dimensions."
|
|
115
|
+
msgstr "El nuevo campo de firma está fuera de los límites de la página."
|
|
116
|
+
|
|
117
|
+
msgid "The version of one or more libraries is incompatible."
|
|
118
|
+
msgstr "La versión de una o más bibliotecas es incompatible."
|
|
119
|
+
|
|
120
|
+
msgid "The cryptographic provider is not available."
|
|
121
|
+
msgstr "El proveedor de criptografía no está disponible."
|
|
122
|
+
|
|
123
|
+
msgid "The signing algorithm is not available."
|
|
124
|
+
msgstr "El algoritmo de firma no está disponible."
|
|
125
|
+
|
|
126
|
+
msgid ""
|
|
127
|
+
"Errors have been encountered in the data to be sent to the 'Free Signer'. "
|
|
128
|
+
"Please press the reload button and try again."
|
|
129
|
+
msgstr ""
|
|
130
|
+
"Se han encontrado errores en los datos que se enviarán al 'Firmador Libre'. "
|
|
131
|
+
"Presiona el botón de recarga y intenta de nuevo."
|
|
132
|
+
|
|
133
|
+
msgid ""
|
|
134
|
+
"The request to the signing service timed out. Please, press the reload "
|
|
135
|
+
"button and try again."
|
|
136
|
+
msgstr ""
|
|
137
|
+
"El tiempo de espera del servicio de firma ha expirado. Presiona el botón de "
|
|
138
|
+
"recarga y intenta de nuevo."
|
|
139
|
+
|
|
140
|
+
msgid ""
|
|
141
|
+
"We're sorry, an unexpected error occurred. Please, press the reload button "
|
|
142
|
+
"and try again."
|
|
143
|
+
msgstr ""
|
|
144
|
+
"Lo sentimos, ha ocurrido un error inesperado. Presiona el botón de recarga y "
|
|
145
|
+
"intenta de nuevo."
|
|
146
|
+
|
|
147
|
+
msgid "Accept"
|
|
148
|
+
msgstr "Aceptar"
|
|
149
|
+
|
|
150
|
+
msgid "Cancel"
|
|
151
|
+
msgstr "Cancelar"
|
|
152
|
+
|
|
48
153
|
msgid " Records Selected"
|
|
49
154
|
msgstr " Grabar seleccionado"
|
|
50
155
|
|
|
@@ -81,12 +186,6 @@ msgstr "Descargar"
|
|
|
81
186
|
msgid "Clear Filters"
|
|
82
187
|
msgstr "Limpiar Filtros"
|
|
83
188
|
|
|
84
|
-
msgid "Success"
|
|
85
|
-
msgstr "Éxito"
|
|
86
|
-
|
|
87
|
-
msgid "Error"
|
|
88
|
-
msgstr "Error"
|
|
89
|
-
|
|
90
189
|
msgid "Actions"
|
|
91
190
|
msgstr "Acciones"
|
|
92
191
|
|
|
@@ -29,6 +29,7 @@ class Command(BaseCommand):
|
|
|
29
29
|
'calendar.js',
|
|
30
30
|
'timeline.js',
|
|
31
31
|
'mediarecord.js',
|
|
32
|
+
'digital_signature.js',
|
|
32
33
|
'api_list.js',
|
|
33
34
|
'tagify.js'
|
|
34
35
|
]
|
|
@@ -41,12 +42,14 @@ class Command(BaseCommand):
|
|
|
41
42
|
]
|
|
42
43
|
|
|
43
44
|
with open(basepath / 'base.js', 'w') as fwriter:
|
|
45
|
+
# load jquery plugins
|
|
44
46
|
fwriter.write("(function($){\n")
|
|
45
47
|
for f in jquery_plugins:
|
|
46
48
|
with open(basepath / 'base' / f, 'r') as rfile:
|
|
47
49
|
fwriter.write("\n%s\n" % (rfile.read()))
|
|
48
50
|
fwriter.write("})(jQuery)\n")
|
|
49
51
|
|
|
52
|
+
# load base files
|
|
50
53
|
for f in basefiles:
|
|
51
54
|
with open(basepath / 'base' / f, 'r') as rfile:
|
|
52
55
|
fwriter.write("\n%s\n" % (rfile.read()))
|
|
@@ -375,8 +375,26 @@ class Command(BaseCommand):
|
|
|
375
375
|
'https://cdnjs.cloudflare.com/ajax/libs/pdf.js/4.6.82/pdf.worker.min.mjs',
|
|
376
376
|
'https://cdnjs.cloudflare.com/ajax/libs/interact.js/1.10.27/interact.min.js',
|
|
377
377
|
],
|
|
378
|
+
|
|
378
379
|
'htmlx': [
|
|
379
380
|
'https://unpkg.com/htmx.org@2.0.4/dist/htmx.min.js'
|
|
381
|
+
],
|
|
382
|
+
'pdfjs/images/': [
|
|
383
|
+
"https://cdnjs.cloudflare.com/ajax/libs/pdf.js/4.6.82/images/messageBar_warning.svg",
|
|
384
|
+
"https://cdnjs.cloudflare.com/ajax/libs/pdf.js/4.6.82/images/messageBar_closingButton.svg",
|
|
385
|
+
"https://cdnjs.cloudflare.com/ajax/libs/pdf.js/4.6.82/images/cursor-editorInk.svg",
|
|
386
|
+
"https://cdnjs.cloudflare.com/ajax/libs/pdf.js/4.6.82/images/cursor-editorTextHighlight.svg",
|
|
387
|
+
"https://cdnjs.cloudflare.com/ajax/libs/pdf.js/4.6.82/images/cursor-editorFreeHighlight.svg",
|
|
388
|
+
"https://cdnjs.cloudflare.com/ajax/libs/pdf.js/4.6.82/images/altText_warning.svg",
|
|
389
|
+
"https://cdnjs.cloudflare.com/ajax/libs/pdf.js/4.6.82/images/cursor-editorFreeText.svg",
|
|
390
|
+
"https://cdnjs.cloudflare.com/ajax/libs/pdf.js/4.6.82/images/editor-toolbar-delete.svg",
|
|
391
|
+
"https://cdnjs.cloudflare.com/ajax/libs/pdf.js/4.6.82/images/toolbarButton-editorHighlight.svg",
|
|
392
|
+
"https://cdnjs.cloudflare.com/ajax/libs/pdf.js/4.6.82/images/altText_add.svg",
|
|
393
|
+
"https://cdnjs.cloudflare.com/ajax/libs/pdf.js/4.6.82/images/altText_done.svg",
|
|
394
|
+
"https://cdnjs.cloudflare.com/ajax/libs/pdf.js/4.6.82/images/altText_disclaimer.svg",
|
|
395
|
+
"https://cdnjs.cloudflare.com/ajax/libs/pdf.js/4.6.82/images/altText_spinner.svg",
|
|
396
|
+
"https://cdnjs.cloudflare.com/ajax/libs/pdf.js/4.6.82/images/toolbarButton-menuArrow.svg",
|
|
397
|
+
"https://cdnjs.cloudflare.com/ajax/libs/pdf.js/4.6.82/images/loading-icon.gif"
|
|
380
398
|
]
|
|
381
399
|
}
|
|
382
400
|
compressed = {
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Generated by Django 5.1.5 on 2025-02-04 14:22
|
|
2
|
+
|
|
3
|
+
import django.db.models.deletion
|
|
4
|
+
import djgentelella.firmador_digital.models
|
|
5
|
+
from django.conf import settings
|
|
6
|
+
from django.db import migrations, models
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class Migration(migrations.Migration):
|
|
10
|
+
|
|
11
|
+
dependencies = [
|
|
12
|
+
('djgentelella', '00012_defaultusecompessstatic'),
|
|
13
|
+
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
|
14
|
+
]
|
|
15
|
+
|
|
16
|
+
operations = [
|
|
17
|
+
migrations.CreateModel(
|
|
18
|
+
name='UserSignatureConfig',
|
|
19
|
+
fields=[
|
|
20
|
+
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
21
|
+
('config', models.JSONField(default=djgentelella.firmador_digital.models.get_signature_default)),
|
|
22
|
+
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
|
23
|
+
],
|
|
24
|
+
),
|
|
25
|
+
]
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import base64
|
|
2
|
+
import json
|
|
3
|
+
import logging
|
|
4
|
+
|
|
5
|
+
from rest_framework import serializers
|
|
6
|
+
|
|
7
|
+
logger = logging.getLogger('djgentelella')
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class DocumentSettingsSerializer(serializers.Serializer):
|
|
11
|
+
pageNumber = serializers.IntegerField(min_value=1, default=1)
|
|
12
|
+
signWidth = serializers.IntegerField(min_value=1, default=133)
|
|
13
|
+
signHeight = serializers.IntegerField(min_value=1, default=33)
|
|
14
|
+
signX = serializers.IntegerField(min_value=0, default=198)
|
|
15
|
+
signY = serializers.IntegerField(min_value=0, default=0)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class InstanceSerializer(serializers.Serializer):
|
|
19
|
+
pk = serializers.IntegerField()
|
|
20
|
+
cc = serializers.IntegerField()
|
|
21
|
+
value = serializers.CharField()
|
|
22
|
+
|
|
23
|
+
def get_json_file(self, value):
|
|
24
|
+
jsondata = None
|
|
25
|
+
try:
|
|
26
|
+
instance = base64.b64decode(value.encode())
|
|
27
|
+
jsondata = json.loads(instance.decode())
|
|
28
|
+
except Exception as e:
|
|
29
|
+
logger.error("Validation of value on digital signature fail", exc_info=e)
|
|
30
|
+
return jsondata
|
|
31
|
+
|
|
32
|
+
def get_file_from_token(self, token):
|
|
33
|
+
from djgentelella.models import ChunkedUpload
|
|
34
|
+
tmpupload = ChunkedUpload.objects.filter(upload_id=token).first()
|
|
35
|
+
dev = None
|
|
36
|
+
if tmpupload:
|
|
37
|
+
dev = tmpupload.get_uploaded_file().read()
|
|
38
|
+
return dev
|
|
39
|
+
|
|
40
|
+
def get_instance_file(self, instance, fieldname):
|
|
41
|
+
file_path = getattr(instance, fieldname)
|
|
42
|
+
file_data = None
|
|
43
|
+
with open(file_path.path, 'rb') as f:
|
|
44
|
+
file_data = f.read()
|
|
45
|
+
return file_data
|
|
46
|
+
|
|
47
|
+
def validate_value(self, data):
|
|
48
|
+
jsonparse = self.get_json_file(data)
|
|
49
|
+
if not jsonparse:
|
|
50
|
+
raise serializers.ValidationError("Invalid encode value")
|
|
51
|
+
return jsonparse
|
|
52
|
+
|
|
53
|
+
def validate(self, attrs):
|
|
54
|
+
from django.contrib.contenttypes.models import ContentType
|
|
55
|
+
cc = attrs.get("cc")
|
|
56
|
+
pk = attrs.get("pk")
|
|
57
|
+
ccinstance = ContentType.objects.get_for_id(cc)
|
|
58
|
+
instance = ccinstance.get_object_for_this_type(pk=pk)
|
|
59
|
+
value = attrs.get("value")
|
|
60
|
+
if 'token' in value:
|
|
61
|
+
attrs['value'] = self.get_file_from_token(value['token'])
|
|
62
|
+
elif 'field_name' in value:
|
|
63
|
+
attrs['value'] = self.get_instance_file(instance, value['field_name'])
|
|
64
|
+
return attrs
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
class RequestInitialDoc(serializers.Serializer):
|
|
68
|
+
docsettings = DocumentSettingsSerializer()
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
class WSRequest(serializers.Serializer):
|
|
72
|
+
action = serializers.CharField()
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
class CardSerializer(serializers.Serializer):
|
|
76
|
+
certificate = serializers.CharField()
|
|
77
|
+
commonName = serializers.CharField()
|
|
78
|
+
firstName = serializers.CharField()
|
|
79
|
+
identification = serializers.CharField()
|
|
80
|
+
lastName = serializers.CharField()
|
|
81
|
+
tokenSerialNumber = serializers.CharField()
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
class SignatureSerializer(serializers.Serializer):
|
|
85
|
+
algorithm = serializers.CharField()
|
|
86
|
+
value = serializers.CharField()
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
class InitialSignatureSerializer(serializers.Serializer):
|
|
90
|
+
action = serializers.CharField()
|
|
91
|
+
docsettings = DocumentSettingsSerializer()
|
|
92
|
+
card = CardSerializer()
|
|
93
|
+
logo_url = serializers.CharField(required=False, allow_null=True, allow_blank=True)
|
|
94
|
+
instance = InstanceSerializer()
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
class CompleteSignatureSerializer(serializers.Serializer):
|
|
98
|
+
action = serializers.CharField()
|
|
99
|
+
documentid = serializers.CharField()
|
|
100
|
+
certificate = serializers.CharField()
|
|
101
|
+
signature = SignatureSerializer()
|
|
102
|
+
logo_url = serializers.CharField(required=False, allow_null=True, allow_blank=True)
|
|
103
|
+
instance = InstanceSerializer()
|
djgentelella/settings.py
CHANGED
|
@@ -42,7 +42,7 @@ try:
|
|
|
42
42
|
except Exception as e:
|
|
43
43
|
from django.contrib.auth.models import User
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
############################################
|
|
46
46
|
# Chunked Upload
|
|
47
47
|
############################################
|
|
48
48
|
|
|
@@ -83,5 +83,7 @@ CONTENT_TYPE = getattr(settings, 'CHUNKED_UPLOAD_CONTENT_TYPE',
|
|
|
83
83
|
DEFAULT_MAX_BYTES = None
|
|
84
84
|
MAX_BYTES = getattr(settings, 'CHUNKED_UPLOAD_MAX_BYTES', DEFAULT_MAX_BYTES)
|
|
85
85
|
|
|
86
|
-
|
|
86
|
+
############################################
|
|
87
87
|
# END UPLOAD CHUNKED
|
|
88
|
+
|
|
89
|
+
|