carga
This commit is contained in:
2025-04-17 00:18:43 -06:00
parent 212fea81b2
commit f5dcfba2b6
306 changed files with 112862 additions and 2 deletions

View File

3
autenticacion/admin.py Normal file
View File

@@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

5
autenticacion/apps.py Normal file
View File

@@ -0,0 +1,5 @@
from django.apps import AppConfig
class AutenticacionConfig(AppConfig):
name = 'autenticacion'

36
autenticacion/forms.py Normal file
View File

@@ -0,0 +1,36 @@
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
from .models import perfil
class UserForm(UserCreationForm):
first_name = forms.CharField()
last_name = forms.CharField()
class Meta:
model = User
fields = ('first_name','last_name', 'username', 'email', 'password1' ,'password2' )
class Formperfil(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(Formperfil, self).__init__(*args, **kwargs)
self.fields['key'].widget.attrs['readonly'] = True
self.fields["key"].widget = forms.HiddenInput()
self.fields['usuario'].widget.attrs['readonly'] = True
self.fields["usuario"].widget = forms.HiddenInput()
class Meta:
model = perfil
fields = ('usuario', 'matricula', 'cuatrimestre', 'grupo', 'direccion', 'genero', 'telefono', 'tipo', 'id_carrera', 'foto', 'key')
class FormperfilEnv(forms.ModelForm):
class Meta:
model = perfil
fields = ('matricula', 'cuatrimestre', 'grupo', 'direccion', 'genero', 'telefono', 'tipo', 'id_carrera', 'foto')

View File

@@ -0,0 +1,41 @@
# Generated by Django 4.0.5 on 2022-06-27 13:26
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
('universidad', '0001_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='perfil',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('matricula', models.CharField(max_length=50, unique=True, verbose_name='Matricula ó CURP')),
('cuatrimestre', models.CharField(blank=True, max_length=2, null=True, verbose_name='Cuatrimestre')),
('grupo', models.CharField(choices=[('A', 'A'), ('B', 'B'), ('C', 'C'), ('D', 'D')], default='A', max_length=1, verbose_name='Grupo')),
('direccion', models.CharField(blank=True, max_length=250, null=True, verbose_name='Domicilio')),
('telefono', models.CharField(blank=True, max_length=15, null=True, verbose_name='Telefono')),
('genero', models.CharField(choices=[('Estudiante', 'Estudiante'), ('Docente', 'Docente'), ('Administrativo', 'Administrativo'), ('Visitante', 'Visitante')], default='Estudiante', max_length=20, verbose_name='Genero')),
('foto', models.ImageField(blank=True, upload_to='foto/')),
('qr', models.ImageField(blank=True, upload_to='qr/')),
('fecha_alta', models.DateField(auto_now_add=True, verbose_name='Fecha alta')),
('fecha_actualizacion', models.DateField(auto_now=True, verbose_name='Fecha de Actualización')),
('id_carrera', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='universidad.carrera', verbose_name='Carrera')),
('usuario', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
options={
'verbose_name': 'perfil',
'verbose_name_plural': 'perfiles',
'ordering': ['matricula'],
},
),
]

View File

@@ -0,0 +1,23 @@
# Generated by Django 4.0.5 on 2022-07-19 04:25
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('autenticacion', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='perfil',
name='tipo',
field=models.CharField(choices=[('Estudiante', 'Estudiante'), ('Docente', 'Docente'), ('Administrativo', 'Administrativo'), ('Visitante', 'Visitante')], default='Estudiante', max_length=20, verbose_name='Genero'),
),
migrations.AlterField(
model_name='perfil',
name='genero',
field=models.CharField(choices=[('M', 'M'), ('F', 'F')], default='M', max_length=1, verbose_name='Genero'),
),
]

View File

