chartManD commited on
Commit
e443a46
·
1 Parent(s): 681cfb7

Se establece el inicio de sesion del Presentador

Browse files
cata_system/settings.py CHANGED
@@ -68,7 +68,8 @@ MIDDLEWARE = [
68
  'django.contrib.messages.middleware.MessageMiddleware',
69
  'django.middleware.clickjacking.XFrameOptionsMiddleware',
70
 
71
- 'tecnicas.middlewares.LoginTesterMiddleware',
 
72
  ]
73
 
74
  if DEBUG:
 
68
  'django.contrib.messages.middleware.MessageMiddleware',
69
  'django.middleware.clickjacking.XFrameOptionsMiddleware',
70
 
71
+ 'tecnicas.middlewares.PresenterAccessMiddleware',
72
+ 'tecnicas.middlewares.TesterAccessMiddleware',
73
  ]
74
 
75
  if DEBUG:
cata_system/views.py CHANGED
@@ -2,4 +2,4 @@ from django.http import HttpRequest
2
  from django.shortcuts import redirect
3
 
4
  def home(req: HttpRequest):
5
- return redirect('/cata/')
 
2
  from django.shortcuts import redirect
3
 
4
  def home(req: HttpRequest):
5
+ return redirect('/cata/presenter/')
tecnicas/decorators/__init__.py ADDED
@@ -0,0 +1 @@
 
 
1
+ from .required_presenter import required_presenter
tecnicas/decorators/required_presenter.py ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from django.shortcuts import redirect
2
+ from django.urls import reverse
3
+ from django.core.exceptions import PermissionDenied
4
+
5
+
6
+ def required_presenter(view_func):
7
+ def wrapper(request, *args, **kwargs):
8
+ if not request.user.is_authenticated:
9
+ return redirect("cata_system:autenticacion")
10
+
11
+ if not hasattr(request.user, "presentador"):
12
+ raise PermissionDenied(
13
+ "Solo los presentadores pueden acceder a esta vista")
14
+ return view_func(request, *args, **kwargs)
15
+ return wrapper
tecnicas/middlewares/__init__.py CHANGED
@@ -1 +1,2 @@
1
- from .login_tester_middleware import LoginTesterMiddleware
 
 
1
+ from .tester_middleware import TesterAccessMiddleware
2
+ from .presenter_middleware import PresenterAccessMiddleware
tecnicas/middlewares/login_tester_middleware.py DELETED
@@ -1,25 +0,0 @@
1
- from django.http import HttpRequest
2
-
3
-
4
- class LoginTesterMiddleware():
5
- def __init__(self, get_response):
6
- self.get_response = get_response
7
-
8
- def __call__(self, req: HttpRequest):
9
- base_url_protected = "/cata/testers/"
10
-
11
- if req.path.startswith(base_url_protected):
12
- if not "cata_username" in req.session:
13
- id_participacion = req.COOKIES.get("id_participacion")
14
- if id_participacion:
15
- from tecnicas.controllers import ParticipacionController
16
- ParticipacionController.outSession(id_participacion)
17
- from django.shortcuts import redirect
18
- from django.urls import reverse
19
- response = redirect(reverse("cata_system:catador_login"))
20
- response.delete_cookie("id_participacion")
21
- return response
22
-
23
- response = self.get_response(req)
24
-
25
- return response
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tecnicas/middlewares/presenter_middleware.py ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from django.core.exceptions import PermissionDenied
2
+
3
+ class PresenterAccessMiddleware:
4
+ def __init__(self, get_response):
5
+ self.get_response = get_response
6
+
7
+ def __call__(self, request):
8
+ path = request.path_info
9
+
10
+ if path.startswith('/cata/presenter/'):
11
+ if not request.user.is_authenticated:
12
+ from django.shortcuts import redirect
13
+ return redirect("cata_system:autenticacion")
14
+
15
+ if not hasattr(request.user, 'user_presentador'):
16
+ raise PermissionDenied("Solo los Presentadores pueden acceder a esta sección.")
17
+
18
+ return self.get_response(request)
tecnicas/middlewares/tester_middleware.py ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # usuarios/middleware/catador_middleware.py
2
+ from django.core.exceptions import PermissionDenied
3
+
4
+
5
+ class TesterAccessMiddleware:
6
+ def __init__(self, get_response):
7
+ self.get_response = get_response
8
+
9
+ def __call__(self, request):
10
+ path = request.path_info
11
+
12
+ if path.startswith('/cata/tester/'):
13
+ if not request.user.is_authenticated:
14
+ from django.shortcuts import redirect
15
+ return redirect("cata_system:catador_login")
16
+
17
+ if not hasattr(request.user, 'catador'):
18
+ raise PermissionDenied(
19
+ "Solo los Catadores pueden acceder a esta sección.")
20
+
21
+ return self.get_response(request)
22
+
23
+ # from django.http import HttpRequest
24
+
25
+
26
+ # class LoginTesterMiddleware():
27
+ # def __init__(self, get_response):
28
+ # self.get_response = get_response
29
+
30
+ # def __call__(self, req: HttpRequest):
31
+ # base_url_protected = "/cata/testers/"
32
+
33
+ # if req.path.startswith(base_url_protected):
34
+ # if not "cata_username" in req.session:
35
+ # id_participacion = req.COOKIES.get("id_participacion")
36
+ # if id_participacion:
37
+ # from tecnicas.controllers import ParticipacionController
38
+ # ParticipacionController.outSession(id_participacion)
39
+ # from django.shortcuts import redirect
40
+ # from django.urls import reverse
41
+ # response = redirect(reverse("cata_system:catador_login"))
42
+ # response.delete_cookie("id_participacion")
43
+ # return response
44
+
45
+ # response = self.get_response(req)
46
+
47
+ # return response
tecnicas/migrations/0020_remove_catador_apellido_remove_catador_correo_and_more.py ADDED
@@ -0,0 +1,93 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Generated by Django 5.2.1 on 2025-10-18 23:34
2
+
3
+ import django.db.models.deletion
4
+ import shortuuid.main
5
+ from django.conf import settings
6
+ from django.db import migrations, models
7
+
8
+
9
+ class Migration(migrations.Migration):
10
+
11
+ dependencies = [
12
+ ('tecnicas', '0019_rename_repecion_tecnica_repeticion_and_more'),
13
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
14
+ ]
15
+
16
+ operations = [
17
+ migrations.RemoveField(
18
+ model_name='catador',
19
+ name='apellido',
20
+ ),
21
+ migrations.RemoveField(
22
+ model_name='catador',
23
+ name='correo',
24
+ ),
25
+ migrations.RemoveField(
26
+ model_name='catador',
27
+ name='fechaNacimiento',
28
+ ),
29
+ migrations.RemoveField(
30
+ model_name='catador',
31
+ name='nombre',
32
+ ),
33
+ migrations.RemoveField(
34
+ model_name='catador',
35
+ name='usuarioCatador',
36
+ ),
37
+ migrations.RemoveField(
38
+ model_name='presentador',
39
+ name='apellido',
40
+ ),
41
+ migrations.RemoveField(
42
+ model_name='presentador',
43
+ name='contrasena',
44
+ ),
45
+ migrations.RemoveField(
46
+ model_name='presentador',
47
+ name='nombre',
48
+ ),
49
+ migrations.RemoveField(
50
+ model_name='presentador',
51
+ name='nombre_usuario',
52
+ ),
53
+ migrations.AddField(
54
+ model_name='catador',
55
+ name='genero',
56
+ field=models.CharField(blank=True, choices=[('Hombre', 'Hombre'), ('Mujer', 'Mujer')], default='Hombre', max_length=10, null=True),
57
+ ),
58
+ migrations.AddField(
59
+ model_name='catador',
60
+ name='nacimiento',
61
+ field=models.DateField(blank=True, null=True),
62
+ ),
63
+ migrations.AddField(
64
+ model_name='catador',
65
+ name='user',
66
+ field=models.OneToOneField(default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='user_catador', to=settings.AUTH_USER_MODEL),
67
+ ),
68
+ migrations.AddField(
69
+ model_name='presentador',
70
+ name='fecha_nacimiento',
71
+ field=models.DateField(blank=True, null=True),
72
+ ),
73
+ migrations.AddField(
74
+ model_name='presentador',
75
+ name='telefono',
76
+ field=models.BigIntegerField(default=555),
77
+ ),
78
+ migrations.AddField(
79
+ model_name='presentador',
80
+ name='user',
81
+ field=models.OneToOneField(default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='user_presentador', to=settings.AUTH_USER_MODEL),
82
+ ),
83
+ migrations.AlterField(
84
+ model_name='catador',
85
+ name='telefono',
86
+ field=models.BigIntegerField(default=555),
87
+ ),
88
+ migrations.AlterField(
89
+ model_name='sesionsensorial',
90
+ name='codigo_sesion',
91
+ field=models.CharField(default=shortuuid.main.ShortUUID.uuid, editable=False, max_length=22, primary_key=True, serialize=False),
92
+ ),
93
+ ]
tecnicas/models/catador.py CHANGED
@@ -1,12 +1,17 @@
 
