Apuntes_Python/01_curso/Modulo_4/4-4g_activ_sistema_escuela.py
2022-12-24 22:41:20 -03:00

169 lines
5.4 KiB
Python

"""
Realizar un sistema para una escuela.
- Este sistema permite registrar nuevos alumnos, profesores y cursos.
- Un alumno es asignado a un curso y un curso puede tener asociado más de un profesor.
- Los profesores tienen un horario que indica cuando están en cada curso.
- El horario asociará un curso y un profesor para un día de la semana
(Lunes, Martes, Miércoles, Jueves, Viernes, Sábado, Domingo), una hora desde
y una hora hasta.
- El sistema permitirá exportar los alumnos que pertenecen a un curso,
el horario de cada profesor y el horario del curso.
"""
import csv
import datetime
from sqlalchemy import create_engine, ForeignKey, Column, \
Integer, String, Time, Sequence
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relationship
Base = declarative_base()
class Alumno(Base):
__tablename__ = 'alumno'
id = Column(Integer, primary_key=True)
nombre = Column(String, nullable=False)
curso_id = Column(Integer, ForeignKey('curso.id'))
curso = relationship('Curso', back_populates='inscrito')
def __repr__(self):
return self.nombre
class Profesor(Base):
__tablename__ = 'profesor'
id = Column(Integer, primary_key=True)
nombre = Column(String, nullable=False)
horario_prof = relationship('Horario', order_by='Horario.hr_ini', back_populates='profesor')
def __repr__(self):
return self.nombre
class Curso(Base):
__tablename__ = 'curso'
id = Column(Integer, primary_key=True)
nombre = Column(String, nullable=False)
inscrito = relationship('Alumno', order_by='Alumno.id', back_populates='curso')
horario_curso = relationship('Horario', order_by='Horario.hr_ini', back_populates='curso')
def __repr__(self):
return self.nombre
class Horario(Base):
__tablename__ = 'horario'
id = Column(Integer, Sequence('horario_id_seq'), primary_key=True)
dia = Column(Integer)
hr_ini = Column(Time)
hr_fin = Column(Time)
curso_id = Column(Integer, ForeignKey('curso.id'))
profesor_id = Column(Integer, ForeignKey('profesor.id'))
curso = relationship('Curso', back_populates='horario_curso')
profesor = relationship('Profesor', back_populates='horario_prof')
class ExportarCSV(object):
def __init__(self, ruta):
self.ruta = ruta
def exprt_horario_prof(self, profesor):
horario = profesor.horario_prof
with open(self.ruta, 'w') as archivo:
writer = csv.writer(archivo)
for horas in horario:
writer.writerow([horas.dia, horas.hr_ini, horas.hr_fin, horas.curso.nombre])
def export_hr_curso(self, curso):
horario = curso.horario_curso
with open(self.ruta, 'w') as archivo:
writer = csv.writer(archivo)
for horas in horario:
writer.writerow([horas.dia, horas.hr_ini, horas.hr_fin, horas.profesor])
def export_alumnos_curso(self, curso):
inscritos = curso.inscrito
with open(self.ruta, 'w') as archivo:
writer = csv.writer(archivo)
for alumno in inscritos:
writer.writerow([str(alumno)])
def main(*args, **kwargs):
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
# Creación de profesores
prof1 = Profesor(nombre='Profesor_1')
prof2 = Profesor(nombre='Profesor_2')
prof3 = Profesor(nombre='Profesor_3')
session.add(prof1)
session.add(prof2)
session.add(prof3)
# Creación de Cursos
curso1 = Curso(nombre='Curso_1')
curso2 = Curso(nombre='Curso_2')
curso3 = Curso(nombre='Curso_3')
session.add(curso1)
session.add(curso2)
session.add(curso3)
# Creación de Alumnos
alumno1 = Alumno(nombre='Alumno_1', curso=curso1)
alumno2 = Alumno(nombre='Alumno_2', curso=curso2)
alumno3 = Alumno(nombre='Alumno_3', curso=curso3)
session.add(alumno1)
session.add(alumno2)
session.add(alumno3)
# Creación de objetos Hora
hora1 = datetime.time(9, 0, 0)
hora2 = datetime.time(12, 0, 0)
hora3 = datetime.time(13, 0, 0)
hora4 = datetime.time(15, 0, 0)
# Creación de horas para iniciio y termino de clases
horario1 = Horario(dia=2, hr_ini=hora1, hr_fin=hora2, curso=curso1, profesor=prof1)
horario2 = Horario(dia=3, hr_ini=hora2, hr_fin=hora3, curso=curso2, profesor=prof2)
horario3 = Horario(dia=4, hr_ini=hora2, hr_fin=hora3, curso=curso3, profesor=prof3)
horario4 = Horario(dia=5, hr_ini=hora3, hr_fin=hora4, curso=curso1, profesor=prof3)
session.add(horario1)
session.add(horario2)
session.add(horario3)
session.add(horario4)
session.commit()
# Exportar Datos
ExportarCSV('Horario_Docente_{}'.format(prof1)).exprt_horario_prof(prof1)
ExportarCSV('Horario_Docente_{}'.format(prof2)).exprt_horario_prof(prof2)
ExportarCSV('Horario_Docente_{}'.format(prof3)).exprt_horario_prof(prof3)
ExportarCSV('Horario_Curso_{}'.format(curso1)).export_hr_curso(curso1)
ExportarCSV('Horario_Curso_{}'.format(curso2)).export_hr_curso(curso2)
ExportarCSV('Horario_Curso_{}'.format(curso3)).export_hr_curso(curso3)
ExportarCSV('Alumnos_Inscritos_{}'.format(curso1)).export_alumnos_curso(curso1)
ExportarCSV('Alumnos_Inscritos_{}'.format(curso2)).export_alumnos_curso(curso2)
ExportarCSV('Alumnos_Inscritos_{}'.format(curso3)).export_alumnos_curso(curso3)
if __name__ == "__main__":
main()