@@ -0,0 +1,23 @@
# Generated by Django 4.0.5 on 2022-07-19 06:48
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('autenticacion', '0002_perfil_tipo_alter_perfil_genero'),
]
operations = [
migrations.AddField(
model_name='perfil',
name='key',
field=models.CharField(blank=True, max_length=250, null=True, verbose_name='Key'),
),
migrations.AlterField(
model_name='perfil',
name='tipo',
field=models.CharField(choices=[('Estudiante', 'Estudiante'), ('Docente', 'Docente'), ('Administrativo', 'Administrativo'), ('Visitante', 'Visitante')], default='Estudiante', max_length=20, verbose_name='Tipo'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.0.5 on 2022-07-23 23:52
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('autenticacion', '0003_perfil_key_alter_perfil_tipo'),
]
operations = [
migrations.AlterField(
model_name='perfil',
name='cuatrimestre',
field=models.IntegerField(default=0, verbose_name='Cuatrimestre'),
),
]

View File

@@ -0,0 +1,20 @@
# Generated by Django 4.0.5 on 2022-07-24 00:19
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('universidad', '0002_ncuatrimestre'),
('autenticacion', '0004_alter_perfil_cuatrimestre'),
]
operations = [
migrations.AlterField(
model_name='perfil',
name='cuatrimestre',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='universidad.ncuatrimestre', verbose_name='Cuatrimestre'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.0.5 on 2022-07-24 00:49
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('autenticacion', '0005_alter_perfil_cuatrimestre'),
]
operations = [
migrations.AlterField(
model_name='perfil',
name='cuatrimestre',
field=models.CharField(choices=[('0', '0'), ('1', '1'), ('2', '2'), ('3', '3'), ('4', '4'), ('5', '5'), ('6', '6'), ('7', '7'), ('8', '8'), ('9', '9'), ('10', '10')], default=0, max_length=2, verbose_name='Cuatrimestre'),
),
]

View File

59
autenticacion/models.py Normal file
View File

@@ -0,0 +1,59 @@
from django.db import models
from django.contrib.auth.models import User
import os
from tinymce import models as tinymce_models
from model_utils import Choices
import qrcode
from io import BytesIO
from django.core.files import File
from PIL import Image, ImageDraw
from universidad.models import carrera
# Create your models here.
class perfil(models.Model):
TIPO = Choices('Estudiante', 'Docente', 'Administrativo', 'Visitante')
GENERO = Choices('M', 'F')
GRU = Choices('A','B','C','D')
CUATRI = Choices('0','1','2','3','4','5','6','7','8','9','10')
usuario = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
matricula = models.CharField(max_length=50, unique=True, null=False, blank=False, verbose_name='Matricula ó CURP')
cuatrimestre = models.CharField(choices=CUATRI, default=0, max_length=2, verbose_name='Cuatrimestre')
grupo = models.CharField(choices=GRU, default=GRU.A, max_length=1, verbose_name='Grupo')
direccion = models.CharField(max_length=250, null=True, blank=True, verbose_name='Domicilio')
genero = models.CharField(choices=GENERO, default=GENERO.M, max_length=1, verbose_name='Genero')
telefono = models.CharField(max_length=15, null=True, blank=True, verbose_name='Telefono')
tipo = models.CharField(choices=TIPO, default=TIPO.Estudiante, max_length=20, verbose_name='Tipo')
id_carrera = models.ForeignKey(carrera, on_delete=models.CASCADE, null=False, blank=False, verbose_name='Carrera')
foto = models.ImageField(upload_to='foto/', blank=True)
qr = models.ImageField(upload_to='qr/', blank=True)
fecha_alta = models.DateField(auto_now_add=True, verbose_name='Fecha alta')
fecha_actualizacion = models.DateField(auto_now=True, verbose_name='Fecha de Actualización')
key = models.CharField(max_length=250, null=True, blank=True, verbose_name='Key')
def delete(self, *args, **kwargs):
if os.path.isfile(self.foto.path):
os.remove(self.foto.path)
super(perfil, self).delete(*args, **kwargs)
def __str__(self):
return self.matricula
def save(self, *args, **kwargs):
data = self.key
key = ''.join(ch for ch in data if ch.isalnum())
qr_image = qrcode.make(key)
qr_offset = Image.new('RGB',(480, 480),'white')
qr_offset.paste(qr_image)
files_name = f'{self.matricula}qr.png'
stream = BytesIO()
qr_offset.save(stream, 'PNG')
self.qr.save(files_name, File(stream), save=False)
qr_offset.close()
super().save(*args, **kwargs)
class Meta:
verbose_name = 'perfil'
verbose_name_plural = 'perfiles'
ordering = ['matricula']

3
autenticacion/tests.py Normal file
View File

@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

76
autenticacion/views.py Normal file
View File

@@ -0,0 +1,76 @@
from django.shortcuts import render, redirect, get_object_or_404
from django.views.generic import View
from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth.models import User
from django.contrib import messages
from django.contrib.auth import login, logout, authenticate
from .forms import UserForm
from django.contrib.auth.decorators import login_required
def acceder(request):
if request.method == "POST":
form = AuthenticationForm(request, data=request.POST)
if form.is_valid():
nombre_usuario = form.cleaned_data.get("username")
password = form.cleaned_data.get("password")
usuario = authenticate(username=nombre_usuario, password=password)
if usuario is not None:
login(request, usuario)
messages.success(request, F"Bienvenid@ de nuevo {nombre_usuario}")
return redirect("index")
else:
messages.error(request, "Los datos son incorrectos")
else:
messages.error(request, "Los datos son incorrectos")
form = AuthenticationForm()
return render(request, "acceder.html", {"form": form})
# Create your views here.
class VistaRegistro(View):
def get(self, request):
form = UserForm()
return render(request, "registro.html", {"form": form})
def post(self, request):
form = UserForm(request.POST)
if form.is_valid():
post = form.save(commit=False)
post.save()
return redirect("index")
else:
for field, items in form.errors.items():
for item in items:
messages.error(request, '{}: {}'.format(field, item))
return render(request, "registro.html", {"form": form})
def salir(request):
logout(request)
messages.success(request, F"Tu sesion se ha cerrado correctamente")
return redirect("index")
def usuarios(request):
datos = User.objects.all()
return render(request, 'usuarios.html', {"datos": datos})
@login_required(login_url='/acceder')
def userupdate(request, id):
instance= get_object_or_404(User, pk=id)
form = UserForm(request.POST or None, instance=instance)
context= {'form': form}
if form.is_valid():
obj= form.save(commit= False)
obj.save()
messages.success(request, "El usuario fue actualizado")
return redirect("usuarios")
else:
context= {'form': form, 'error': 'Error al actualizar'}
return render(request,'usuariosupdate.html' , context)