1
  from django.db import models
2
 
 
3
  class Catador(models.Model):
4
- usuarioCatador = models.CharField(max_length=255, unique=True)
5
- nombre = models.CharField(max_length=255)
6
- apellido = models.CharField(max_length=255)
7
- telefono = models.BigIntegerField()
8
- correo = models.EmailField()
9
- fechaNacimiento = models.DateField()
 
 
 
10
 
11
  def __str__(self):
12
- return self.usuarioCatador
 
1
+ from django.contrib.auth.models import User
2
  from django.db import models
3
 
4
+
5
  class Catador(models.Model):
6
+ user = models.OneToOneField(
7
+ User, on_delete=models.CASCADE, related_name='user_catador', default=None, null=True)
8
+ nacimiento = models.DateField(null=True, blank=True)
9
+ telefono = models.BigIntegerField(default=555)
10
+ genero = models.CharField(
11
+ max_length=10,
12
+ choices=[('Hombre', 'Hombre'), ('Mujer', 'Mujer')],
13
+ null=True, blank=True, default="Hombre"
14
+ )
15
 
16
  def __str__(self):
17
+ return f"Catador: {self.user.username}"
tecnicas/models/presentador.py CHANGED
@@ -1,10 +1,12 @@
 
1
  from django.db import models
2
 
 
3
  class Presentador(models.Model):
