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.
Files changed (80) hide show
  1. djgentelella/__init__.py +4 -1
  2. djgentelella/admin.py +7 -1
  3. djgentelella/firmador_digital/consumers/sign.py +24 -3
  4. djgentelella/firmador_digital/forms.py +140 -0
  5. djgentelella/firmador_digital/models.py +20 -2
  6. djgentelella/firmador_digital/utils.py +11 -0
  7. djgentelella/firmador_digital/views.py +31 -0
  8. djgentelella/firmador_digital/viewsets.py +15 -4
  9. djgentelella/forms/forms.py +10 -2
  10. djgentelella/groute.py +4 -1
  11. djgentelella/locale/es/LC_MESSAGES/django.mo +0 -0
  12. djgentelella/locale/es/LC_MESSAGES/django.po +67 -0
  13. djgentelella/locale/es/LC_MESSAGES/djangojs.mo +0 -0
  14. djgentelella/locale/es/LC_MESSAGES/djangojs.po +9 -0
  15. djgentelella/migrations/0014_trash.py +31 -0
  16. djgentelella/migrations/0015_trash_deleted_by.py +21 -0
  17. djgentelella/migrations/0016_trash_created_at.py +20 -0
  18. djgentelella/models.py +96 -0
  19. djgentelella/models_manager.py +40 -0
  20. djgentelella/serializers/firmador_digital.py +9 -1
  21. djgentelella/serializers/selects.py +14 -0
  22. djgentelella/static/djgentelella.flags.vendors.min.css +1 -1
  23. djgentelella/static/djgentelella.readonly.vendors.min.css +9 -5
  24. djgentelella/static/djgentelella.readonly.vendors.min.js +1 -1
  25. djgentelella/static/gentelella/css/custom.css +23 -2
  26. djgentelella/static/gentelella/css/modern.css +15 -0
  27. djgentelella/static/gentelella/css/modern_black_white.css +15 -0
  28. djgentelella/static/gentelella/css/pdfviewer.css +43 -1
  29. djgentelella/static/gentelella/images/default.png +0 -0
  30. djgentelella/static/gentelella/js/base/digital_signature.js +318 -79
  31. djgentelella/static/gentelella/js/base/form.common.js +9 -4
  32. djgentelella/static/gentelella/js/base/select2_wrap.js +15 -1
  33. djgentelella/static/gentelella/js/base/select2related.js +5 -0
  34. djgentelella/static/gentelella/js/base.js +347 -83
  35. djgentelella/static/gentelella/js/custom.js +6 -1
  36. djgentelella/static/gentelella/js/datatables.js +15 -0
  37. djgentelella/static/gentelella/js/digital_signature_update.js +29 -0
  38. djgentelella/static/gentelella/js/obj_api_management.js +403 -344
  39. djgentelella/static/gentelella/js/widgets.js +10 -1
  40. djgentelella/static/vendors/bootstrap-datetimepicker/bootstrap-datetimepicker.min.css.map +75 -7
  41. djgentelella/static/vendors/flags/1x1/ac.svg +75 -7
  42. djgentelella/static/vendors/flags/1x1/cp.svg +75 -7
  43. djgentelella/static/vendors/flags/1x1/dg.svg +75 -7
  44. djgentelella/static/vendors/flags/1x1/ea.svg +75 -7
  45. djgentelella/static/vendors/flags/1x1/es-ct.svg +75 -7
  46. djgentelella/static/vendors/flags/1x1/es-ga.svg +75 -7
  47. djgentelella/static/vendors/flags/1x1/ic.svg +75 -7
  48. djgentelella/static/vendors/flags/1x1/ta.svg +75 -7
  49. djgentelella/static/vendors/flags/1x1/xx.svg +75 -7
  50. djgentelella/static/vendors/flags/4x3/ac.svg +75 -7
  51. djgentelella/static/vendors/flags/4x3/cp.svg +75 -7
  52. djgentelella/static/vendors/flags/4x3/dg.svg +75 -7
  53. djgentelella/static/vendors/flags/4x3/ea.svg +75 -7
  54. djgentelella/static/vendors/flags/4x3/es-ct.svg +75 -7
  55. djgentelella/static/vendors/flags/4x3/es-ga.svg +75 -7
  56. djgentelella/static/vendors/flags/4x3/ic.svg +75 -7
  57. djgentelella/static/vendors/flags/4x3/ta.svg +75 -7
  58. djgentelella/static/vendors/flags/4x3/xx.svg +75 -7
  59. djgentelella/static/vendors/timeline/css/timeline.css +9 -5
  60. djgentelella/static/vendors/timeline/js/timeline.js +1 -1
  61. djgentelella/templates/forms/as_grid.html +2 -2
  62. djgentelella/templates/forms/as_inline.html +3 -5
  63. djgentelella/templates/gentelella/app/sidebar.html +16 -13
  64. djgentelella/templates/gentelella/digital_signature/update_signature_settings.html +45 -0
  65. djgentelella/templates/gentelella/registration/reset_done.html +24 -0
  66. djgentelella/templates/gentelella/widgets/digital_signature.html +47 -11
  67. djgentelella/trash/api.py +58 -0
  68. djgentelella/trash/filterset.py +20 -0
  69. djgentelella/trash/serializer.py +45 -0
  70. djgentelella/urls.py +8 -1
  71. djgentelella/views/select2autocomplete.py +40 -0
  72. djgentelella/widgets/core.py +6 -5
  73. djgentelella/widgets/digital_signature.py +5 -21
  74. djgentelella/widgets/selects.py +47 -0
  75. {djgentelella-0.4.30.dist-info → djgentelella-0.5.0.dist-info}/METADATA +2 -2
  76. {djgentelella-0.4.30.dist-info → djgentelella-0.5.0.dist-info}/RECORD +80 -68
  77. {djgentelella-0.4.30.dist-info → djgentelella-0.5.0.dist-info}/AUTHORS +0 -0
  78. {djgentelella-0.4.30.dist-info → djgentelella-0.5.0.dist-info}/LICENSE.txt +0 -0
  79. {djgentelella-0.4.30.dist-info → djgentelella-0.5.0.dist-info}/WHEEL +0 -0
  80. {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