Materia
Ejercicios


Tarea 3: SGIA

Objetivos de aprendizaje

Después de resolver la tarea 3, usted será capaz de:

  • Operar sobre un archivo con una estructura pre-definida de datos,
  • Realizar procesamiento de texto sobre datos con un formato específico,
  • Conocer código html para el desarrollo de una página web,
  • Guardar datos en un archivo.

Enunciado

En esta tarea usted deberá implementar un sitio web de informaciones académicas para una prestigiosa Universidad. El sitio se llama SGIA (Sistemas de Gestión e Información Académica) y debe contar con las siguientes funcionalidades:

  • Crear cuentas de alumnos para el sitio.
  • Permitir la inscripción de asignaturas.
  • Visualizar la información de los alumnos y sus notas.

Se les entregará un conjunto de archivos que les proveerá de algunas funciones ya implementadas y otras que deben implementar con su equipo de trabajo.

Archivos

Los archivos que se le entregarán los puede descargar acá y cada uno de ellos se describe a continuación:

  • sgia.py, este archivo es el encargado de levantar el servidor que permite ver el sitio. No modificar, a menos que quieran personalizar su tarea.
  • funciones.py, archivo que contiene las funciones que usted deberá implementar para el correcto funcionamiento del sitio.
  • definiciones.py, archivo que contiene diccionarios y funciones que sirven de ayuda para el desarrollo de la tarea.
  • alumnos.dat, archivo de texto que contiene los alumnos que han sido registrados en el sitio.
  • Además de los archivos mencionados, la tarea debería generar archivos cuyo nombre es un rol UTFSM (ej: 201330001-4) con extensión “.dat” en la carpeta alumnos.

Nota

Todos estos archivos deben estar en el mismo directorio de trabajo. Además encontrará la carpeta static, la cual contiene los archivos html y CSS usados para el sitio.

Funcionamiento

Una vez descargado el archivo para comenzar la tarea, descomprímalo y ejecute el archivo python sgia.py. Se mostrará el siguiente mensaje:

Bottle v0.11.dev server starting up (using WSGIRefServer())...
Listening on http://localhost:8080/
Hit Ctrl-C to quit.

Este mensaje indica que el servidor web que contiene el sitio se está ejecutando de manera local. Abra su navegador preferido (chrome, internet explorer, safari u otro) y escriba la dirección http://localhost:8080/, se debería mostrar la página web que aparece en el video.

El sitio se divide en las siguientes secciones:

  • Página de Inicio de Sesión: se muestra al escribir la dirección http://localhost:8080. En esta página el usuario debe ingresar su dirección de correo electrónico y la password que el sitio le genera para iniciar sesión.
  • Ficha personal: Página que muestra la información del alumno.
  • Avance curricular: Página que muestra las notas obtenidas por el alumno.
  • Inscripción: Página que permite la inscripción de asignaturas.
  • Registro alumnos: se muestra al escribir http://localhost:8080/registro. Permite registrar un nuevo alumno en el sitio.
  • Evaluaciones: se muestra al escribir la dirección http://localhost:8080/evaluaciones. En esta página se puede ingresar las notas de los alumnos.

El sitio cuenta con enlaces que permiten entrar a cada uno de los sitios mostrados anteriormente.

Representación

El sitio permite el registro de cuentas de alumnos, quienes podrán inscribir asignaturas, ver su información personal y conocer sus notas. Para registrar un alumno, sólo debe ingresar su nombre, apellidos, sexo, carrera y año de ingreso a la Universidad. Estos datos deben ser guardados en archivos de texto. Los datos de los alumnos están representados por el diccionario:

datos = {
     "nombre": "Juan",
     "apellido1": "Perez",
     "apellido2": "Palma",
     "sexo": "M",
     "codigo": "30",
     "ingreso": "2011"
     }

Qué hay que implementar