4
- nombre = models.CharField(max_length=255)
5
- apellido = models.CharField(max_length=255)
6
- nombre_usuario = models.CharField(max_length=255, unique=True)
7
- contrasena = models.CharField(max_length=255)
8
 
9
  def __str__(self):
10
- return self.nombre
 
1
+ from django.contrib.auth.models import User
2
  from django.db import models
3
 
4
+
5
  class Presentador(models.Model):
6
+ user = models.OneToOneField(
7
+ User, on_delete=models.CASCADE, related_name='user_presentador', default=None, null=True)
8
+ fecha_nacimiento = models.DateField(null=True, blank=True)
9
+ telefono = models.BigIntegerField(default=555)
10
 
11
  def __str__(self):
12
+ return f"Presentador: {self.user.username}"
tecnicas/templates/tecnicas/auth.html CHANGED
@@ -6,26 +6,33 @@
6
  <article class="cts-container-main">
7
  <article class="cts-wrap-content">
8
  <form action="" method="post" class="p-8 rounded-xl text-black">
9
- <header class="text-center">
10
  <h1 class="text-5xl max-sm:text-3xl font-bold">Cata System</h1>
11
  <p class="text-2xl max-sm:text-xl font-semibold mt-3">Presentador</p>
12
  </header>
 
 
 
 
 
 
 
 
13
  <section class="flex flex-col gap-6 items-center w-full mt-5">
14
- <label for="id">
15
- <input type="text" name="id" id="id" placeholder="Ingrese Indentifiacion"
16
  class="placeholder:text-gray-400 placeholder:font-semibold text-xl max-sm:text-base bg-surface-ligt py-3 px-6 rounded-xl lg:w-sm border-b-2 border-surface-sweet"
17
  required>
18
  </label>
19
 
20
- <label for="id">
21
- <input type="text" name="id" id="id" placeholder="Ingrese Contraseña"
22
  class="placeholder:text-gray-400 placeholder:font-semibold text-xl max-sm:text-base bg-surface-ligt py-3 px-6 rounded-xl lg:w-sm border-b-2 border-surface-sweet"
23
  required>
24
  </label>
25
 
26
  <section class="flex flex-row flex-wrap gap-4 w-f ull justify-center">
27
- <button type="submit"
28
- class="cts-btn-general cts-btn-primary btn-push uppercase lg:w-sm">
29
  Ingresar
30
  </button>
31
  </section>
 
6
  <article class="cts-container-main">
7
  <article class="cts-wrap-content">
