djgentelella 0.4.30__py3-none-any.whl → 0.5.0__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 +7 -1
- djgentelella/firmador_digital/consumers/sign.py +24 -3
- djgentelella/firmador_digital/forms.py +140 -0
- djgentelella/firmador_digital/models.py +20 -2
- djgentelella/firmador_digital/utils.py +11 -0
- djgentelella/firmador_digital/views.py +31 -0
- djgentelella/firmador_digital/viewsets.py +15 -4
- djgentelella/forms/forms.py +10 -2
- djgentelella/groute.py +4 -1
- djgentelella/locale/es/LC_MESSAGES/django.mo +0 -0
- djgentelella/locale/es/LC_MESSAGES/django.po +67 -0
- djgentelella/locale/es/LC_MESSAGES/djangojs.mo +0 -0
- djgentelella/locale/es/LC_MESSAGES/djangojs.po +9 -0
- djgentelella/migrations/0014_trash.py +31 -0
- djgentelella/migrations/0015_trash_deleted_by.py +21 -0
- djgentelella/migrations/0016_trash_created_at.py +20 -0
- djgentelella/models.py +96 -0
- djgentelella/models_manager.py +40 -0
- djgentelella/serializers/firmador_digital.py +9 -1
- djgentelella/serializers/selects.py +14 -0
- djgentelella/static/djgentelella.flags.vendors.min.css +1 -1
- djgentelella/static/djgentelella.readonly.vendors.min.css +9 -5
- djgentelella/static/djgentelella.readonly.vendors.min.js +1 -1
- djgentelella/static/gentelella/css/custom.css +23 -2
- djgentelella/static/gentelella/css/modern.css +15 -0
- djgentelella/static/gentelella/css/modern_black_white.css +15 -0
- djgentelella/static/gentelella/css/pdfviewer.css +43 -1
- djgentelella/static/gentelella/images/default.png +0 -0
- djgentelella/static/gentelella/js/base/digital_signature.js +318 -79
- djgentelella/static/gentelella/js/base/form.common.js +9 -4
- djgentelella/static/gentelella/js/base/select2_wrap.js +15 -1
- djgentelella/static/gentelella/js/base/select2related.js +5 -0
- djgentelella/static/gentelella/js/base.js +347 -83
- djgentelella/static/gentelella/js/custom.js +6 -1
- djgentelella/static/gentelella/js/datatables.js +15 -0
- djgentelella/static/gentelella/js/digital_signature_update.js +29 -0
- djgentelella/static/gentelella/js/obj_api_management.js +403 -344
- djgentelella/static/gentelella/js/widgets.js +10 -1
- djgentelella/static/vendors/bootstrap-datetimepicker/bootstrap-datetimepicker.min.css.map +75 -7
- djgentelella/static/vendors/flags/1x1/ac.svg +75 -7
- djgentelella/static/vendors/flags/1x1/cp.svg +75 -7
- djgentelella/static/vendors/flags/1x1/dg.svg +75 -7
- djgentelella/static/vendors/flags/1x1/ea.svg +75 -7
- djgentelella/static/vendors/flags/1x1/es-ct.svg +75 -7
- djgentelella/static/vendors/flags/1x1/es-ga.svg +75 -7
- djgentelella/static/vendors/flags/1x1/ic.svg +75 -7
- djgentelella/static/vendors/flags/1x1/ta.svg +75 -7
- djgentelella/static/vendors/flags/1x1/xx.svg +75 -7
- djgentelella/static/vendors/flags/4x3/ac.svg +75 -7
- djgentelella/static/vendors/flags/4x3/cp.svg +75 -7
- djgentelella/static/vendors/flags/4x3/dg.svg +75 -7
- djgentelella/static/vendors/flags/4x3/ea.svg +75 -7
- djgentelella/static/vendors/flags/4x3/es-ct.svg +75 -7
- djgentelella/static/vendors/flags/4x3/es-ga.svg +75 -7
- djgentelella/static/vendors/flags/4x3/ic.svg +75 -7
- djgentelella/static/vendors/flags/4x3/ta.svg +75 -7
- djgentelella/static/vendors/flags/4x3/xx.svg +75 -7
- djgentelella/static/vendors/timeline/css/timeline.css +9 -5
- 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/app/sidebar.html +16 -13
- djgentelella/templates/gentelella/digital_signature/update_signature_settings.html +45 -0
- djgentelella/templates/gentelella/registration/reset_done.html +24 -0
- djgentelella/templates/gentelella/widgets/digital_signature.html +47 -11
- djgentelella/trash/api.py +58 -0
- djgentelella/trash/filterset.py +20 -0
- djgentelella/trash/serializer.py +45 -0
- djgentelella/urls.py +8 -1
- djgentelella/views/select2autocomplete.py +40 -0
- djgentelella/widgets/core.py +6 -5
- djgentelella/widgets/digital_signature.py +5 -21
- djgentelella/widgets/selects.py +47 -0
- {djgentelella-0.4.30.dist-info → djgentelella-0.5.0.dist-info}/METADATA +2 -2
- {djgentelella-0.4.30.dist-info → djgentelella-0.5.0.dist-info}/RECORD +80 -68
- {djgentelella-0.4.30.dist-info → djgentelella-0.5.0.dist-info}/AUTHORS +0 -0
- {djgentelella-0.4.30.dist-info → djgentelella-0.5.0.dist-info}/LICENSE.txt +0 -0
- {djgentelella-0.4.30.dist-info → djgentelella-0.5.0.dist-info}/WHEEL +0 -0
- {djgentelella-0.4.30.dist-info → djgentelella-0.5.0.dist-info}/top_level.txt +0 -0
djgentelella/models.py
CHANGED
|
@@ -5,6 +5,10 @@ from django.utils.translation import gettext_lazy as _
|
|
|
5
5
|
from tree_queries.models import TreeNode
|
|
6
6
|
|
|
7
7
|
from djgentelella.chunked_upload.models import AbstractChunkedUpload
|
|
8
|
+
from django.contrib.contenttypes.models import ContentType
|
|
9
|
+
from django.contrib.contenttypes.fields import GenericForeignKey
|
|
10
|
+
from .models_manager import ObjectManager, AllObjectsManager, \
|
|
11
|
+
DeletedObjectsManager
|
|
8
12
|
|
|
9
13
|
|
|
10
14
|
class GentelellaSettings(models.Model):
|
|
@@ -123,3 +127,95 @@ class ChunkedUpload(AbstractChunkedUpload):
|
|
|
123
127
|
null=DEFAULT_MODEL_USER_FIELD_NULL,
|
|
124
128
|
blank=DEFAULT_MODEL_USER_FIELD_BLANK
|
|
125
129
|
)
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
# Trash
|
|
133
|
+
class Trash(models.Model):
|
|
134
|
+
"""
|
|
135
|
+
Trash generic. Each row represents an instance deleted.
|
|
136
|
+
"""
|
|
137
|
+
content_type = models.ForeignKey(ContentType, on_delete=models.PROTECT,
|
|
138
|
+
verbose_name=_("Content type"))
|
|
139
|
+
object_id = models.PositiveIntegerField(verbose_name=_("Object ID"))
|
|
140
|
+
content_object = GenericForeignKey("content_type", "object_id")
|
|
141
|
+
object_repr = models.CharField(
|
|
142
|
+
_("Object repr"), max_length=200,
|
|
143
|
+
help_text=_("Value of str(instance) at deletion time"),
|
|
144
|
+
)
|
|
145
|
+
deleted_by = models.ForeignKey(
|
|
146
|
+
User,
|
|
147
|
+
on_delete=models.SET_NULL,
|
|
148
|
+
null=True,
|
|
149
|
+
blank=True,
|
|
150
|
+
verbose_name=_("Deleted by")
|
|
151
|
+
)
|
|
152
|
+
created_at = models.DateTimeField(auto_now_add=True)
|
|
153
|
+
|
|
154
|
+
class Meta:
|
|
155
|
+
ordering = ("id",)
|
|
156
|
+
unique_together = ("content_type", "object_id")
|
|
157
|
+
indexes = [
|
|
158
|
+
models.Index(fields=["content_type", "object_id"]),
|
|
159
|
+
]
|
|
160
|
+
verbose_name = _("Trash")
|
|
161
|
+
verbose_name_plural = _("Trash")
|
|
162
|
+
|
|
163
|
+
def __str__(self):
|
|
164
|
+
return _("Registration in trash: %(obj)s") % {"obj": self.object_repr}
|
|
165
|
+
|
|
166
|
+
def restore(self, user=None):
|
|
167
|
+
obj = self.content_object
|
|
168
|
+
|
|
169
|
+
# if `is_deleted` is in the model, unmark it
|
|
170
|
+
if hasattr(obj, "restore"):
|
|
171
|
+
obj.restore()
|
|
172
|
+
|
|
173
|
+
self.delete() # delete the instance of trash
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def hard_delete(self):
|
|
177
|
+
"""
|
|
178
|
+
Permanent deletion of the original object and then the trash entry.
|
|
179
|
+
"""
|
|
180
|
+
obj = self.content_object
|
|
181
|
+
|
|
182
|
+
if obj is None:
|
|
183
|
+
return
|
|
184
|
+
|
|
185
|
+
obj.delete(hard=True)
|
|
186
|
+
|
|
187
|
+
super().delete()
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
class DeletedWithTrash(models.Model):
|
|
191
|
+
is_deleted = models.BooleanField(default=False, db_index=True)
|
|
192
|
+
|
|
193
|
+
objects = ObjectManager()
|
|
194
|
+
objects_with_deleted = AllObjectsManager()
|
|
195
|
+
objects_deleted_only = DeletedObjectsManager()
|
|
196
|
+
|
|
197
|
+
class Meta:
|
|
198
|
+
abstract = True
|
|
199
|
+
|
|
200
|
+
def delete(self, using=None, keep_parents=False, *, hard=False, user=None):
|
|
201
|
+
if hard:
|
|
202
|
+
# Permanent deletion
|
|
203
|
+
return super().delete(using=using, keep_parents=keep_parents)
|
|
204
|
+
|
|
205
|
+
self.is_deleted = True
|
|
206
|
+
self.save(update_fields=["is_deleted"])
|
|
207
|
+
|
|
208
|
+
# create trash instance
|
|
209
|
+
Trash.objects.get_or_create(
|
|
210
|
+
content_type=ContentType.objects.get_for_model(self.__class__),
|
|
211
|
+
object_id=self.pk,
|
|
212
|
+
defaults={
|
|
213
|
+
"object_repr": str(self)[:200],
|
|
214
|
+
"deleted_by": user,
|
|
215
|
+
},
|
|
216
|
+
)
|
|
217
|
+
|
|
218
|
+
# Restore an object
|
|
219
|
+
def restore(self):
|
|
220
|
+
self.is_deleted = False
|
|
221
|
+
self.save(update_fields=["is_deleted"])
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class ObjectQuerySet(models.QuerySet):
|
|
5
|
+
# Non-deleted records
|
|
6
|
+
def alive(self):
|
|
7
|
+
return self.filter(is_deleted=False)
|
|
8
|
+
|
|
9
|
+
# Only deleted records
|
|
10
|
+
def dead(self):
|
|
11
|
+
return self.filter(is_deleted=True)
|
|
12
|
+
|
|
13
|
+
# Overridden delete (soft delete)
|
|
14
|
+
def delete(self):
|
|
15
|
+
return super().update(is_deleted=True)
|
|
16
|
+
|
|
17
|
+
# Permanent deletion
|
|
18
|
+
def hard_delete(self):
|
|
19
|
+
return super().delete()
|
|
20
|
+
|
|
21
|
+
# Bulk restore
|
|
22
|
+
def restore(self):
|
|
23
|
+
return self.update(is_deleted=False)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class ObjectManager(models.Manager):
|
|
27
|
+
# Only alive objects by default
|
|
28
|
+
def get_queryset(self):
|
|
29
|
+
return ObjectQuerySet(self.model, using=self._db).alive()
|
|
30
|
+
|
|
31
|
+
class AllObjectsManager(models.Manager):
|
|
32
|
+
# Explicit access to all objects
|
|
33
|
+
def get_queryset(self):
|
|
34
|
+
return ObjectQuerySet(self.model, using=self._db)
|
|
35
|
+
|
|
36
|
+
class DeletedObjectsManager(models.Manager):
|
|
37
|
+
# Only deleted objects
|
|
38
|
+
def get_queryset(self):
|
|
39
|
+
return ObjectQuerySet(self.model, using=self._db).dead()
|
|
40
|
+
|
|
@@ -69,7 +69,8 @@ class RequestInitialDoc(serializers.Serializer):
|
|
|
69
69
|
|
|
70
70
|
|
|
71
71
|
class WSRequest(serializers.Serializer):
|
|
72
|
-
action = serializers.CharField()
|
|
72
|
+
action = serializers.CharField(required=True)
|
|
73
|
+
socket_id = serializers.CharField(required=True)
|
|
73
74
|
|
|
74
75
|
|
|
75
76
|
class CardSerializer(serializers.Serializer):
|
|
@@ -88,6 +89,7 @@ class SignatureSerializer(serializers.Serializer):
|
|
|
88
89
|
|
|
89
90
|
class InitialSignatureSerializer(serializers.Serializer):
|
|
90
91
|
action = serializers.CharField()
|
|
92
|
+
socket_id = serializers.CharField(required=True)
|
|
91
93
|
docsettings = DocumentSettingsSerializer()
|
|
92
94
|
card = CardSerializer()
|
|
93
95
|
logo_url = serializers.CharField(required=False, allow_null=True, allow_blank=True)
|
|
@@ -96,8 +98,14 @@ class InitialSignatureSerializer(serializers.Serializer):
|
|
|
96
98
|
|
|
97
99
|
class CompleteSignatureSerializer(serializers.Serializer):
|
|
98
100
|
action = serializers.CharField()
|
|
101
|
+
socket_id = serializers.CharField(required=True)
|
|
99
102
|
documentid = serializers.CharField()
|
|
100
103
|
certificate = serializers.CharField()
|
|
101
104
|
signature = SignatureSerializer()
|
|
102
105
|
logo_url = serializers.CharField(required=False, allow_null=True, allow_blank=True)
|
|
103
106
|
instance = InstanceSerializer()
|
|
107
|
+
|
|
108
|
+
class ValidateDocumentSerializer(serializers.Serializer):
|
|
109
|
+
action = serializers.CharField()
|
|
110
|
+
socket_id = serializers.CharField(required=True)
|
|
111
|
+
instance = InstanceSerializer()
|
|
@@ -30,3 +30,17 @@ class GTS2SerializerBase(serializers.Serializer):
|
|
|
30
30
|
text = serializers.SerializerMethodField()
|
|
31
31
|
disabled = serializers.SerializerMethodField()
|
|
32
32
|
selected = serializers.SerializerMethodField()
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class ChoicesGTS2Serializer(GTS2SerializerBase):
|
|
36
|
+
def __init__(self, *args, choices=None, **kwargs):
|
|
37
|
+
self.choices = dict(choices)
|
|
38
|
+
super().__init__(*args, **kwargs)
|
|
39
|
+
|
|
40
|
+
def get_id(self, obj):
|
|
41
|
+
return obj
|
|
42
|
+
|
|
43
|
+
def get_text(self, obj):
|
|
44
|
+
if obj in self.choices:
|
|
45
|
+
return self.choices[obj]
|
|
46
|
+
return obj
|