First commit.
This commit is contained in:
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
*.pyc
|
||||||
|
*.pyo
|
||||||
|
*~
|
22
LICENSE
Normal file
22
LICENSE
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
Copyright (c) 2015, Miguel Angel Astor Romero
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer.
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||||
|
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
5
README.md
Executable file
5
README.md
Executable file
@@ -0,0 +1,5 @@
|
|||||||
|
OECI - Lab Register
|
||||||
|
===================
|
||||||
|
|
||||||
|
A Web.py application that registers students to the UCV 6001 course.
|
||||||
|
|
154
code.py
Executable file
154
code.py
Executable file
@@ -0,0 +1,154 @@
|
|||||||
|
#! /usr/bin/env python
|
||||||
|
# _*_ coding: UTF-8 _*_
|
||||||
|
|
||||||
|
import web
|
||||||
|
|
||||||
|
urls = (
|
||||||
|
'/', 'Index'
|
||||||
|
)
|
||||||
|
|
||||||
|
render = web.template.render('templates/')
|
||||||
|
|
||||||
|
db = web.database(dbn = 'mysql', user = '', pw = '', db = '')
|
||||||
|
|
||||||
|
def _get_schedule_list():
|
||||||
|
schedules = db.query("SELECT sched_id, description FROM schedules WHERE sched_id < 8 ORDER BY sched_id ASC")
|
||||||
|
|
||||||
|
lst = []
|
||||||
|
for s in schedules:
|
||||||
|
lst.append((s['sched_id'], s['description']))
|
||||||
|
|
||||||
|
return lst
|
||||||
|
|
||||||
|
class Index:
|
||||||
|
|
||||||
|
form = web.form.Form(
|
||||||
|
web.form.Textbox(
|
||||||
|
'cedula',
|
||||||
|
web.form.notnull,
|
||||||
|
web.form.regexp('\d+', 'Debe ser un numero'),
|
||||||
|
size = 30,
|
||||||
|
description = "Cedula de identidad:"
|
||||||
|
),
|
||||||
|
web.form.Textbox(
|
||||||
|
'email',
|
||||||
|
web.form.notnull,
|
||||||
|
size = 30,
|
||||||
|
description = "Correo electronico:"
|
||||||
|
),
|
||||||
|
web.form.Dropdown(
|
||||||
|
'horario',
|
||||||
|
_get_schedule_list(),
|
||||||
|
description = "Horario a inscribir:"
|
||||||
|
),
|
||||||
|
web.form.Button('Registrar horario')
|
||||||
|
)
|
||||||
|
|
||||||
|
def GET(self):
|
||||||
|
schedules = db.query(
|
||||||
|
"SELECT schedules.sched_id, schedules.description, schedules.capacity, rooms.name " +
|
||||||
|
"FROM schedules " +
|
||||||
|
"INNER JOIN rooms ON schedules.room_id = rooms.room_id " +
|
||||||
|
"ORDER BY schedules.sched_id ASC"
|
||||||
|
)
|
||||||
|
|
||||||
|
return render.index(schedules, self.form(), None)
|
||||||
|
|
||||||
|
def POST(self):
|
||||||
|
schedules = db.query(
|
||||||
|
"SELECT schedules.sched_id, schedules.description, schedules.capacity, rooms.name " +
|
||||||
|
"FROM schedules " +
|
||||||
|
"INNER JOIN rooms ON schedules.room_id = rooms.room_id " +
|
||||||
|
"ORDER BY schedules.sched_id ASC"
|
||||||
|
)
|
||||||
|
|
||||||
|
form = self.form()
|
||||||
|
|
||||||
|
if not form.validates():
|
||||||
|
return render.index(
|
||||||
|
schedules,
|
||||||
|
self.form,
|
||||||
|
"No deje los campos vacíos.<br/>La cédula debe ser un número."
|
||||||
|
)
|
||||||
|
|
||||||
|
else:
|
||||||
|
|
||||||
|
student = db.query(
|
||||||
|
"SELECT schedule_id FROM students WHERE id_CARD = $id AND email = $email",
|
||||||
|
vars = {
|
||||||
|
'id':str(form.d.cedula),
|
||||||
|
'email':form.d.email.upper()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
if len(student) == 0:
|
||||||
|
return render.index(schedules, self.form, "Cedula o email no encontrados.")
|
||||||
|
else:
|
||||||
|
if student[0]["schedule_id"] != 8:
|
||||||
|
return render.index(schedules, self.form, "Estudiante con horario ya registrado.")
|
||||||
|
else:
|
||||||
|
|
||||||
|
sched = db.query(
|
||||||
|
"SELECT description, capacity FROM schedules WHERE sched_id = $id",
|
||||||
|
vars = {'id':form.d.horario}
|
||||||
|
)
|
||||||
|
|
||||||
|
if len(sched) == 0:
|
||||||
|
return render.index(schedules, self.form, "ERROR: Horario no encontrado.")
|
||||||
|
else:
|
||||||
|
x = 0
|
||||||
|
for s in sched:
|
||||||
|
if x > 0:
|
||||||
|
raise Exception("POOTIS")
|
||||||
|
desc = s['description']
|
||||||
|
cap = int(s['capacity'])
|
||||||
|
x += 1
|
||||||
|
|
||||||
|
if cap <= 0:
|
||||||
|
return render.index(schedules, self.form, "Horario agotado.")
|
||||||
|
else:
|
||||||
|
db.query(
|
||||||
|
"UPDATE schedules SET capacity = $cap where sched_id = $id",
|
||||||
|
vars = {
|
||||||
|
'id':form.d.horario,
|
||||||
|
'cap':str((cap - 1))
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
db.query(
|
||||||
|
"UPDATE students " +
|
||||||
|
"SET schedule_id = $sched " +
|
||||||
|
"WHERE id_CARD = $id AND email = $email",
|
||||||
|
vars = {
|
||||||
|
'id':str(form.d.cedula),
|
||||||
|
'email':form.d.email.upper(),
|
||||||
|
'sched':form.d.horario
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
schedules = db.query(
|
||||||
|
"SELECT schedules.sched_id, schedules.description, " +
|
||||||
|
"schedules.capacity, rooms.name " +
|
||||||
|
"FROM schedules " +
|
||||||
|
"INNER JOIN rooms ON schedules.room_id = rooms.room_id " +
|
||||||
|
"ORDER BY schedules.sched_id ASC"
|
||||||
|
)
|
||||||
|
|
||||||
|
web.sendmail(
|
||||||
|
'',
|
||||||
|
form.d.email.lower(),
|
||||||
|
'OECI - Laboratorio Registrado',
|
||||||
|
'Ha registrado exitosamente el horario de laboratorio: ' + desc
|
||||||
|
)
|
||||||
|
|
||||||
|
return render.index(schedules, self.form, "Horario registrado exitosamente.")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
web.config.smtp_server = ''
|
||||||
|
web.config.smtp_port = -1
|
||||||
|
web.config.smtp_username = ''
|
||||||
|
web.config.smtp_password = ''
|
||||||
|
web.config.smtp_starttls = True
|
||||||
|
|
||||||
|
app = web.application(urls, globals())
|
||||||
|
app.run()
|
96
db_schema.sql
Normal file
96
db_schema.sql
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
-- MySQL dump 10.13 Distrib 5.5.46, for debian-linux-gnu (x86_64)
|
||||||
|
--
|
||||||
|
-- Host: localhost Database: db_name
|
||||||
|
-- ------------------------------------------------------
|
||||||
|
-- Server version 5.5.46-0+deb7u1
|
||||||
|
|
||||||
|
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
||||||
|
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
|
||||||
|
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
|
||||||
|
/*!40101 SET NAMES utf8 */;
|
||||||
|
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
|
||||||
|
/*!40103 SET TIME_ZONE='+00:00' */;
|
||||||
|
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
|
||||||
|
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
|
||||||
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
||||||
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `rooms`
|
||||||
|
--
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS `rooms`;
|
||||||
|
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||||
|
/*!40101 SET character_set_client = utf8 */;
|
||||||
|
CREATE TABLE `rooms` (
|
||||||
|
`room_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||||
|
`name` varchar(5) DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`room_id`)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;
|
||||||
|
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `schedules`
|
||||||
|
--
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS `schedules`;
|
||||||
|
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||||
|
/*!40101 SET character_set_client = utf8 */;
|
||||||
|
CREATE TABLE `schedules` (
|
||||||
|
`sched_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||||
|
`description` varchar(30) DEFAULT NULL,
|
||||||
|
`capacity` int(11) NOT NULL,
|
||||||
|
`room_id` int(10) unsigned NOT NULL,
|
||||||
|
PRIMARY KEY (`sched_id`),
|
||||||
|
KEY `fk_room` (`room_id`),
|
||||||
|
CONSTRAINT `schedules_ibfk_1` FOREIGN KEY (`room_id`) REFERENCES `rooms` (`room_id`) ON DELETE CASCADE ON UPDATE CASCADE
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1;
|
||||||
|
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `sections`
|
||||||
|
--
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS `sections`;
|
||||||
|
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||||
|
/*!40101 SET character_set_client = utf8 */;
|
||||||
|
CREATE TABLE `sections` (
|
||||||
|
`section_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||||
|
`section` varchar(2) DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`section_id`)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;
|
||||||
|
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `students`
|
||||||
|
--
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS `students`;
|
||||||
|
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||||
|
/*!40101 SET character_set_client = utf8 */;
|
||||||
|
CREATE TABLE `students` (
|
||||||
|
`student_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||||
|
`id_card` int(10) unsigned NOT NULL,
|
||||||
|
`first_name` varchar(60) NOT NULL,
|
||||||
|
`last_name` varchar(60) NOT NULL,
|
||||||
|
`email` varchar(100) NOT NULL,
|
||||||
|
`class_id` int(10) unsigned NOT NULL,
|
||||||
|
`schedule_id` int(10) unsigned NOT NULL,
|
||||||
|
PRIMARY KEY (`student_id`),
|
||||||
|
KEY `fk_class` (`class_id`),
|
||||||
|
KEY `fk_sched` (`schedule_id`),
|
||||||
|
CONSTRAINT `students_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `sections` (`section_id`) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
|
CONSTRAINT `students_ibfk_2` FOREIGN KEY (`schedule_id`) REFERENCES `schedules` (`sched_id`) ON DELETE CASCADE ON UPDATE CASCADE
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=103 DEFAULT CHARSET=latin1;
|
||||||
|
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||||
|
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
|
||||||
|
|
||||||
|
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
|
||||||
|
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
|
||||||
|
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
|
||||||
|
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
|
||||||
|
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
|
||||||
|
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
|
||||||
|
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
|
||||||
|
|
||||||
|
-- Dump completed on 2015-11-04 16:12:11
|
BIN
static/favicon.png
Normal file
BIN
static/favicon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 765 B |
BIN
static/header-CICORE-new.png
Normal file
BIN
static/header-CICORE-new.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 170 KiB |
39
static/styles.css
Normal file
39
static/styles.css
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
body{ background:#66ADED; }
|
||||||
|
h1{ color:#fff; }
|
||||||
|
h2{ color:#fff; }
|
||||||
|
h3{ color:#13238f; }
|
||||||
|
div.text_style{ text-align:center; }
|
||||||
|
p.warning{ color:#FF0000; }
|
||||||
|
#banner{
|
||||||
|
background-image:url(header-CICORE-new.png);
|
||||||
|
background-size:100%;
|
||||||
|
height:125px;
|
||||||
|
border:5px solid black;
|
||||||
|
font-variant:small-caps;
|
||||||
|
vertical-align:middle
|
||||||
|
/* -webkit-border-radius:15px 15px 15px 15px;
|
||||||
|
-moz-border-radius:15px 15px 15px 15px;
|
||||||
|
border-radius:15px 15px 15px 15px;*/
|
||||||
|
}
|
||||||
|
#main_table{
|
||||||
|
padding:4px;
|
||||||
|
border-width:4px;
|
||||||
|
border-spacing:10px;
|
||||||
|
margin-top:0;
|
||||||
|
margin-right:auto;
|
||||||
|
margin-bottom:0;
|
||||||
|
margin-left:auto;
|
||||||
|
}
|
||||||
|
#main_cell{
|
||||||
|
border-color:#000;
|
||||||
|
border-width:1px;
|
||||||
|
border-style:solid;
|
||||||
|
background-color:#fff;
|
||||||
|
padding:10px;
|
||||||
|
-webkit-border-radius:12px 12px 12px 12px;
|
||||||
|
-moz-border-radius:12px 12px 12px 12px;
|
||||||
|
border-radius:12px 12px 12px 12px;
|
||||||
|
/* -webkit-box-shadow:0 0 10px #676767;
|
||||||
|
-moz-box-shadow:0 0 10px #676767;
|
||||||
|
box-shadow:0 0 10px #676767;*/
|
||||||
|
}
|
85
templates/index.html
Normal file
85
templates/index.html
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
$def with (schedules, form, error_text)
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset=utf-8 />
|
||||||
|
<title>
|
||||||
|
GD-OECI :: Semestre 2-2015 - Inscripción de laboratorios.
|
||||||
|
</title>
|
||||||
|
<link rel=stylesheet type=text/css href=static/styles.css>
|
||||||
|
<link href=img/favicon.ico rel=icon type=image/x-icon />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<table id=main_table>
|
||||||
|
<tr>
|
||||||
|
<td id=main_cell>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td colspan=2>
|
||||||
|
<br>
|
||||||
|
<div class=text_style id=banner>
|
||||||
|
<h1> Organización y Estructura del Computador 1 </h1>
|
||||||
|
<h2> Inscripción de laboratorios :: Semestre 2-2015 </h2>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td colspan=2>
|
||||||
|
<hr />
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<div class=text_style>
|
||||||
|
<h3>
|
||||||
|
Datos para la inscripción.
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<div class=text_style>
|
||||||
|
<h3>Horarios disponibles</h3>
|
||||||
|
<div class=text_style>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td style=vertical-align:top>
|
||||||
|
$if error_text is not None:
|
||||||
|
<div class=text_style>
|
||||||
|
<p class=warning> $:error_text </p>
|
||||||
|
</div>
|
||||||
|
<form action="" method=post>
|
||||||
|
$:form.render()
|
||||||
|
</form>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<div style=font-variant:small-caps>
|
||||||
|
<ul>
|
||||||
|
$for sched in schedules:
|
||||||
|
$if sched.sched_id < 8:
|
||||||
|
<li>
|
||||||
|
<b>$sched.description</b>
|
||||||
|
<br/>
|
||||||
|
Capacidad: <i>15</i>
|
||||||
|
<br/>
|
||||||
|
Disponibles:
|
||||||
|
<i>$sched.capacity</i>
|
||||||
|
<br/>
|
||||||
|
Sala:
|
||||||
|
$sched.name
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<div class=text_style>
|
||||||
|
<p style=text-align:center;>
|
||||||
|
Laboratorio ICARO, Escuela de Computación, Facultad de Ciencias, Universidad Central de Venezuela.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
Reference in New Issue
Block a user