8
  <form action="" method="post" class="p-8 rounded-xl text-black">
9
+ <header class="text-center mb-2">
10
  <h1 class="text-5xl max-sm:text-3xl font-bold">Cata System</h1>
11
  <p class="text-2xl max-sm:text-xl font-semibold mt-3">Presentador</p>
12
  </header>
13
+
14
+ {% if error %}
15
+ {% include "./components/error-message.html" with message=error %}
16
+ {% endif %}
17
+ {% if message %}
18
+ {% include "./components/error-message.html" with message=message %}
19
+ {% endif %}
20
+
21
  <section class="flex flex-col gap-6 items-center w-full mt-5">
22
+ <label for="username">
23
+ <input type="text" name="username" id="username" placeholder="Ingrese Nombre de Usuario"
24
  class="placeholder:text-gray-400 placeholder:font-semibold text-xl max-sm:text-base bg-surface-ligt py-3 px-6 rounded-xl lg:w-sm border-b-2 border-surface-sweet"
25
  required>
26
  </label>
27
 
28
+ <label for="password">
29
+ <input type="text" name="password" id="password" placeholder="Ingrese Contraseña"
30
  class="placeholder:text-gray-400 placeholder:font-semibold text-xl max-sm:text-base bg-surface-ligt py-3 px-6 rounded-xl lg:w-sm border-b-2 border-surface-sweet"
31
  required>
32
  </label>
33
 
34
  <section class="flex flex-row flex-wrap gap-4 w-f ull justify-center">
35
+ <button type="submit" class="cts-btn-general cts-btn-primary btn-push uppercase lg:w-sm">
 
36
  Ingresar
37
  </button>
38
  </section>
tecnicas/urls.py CHANGED
@@ -5,73 +5,73 @@ from . import views
5
 
6
  app_name = "cata_system"