Las funciones que usted debe implementar con su equipo de trabajo son las siguientes:

  • generar_correo(datos): esta función debe retornar la dirección de correo electrónico que corresponde al usuario cuyos datos son pasados como argumento. Para un alumno que ingresó antes del 2012 la cuenta de correo será nombre.apellido1@alumnos.usm.cl, mientras que para el resto la cuenta será nombre.apellido1.XX@sansano.usm.cl, donde XX corresponde a los dos últimos dígitos del año de ingreso del alumno. Su función debe ser capaz de omitir los guiones (-) y espacios en el nombre y el primer apellido.

  • generar_rol(datos): Esta función debe retornar el rol que corresponde al alumno cuyos datos son pasados como argumento. El rol de un alumno que ingresó antes del 2010 tiene la forma XXYYZZZ-D, donde XX corresponde al primer y último dígito del año de ingreso. Para el resto de los alumnos, el rol tiene la forma XXXXYYZZZ-D, donde XXXX corresponde al año de ingreso. En ambos casos, los caracteres YY corresponden al código de la carrera que estudia el alumno y ZZZ representa la posición en que fue ingresado al archivo de texto (se rellena por la izquierda con ceros). Apóyese de la función digito_verificador definida en el archivo definiciones.py para obtener el dígito verificador del rol.

  • generar_password(datos): Esta función devuelve como resultado la password (contraseña) asociada a la cuenta del alumno cuyos datos son pasados como argumento. La password se obtiene concatenando los tres primeros caracteres del nombre con los tres últimos caracteres del segundo apellido, para luego agregar el número de letras del primer apellido.

  • guardar_datos(datos): esta función debe ingresar una nueva cuenta de alumno al final del archivo alumnos.dat. Recibe como entrada un diccionario con los datos del alumno ingresados en el formulario, con la estructura mostrada en la representación. La función no debe retornar nada. Para los campos de nombres y apellidos, en caso de un nombre o apellido compuesto (de dos o más palabras), reemplace los espacios por guiones (ej: SANTA-MARIA). El formato del archivo es el siguiente:

    juan.perez@alumnos.usm.cl 201130001-4 JUAN|PEREZ|PALMA M;30;2011;jualma5
En el archivo cada línea contiene los datos de una cuenta. La dirección de correo electrónico, el rol y la password son generados por las funciones correspondientes que usted debe implementar (descritas más abajo). La parte de la izquierda del @ en el correo electrónico es el nombre de usuario del alumno (ej: juan.perez). Además de lo anterior, la función debe crear un archivo en blanco en la carpeta alumnos cuyo nombre tiene la forma rol.dat, donde rol es el rol del alumno (ej: 201130001-4.dat). Este archivo servirá más adelante para agregar las asignaturas inscritas por el alumno.
  • verificar_ingreso(correo, password): Esta función debe retornar True si el correo y la password entregados como argumentos están asociados al mismo usuario y False en caso contrario.

  • obtener_datos(usuario): Esta función debe leer el archivo alumnos.dat y retornar un diccionario con los datos del usuario entregado como argumento (ej: juan.perez). La estructura del diccionario es similar al que se muestra más arriba, pero esta vez se cambia el código de la carrera por su nombre completo, además de incluir la dirección de correo electrónico y el rol:

    datos2 = {
    "nombre": "JUAN",
    "apellido1": "PEREZ",
    "apellido2": "PALMA",
    "sexo": "M",
    "carrera": "INGENIERIA CIVIL TELEMATICA",
    "ingreso": "2011",
    "correo": "juan.perez@alumnos.usm.cl",
    "rol": "201130001-4"
    }
    
Apóyese del diccionario global codigos_carreras definido en el archivo definiciones.py para obtener el nombre asociado al código de una carrera.
  • inscribir_asignaturas(usuario, asignaturas): Esta función debe escribir en el archivo rol.dat correspondiente al usuario las siglas de asignaturas que se entregan en la lista asignaturas. El formato de un archivo rol.dat es el siguiente:

    IWI131:70
    MAT021:-1
    FIS100:20
donde un número entre 0 y 100 corresponde a la nota obtenida en la asignatura de la izquierda y un -1 indica que la nota no ha sido ingresada. Al momento de inscribir una asignatura, ésta obviamente debe estar sin nota (es decir, con nota -1).
  • avance_curricular(usuario): Esta función recibe un nombre de usuario y retorna un diccionario que asocia la sigla de cada asignatura inscrita por el usuario con una tupla de tres elementos: nombre de la asignatura, nota obtenida, evaluación. El diccionario a retornar tiene la forma:

    notas = {
    "IWI131": ("PROGRAMACION", "70", "Aprobada"),
    "MAT021": ("MATEMATICAS I", "-1", "No ingresada"),
    "FIS100": ("INTRODUCCION A LA FISICA", "20", "Reprobada"),
    …
    }
