epok-toolkit 1.9.1__tar.gz → 1.11.0__tar.gz

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.

Potentially problematic release.


This version of epok-toolkit might be problematic. Click here for more details.

Files changed (39) hide show
  1. {epok_toolkit-1.9.1/epok_toolkit.egg-info → epok_toolkit-1.11.0}/PKG-INFO +2 -1
  2. epok_toolkit-1.11.0/epok_toolkit/django/__init__.py +5 -0
  3. {epok_toolkit-1.9.1 → epok_toolkit-1.11.0}/epok_toolkit/django/manager.py +3 -3
  4. epok_toolkit-1.11.0/epok_toolkit/django/utils/__init__.py +1 -0
  5. epok_toolkit-1.11.0/epok_toolkit/django/utils/magic_link.py +27 -0
  6. epok_toolkit-1.11.0/epok_toolkit/django/viewsets.py +41 -0
  7. {epok_toolkit-1.9.1 → epok_toolkit-1.11.0/epok_toolkit.egg-info}/PKG-INFO +2 -1
  8. {epok_toolkit-1.9.1 → epok_toolkit-1.11.0}/epok_toolkit.egg-info/SOURCES.txt +4 -2
  9. {epok_toolkit-1.9.1 → epok_toolkit-1.11.0}/epok_toolkit.egg-info/requires.txt +1 -0
  10. {epok_toolkit-1.9.1 → epok_toolkit-1.11.0}/pyproject.toml +3 -2
  11. epok_toolkit-1.9.1/epok_toolkit/cache/__init__.py +0 -1
  12. epok_toolkit-1.9.1/epok_toolkit/django/__init__.py +0 -3
  13. {epok_toolkit-1.9.1 → epok_toolkit-1.11.0}/LICENSE +0 -0
  14. {epok_toolkit-1.9.1 → epok_toolkit-1.11.0}/MANIFEST.in +0 -0
  15. {epok_toolkit-1.9.1 → epok_toolkit-1.11.0}/README.md +0 -0
  16. {epok_toolkit-1.9.1 → epok_toolkit-1.11.0}/epok_toolkit/__init__.py +0 -0
  17. {epok_toolkit-1.9.1 → epok_toolkit-1.11.0}/epok_toolkit/apps.py +0 -0
  18. {epok_toolkit-1.9.1 → epok_toolkit-1.11.0}/epok_toolkit/default_settings.py +0 -0
  19. /epok_toolkit-1.9.1/epok_toolkit/cache/cacher.py → /epok_toolkit-1.11.0/epok_toolkit/django/cache.py +0 -0
  20. {epok_toolkit-1.9.1 → epok_toolkit-1.11.0}/epok_toolkit/django/fields.py +0 -0
  21. {epok_toolkit-1.9.1 → epok_toolkit-1.11.0}/epok_toolkit/django/response.py +0 -0
  22. {epok_toolkit-1.9.1 → epok_toolkit-1.11.0}/epok_toolkit/email/__init__.py +0 -0
  23. {epok_toolkit-1.9.1 → epok_toolkit-1.11.0}/epok_toolkit/email/email_async.py +0 -0
  24. {epok_toolkit-1.9.1 → epok_toolkit-1.11.0}/epok_toolkit/email/engine.py +0 -0
  25. {epok_toolkit-1.9.1 → epok_toolkit-1.11.0}/epok_toolkit/email/templates.py +0 -0
  26. {epok_toolkit-1.9.1 → epok_toolkit-1.11.0}/epok_toolkit/messaging/__init__.py +0 -0
  27. {epok_toolkit-1.9.1 → epok_toolkit-1.11.0}/epok_toolkit/messaging/whatsapp.py +0 -0
  28. {epok_toolkit-1.9.1 → epok_toolkit-1.11.0}/epok_toolkit/messaging/whatsapp_instanced.py +0 -0
  29. {epok_toolkit-1.9.1 → epok_toolkit-1.11.0}/epok_toolkit/pdf/__init__.py +0 -0
  30. {epok_toolkit-1.9.1 → epok_toolkit-1.11.0}/epok_toolkit/pdf/fuentes/Kollektif-Bold.ttf +0 -0
  31. {epok_toolkit-1.9.1 → epok_toolkit-1.11.0}/epok_toolkit/pdf/fuentes/Kollektif-BoldItalic.ttf +0 -0
  32. {epok_toolkit-1.9.1 → epok_toolkit-1.11.0}/epok_toolkit/pdf/fuentes/Kollektif-Italic.ttf +0 -0
  33. {epok_toolkit-1.9.1 → epok_toolkit-1.11.0}/epok_toolkit/pdf/fuentes/Kollektif.ttf +0 -0
  34. {epok_toolkit-1.9.1 → epok_toolkit-1.11.0}/epok_toolkit/pdf/plantillas/Ticket_congrats.png +0 -0
  35. {epok_toolkit-1.9.1 → epok_toolkit-1.11.0}/epok_toolkit/pdf/plantillas/Ticket_congrats2.png +0 -0
  36. {epok_toolkit-1.9.1 → epok_toolkit-1.11.0}/epok_toolkit/pdf/ticket_pdf.py +0 -0
  37. {epok_toolkit-1.9.1 → epok_toolkit-1.11.0}/epok_toolkit.egg-info/dependency_links.txt +0 -0
  38. {epok_toolkit-1.9.1 → epok_toolkit-1.11.0}/epok_toolkit.egg-info/top_level.txt +0 -0
  39. {epok_toolkit-1.9.1 → epok_toolkit-1.11.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: epok-toolkit
3
- Version: 1.9.1
3
+ Version: 1.11.0
4
4
  Summary: Una herramienta para la gestión de tareas y procesos en Django con Celery.
5
5
  Author-email: Fernando Leon Franco <fernanlee2131@gmail.com>
6
6
  License: MIT
@@ -16,6 +16,7 @@ Requires-Dist: djangorestframework>=3.16.0
16
16
  Requires-Dist: celery[redis]>=5.5.3
17
17
  Requires-Dist: django-celery-beat>=2.6.0
18
18
  Requires-Dist: colorstreak>=0.1.0
19
+ Requires-Dist: PyJWT>=2.10.1
19
20
  Dynamic: license-file
20
21
 
21
22
  # EPOK Toolkit
@@ -0,0 +1,5 @@
1
+ from .fields import *
2
+ from .manager import *
3
+ from .response import *
4
+ from .cache import *
5
+ from .viewsets import *
@@ -14,13 +14,13 @@ class OptimizedManager(models.Manager):
14
14
  """
15
15
  Custom manager for optimized querysets.
16
16
  """
17
- def __init__(self, select_fields_full=None, prefetch_fields_full=None, select_fields_simple=None, prefetch_related_simple=None, *args, **kwargs):
17
+ def __init__(self, select_fields_full=None, prefetch_fields_full=None, select_fields_simple=None, prefetch_fields_simple=None, *args, **kwargs):
18
18
 
19
19
  super().__init__(*args, **kwargs)
20
20
  self._select_fields_full = select_fields_full or []
21
21
  self._prefetch_fields_full = prefetch_fields_full or []
22
22
  self._select_fields_simple = select_fields_simple or []
23
- self._prefetch_related_simple = prefetch_related_simple or []
23
+ self._prefetch_fields_simple = prefetch_fields_simple or []
24
24
 
25
25
  def get_queryset(self):
26
26
  return OptimizedQuerySet(self.model, using=self._db)
@@ -34,5 +34,5 @@ class OptimizedManager(models.Manager):
34
34
  def simple(self):
35
35
  return self.get_queryset().optimized(
36
36
  select_fields=self._select_fields_simple,
37
- prefetch_fields=self._prefetch_related_simple
37
+ prefetch_fields=self._prefetch_fields_simple
38
38
  )
@@ -0,0 +1 @@
1
+ from .magic_link import *
@@ -0,0 +1,27 @@
1
+ from datetime import timedelta
2
+ import jwt
3
+ from django.utils import timezone
4
+ from django.conf import settings
5
+
6
+ def generate_login_magic_token(user, minutes_valid=10):
7
+ """
8
+ Genera un token JWT válido por X minutos para login sin contraseña.
9
+ Incluye un propósito específico para distinguirlo de otros tipos de token.
10
+ """
11
+ payload = {
12
+ "user_id": str(user.id),
13
+ "exp": timezone.now() + timedelta(minutes=minutes_valid),
14
+ "purpose": "magic_login",
15
+ }
16
+
17
+ token = jwt.encode(payload, settings.SECRET_KEY, algorithm="HS256")
18
+ if isinstance(token, bytes):
19
+ token = token.decode("utf-8")
20
+ return token
21
+
22
+ def build_login_magic_link(token):
23
+ """
24
+ Construye el enlace completo hacia tu frontend.
25
+ Ajusta la ruta a donde quieras que el frontend reciba el token.
26
+ """
27
+ return f"{settings.FRONTEND_URL}#/magic-login?token={token}"
@@ -0,0 +1,41 @@
1
+ # core/viewsets.py
2
+ from rest_framework import viewsets
3
+ from rest_framework.pagination import PageNumberPagination
4
+
5
+ class DefaultPagination(PageNumberPagination):
6
+ page_size = 10
7
+ page_size_query_param = 'page_size'
8
+ max_page_size = 100
9
+
10
+
11
+
12
+ class BaseOptimizedViewSet(viewsets.ModelViewSet):
13
+ """
14
+ ViewSet base que alterna entre .full() y .simple() automáticamente
15
+ y permite serializers diferentes para list y detail.
16
+ """
17
+ pagination_class = DefaultPagination
18
+ simple_serializer_class = None
19
+ full_serializer_class = None
20
+
21
+ def get_queryset(self):
22
+ qs = super().get_queryset()
23
+
24
+ if not (hasattr(qs, 'full') and hasattr(qs, 'simple')):
25
+ raise NotImplementedError(
26
+ f"❌ El modelo {qs.model.__name__} no está usando un OptimizedManager con full() y simple()."
27
+ )
28
+
29
+ if self.action == 'list':
30
+ return qs.simple()
31
+ elif self.action in ['retrieve', 'update', 'partial_update']:
32
+ return qs.full()
33
+ return qs
34
+
35
+ def get_serializer_class(self):
36
+ # Cambia el serializer según la acción
37
+ if self.action == 'list' and self.simple_serializer_class:
38
+ return self.simple_serializer_class
39
+ if self.action in ['retrieve', 'update', 'partial_update'] and self.full_serializer_class:
40
+ return self.full_serializer_class
41
+ return super().get_serializer_class()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: epok-toolkit
3
- Version: 1.9.1
3
+ Version: 1.11.0
4
4
  Summary: Una herramienta para la gestión de tareas y procesos en Django con Celery.
5
5
  Author-email: Fernando Leon Franco <fernanlee2131@gmail.com>
6
6
  License: MIT
@@ -16,6 +16,7 @@ Requires-Dist: djangorestframework>=3.16.0
16
16
  Requires-Dist: celery[redis]>=5.5.3
17
17
  Requires-Dist: django-celery-beat>=2.6.0
18
18
  Requires-Dist: colorstreak>=0.1.0
19
+ Requires-Dist: PyJWT>=2.10.1
19
20
  Dynamic: license-file
20
21
 
21
22
  # EPOK Toolkit
@@ -10,12 +10,14 @@ epok_toolkit.egg-info/SOURCES.txt
10
10
  epok_toolkit.egg-info/dependency_links.txt
11
11
  epok_toolkit.egg-info/requires.txt
12
12
  epok_toolkit.egg-info/top_level.txt
13
- epok_toolkit/cache/__init__.py
14
- epok_toolkit/cache/cacher.py
15
13
  epok_toolkit/django/__init__.py
14
+ epok_toolkit/django/cache.py
16
15
  epok_toolkit/django/fields.py
17
16
  epok_toolkit/django/manager.py
18
17
  epok_toolkit/django/response.py
18
+ epok_toolkit/django/viewsets.py
19
+ epok_toolkit/django/utils/__init__.py
20
+ epok_toolkit/django/utils/magic_link.py
19
21
  epok_toolkit/email/__init__.py
20
22
  epok_toolkit/email/email_async.py
21
23
  epok_toolkit/email/engine.py
@@ -3,3 +3,4 @@ djangorestframework>=3.16.0
3
3
  celery[redis]>=5.5.3
4
4
  django-celery-beat>=2.6.0
5
5
  colorstreak>=0.1.0
6
+ PyJWT>=2.10.1
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "epok-toolkit"
7
- version = "1.9.1"
7
+ version = "1.11.0"
8
8
  description = "Una herramienta para la gestión de tareas y procesos en Django con Celery."
9
9
  authors = [
10
10
  { name="Fernando Leon Franco", email="fernanlee2131@gmail.com" }
@@ -23,7 +23,8 @@ dependencies = [
23
23
  "djangorestframework>=3.16.0",
24
24
  "celery[redis]>=5.5.3",
25
25
  "django-celery-beat>=2.6.0",
26
- "colorstreak>=0.1.0"
26
+ "colorstreak>=0.1.0",
27
+ "PyJWT>=2.10.1",
27
28
  ]
28
29
 
29
30
  [tool.setuptools.packages.find]
@@ -1 +0,0 @@
1
- from .cacher import cache_full, cache_get, CachedViewSet, TimeToLive
@@ -1,3 +0,0 @@
1
- from .fields import *
2
- from .manager import *
3
- from .response import *
File without changes
File without changes
File without changes
File without changes