7
  urlpatterns = [
8
- path("", views.mainPanel, name="index"),
9
-
10
  # Atentificacion
11
  path("autenticacion",
12
  views.autentication,
13
  name="autenticacion"),
14
 
 
 
 
 
 
 
15
 
16
  # Gestion de catadores
17
- path("panel-catadores",
18
  views.testerMenu,
19
  name="panel_catadores"),
20
 
21
- path("crear-catador",
22
  views.testerCreate,
23
  name="crear_catador"),
24
 
25
- path("buscar-catador",
26
  views.testerSearch,
27
  name="buscar_catador"),
28
 
29
 
30
  # Creacion de sessiones sensoriales
31
- path("seleccion-tecnica",
32
  views.selecionTecnica,
33
  name="seleccion_tecnica"),
34
 
35
- path("panel-configuracion-basic",
36
  views.configurationPanelBasic,
37
  name="panel_configuracion_basic"),
38
 
39
- path("panel-configuracion-tags",
40
  views.configurationPanelTags,
41
  name="panel_configuracion_tags"),
42
 
43
- path("panel-configuracion-codes",
44
  views.configurationPanelCodes,
45
  name="panel_configuracion_codes"),
46
 
47
- path("panel-configuracion-words",
48
  views.configurationPanelWords,
49
  name="panel_configuracion_words"),
50
 
51
- path("creando-sesion",
52
  views.createSession,
53
  name="creando_sesion"),
54
 
55
 
56
  # Gestion de sesiones sensoriales
57
- path("panel-sesiones/<int:page>",
58
  views.sesionsPanel,
59
  name="panel_sesiones"),
60
 
61
- path("detalles-sesion/<str:session_code>",
62
  views.sessionDetails,
63
  name="detalles_sesion"),
64
 
65
- path("monitor/<str:session_code>",
66
  views.sessionMonitor,
67
  name="monitor_sesion"),
68
 
69
 
70
  # Vistas para catadores
71
- path("catador-login",
72
- views.testerLogin,
73
- name="catador_login"),
74
-
75
  path("testers/catador-main",
76
  views.mainTesterForm,
77
  name="catador_main"),
@@ -81,7 +81,7 @@ urlpatterns = [
81
  name="session_convencional"),
82
 
83
  # APIs
84
- path("nueva-etiqueta",
85
  views.newTag,
86
  name="nueva_etiqueta"),
87
 
 
5
 
6
  app_name = "cata_system"
7
  urlpatterns = [
 
 
8
  # Atentificacion
9
  path("autenticacion",
10
  views.autentication,
11
  name="autenticacion"),
12
 
13
+ path("catador-login",
14
+ views.testerLogin,
15
+ name="catador_login"),
16
+
17
+ # Pantalla principal Presetador
18
+ path("presenter/", views.mainPanel, name="index"),
19
 
20
  # Gestion de catadores
21
+ path("presenter/panel-catadores",
22
  views.testerMenu,
23
  name="panel_catadores"),
24
 
25
+ path("presenter/crear-catador",
26
  views.testerCreate,
27
  name="crear_catador"),
28
 
29
+ path("presenter/buscar-catador",
30
  views.testerSearch,
31
  name="buscar_catador"),
32
 
33
 
34
  # Creacion de sessiones sensoriales
35
+ path("presenter/seleccion-tecnica",
36
  views.selecionTecnica,
37
  name="seleccion_tecnica"),
38
 
39
+ path("presenter/panel-configuracion-basic",
40
  views.configurationPanelBasic,
41
  name="panel_configuracion_basic"),
42
 
43
+ path("presenter/panel-configuracion-tags",
44
  views.configurationPanelTags,
45
  name="panel_configuracion_tags"),
46
 
47
+ path("presenter/panel-configuracion-codes",
48
  views.configurationPanelCodes,
49
  name="panel_configuracion_codes"),
50
 
51
+ path("presenter/panel-configuracion-words",
52
  views.configurationPanelWords,
53
  name="panel_configuracion_words"),
54
 
55
+ path("presenter/creando-sesion",
56
  views.createSession,
57
  name="creando_sesion"),
58
 
59
 
60
  # Gestion de sesiones sensoriales
61
+ path("presenter/panel-sesiones/<int:page>",
62
  views.sesionsPanel,
63
  name="panel_sesiones"),
64
 
65
+ path("presenter/detalles-sesion/<str:session_code>",
66
  views.sessionDetails,
67
  name="detalles_sesion"),
68
 
69
+ path("presenter/monitor/<str:session_code>",
70
  views.sessionMonitor,
71
  name="monitor_sesion"),
72
 
73
 
74
  # Vistas para catadores
 
 
 
 
75
  path("testers/catador-main",
76
  views.mainTesterForm,
77
  name="catador_main"),
 
81
  name="session_convencional"),
82
 
83
  # APIs
84
+ path("api/nueva-etiqueta",
85
  views.newTag,
86
  name="nueva_etiqueta"),
87
 
tecnicas/views/autentication.py CHANGED
@@ -1,4 +1,29 @@
1
- from django.shortcuts import render
 
 
 
 
 
2
 
3
- def autentication(req):
4
- return render(req, "tecnicas/auth.html")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from django.contrib.auth import authenticate, login
2
+ from django.http import HttpRequest, JsonResponse
3
+ from django.views.decorators.csrf import csrf_exempt
4
+ from django.shortcuts import render, redirect
5
+ from tecnicas.utils import general_error
6
+ from tecnicas.models import Presentador
7
 
8
+ @csrf_exempt
9
+ def autentication(req: HttpRequest):
10
+ context_view = {}
11
+
12
+ if req.method == "GET":
13
+ return render(req, "tecnicas/auth.html")
14
+ elif req.method == "POST":
15
+ username = req.POST.get("username")
16
+ password = req.POST.get("password")
17
+
18
+ user = authenticate(username=username, password=password)
19
+
20
+ if user is not None and hasattr(user, "user_presentador"):
21
+ login(req, user)
22
+ return redirect("cata_system:index")
23
+ else:
24
+ return JsonResponse({
25
+ "success": False,
26
+ "error": "Credenciales inválidas o no es un Presentador"
27
+ })
28
+ else:
29
+ return general_error("Método no permitido")
tecnicas/views/main_panel.py CHANGED
@@ -4,7 +4,6 @@ def mainPanel(req):
4
  pres = Presente("1233MMAS092222", "Juan Mendez Salazar")
5
  return render(req, "tecnicas/main-panel.html", context={"presentador":pres})
6
 
7
- # Auxiliar classes
8
  class Presente():
9
  def __init__(self, id, nombre):
10
  self.id = id
 
4
  pres = Presente("1233MMAS092222", "Juan Mendez Salazar")
5
  return render(req, "tecnicas/main-panel.html", context={"presentador":pres})
6
 
 
7
  class Presente():
8
  def __init__(self, id, nombre):
9
  self.id = id