Una asignatura se considera Aprobada si la nota obtenida es mayor o igual a 55, de otro modo se considera Reprobada. Apóyese del diccionario global siglas_asignaturas definido en el archivo definiciones.py para obtener el nombre asociado a la sigla de una asignatura.

Bonificación

Se otorgará puntaje adicional si el equipo de trabajo, además de implementar las funciones señaladas anteriormente, desarrolla las siguiente función:

  • obtener_alumnos_asignatura(asignatura): Esta función debe retornar un conjunto con los rol de todos los alumnos que tengan inscrita la asignatura que se pasa como argumento.
  • calificar_alumnos(asignatura, notas): Esta función recibe como argumentos una asignatura y una lista de tuplas de la forma [(rol, nota), …] con lo cual debe escribir en el archivo rol.dat asociado a cada rol de la lista recién mencionada, la nota obtenida por el alumno en la asignatura. El resto de las asignaturas deben mantener la nota que tenían.

Consideraciones

  • Sólo están permitidos los siguientes caracteres: espacios, letras minúsculas (a-z), letras mayúsculas (A-Z) y números (0-9). Algunos campos en las páginas limitan el uso de ciertos caracteres. Para el campo descripción se podrá usar además el punto ”.” y para el correo electrónico se permitirá el uso de los caracteres arroba “@” y punto ”.”
  • No utilice otros caracteres, ni eñes (“ñ”), ni acentos.
  • Puede implementar otras funciones, además de las que se solicitan para pasos intermedios que le permitan obtener la información solicitada en las funciones.
  • Puede utilizar comentarios en las funciones para explicarlas.

Ayuda

Usted puede hacerse miembro del grupo facebook Tareas de programación. Ahí habrá ayudantes y profesores que podrían ayudarlo con dudas o consultas de la tarea.

Entrega

La fecha de entrega es el Viernes 03 de Enero 2014 a las 23:00.

La tarea debe ser resuelta en equipos de dos o tres personas. De lo contrario habrá penalización en la nota.

Sólo uno de los integrantes del equipo debe subir la tarea en la sección Aula Virtual de la plataforma Moodle, ingresando al campus que corresponda. ¡No la suba a la sección de su paralelo!

Se debe entregar un archivo comprimido (.zip) con todos los archivos para hacer funcionar la tarea con el nombre tarea-3-RUT.zip, reemplazando RUT por el RUT del integrante que subirá la tarea. Sólo debe ir la parte del RUT hasta antes de la raya. Por ejemplo: tarea-3-18000123.zip.

Al principio del archivo funciones.py se debe poner un comentario indicando los RUT de los integrantes del equipo, como en el siguiente ejemplo:

# Integrantes:
# 18000123-0 Perico Los Palotes
# 18000456-7 Fulanita de Tal
# 18000890-k Federico Santa Maria

No se puede subir ningún archivo adicional.

Evite dejar para última hora la entrega de la tarea. Cerca del plazo final, la plataforma seguramente estará sobrecargada.

Se recibirán tareas con 1 día de retraso como máximo, las cuales tienen el descuento estipulado en la rúbrica de la tarea. Si hay entregas posterior a este plazo serán evaluadas con nota cero.

Recuerde que para que todos los miembros del equipo sean evaluados, deben estar matriculados en “Alumnos de CAMPUS” (donde CAMPUS es el campus al cual usted pertenece).

Los equipos de trabajo pueden ser los mismos de la tarea anterior, pero recuerde que deben ser de 2 ó 3 personas.

Políticas de copia

Usted puede discutir la tarea con compañeros de otros grupos, pero bajo ningún motivo puede compartir o copiar el código de su tarea. Cada equipo debe escribir su propio código.

Las políticas de copia de la asignatura rigen para la tarea.

En caso de tener problemas con el desarrollo de la tarea, consulte a su profesor o asista a las ayudantías.