El siguiente proyecto está desarrollado en el marco de la aceleración llevada adelante por el Gobierno de Salta a través de la empresa ALKEMY para los egresados de 1000 Programadores y Programadoras
El Caso de Negocio que se desarrollo es el de una Bilbioteca que presta libros, tiene socios y empleados. Su objetivo es gestionar los prestamos de libros.
Desde la configuración inicial de las entidades libro, autor, empleado y socio , su gestión; hasta la registración de un prestamo de libro.
- FrameWork DJANGO
- Python
- Jinga2
- HTML/Bootstrap
- SQLite3
- Git
- Jira
Este módulo permite resgistrar, modificar, elimanar lógicamente y mostrar a todos los empleados de la Biblioteca. Básicamente es un CRUD de empleados.
Modelo de Datos:
class Empleado(models.Model):
nombre = models.CharField(max_length=30)
apellido = models.CharField(max_length=30)
numero_legajo = models.CharField(max_length=30)
activo = models.BooleanField(default=True)
# el campo 'activo' sirve para el borrrado lógico de la entidad
def __str__(self):
return f"{self.nombre} {self.apellido}: {self.numero_legajo}"
Esta pantalla permite registrar un nuevo empleado ingresando Nombre, Apellido y Número de Legajo.
Acceso: puede acceder al formulario desde la url http://localhost:8000/biblioteca/empleados/nuevo , desde el formulario "Listado de Empleados" o desde la "Home Page"
Vista:
def registrar_empleado(request):
if request.POST:
# Se cargan las variables con los datos que se reciben desde el formulario por el método POST
nombre_empleado = request.POST["nombre"]
apellido_empleado = request.POST["apellido"]
numeroLeg_empleado = request.POST["numero_legajo"]
# Se crea el objeto de la clase 'Empleado' con los datos de las variables y este se registra en la base de datos.
Empleado.objects.create(
nombre=nombre_empleado,
apellido=apellido_empleado,
numero_legajo=numeroLeg_empleado
)
# Se renderiza y retornamos el request al templeate 'nuevo empleado'
return render(request,"biblioteca/nuevos_empleados.html")
Esta pantalla permite listar a todos los empleado, tanto activos como inactivos de la biblioteca y poder gestionar la actualización de sus datos, activar o desartivar su estado y/o agregar un nuevo empleado.
Acceso: puede acceder al formulario desde la url http://localhost:8000/biblioteca/empleados/listado , desde el formulario "Listado de Empleados" o desde la " Home Page"
Vista:
def listado_empleados(request):
# Se cargan todos los registros de empleados de la base a la variable lista_empleados
lista_empleados = Empleado.objects.all()
#Se renderiza y se envían la lista con todos los empleados al template 'listado de empleados'
return render(request, "biblioteca/listado_empleados.html", {"lista_empleados" : lista_empleados})
Esta pantalla permite actualizar el nombre, apellido y nro. de legajo de un empleado seleccionado desde la pantalla 'listado de empleados'
Acceso: puede acceder al formulario desde la url http://localhost:8000/biblioteca/empleados/listado , haciendo clic sobre el botón 'Actualizar'
Vista:
def actualizar_empleado(request, empleado_id):
# Se cargan los datos de la base correspondientes con el id del empleado seleccionado desde el template 'listado de empleados' en la variable empleado
empleado = Empleado.objects.get(id=empleado_id)
if request.POST:
# Se cargan las variables con los datos que se reciben desde el formulario por el método POST
nombre_empleado = request.POST["nombre"]
apellido_empleado = request.POST["apellido"]
numeroLeg_empleado = request.POST["numero_legajo"]
# Se actualiza el objeto 'empleado' con los datos recibidos del formulario
empleado.nombre=nombre_empleado
empleado.apellido=apellido_empleado
empleado.numero_legajo=numeroLeg_empleado
empleado.save()
# Se retorna a la página con el listado de empleados actualizada
return redirect("listado_empleados")
# Se renderiza y retornamos el request al templeate 'actualizar empleado' con los datos del objeto 'empleado'
return render(request, "biblioteca/actualizar_empleado.html", {"empleado" : empleado})Este módulo permite resgistrar, modificar, eliminar y mostrar a todos los prestamos de libros de la Biblioteca.
Modelo de Datos:
class PrestamoLibro(models.Model):
fecha_prestamo = models.DateField(default=date.today)
fecha_devolucion = models.DateField(default=date.today)
socio = models.ForeignKey('Socio', related_name='socio', on_delete=models.CASCADE)
empleado = models.ForeignKey('Empleado', related_name='empleado', on_delete=models.CASCADE)
libro = models.ForeignKey('Libro', related_name='libro', on_delete=models.CASCADE)
def __str__(self):
return f"{self.socio.nombre}"
#Devuelve una cadena que representa el nombre del socio asociado al préstamo. Esto se utiliza para mostrar el nombre del socio cuando se imprime o se muestra una instancia de PrestamoLibro.Esta pantalla permite registrar un nuevo prestamo ingresando fecha de prestamo, nombre del empleado , socio y el libro.
Acceso: puede acceder al formulario desde la url http://localhost:8000/biblioteca/prestamos/nuevo, desde el formulario "Listado de Prestamos" o desde la " Home Page"
Vista:
def registrar_prestamo(request):
if request.POST:
fecha_Prestamo = datetime.strptime(request.POST["fecha_prestamo"],"%Y-%m-%d").date()
socio=request.POST["socio"]
empleado=request.POST["empleado"]
libro=request.POST["libro"]
fecha_devolucion = fecha_Prestamo + timedelta(days=2)
fecha_devolucion_str = fecha_devolucion.strftime("%Y-%m-%d") # Convertir a cadena
PrestamoLibro.objects.create(
fecha_prestamo=fecha_Prestamo,
fecha_devolucion=fecha_devolucion_str,
socio_id=socio,
empleado_id=empleado,
libro_id=libro,
)
return render(request, "biblioteca/nuevos_prestamo_libro.html", {
'lista_empleados': Empleado.objects.all(),
'lista_socios': Socio.objects.all(),
'lista_libros': Libro.objects.all()
})Esta pantalla permite listar a todos los prestamos, poder gestionar la actualización ,eliminar y/o agregar un nuevo prestamo.
Acceso: puede acceder al formulario desde la url http://localhost:8000/biblioteca/prestamos/listado , desde el formulario "Listado de Empleados" o desde la " Home Page"
Vista:
def listado_prestamos(request):
# Se cargan todos los registros de prestamos de la base a la variable listado_prestamos
listado_prestamos = PrestamoLibro.objects.all()
#Aquí se crea un diccionario llamado context que contiene una clave llamada "listado_prestamos" cuyo valor es la lista de préstamos obtenida en el paso anterior. Este diccionario se utiliza para pasar información adicional
context = {"listado_prestamos" : listado_prestamos}
#Se renderiza y se envían la lista con todos los prestamos al template 'listado de prestamos'
return render(request, "biblioteca/listado_prestamos.html", context )Esta pantalla permite actualizar el libro, socio y el empleado. seleccionado desde la pantalla 'listado de prestamos'
Acceso: puede acceder al formulario desde la url http://localhost:8000/biblioteca/prestamos/listado , haciendo clic sobre el botón 'Actualizar'
Vista:
def actualizar_prestamo(request, id):
prestamo = get_object_or_404(PrestamoLibro, id=id)
listado_empleados= Empleado.objects.all()
listado_libros= Libro.objects.all()
listado_socios= Socio.objects.all()
if request.method == 'POST':
empleado_prestamo = Empleado.objects.get(id=request.POST['empleado'])
socio_prestamo = Socio.objects.get(id=request.POST['socio'])
libro_prestamo = Libro.objects.get(id=request.POST['libro'])
prestamo.empleado=empleado_prestamo
prestamo.socio=socio_prestamo
prestamo.libro=libro_prestamo
prestamo.save()
return redirect("listado_prestamos")
context = {'prestamo': prestamo,
'listado_empleados' : listado_empleados,
'listado_libros' : listado_libros,
'listado_socios' : listado_socios
}
return render(request, 'biblioteca/actualizar_prestamo.html', context)Este módulo permite resgistrar, modificar, eliminar lógicamente y mostrar a todos los autores de la Biblioteca. Básicamente es un CRUD de autores.
Modelo de Datos:
class Autor(models.Model):
nombre = models.CharField(max_length=30)
apellido = models.CharField(max_length=30)
nacionalidad = models.CharField(max_length=60)
activo = models.BooleanField(default=True)
def __str__(self):
return f"{self.nombre} {self.apellido}"
Esta pantalla permite registrar un nuevo autor ingresando Nombre, Apellido y Nacionalidad.
Acceso: puede acceder al formulario desde la url http://localhost:8000/biblioteca/autores/nuevo/ , desde el formulario "Listado de Autores" o desde la "Home Page"
Vista:
def registrar_autores(request):
if request.POST:
# Se cargan las variables con los datos que se reciben desde el formulario por el método POST
nombre_autor = request.POST["nombre"]
apellido_autor = request.POST["apellido"]
nacionalidad_autor = request.POST["nacionalidad"]
# Se crea el objeto de la clase 'Autor' con los datos de las variables y este se registra en la base de datos.
Autor.objects.create(
nombre=nombre_autor,
apellido=apellido_autor,
nacionalidad=nacionalidad_autor
)
# Se renderiza y retornamos el request al templeate 'nuevo autor'
return render(request,"biblioteca/nuevos_autores.html")
Esta pantalla permite listar a todos los autores, tanto activos como inactivos de la biblioteca y poder gestionar la actualización de sus datos, activar o desartivar su estado y/o agregar un nuevo autor.
Acceso: puede acceder al formulario desde la url http://localhost:8000/biblioteca/autores/listado , desde el formulario "Listado de autores" o desde la " Home Page"
Vista:
def listado_autores(request):
# Se cargan todos los registros de empleados de la base a la variable lista_autores
lista_autores = Autor.objects.all()
#Se renderiza y se envían la lista con todos los empleados al template 'listado de empleados'
return render(request, "biblioteca/listado_autores.html", {"lista_autores" : lista_autores})
Esta pantalla permite actualizar el nombre, apellido y la nacionalidad de un autor seleccionado desde la pantalla 'listado de autores'
Acceso: puede acceder al formulario desde la url http://localhost:8000/biblioteca/autores/listado/ , haciendo clic sobre el botón 'Actualizar'
Vista:
def actualizar_autor(request, autor_id):
# Se cargan los datos de la base correspondientes con el id del autor seleccionado desde el template 'listado de autores' en la variable autor
autor = get_object_or_404(Autor, id=autor_id)
if request.method == 'POST':
# Se cargan las variables con los datos que se reciben desde el formulario por el método POST
nombre_autor = request.POST.get('nombre')
apellido_autor = request.POST.get('apellido')
nacionalidad_autor = request.POST.get('nacionalidad')
# Se actualiza el objeto 'autor' con los datos recibidos del formulario
autor.nombre=nombre_autor
autor.apellido=apellido_autor
autor.nacionalidad=nacionalidad_autor
autor.save()
# Se retorna a la página con el listado de autores actualizada
return redirect("listado_autores")
# Se renderiza y retornamos el request al templeate 'actualizar autor' con los datos del objeto 'autor'
context = {'autor': autor}
return render(request, 'biblioteca/actualizar_autor.html', context)Este módulo permite resgistrar, modificar, eliminar lógicamente y mostrar a todos los socios de la Biblioteca. Básicamente es un CRUD de socios.
Modelo de Datos:
class Socio(models.Model):
nombre = models.CharField(max_length=30)
apellido = models.CharField(max_length=30)
fecha_nacimiento = models.DateField(null=True, blank=True)
activo = models.BooleanField(default=True)
def __str__(self):
return f"{self.nombre} {self.apellido}"
Esta pantalla permite registrar un nuevo socio ingresando Nombre, Apellido y fecha de nacimiento.
Acceso: puede acceder al formulario desde la url http://localhost:8000/biblioteca/socios/nuevo/ , desde el formulario "Listado de socios" o desde la "Home Page"
Vista:
def registrar_socio(request):
if request.POST:
# Se cargan las variables con los datos que se reciben desde el formulario por el método POST
nombre_socio = request.POST["nombre"]
apellido_socio = request.POST["apellido"]
fecha_nacimiento_socio = request.POST["fecha_nacimiento"]
# Se crea el objeto de la clase 'Autor' con los datos de las variables y este se registra en la base de datos.
Socio.objects.create(
nombre=nombre_socio,
apellido=apellido_socio,
fecha_nacimiento=fecha_nacimiento_socio
)
# Se renderiza y retornamos el request al templeate 'nuevo socio'
return render(request,"biblioteca/nuevos_socios.html")
Esta pantalla permite listar a todos los socios, tanto activos como inactivos de la biblioteca y poder gestionar la actualización de sus datos, activar o desactivar su estado y/o agregar un nuevo socio.
Acceso: puede acceder al formulario desde la url http://localhost:8000/biblioteca/socios/listado , desde el formulario "Listado de socios" o desde la " Home Page"
Vista:
def listado_socios(request):
# Se cargan todos los registros de socios de la base a la variable lista_socios
lista_socios = Socio.objects.all()
#Se renderiza y se envían la lista con todos los socios al template 'listado de socios'
return render(request, "biblioteca/listado_socios.html", {"lista_socios" : lista_socios})
Esta pantalla permite actualizar el nombre, apellido y la fecha de nacimiento de un socio seleccionado desde la pantalla 'listado de socios'
Acceso: puede acceder al formulario desde la url http://localhost:8000/biblioteca/socios/listado/ , haciendo clic sobre el botón 'Actualizar'
Vista:
def actualizar_autor(request, autor_id):
# Se cargan los datos de la base correspondientes con el id del socio seleccionado desde el template 'listado de socios' en la variable socio
socio = get_object_or_404(Socio, id=socio_id)
if request.method == 'POST':
# Se cargan las variables con los datos que se reciben desde el formulario por el método POST
nombre_socio = request.POST['nombre']
apellido_socio = request.POST['apellido']
fecha_nacimiento_socio = request.POST['fecha_nacimiento']
# Se actualiza el objeto 'socio' con los datos recibidos del formulario
socio.nombre=nombre_socio
socio.apellido=apellido_socio
fecha_dt=datetime.strptime(fecha_nacimiento_socio,'%Y-%m-%d')
socio.fecha_nacimiento= fecha_dt
socio.save()
# Se retorna a la página con el listado de socios actualizada
return redirect("listado_socios")
# Se renderiza y retornamos el request al templeate 'actualizar socio' con los datos del objeto 'socio'
return render(request, 'biblioteca/actualizar_socio.html', {"socio" : socio})Este módulo permite resgistrar, modificar, eliminar lógicamente y mostrar a todos los libros de la Biblioteca. Básicamente es un CRUD de libros.
Modelo de Datos:
class Libro(models.Model):
titulo = models.CharField(max_length=30)
descripcion = models.CharField(max_length=255)
isbn = models.IntegerField()
autor = models.ForeignKey(Autor,related_name="libros",on_delete=models.CASCADE)
activo = models.BooleanField(default=True)
def __str__(self):
return f"{self.titulo}-ISBN:{self.isbn}"
Esta pantalla permite registrar un nuevo libro ingresando Titulo, Descripcion , ISBN y autor.
Acceso: puede acceder al formulario desde la url http://localhost:8000/biblioteca/libros/nuevo/ , desde el formulario "Listado de libros" o desde la "Home Page"
Vista:
def registrar_libro(request):
listado_autores = Autor.objects.all()
if request.POST:
# Se cargan las variables con los datos que se reciben desde el formulario por el método POST
titulo_libro = request.POST["titulo"]
descripcion_libro = request.POST["descripcion"]
isbn_libro = request.POST["isbn"]
autor_libro = request.POST["autor"]
# Se crea el objeto de la clase 'Libro' con los datos de las variables y este se registra en la base de datos.
Libro.objects.create(
titulo=titulo_libro,
descripcion=descripcion_libro,
isbn=isbn_libro,
autor=Autor.objects.get(id=autor_libro)
)
# Se renderiza y retornamos el request al templeate 'nuevo libro',tambien se pasa que el listado de autores para acceder a los autores disponibles
context = {'listado_autores':listado_autores}
return render(request, "biblioteca/nuevos_libros.html", context)
Esta pantalla permite listar a todos los libros, tanto activos como inactivos de la biblioteca y poder gestionar la actualización de sus datos, activar o desactivar su estado y/o agregar un nuevo libro.
Acceso: puede acceder al formulario desde la url http://localhost:8000/biblioteca/libros/listado , desde el formulario "Listado de libros" o desde la " Home Page"
Vista:
def listado_libros(request):
# Se cargan todos los registros de libros de la base a la variable lista_libros
listado_libros = Libro.objects.all()
context = {"listado_libros" : listado_libros}
#Se renderiza y se envían la lista con todos los libros al template 'listado de libros'
return render(request, "biblioteca/listado_libros.html", context )
Esta pantalla permite actualizar el titulo, descripcion,ISBN el autor de un libro seleccionado desde la pantalla 'listado de libros'
Acceso: puede acceder al formulario desde la url http://localhost:8000/biblioteca/libros/listado/ , haciendo clic sobre el botón 'Actualizar'
Vista:
def actualizar_libro(request, autor_id):
# Se cargan los datos de la base correspondientes con el id libro seleccionado desde el template 'listado de libro' en la variable libro , tambien cargamos el listado de autores para su acceso
libro = get_object_or_404(Libro, id=id)
listado_autores = Autor.objects.all()
if request.method == 'POST':
# Se cargan las variables con los datos que se reciben desde el formulario por el método POST
titulo_libro = request.POST['titulo']
descripcion_libro = request.POST['descripcion']
isbn_libro = request.POST['isbn']
autor_libro = Autor.objects.get(id=request.POST['autor'])
# Se actualiza el objeto 'libro' con los datos recibidos del formulario
libro.titulo=titulo_libro
libro.descripcion=descripcion_libro
libro.isbn=isbn_libro
libro.autor=autor_libro
libro.save()
# Se retorna a la página con el listado de libros actualizada
return redirect("listado_libros")
# Se renderiza y retornamos el request al templeate 'actualizar libro' con los datos del objeto 'libro'
context = {'libro': libro,'listado_autores' : listado_autores }
return render(request, 'biblioteca/actualizar_libro.html', context)Django instala como parte de su framework en forma automática la aplicación de administración de permite usar los modelos creados en una aplicación para construir automáticamente un área dentro del sitio que puedes usar para crear, consultar, actualizar y borrar registros. Esto puede ahorrarte mucho tiempo de desarrollo, haciendo muy fácil probar nuestros modelos y darte una idea de si nuestros datos son correctos. La aplicación de administración también puede ser útil para manejar datos en producción, dependiendo del estilo del sitio web. Desde el proyecto Django solo se recomienda para gestión de datos internos (por ejemplo, solo para uso de administradores o personas internas de tu organización), ya que como enfoque centrado en el modelo no es necesariamente la mejor interfaz posible para todos los usuarios, exponiendo una gran cantidad de detalles innecesarios de los modelos.
Para registrar y tener disponibles nuestros modelos en la aplicación necesitamos importarlos en el archivo *admin.py ubicado en el directorio de nuestra aplicación.
# 'admin' se importa automáticamente al instalar Django
from django.contrib import admin
" Se deben importar todos los modelos que necesitaremos gestionar desde ADMIN
from biblioteca.models import Autor, Empleado, Libro, PrestamoLibro, SocioLuego se crean las vistas de los modelos para la aplicación, pudiendo agregar filtros de búsqueda y selección que necesitemos tener para los listados correspondientes. A continuación, se muestra como se define el modelo de Socio para la aplicación:
# Se define el modelo Socio para la aplicación admin
class SocioAdmin(admin.ModelAdmin):
# Se define el modelo relacionado para incluirse en la aplicación
model= Socio
# Se definen los campos que serán mostrados en la aplicación para el modelo definido
list_display=[
"nombre",
"apellido",
"fecha_nacimiento",
"activo",
]
# Se definen los campos por los que se filtrarán los registros según lo que ingresado en el campo de búsqueda
search_fields = [
"nombre",
"apellido",
]
# Se definen los campos de filtrado cuyos valores se mostrarán para poder ser seleccionados en una columna lateral al listado
list_filter = [
"activo"
]Por último, para que tenga efecto en la aplicación se debe registrar los modelos en la base de datos de la aplicación con el siguiente comando:
admin.site.register(Socio, SocioAdmin)Estos pasos de importación, definición y registración se repiten por cada modelo que se quiera gestionar desde la aplicación ADMIN
Para lograr acceder a la aplicación debemos crear un usuario desde el entorno virtual de nuestro proyecto. Esto se realiza con el comando el que nos permitirá definir el nombre de nuestro usuario, un correo electrónico y el password relacionado.
Una vez creado el usuario podremos ingresar sus credenciales en la pantalla de logeo.
Se puede acceder a la aplicación desde http://localhost:8000/admin/ en donde aparecerá una pantalla de logeo .
Ingresando las credenciales de acceso correctas podremos acceder al sistema.
Desde la pantalla principal podremos acceder al listado de nuestros modelos registrados, los cuales mostrarán un campo de búsqueda según los campos definidos en el archivo admin.py y en el lateral derecho los valores de los campos de filtrados registrados.
Pantalla para crear un empleado
Pantalla para modificar un empleado
Pantalla para eliminar un empleado
Por otro lado, la aplicación nos proporciona la posibilidad de gestionar todos los usuarios creados pudiendo eliminarlos, crear uno nuevo, modificar sus datos y hasta eliminarlos.
Existen otras funcionalidades como acceder al historial de cada registro, la gestión de grupos, entre otras, pero no están dentro del alcance de este documento.
Se encargan de obtener los datos de los empleados, socios y autores almacenados en la base de datos y devolverlos en forma de respuestas JSON cuando se realizan solicitudes GET a los endpoints correspondientes.
GET /api/autores/- Obtiene un listado de todos los autores.
def listado_autor(request):
# Obtiene todos los autores
autores = Autor.objects.all()
autores_data = []
for autor in autores:
# Crea un diccionario con los datos del autor
autor_data = {
'id': autor.id,
'nombre': autor.nombre,
'apellido': autor.apellido,
'nacionalidad': autor.nacionalidad,
}
autores_data.append(autor_data)
# Retorna los datos de los autores como una respuesta JSON
return JsonResponse(autores_data, safe=False)
GET /api/libros/- Obtiene un listado de todos los libros.
def listado_libro(request):
# Obtiene todos los libros
libros = Libro.objects.all()
libros_data = []
for libro in libros:
# Crea un diccionario con los datos del libro
libro_data = {
'id': libro.id,
'titulo': libro.titulo,
'autor': {
'nombre': libro.autor.nombre,
'apellido': libro.autor.apellido,
},
}
libros_data.append(libro_data)
# Retorna los datos de los libros como una respuesta JSON
return JsonResponse(libros_data, safe=False)
GET /api/libros/{id}/- Obtiene los detalles de un libro dada la id
def registro_libro(request, id):
# Obtiene un objeto especifico del modelo Libro dada la id
libro = get_object_or_404(Libro, id=id)
# Crea un diccionario con los datos del autor del libro
autor_data = {
'id': libro.autor.id,
'nombre': libro.autor.nombre,
'apellido': libro.autor.apellido,
}
# Crea un diccionario con los datos del libro, agregando tambien el diccionario previamente creado
libro_data = {
'id': libro.id,
'titulo': libro.titulo,
'descripcion': libro.descripcion,
'autor': autor_data,
}
# Retorna los datos del libro como una respuesta JSON
return JsonResponse(libro_data)
GET /api/socios/- Obtiene un listado de todos los socios.
def listado_socio(request):
# Obtiene todos los socios
socios = Socio.objects.all()
socios_data = []
for socio in socios:
# Crea un diccionario con los datos del socio
socio_data = {
'id': socio.id,
'nombre': socio.nombre,
'apellido': socio.apellido,
'fecha_nacimiento': socio.fecha_nacimiento,
}
socios_data.append(socio_data)
# Retorna los datos de los socios como una respuesta JSON
return JsonResponse(socios_data, safe=False)
GET /api/empleados/- Obtiene un listado de todos los empleados.
def listado_empleado(request):
# Obtiene todos los empleados
empleados = Empleado.objects.all()
empleados_data = []
for empleado in empleados:
# Crea un diccionario con los datos del empleado
empleado_data = {
'id': empleado.id,
'nombre': empleado.nombre,
'apellido': empleado.apellido,
'numero_legajo': empleado.numero_legajo,
}
empleados_data.append(empleado_data)
# Retorna los datos de los empleados como una respuesta JSON
return JsonResponse(empleados_data, safe=False)
Comision 4 Squad 2
- Arredes Javier Ricardo
- Cayampi Segovia Ismael Braian
- Fradejas Soria Martín
- Ulloa Pablo Alfredo
- Villa Cristian Nahuel