· 8 months ago · Mar 08, 2025, 08:55 PM
1# Django Core
2from django.shortcuts import render, redirect, get_object_or_404
3from django.http import HttpResponse, JsonResponse, HttpResponseNotAllowed
4from django.core.paginator import Paginator
5from django.db.models import Q
6from django.views.generic import ListView
7from django.views.decorators.csrf import csrf_exempt
8from django.views.decorators.http import require_http_methods
9from django.contrib import messages
10
11# Autenticación
12from django.contrib.auth import authenticate, login, logout
13from django.contrib.auth.decorators import login_required, user_passes_test
14
15# Formularios locales
16from .forms import (
17 ClienteForm,
18 ContratoForm,
19 DireccionFormSet,
20 DireccionForm,
21 ServicioForm
22)
23
24# Modelos locales
25from .models import (
26 Cliente,
27 Contrato,
28 Servicio,
29 Usuario,
30 Rol,
31 Empleado,
32 Zona,
33 DireccionInstalacion # Usa la clase actualizada
34)
35
36# Librerías estándar
37import random
38import json
39import traceback
40
41
42
43def login_view(request):
44 if request.method == "POST":
45 username = request.POST['username']
46 password = request.POST['password']
47 user = authenticate(request, username=username, password=password)
48 if user is not None:
49 login(request, user)
50 return redirect('dashboard') # Redirigir al dashboard si el login es exitoso
51 else:
52 messages.error(request, "Usuario o contraseña incorrectos")
53 return render(request, 'usuarios/login.html')
54
55def logout_view(request):
56 logout(request)
57 return redirect('login') # Redirigir al login después de cerrar sesión
58
59@login_required
60def dashboard(request):
61 return render(request, 'usuarios/dashboard.html')
62
63### CRUD USUARIOS ###
64
65@login_required
66def lista_usuarios(request):
67 usuarios = Usuario.objects.all()
68 roles = Rol.objects.all() # ✅ Asegurar que los roles estén disponibles en la plantilla
69 return render(request, 'usuarios/lista_usuarios.html', {'usuarios': usuarios, 'roles': roles})
70
71@login_required
72def editar_usuario(request, user_id):
73 usuario = get_object_or_404(Usuario, id=user_id)
74
75 if request.method == 'POST':
76 usuario.username = request.POST['username']
77 usuario.first_name = request.POST['first_name']
78 usuario.last_name = request.POST['last_name']
79 usuario.email = request.POST['email']
80 usuario.rol_id = request.POST.get('rol')
81 usuario.estatus = 'estatus' in request.POST # Checkbox activo/inactivo
82 usuario.save()
83 messages.success(request, "Usuario actualizado correctamente.")
84 return redirect('lista_usuarios')
85
86 roles = Rol.objects.all()
87 return render(request, 'usuarios/editar_usuario.html', {'usuario': usuario, 'roles': roles})
88
89@login_required
90def eliminar_usuario(request, user_id):
91 usuario = get_object_or_404(Usuario, id=user_id)
92 usuario.delete()
93 messages.success(request, "Usuario eliminado correctamente.")
94 return redirect('lista_usuarios')
95
96@login_required
97def crear_usuario(request):
98 if request.method == "POST":
99 username = request.POST.get('username').strip()
100 first_name = request.POST.get('first_name').strip()
101 last_name = request.POST.get('last_name').strip()
102 email = request.POST.get('email').strip()
103 password = request.POST.get('password')
104 rol_id = request.POST.get('rol')
105
106 # Validar que no haya campos vacíos
107 if not username or not first_name or not last_name or not email or not password or not rol_id:
108 messages.error(request, "Todos los campos son obligatorios.")
109 return redirect('lista_usuarios')
110
111 # Validar si el usuario ya existe
112 if Usuario.objects.filter(username=username).exists():
113 messages.error(request, "El nombre de usuario ya está en uso.")
114 return redirect('lista_usuarios')
115
116 # Verificar si el rol existe en la base de datos
117 try:
118 rol = Rol.objects.get(id=rol_id)
119 except Rol.DoesNotExist:
120 messages.error(request, "El rol seleccionado no es válido.")
121 return redirect('lista_usuarios')
122
123 # Crear usuario y cifrar la contraseña
124 nuevo_usuario = Usuario(
125 username=username,
126 first_name=first_name,
127 last_name=last_name,
128 email=email,
129 rol=rol
130 )
131 nuevo_usuario.set_password(password) # 🔐 Cifra la contraseña
132 nuevo_usuario.save()
133
134 messages.success(request, f"Usuario '{username}' creado correctamente.")
135 return redirect('lista_usuarios')
136
137 # Si el método no es POST, regresar la lista de usuarios
138 usuarios = Usuario.objects.all()
139 roles = Rol.objects.all()
140 return render(request, 'usuarios/lista_usuarios.html', {'usuarios': usuarios, 'roles': roles})
141
142
143### CRUD EMPLEADOS ###
144
145@login_required
146def lista_empleados(request):
147 empleados = Empleado.objects.all()
148 return render(request, 'usuarios/lista_empleados.html', {'empleados': empleados})
149
150@login_required
151def crear_empleado(request):
152 if request.method == "POST":
153 nombre = request.POST['nombre']
154 apellido = request.POST['apellido']
155 dni = request.POST['dni']
156 rol_id = request.POST.get('rol')
157 rol = Rol.objects.get(id=rol_id)
158
159 Empleado.objects.create(nombre=nombre, apellido=apellido, dni=dni, rol=rol)
160 messages.success(request, "Empleado agregado correctamente.")
161 return redirect('lista_empleados')
162
163 roles = Rol.objects.all()
164 return render(request, 'usuarios/crear_empleado.html', {'roles': roles})
165
166@login_required
167def editar_empleado(request, emp_id):
168 empleado = get_object_or_404(Empleado, id=emp_id)
169
170 if request.method == "POST":
171 empleado.nombre = request.POST['nombre']
172 empleado.apellido = request.POST['apellido']
173 empleado.dni = request.POST['dni']
174 empleado.rol_id = request.POST.get('rol')
175 empleado.save()
176 messages.success(request, "Empleado actualizado correctamente.")
177 return redirect('lista_empleados')
178
179 roles = Rol.objects.all()
180 return render(request, 'usuarios/editar_empleado.html', {'empleado': empleado, 'roles': roles})
181
182@login_required
183def eliminar_empleado(request, emp_id):
184 empleado = get_object_or_404(Empleado, id=emp_id)
185 empleado.delete()
186 messages.success(request, "Empleado eliminado correctamente.")
187 return redirect('lista_empleados')
188
189### CRUD ROLES ###
190
191@login_required
192def lista_roles(request):
193 roles = Rol.objects.all()
194 return render(request, 'usuarios/lista_roles.html', {'roles': roles})
195
196@login_required
197def crear_rol(request):
198 if request.method == "POST":
199 nombre = request.POST['nombre']
200 Rol.objects.create(nombre=nombre)
201 messages.success(request, "Rol creado correctamente.")
202 return redirect('lista_roles')
203
204 return render(request, 'usuarios/crear_rol.html')
205
206@login_required
207def editar_rol(request, rol_id):
208 rol = get_object_or_404(Rol, id=rol_id)
209
210 if request.method == "POST":
211 rol.nombre = request.POST['nombre']
212 rol.save()
213 messages.success(request, "Rol actualizado correctamente.")
214 return redirect('lista_roles')
215
216 return render(request, 'usuarios/editar_rol.html', {'rol': rol})
217
218@login_required
219def eliminar_rol(request, rol_id):
220 rol = get_object_or_404(Rol, id=rol_id)
221 rol.delete()
222 messages.success(request, "Rol eliminado correctamente.")
223 return redirect('lista_roles')
224
225
226@login_required
227def editar_usuario(request, user_id):
228 usuario = get_object_or_404(Usuario, id=user_id)
229
230 if request.method == "POST":
231 usuario.username = request.POST.get('username').strip()
232 usuario.first_name = request.POST.get('first_name').strip()
233 usuario.last_name = request.POST.get('last_name').strip()
234 usuario.email = request.POST.get('email').strip()
235 rol_id = request.POST.get('rol')
236 usuario.estatus = 'estatus' in request.POST # Checkbox para activar/desactivar usuario
237
238 # Validar si el usuario ya existe con otro ID
239 if Usuario.objects.exclude(id=user_id).filter(username=usuario.username).exists():
240 messages.error(request, "El nombre de usuario ya está en uso por otro usuario.")
241 return redirect('lista_usuarios')
242
243 # Verificar si el rol existe
244 try:
245 usuario.rol = Rol.objects.get(id=rol_id)
246 except Rol.DoesNotExist:
247 messages.error(request, "El rol seleccionado no es válido.")
248 return redirect('lista_usuarios')
249
250 usuario.save()
251 messages.success(request, f"Usuario '{usuario.username}' actualizado correctamente.")
252 return redirect('lista_usuarios')
253
254 roles = Rol.objects.all()
255 return render(request, 'usuarios/editar_usuario.html', {'usuario': usuario, 'roles': roles})
256
257
258@login_required
259def eliminar_usuario(request, user_id):
260 usuario = get_object_or_404(Usuario, id=user_id)
261 usuario.delete()
262 messages.success(request, f"Usuario '{usuario.username}' eliminado correctamente.")
263 return redirect('lista_usuarios')
264
265
266# Función para verificar si el usuario es administrador
267def es_admin(user):
268 return user.is_authenticated and user.is_superuser
269
270### RESTRINGIR VISTAS A ADMINISTRADORES ###
271
272@login_required
273@user_passes_test(es_admin, login_url='/dashboard/') # Redirigir si no es admin
274def lista_usuarios(request):
275 usuarios = Usuario.objects.all()
276 roles = Rol.objects.all()
277 return render(request, 'usuarios/lista_usuarios.html', {'usuarios': usuarios, 'roles': roles})
278
279@login_required
280@user_passes_test(es_admin, login_url='/dashboard/')
281def crear_usuario(request):
282 if request.method == "POST":
283 username = request.POST.get('username').strip()
284 first_name = request.POST.get('first_name').strip()
285 last_name = request.POST.get('last_name').strip()
286 email = request.POST.get('email').strip()
287 password = request.POST.get('password')
288 rol_id = request.POST.get('rol')
289
290 if Usuario.objects.filter(username=username).exists():
291 messages.error(request, "El nombre de usuario ya está en uso.")
292 return redirect('lista_usuarios')
293
294 try:
295 rol = Rol.objects.get(id=rol_id)
296 except Rol.DoesNotExist:
297 messages.error(request, "El rol seleccionado no es válido.")
298 return redirect('lista_usuarios')
299
300 nuevo_usuario = Usuario(
301 username=username,
302 first_name=first_name,
303 last_name=last_name,
304 email=email,
305 rol=rol
306 )
307 nuevo_usuario.set_password(password)
308 nuevo_usuario.save()
309
310 messages.success(request, f"Usuario '{username}' creado correctamente.")
311 return redirect('lista_usuarios')
312
313 return redirect('lista_usuarios')
314
315@login_required
316@user_passes_test(es_admin, login_url='/dashboard/')
317def eliminar_usuario(request, user_id):
318 usuario = get_object_or_404(Usuario, id=user_id)
319 usuario.delete()
320 messages.success(request, f"Usuario '{usuario.username}' eliminado correctamente.")
321 return redirect('lista_usuarios')
322
323@login_required
324@user_passes_test(es_admin, login_url='/dashboard/')
325def lista_roles(request):
326 roles = Rol.objects.all()
327 return render(request, 'usuarios/lista_roles.html', {'roles': roles})
328
329@login_required
330@user_passes_test(es_admin, login_url='/dashboard/')
331def crear_rol(request):
332 if request.method == "POST":
333 nombre = request.POST['nombre']
334 Rol.objects.create(nombre=nombre)
335 messages.success(request, "Rol creado correctamente.")
336 return redirect('lista_roles')
337
338 return render(request, 'usuarios/crear_rol.html')
339
340@login_required
341@user_passes_test(es_admin, login_url='/dashboard/')
342def eliminar_rol(request, rol_id):
343 rol = get_object_or_404(Rol, id=rol_id)
344 rol.delete()
345 messages.success(request, "Rol eliminado correctamente.")
346 return redirect('lista_roles')
347
348
349def lista_zonas(request):
350 zonas = Zona.objects.all()
351 return render(request, "usuarios/lista_zonas.html", {"zonas": zonas})
352
353def crear_zona(request):
354 if request.method == "POST":
355 nombre = request.POST["nombre"]
356 Zona.objects.create(nombre=nombre)
357 messages.success(request, "Zona creada correctamente.")
358 return redirect("lista_zonas")
359 return redirect("lista_zonas")
360
361def editar_zona(request, zona_id):
362 zona = get_object_or_404(Zona, id=zona_id)
363 if request.method == "POST":
364 zona.nombre = request.POST["nombre"]
365 zona.save()
366 messages.success(request, "Zona actualizada correctamente.")
367 return redirect("lista_zonas")
368 return redirect("lista_zonas")
369
370def eliminar_zona(request, zona_id):
371 zona = get_object_or_404(Zona, id=zona_id)
372 zona.delete()
373 messages.success(request, "Zona eliminada correctamente.")
374 return redirect("lista_zonas")
375
376
377def get_zonas(request):
378 zonas = list(Zona.objects.values('id', 'nombre'))
379 return JsonResponse({'zonas': zonas})
380
381
382
383# Lista todos los clientes
384class ClienteListView(ListView):
385 model = Cliente
386 template_name = 'usuarios/cliente_list.html'
387 context_object_name = 'clientes'
388 paginate_by = 10 # Muestra de 10 en 10
389
390 def get_queryset(self):
391 queryset = super().get_queryset()
392 buscar = self.request.GET.get('buscar', '')
393 if buscar:
394 queryset = queryset.filter(
395 Q(nombre__icontains=buscar) |
396 Q(apellido_paterno__icontains=buscar) |
397 Q(apellido_materno__icontains=buscar) |
398 Q(numero_documento__icontains=buscar)
399 )
400 return queryset.order_by('nombre')
401
402 def get_context_data(self, **kwargs):
403 context = super().get_context_data(**kwargs)
404 context['buscar'] = self.request.GET.get('buscar', '')
405 return context
406
407# Crea un nuevo cliente con múltiples direcciones
408def crear_cliente(request):
409 if request.method == 'POST':
410 form = ClienteForm(request.POST)
411 formset = DireccionFormSet(request.POST)
412 if form.is_valid() and formset.is_valid():
413 cliente = form.save()
414 direcciones = formset.save(commit=False)
415 for direccion in direcciones:
416 direccion.cliente = cliente
417 direccion.save()
418 return redirect('cliente_list')
419 else:
420 form = ClienteForm()
421 formset = DireccionFormSet()
422
423 return render(request, 'usuarios/cliente_form.html', {
424 'form': form,
425 'formset': formset,
426 })
427
428# Edita un cliente existente
429def editar_cliente(request, pk):
430 cliente = get_object_or_404(Cliente, pk=pk)
431 if request.method == 'POST':
432 form = ClienteForm(request.POST, instance=cliente)
433 formset = DireccionFormSet(request.POST, instance=cliente)
434 if form.is_valid() and formset.is_valid():
435 form.save()
436 formset.save()
437 return redirect('cliente_list')
438 else:
439 form = ClienteForm(instance=cliente)
440 formset = DireccionFormSet(instance=cliente)
441
442 return render(request, 'usuarios/cliente_form.html', {
443 'form': form,
444 'formset': formset,
445 })
446
447
448def obtener_direcciones_cliente(request, cliente_id):
449 direcciones = DireccionInstalacion.objects.filter(cliente_id=cliente_id).values("id", "direccion")
450 return JsonResponse({"direcciones": list(direcciones)})
451
452
453def crear_contrato(request):
454 if request.method == 'POST':
455 form = ContratoForm(request.POST, cliente_id=request.POST.get('cliente'))
456 if form.is_valid():
457 contrato = form.save(commit=False)
458 contrato.total = sum(servicio.precio for servicio in form.cleaned_data['servicios'])
459 contrato.save()
460 form.save_m2m()
461 return redirect('lista_contratos')
462 else:
463 form = ContratoForm()
464
465 return render(request, 'usuarios/contrato_form.html', {'form': form})
466
467
468# Editar un contrato existente
469def editar_contrato(request, pk):
470 contrato = get_object_or_404(Contrato, pk=pk)
471 if request.method == 'POST':
472 form = ContratoForm(request.POST, instance=contrato, cliente_id=contrato.cliente.id)
473 if form.is_valid():
474 contrato = form.save(commit=False)
475 contrato.total = sum(servicio.precio for servicio in form.cleaned_data['servicios'])
476 contrato.save()
477 form.save_m2m()
478 return redirect('lista_contratos')
479 else:
480 form = ContratoForm(instance=contrato, cliente_id=contrato.cliente.id)
481
482 return render(request, 'usuarios/contrato_form.html', {'form': form})
483
484def lista_contratos(request):
485 contratos = Contrato.objects.all()
486 return render(request, 'usuarios/lista_contratos.html', {'contratos': contratos})
487
488def eliminar_contrato(request, pk):
489 contrato = get_object_or_404(Contrato, pk=pk)
490 contrato.delete()
491 messages.success(request, "Contrato eliminado correctamente.")
492 return redirect('lista_contratos') # Asegúrate de que esta vista existe en `urls.py`
493
494
495
496def lista_servicios(request):
497 servicios = Servicio.objects.all()
498 return render(request, 'usuarios/lista_servicios.html', {'servicios': servicios})
499
500def agregar_servicio(request):
501 if request.method == 'POST':
502 form = ServicioForm(request.POST)
503 if form.is_valid():
504 form.save()
505 return redirect('servicios')
506 else:
507 form = ServicioForm()
508 return render(request, 'usuarios/agregar_servicio.html', {'form': form})
509
510def editar_servicio(request, servicio_id):
511 servicio = get_object_or_404(Servicio, pk=servicio_id)
512 if request.method == 'POST':
513 form = ServicioForm(request.POST, instance=servicio)
514 if form.is_valid():
515 form.save()
516 return redirect('servicios')
517 else:
518 form = ServicioForm(instance=servicio)
519 return render(request, 'usuarios/editar_servicio.html', {'form': form, 'servicio': servicio})
520
521
522def eliminar_servicio(request, servicio_id):
523 servicio = get_object_or_404(Servicio, pk=servicio_id)
524 try:
525 servicio.delete()
526 messages.success(request, "Servicio eliminado correctamente.")
527 except Exception as e:
528 messages.error(request, f"No se pudo eliminar el servicio: {e}")
529
530 return redirect('servicios')
531