Explorar o código

New implementation of handlers

Andrea Fazzi %!s(int64=6) %!d(string=hai) anos
pai
achega
dcdadd3330

+ 441 - 0
compose/karmen/sql/karmen.sql

@@ -0,0 +1,441 @@
+-- MySQL dump 10.16  Distrib 10.3.9-MariaDB, for debian-linux-gnu (x86_64)
+--
+-- Host: localhost    Database: karmen_test
+-- ------------------------------------------------------
+-- Server version	10.3.9-MariaDB-1:10.3.9+maria~bionic
+
+/*!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 `activities`
+--
+
+DROP TABLE IF EXISTS `activities`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `activities` (
+  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+  `created_at` timestamp NULL DEFAULT NULL,
+  `updated_at` timestamp NULL DEFAULT NULL,
+  `deleted_at` timestamp NULL DEFAULT NULL,
+  `name` varchar(255) DEFAULT NULL,
+  `class_id` int(10) unsigned DEFAULT NULL,
+  `teacher_id` int(10) unsigned DEFAULT NULL,
+  `subject_id` int(10) unsigned DEFAULT NULL,
+  `hours` int(11) DEFAULT NULL,
+  PRIMARY KEY (`id`),
+  KEY `idx_activities_deleted_at` (`deleted_at`)
+) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `activities`
+--
+
+LOCK TABLES `activities` WRITE;
+/*!40000 ALTER TABLE `activities` DISABLE KEYS */;
+INSERT INTO `activities` VALUES (1,'2018-08-24 17:17:22','2018-08-24 17:17:22',NULL,'1 A MATEMATICA 2h',1,1,1,2),(2,'2018-08-24 17:18:01','2018-08-24 17:18:01',NULL,'1 A INGLESE 2h',1,2,3,2),(3,'2018-08-24 17:18:26','2018-08-24 17:18:26',NULL,'1 A ITALIANO 5h',1,3,2,5),(4,'2018-08-24 17:23:58','2018-08-24 17:23:58',NULL,'1 A STORIA DELL\'ARTE 2h',1,5,4,2),(5,'2018-08-24 17:24:20','2018-08-24 17:24:20',NULL,'1 A TECNOLOGIA 2h',1,4,9,2),(6,'2018-08-24 17:24:41','2018-08-24 17:24:41',NULL,'1 A FRANCESE 2h',1,7,7,2),(7,'2018-08-24 17:25:13','2018-08-24 17:25:13',NULL,'1 A RELIGIONE 2h',1,9,6,2),(8,'2018-08-24 17:25:44','2018-08-24 17:25:44',NULL,'1 A STORIA 2h',1,6,8,2),(9,'2018-08-24 17:26:15','2018-08-24 17:26:15',NULL,'1 A SCIENZE 2h',1,8,5,2);
+/*!40000 ALTER TABLE `activities` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `administratives`
+--
+
+DROP TABLE IF EXISTS `administratives`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `administratives` (
+  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+  `created_at` timestamp NULL DEFAULT NULL,
+  `updated_at` timestamp NULL DEFAULT NULL,
+  `deleted_at` timestamp NULL DEFAULT NULL,
+  `name` varchar(255) DEFAULT NULL,
+  `surname` varchar(255) DEFAULT NULL,
+  `username` varchar(255) DEFAULT NULL,
+  `password` varchar(255) DEFAULT NULL,
+  `email` varchar(255) DEFAULT NULL,
+  `telephone_number` varchar(255) DEFAULT NULL,
+  `role` int(11) DEFAULT NULL,
+  PRIMARY KEY (`id`),
+  KEY `idx_administratives_deleted_at` (`deleted_at`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `administratives`
+--
+
+LOCK TABLES `administratives` WRITE;
+/*!40000 ALTER TABLE `administratives` DISABLE KEYS */;
+/*!40000 ALTER TABLE `administratives` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `classes`
+--
+
+DROP TABLE IF EXISTS `classes`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `classes` (
+  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+  `created_at` timestamp NULL DEFAULT NULL,
+  `updated_at` timestamp NULL DEFAULT NULL,
+  `deleted_at` timestamp NULL DEFAULT NULL,
+  `name` varchar(255) DEFAULT NULL,
+  `coordinator_id` int(10) unsigned DEFAULT NULL,
+  `minuter_id` int(10) unsigned DEFAULT NULL,
+  PRIMARY KEY (`id`),
+  KEY `idx_classes_deleted_at` (`deleted_at`)
+) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `classes`
+--
+
+LOCK TABLES `classes` WRITE;
+/*!40000 ALTER TABLE `classes` DISABLE KEYS */;
+INSERT INTO `classes` VALUES (1,'2018-08-24 17:11:29','2018-08-24 17:26:35',NULL,'1 A',3,2),(2,'2018-08-24 17:12:43','2018-08-24 17:12:43','2018-08-24 17:17:01','1 A',1,2);
+/*!40000 ALTER TABLE `classes` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `department_teachers`
+--
+
+DROP TABLE IF EXISTS `department_teachers`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `department_teachers` (
+  `department_id` int(10) unsigned NOT NULL,
+  `teacher_id` int(10) unsigned NOT NULL,
+  PRIMARY KEY (`department_id`,`teacher_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `department_teachers`
+--
+
+LOCK TABLES `department_teachers` WRITE;
+/*!40000 ALTER TABLE `department_teachers` DISABLE KEYS */;
+/*!40000 ALTER TABLE `department_teachers` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `departments`
+--
+
+DROP TABLE IF EXISTS `departments`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `departments` (
+  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+  `created_at` timestamp NULL DEFAULT NULL,
+  `updated_at` timestamp NULL DEFAULT NULL,
+  `deleted_at` timestamp NULL DEFAULT NULL,
+  `name` varchar(255) DEFAULT NULL,
+  PRIMARY KEY (`id`),
+  KEY `idx_departments_deleted_at` (`deleted_at`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `departments`
+--
+
+LOCK TABLES `departments` WRITE;
+/*!40000 ALTER TABLE `departments` DISABLE KEYS */;
+/*!40000 ALTER TABLE `departments` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `directors`
+--
+
+DROP TABLE IF EXISTS `directors`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `directors` (
+  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+  `created_at` timestamp NULL DEFAULT NULL,
+  `updated_at` timestamp NULL DEFAULT NULL,
+  `deleted_at` timestamp NULL DEFAULT NULL,
+  `name` varchar(255) DEFAULT NULL,
+  `surname` varchar(255) DEFAULT NULL,
+  `username` varchar(255) DEFAULT NULL,
+  `password` varchar(255) DEFAULT NULL,
+  `email` varchar(255) DEFAULT NULL,
+  `telephone_number` varchar(255) DEFAULT NULL,
+  PRIMARY KEY (`id`),
+  KEY `idx_directors_deleted_at` (`deleted_at`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `directors`
+--
+
+LOCK TABLES `directors` WRITE;
+/*!40000 ALTER TABLE `directors` DISABLE KEYS */;
+/*!40000 ALTER TABLE `directors` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `issues`
+--
+
+DROP TABLE IF EXISTS `issues`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `issues` (
+  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+  `created_at` timestamp NULL DEFAULT NULL,
+  `updated_at` timestamp NULL DEFAULT NULL,
+  `deleted_at` timestamp NULL DEFAULT NULL,
+  `description` varchar(255) DEFAULT NULL,
+  `type` int(10) unsigned DEFAULT NULL,
+  `reported` tinyint(1) DEFAULT NULL,
+  `teacher_id` int(10) unsigned DEFAULT NULL,
+  PRIMARY KEY (`id`),
+  KEY `idx_issues_deleted_at` (`deleted_at`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `issues`
+--
+
+LOCK TABLES `issues` WRITE;
+/*!40000 ALTER TABLE `issues` DISABLE KEYS */;
+/*!40000 ALTER TABLE `issues` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `schools`
+--
+
+DROP TABLE IF EXISTS `schools`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `schools` (
+  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+  `created_at` timestamp NULL DEFAULT NULL,
+  `updated_at` timestamp NULL DEFAULT NULL,
+  `deleted_at` timestamp NULL DEFAULT NULL,
+  `name` varchar(255) DEFAULT NULL,
+  `address` varchar(255) DEFAULT NULL,
+  `domain` varchar(255) DEFAULT NULL,
+  PRIMARY KEY (`id`),
+  KEY `idx_schools_deleted_at` (`deleted_at`)
+) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `schools`
+--
+
+LOCK TABLES `schools` WRITE;
+/*!40000 ALTER TABLE `schools` DISABLE KEYS */;
+INSERT INTO `schools` VALUES (1,'2018-08-24 17:19:56','2018-08-24 17:19:56',NULL,'Scuola media inferiore \"Leonardo da Vinci\"','via Castroneria 4, Perlizzi (TN)','scuolamediadavinci.gov.it');
+/*!40000 ALTER TABLE `schools` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- 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` (
+  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+  `created_at` timestamp NULL DEFAULT NULL,
+  `updated_at` timestamp NULL DEFAULT NULL,
+  `deleted_at` timestamp NULL DEFAULT NULL,
+  `name` varchar(255) DEFAULT NULL,
+  `surname` varchar(255) DEFAULT NULL,
+  `username` varchar(255) DEFAULT NULL,
+  `password` varchar(255) DEFAULT NULL,
+  `email` varchar(255) DEFAULT NULL,
+  `telephone_number` varchar(255) DEFAULT NULL,
+  PRIMARY KEY (`id`),
+  KEY `idx_students_deleted_at` (`deleted_at`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `students`
+--
+
+LOCK TABLES `students` WRITE;
+/*!40000 ALTER TABLE `students` DISABLE KEYS */;
+/*!40000 ALTER TABLE `students` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `subjects`
+--
+
+DROP TABLE IF EXISTS `subjects`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `subjects` (
+  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+  `created_at` timestamp NULL DEFAULT NULL,
+  `updated_at` timestamp NULL DEFAULT NULL,
+  `deleted_at` timestamp NULL DEFAULT NULL,
+  `name` varchar(255) DEFAULT NULL,
+  `department_id` int(10) unsigned DEFAULT NULL,
+  PRIMARY KEY (`id`),
+  KEY `idx_subjects_deleted_at` (`deleted_at`)
+) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `subjects`
+--
+
+LOCK TABLES `subjects` WRITE;
+/*!40000 ALTER TABLE `subjects` DISABLE KEYS */;
+INSERT INTO `subjects` VALUES (1,'2018-08-24 17:09:21','2018-08-24 17:09:21',NULL,'MATEMATICA',0),(2,'2018-08-24 17:09:35','2018-08-24 17:09:35',NULL,'ITALIANO',0),(3,'2018-08-24 17:09:44','2018-08-24 17:09:44',NULL,'INGLESE',0),(4,'2018-08-24 17:21:29','2018-08-24 17:21:29',NULL,'STORIA DELL\'ARTE',0),(5,'2018-08-24 17:21:44','2018-08-24 17:21:44',NULL,'SCIENZE',0),(6,'2018-08-24 17:21:59','2018-08-24 17:21:59',NULL,'RELIGIONE',0),(7,'2018-08-24 17:22:31','2018-08-24 17:22:31',NULL,'FRANCESE',0),(8,'2018-08-24 17:23:19','2018-08-24 17:23:19',NULL,'STORIA',0),(9,'2018-08-24 17:23:33','2018-08-24 17:23:33',NULL,'TECNOLOGIA',0);
+/*!40000 ALTER TABLE `subjects` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `teacher_classes`
+--
+
+DROP TABLE IF EXISTS `teacher_classes`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `teacher_classes` (
+  `teacher_id` int(10) unsigned NOT NULL,
+  `class_id` int(10) unsigned NOT NULL,
+  PRIMARY KEY (`teacher_id`,`class_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `teacher_classes`
+--
+
+LOCK TABLES `teacher_classes` WRITE;
+/*!40000 ALTER TABLE `teacher_classes` DISABLE KEYS */;
+INSERT INTO `teacher_classes` VALUES (1,1),(2,1),(3,1),(4,1),(5,1),(6,1),(7,1),(8,1),(9,1);
+/*!40000 ALTER TABLE `teacher_classes` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `teacher_subjects`
+--
+
+DROP TABLE IF EXISTS `teacher_subjects`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `teacher_subjects` (
+  `subject_id` int(10) unsigned NOT NULL,
+  `teacher_id` int(10) unsigned NOT NULL,
+  PRIMARY KEY (`subject_id`,`teacher_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `teacher_subjects`
+--
+
+LOCK TABLES `teacher_subjects` WRITE;
+/*!40000 ALTER TABLE `teacher_subjects` DISABLE KEYS */;
+INSERT INTO `teacher_subjects` VALUES (1,1),(2,3),(3,2),(4,5),(5,8),(6,9),(7,7),(8,6),(9,4);
+/*!40000 ALTER TABLE `teacher_subjects` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `teachers`
+--
+
+DROP TABLE IF EXISTS `teachers`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `teachers` (
+  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+  `created_at` timestamp NULL DEFAULT NULL,
+  `updated_at` timestamp NULL DEFAULT NULL,
+  `deleted_at` timestamp NULL DEFAULT NULL,
+  `name` varchar(255) DEFAULT NULL,
+  `surname` varchar(255) DEFAULT NULL,
+  `username` varchar(255) DEFAULT NULL,
+  `password` varchar(255) DEFAULT NULL,
+  `email` varchar(255) DEFAULT NULL,
+  `telephone_number` varchar(255) DEFAULT NULL,
+  `hours` int(11) DEFAULT NULL,
+  `curr_hours` int(11) DEFAULT NULL,
+  `the_boss_id` int(10) unsigned DEFAULT NULL,
+  PRIMARY KEY (`id`),
+  KEY `idx_teachers_deleted_at` (`deleted_at`)
+) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `teachers`
+--
+
+LOCK TABLES `teachers` WRITE;
+/*!40000 ALTER TABLE `teachers` DISABLE KEYS */;
+INSERT INTO `teachers` VALUES (1,'2018-08-24 17:06:38','2018-08-24 17:17:22',NULL,'Amilcare','AGOSTINO','amilcare.agostino','TpbbDZmSdjzOzEcm5797h2TXY/hzYWx0','amilcare.agostino@foo.org','',18,2,0),(2,'2018-08-24 17:06:58','2018-08-24 17:18:01',NULL,'Assuntina','DONADONI','assuntina.donadoni','Fi28Y8Q76pqz3ggoAuXvMNliew9zYWx0','assuntina.donadoni@foo.org','',18,2,0),(3,'2018-08-24 17:07:14','2018-08-24 17:18:26',NULL,'Costanza','LUNGA','costanza.lunga','//XInIkvIeMYj0+x9AsabCyA8zVzYWx0','costanza.lunga@foo.org','',18,5,0),(4,'2018-08-24 17:07:28','2018-08-24 17:24:20',NULL,'Giacomo','DEL BEN','giacomo.delben','TTdp/vYL+NjgJZTErlceSVwCa1lzYWx0','giacomo.delben@foo.org','',18,2,0),(5,'2018-08-24 17:07:51','2018-08-24 17:23:58',NULL,'Giorgio','ARISTI','giorgio.aristi','bbtj5tK+TSBKd38G/zHK6TUo0JZzYWx0','giorgio.aristi@foo.org','',18,2,0),(6,'2018-08-24 17:08:12','2018-08-24 17:25:44',NULL,'Vittoria','GIRONI','vittoria.gironi','jS5M30Y9d5JUsyXSfxU1Vz4Tmc1zYWx0','vittoria.gironi@foo.org','',18,2,0),(7,'2018-08-24 17:08:33','2018-08-24 17:24:41',NULL,'Francesco','DELLE ROSE','francesco.dellerose','9HakZF2Oh1vZy+8J/doqR1Jpr/lzYWx0','francesco.dellerose@foo.org','',18,2,0),(8,'2018-08-24 17:08:51','2018-08-24 17:26:15',NULL,'Andrea','PETRUZZELLI','andrea.petruzzelli','enbmvOYnUs/2IkttlR90h3oJC9dzYWx0','andrea.petruzzelli@foo.org','',18,2,0),(9,'2018-08-24 17:09:07','2018-08-24 17:25:13',NULL,'Piero','FRANCESCHINI','piero.franceschini','eGAGAG9etZ+rehwW0A/KRWt/7CFzYWx0','piero.franceschini@foo.org','',18,2,0);
+/*!40000 ALTER TABLE `teachers` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `the_bosses`
+--
+
+DROP TABLE IF EXISTS `the_bosses`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `the_bosses` (
+  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+  `created_at` timestamp NULL DEFAULT NULL,
+  `updated_at` timestamp NULL DEFAULT NULL,
+  `deleted_at` timestamp NULL DEFAULT NULL,
+  `name` varchar(255) DEFAULT NULL,
+  `surname` varchar(255) DEFAULT NULL,
+  `username` varchar(255) DEFAULT NULL,
+  `password` varchar(255) DEFAULT NULL,
+  `email` varchar(255) DEFAULT NULL,
+  `telephone_number` varchar(255) DEFAULT NULL,
+  PRIMARY KEY (`id`),
+  KEY `idx_the_bosses_deleted_at` (`deleted_at`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `the_bosses`
+--
+
+LOCK TABLES `the_bosses` WRITE;
+/*!40000 ALTER TABLE `the_bosses` DISABLE KEYS */;
+/*!40000 ALTER TABLE `the_bosses` ENABLE KEYS */;
+UNLOCK TABLES;
+/*!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 2018-08-27  8:41:48

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 45 - 0
compose/karmen/sql/karmen_dev.sql.veryold


+ 9 - 10
handlers/activities.go

@@ -10,7 +10,6 @@ import (
 	"github.com/gorilla/schema"
 
 	"gogs.carducci-dante.gov.it/karmen/core/orm"
-	"gogs.carducci-dante.gov.it/karmen/core/renderer"
 )
 
 func saveActivity(r *http.Request, activity *orm.Activity) {
@@ -55,9 +54,9 @@ func activitiesHandler() http.Handler {
 		if err := orm.DB().Preload("Subject").Preload("Teacher").Preload("Class").Find(&data.Activities).Error; err != nil {
 			panic(err)
 		}
-		if err := renderer.Render(w, "base", "activities", data); err != nil {
-			panic(err)
-		}
+		// if err := renderer.Render(w, "base", "activities", data); err != nil {
+		// 	panic(err)
+		// }
 	}
 	return http.HandlerFunc(fn)
 }
@@ -86,9 +85,9 @@ func activitiesAddHandler() http.Handler {
 				panic(err)
 			}
 
-			if err := renderer.Render(w, "base", "activities_add_update", data); err != nil {
-				panic(err)
-			}
+			// if err := renderer.Render(w, "base", "activities_add_update", data); err != nil {
+			// 	panic(err)
+			// }
 		} else if r.Method == "POST" {
 			var activity orm.Activity
 
@@ -205,9 +204,9 @@ func activitiesUpdateHandler() http.Handler {
 			data.Update = true
 			data.SubmitUrl = template.URL(fmt.Sprintf("/activities/%d/update", data.Activity.ID))
 
-			if err := renderer.Render(w, "base", "activities_add_update", data); err != nil {
-				panic(err)
-			}
+			// if err := renderer.Render(w, "base", "activities_add_update", data); err != nil {
+			// 	panic(err)
+			// }
 		} else if r.Method == "POST" {
 			var activity orm.Activity
 

+ 59 - 70
handlers/classes.go

@@ -7,8 +7,6 @@ import (
 	"io/ioutil"
 	"log"
 	"net/http"
-	"sort"
-	"strings"
 
 	"github.com/gorilla/mux"
 	"github.com/gorilla/schema"
@@ -24,80 +22,71 @@ SELECT activities.id AS activity_id,teachers.name,teachers.surname,subjects.name
 INNER JOIN teachers ON teachers.id=activities.teacher_id 
 INNER JOIN subjects ON subjects.id=activities.subject_id 
 WHERE class_id=? AND activities.deleted_at IS NULL `
-
-	selectUniqueClassTeachers = `
-SELECT surname FROM (SELECT activities.id as activity_id,teachers.name,teachers.surname,subjects.name as subject,activities.hours from activities 
-inner join teachers on teachers.id=activities.teacher_id 
-inner join subjects on subjects.id=activities.subject_id 
-where class_id=?) as activities GROUP BY surname`
 )
 
 func classesHandler() http.Handler {
 	fn := func(w http.ResponseWriter, r *http.Request) {
-		var classes []*orm.Class
-
-		if err := orm.DB().Find(&classes).Error; err != nil {
-			panic(err)
-		}
-
-		for _, class := range classes {
-			orm.DB().Raw(selectUniqueClassTeachers, class.ID).Scan(&class.Teachers)
+		classes, err := orm.GetClassesAll()
+		if err != nil {
+			renderer.Render[r.URL.Query()["format"][0]](w, r, err)
+		} else {
+			renderer.Render[r.URL.Query()["format"][0]](w, r, classes, r.URL.Query()["options"]...)
 		}
 
-		sort.Slice(classes, func(i, j int) bool {
-			return strings.ToLower(classes[i].Name) < strings.ToLower(classes[j].Name)
-		})
-		if err := renderer.Render(w, "base", "classes", classes); err != nil {
-			panic(err)
-		}
 	}
 	return http.HandlerFunc(fn)
 }
 
 func classesShowHandler() http.Handler {
 	fn := func(w http.ResponseWriter, r *http.Request) {
-
-		type teacherActivity struct {
-			ActivityID int
-			Name       string
-			Surname    string
-			Subject    string
-			Hours      int
-		}
-
-		var data struct {
-			Class             orm.Class
-			TeacherActivities []teacherActivity
-		}
-		if err := orm.DB().First(&data.Class, mux.Vars(r)["id"]).Error; err != nil {
-			panic(err)
-		}
-
-		orm.DB().Raw(selectClassActivities, mux.Vars(r)["id"]).Scan(&data.TeacherActivities)
-
-		sort.Slice(data.TeacherActivities, func(i, j int) bool {
-			return strings.ToLower(data.TeacherActivities[i].Surname) < strings.ToLower(data.TeacherActivities[j].Surname)
-		})
-
-		if data.Class.CoordinatorID != 0 {
-			if !orm.DB().First(&data.Class.Coordinator, data.Class.CoordinatorID).RecordNotFound() {
-				if err := orm.DB().First(&data.Class.Coordinator, data.Class.CoordinatorID).Error; err != nil {
-					panic(err)
-				}
-			}
-		}
-
-		if data.Class.MinuterID != 0 {
-			if !orm.DB().First(&data.Class.Minuter, data.Class.MinuterID).RecordNotFound() {
-				if err := orm.DB().First(&data.Class.Minuter, data.Class.MinuterID).Error; err != nil {
-					panic(err)
-				}
-			}
-		}
-
-		if err := renderer.Render(w, "base", "classes_show", data); err != nil {
-			panic(err)
-		}
+		class, err := orm.GetClass(mux.Vars(r)["id"])
+		if err != nil {
+			renderer.Render[r.URL.Query()["format"][0]](w, r, err)
+		} else {
+			renderer.Render[r.URL.Query()["format"][0]](w, r, class, r.URL.Query()["options"]...)
+		}
+
+		// type teacherActivity struct {
+		// 	ActivityID int
+		// 	Name       string
+		// 	Surname    string
+		// 	Subject    string
+		// 	Hours      int
+		// }
+
+		// var data struct {
+		// 	Class             orm.Class
+		// 	TeacherActivities []teacherActivity
+		// }
+		// if err := orm.DB().First(&data.Class, mux.Vars(r)["id"]).Error; err != nil {
+		// 	panic(err)
+		// }
+
+		// orm.DB().Raw(selectClassActivities, mux.Vars(r)["id"]).Scan(&data.TeacherActivities)
+
+		// sort.Slice(data.TeacherActivities, func(i, j int) bool {
+		// 	return strings.ToLower(data.TeacherActivities[i].Surname) < strings.ToLower(data.TeacherActivities[j].Surname)
+		// })
+
+		// if data.Class.CoordinatorID != 0 {
+		// 	if !orm.DB().First(&data.Class.Coordinator, data.Class.CoordinatorID).RecordNotFound() {
+		// 		if err := orm.DB().First(&data.Class.Coordinator, data.Class.CoordinatorID).Error; err != nil {
+		// 			panic(err)
+		// 		}
+		// 	}
+		// }
+
+		// if data.Class.MinuterID != 0 {
+		// 	if !orm.DB().First(&data.Class.Minuter, data.Class.MinuterID).RecordNotFound() {
+		// 		if err := orm.DB().First(&data.Class.Minuter, data.Class.MinuterID).Error; err != nil {
+		// 			panic(err)
+		// 		}
+		// 	}
+		// }
+
+		// if err := renderer.Render(w, "base", "classes_show", data); err != nil {
+		// 	panic(err)
+		// }
 	}
 	return http.HandlerFunc(fn)
 }
@@ -116,9 +105,9 @@ func classesAddHandler() http.Handler {
 				panic(err)
 			}
 
-			if err := renderer.Render(w, "base", "classes_add_update", data); err != nil {
-				panic(err)
-			}
+			// if err := renderer.Render(w, "base", "classes_add_update", data); err != nil {
+			// 	panic(err)
+			// }
 		} else if r.Method == "POST" {
 			var class orm.Class
 			if err := r.ParseForm(); err != nil {
@@ -201,9 +190,9 @@ func classesUpdateHandler() http.Handler {
 			data.Update = true
 			data.SubmitUrl = template.URL(fmt.Sprintf("/classes/%d/update", data.Class.ID))
 
-			if err := renderer.Render(w, "base", "classes_add_update", data); err != nil {
-				panic(err)
-			}
+			// if err := renderer.Render(w, "base", "classes_add_update", data); err != nil {
+			// 	panic(err)
+			// }
 		} else if r.Method == "POST" {
 			var class orm.Class
 

+ 3 - 4
handlers/dashboard.go

@@ -6,7 +6,6 @@ import (
 	"net/http"
 
 	"gogs.carducci-dante.gov.it/karmen/core/orm"
-	"gogs.carducci-dante.gov.it/karmen/core/renderer"
 )
 
 func dashboardHandler() http.Handler {
@@ -62,9 +61,9 @@ func dashboardHandler() http.Handler {
 			}
 			http.Redirect(w, r, fmt.Sprintf("/"), http.StatusSeeOther)
 		}
-		if err := renderer.Render(w, "base", "dashboard", data); err != nil {
-			panic(err)
-		}
+		// if err := renderer.Render(w, "base", "dashboard", data); err != nil {
+		// 	panic(err)
+		// }
 	}
 	return http.HandlerFunc(fn)
 }

+ 1 - 3
handlers/login.go

@@ -31,9 +31,7 @@ func logoutHandler() http.Handler {
 func loginHandler() http.Handler {
 	fn := func(w http.ResponseWriter, r *http.Request) {
 		if r.Method == "GET" {
-			if err := renderer.Render(w, "login", "login", nil); err != nil {
-				panic(err)
-			}
+			renderer.Render["html"](w, r, nil, "login", "login")
 		}
 		if r.Method == "POST" {
 			r.ParseForm()

+ 6 - 7
handlers/school.go

@@ -6,7 +6,6 @@ import (
 	"github.com/gorilla/mux"
 	"github.com/gorilla/schema"
 	"gogs.carducci-dante.gov.it/karmen/core/orm"
-	"gogs.carducci-dante.gov.it/karmen/core/renderer"
 )
 
 func schoolShowHandler() http.Handler {
@@ -53,9 +52,9 @@ func schoolShowHandler() http.Handler {
 		data.NumOfSubjects = len(subjects)
 		data.NumOfClasses = len(classes)
 
-		if err := renderer.Render(w, "base", "school_show", data); err != nil {
-			panic(err)
-		}
+		// if err := renderer.Render(w, "base", "school_show", data); err != nil {
+		// 	panic(err)
+		// }
 	}
 	return http.HandlerFunc(fn)
 }
@@ -92,9 +91,9 @@ func schoolUpdateHandler() http.Handler {
 
 			data.Update = true
 
-			if err := renderer.Render(w, "base", "school_update", data); err != nil {
-				panic(err)
-			}
+			// if err := renderer.Render(w, "base", "school_update", data); err != nil {
+			// 	panic(err)
+			// }
 		} else if r.Method == "POST" {
 			var school orm.School
 

+ 15 - 16
handlers/subjects.go

@@ -11,7 +11,6 @@ import (
 	"github.com/gorilla/schema"
 
 	"gogs.carducci-dante.gov.it/karmen/core/orm"
-	"gogs.carducci-dante.gov.it/karmen/core/renderer"
 	"gogs.carducci-dante.gov.it/karmen/datasource/edt"
 )
 
@@ -36,9 +35,9 @@ func subjectsHandler() http.Handler {
 			orm.DB().Raw(selectUniqueSubjectTeachers, subject.ID).Scan(&subject.Teachers)
 		}
 
-		if err := renderer.Render(w, "base", "subjects", subjects); err != nil {
-			panic(err)
-		}
+		// if err := renderer.Render(w, "base", "subjects", subjects); err != nil {
+		// 	panic(err)
+		// }
 	}
 	return http.HandlerFunc(fn)
 }
@@ -53,9 +52,9 @@ func subjectsShowHandler() http.Handler {
 
 		orm.DB().Raw(selectUniqueSubjectTeachers, mux.Vars(r)["id"]).Scan(&subject.Teachers)
 
-		if err := renderer.Render(w, "base", "subjects_show", subject); err != nil {
-			panic(err)
-		}
+		// if err := renderer.Render(w, "base", "subjects_show", subject); err != nil {
+		// 	panic(err)
+		// }
 	}
 	return http.HandlerFunc(fn)
 }
@@ -68,9 +67,9 @@ func subjectsAddHandler() http.Handler {
 				SubmitUrl template.URL
 			}
 			data.SubmitUrl = template.URL(fmt.Sprintf("/subjects/add"))
-			if err := renderer.Render(w, "base", "subjects_add_update", data); err != nil {
-				panic(err)
-			}
+			// if err := renderer.Render(w, "base", "subjects_add_update", data); err != nil {
+			// 	panic(err)
+			// }
 		} else if r.Method == "POST" {
 			var subject orm.Subject
 			if err := r.ParseForm(); err != nil {
@@ -132,9 +131,9 @@ func subjectsUpdateHandler() http.Handler {
 			}
 			data.Update = true
 			data.SubmitUrl = template.URL(fmt.Sprintf("/subjects/%d/update", data.Subject.ID))
-			if err := renderer.Render(w, "base", "subjects_add_update", data); err != nil {
-				panic(err)
-			}
+			// if err := renderer.Render(w, "base", "subjects_add_update", data); err != nil {
+			// 	panic(err)
+			// }
 		} else if r.Method == "POST" {
 			var subject orm.Subject
 
@@ -164,9 +163,9 @@ func subjectsUpdateHandler() http.Handler {
 				panic(err)
 			}
 
-			if err := renderer.Render(w, "base", "subjects", data); err != nil {
-				panic(err)
-			}
+			// if err := renderer.Render(w, "base", "subjects", data); err != nil {
+			// 	panic(err)
+			// }
 		}
 
 	}

+ 12 - 13
handlers/teachers.go

@@ -12,7 +12,6 @@ import (
 	"github.com/gorilla/mux"
 	"github.com/gorilla/schema"
 	"gogs.carducci-dante.gov.it/karmen/core/orm"
-	"gogs.carducci-dante.gov.it/karmen/core/renderer"
 	"gogs.carducci-dante.gov.it/karmen/datasource/edt"
 )
 
@@ -41,9 +40,9 @@ func teachersHandler() http.Handler {
 		sort.Slice(teachers, func(i, j int) bool {
 			return strings.ToLower(teachers[i].Surname) < strings.ToLower(teachers[j].Surname)
 		})
-		if err := renderer.Render(w, "base", "teachers", teachers); err != nil {
-			panic(err)
-		}
+		// if err := renderer.Render(w, "base", "teachers", teachers); err != nil {
+		// 	panic(err)
+		// }
 	}
 	return http.HandlerFunc(fn)
 }
@@ -74,9 +73,9 @@ func teacherShowHandler() http.Handler {
 			return teacher.Activities[i].Hours < teacher.Activities[j].Hours
 		})
 
-		if err := renderer.Render(w, "base", "teachers_show", teacher); err != nil {
-			panic(err)
-		}
+		// if err := renderer.Render(w, "base", "teachers_show", teacher); err != nil {
+		// 	panic(err)
+		// }
 	}
 	return http.HandlerFunc(fn)
 }
@@ -89,9 +88,9 @@ func teachersAddHandler() http.Handler {
 				SubmitUrl template.URL
 			}
 			data.SubmitUrl = template.URL(fmt.Sprintf("/teachers/add"))
-			if err := renderer.Render(w, "base", "teachers_add_update", data); err != nil {
-				panic(err)
-			}
+			// if err := renderer.Render(w, "base", "teachers_add_update", data); err != nil {
+			// 	panic(err)
+			// }
 		} else if r.Method == "POST" {
 			var teacher orm.Teacher
 			if err := r.ParseForm(); err != nil {
@@ -158,9 +157,9 @@ func teacherUpdateHandler() http.Handler {
 			}
 			data.Update = true
 			data.SubmitUrl = template.URL(fmt.Sprintf("/teachers/%d/update", data.Teacher.ID))
-			if err := renderer.Render(w, "base", "teachers_add_update", data); err != nil {
-				panic(err)
-			}
+			// if err := renderer.Render(w, "base", "teachers_add_update", data); err != nil {
+			// 	panic(err)
+			// }
 		} else if r.Method == "POST" {
 			var (
 				teacher     orm.Teacher

+ 5 - 6
main.go

@@ -13,7 +13,6 @@ import (
 	"gogs.carducci-dante.gov.it/karmen/config"
 	"gogs.carducci-dante.gov.it/karmen/core/handlers"
 	"gogs.carducci-dante.gov.it/karmen/core/orm"
-	"gogs.carducci-dante.gov.it/karmen/core/renderer"
 )
 
 const (
@@ -93,12 +92,12 @@ func main() {
 		}
 	}
 
-	rend, err := renderer.NewHTMLRenderer("templates/")
-	if err != nil {
-		panic(err)
-	}
+	// rend, err := renderer.NewHTMLRenderer("templates/")
+	// if err != nil {
+	// 	panic(err)
+	// }
 
-	renderer.Use(rend)
+	// renderer.Use(rend)
 
 	log.Println("karmen is listening to port 3000...")
 	if err := http.ListenAndServe(":3000", handlers.LoggingHandler(os.Stdout, api.Handlers())); err != nil {

+ 70 - 2
orm/class.go

@@ -6,6 +6,20 @@ import (
 	"github.com/jinzhu/gorm"
 )
 
+var (
+	selectClassActivities = `
+SELECT activities.id AS activity_id,teachers.name,teachers.surname,subjects.name AS subject,activities.hours FROM activities 
+INNER JOIN teachers ON teachers.id=activities.teacher_id 
+INNER JOIN subjects ON subjects.id=activities.subject_id 
+WHERE class_id=? AND activities.deleted_at IS NULL `
+
+	selectUniqueClassTeachers = `
+SELECT surname FROM (SELECT activities.id as activity_id,teachers.name,teachers.surname,subjects.name as subject,activities.hours from activities 
+inner join teachers on teachers.id=activities.teacher_id 
+inner join subjects on subjects.id=activities.subject_id 
+where class_id=?) as activities GROUP BY surname`
+)
+
 type Class struct {
 	gorm.Model
 	Name          string
@@ -13,8 +27,62 @@ type Class struct {
 	MinuterID     uint `schema:"minuter_id"`
 	Coordinator   Teacher
 	Minuter       Teacher
-	Teachers      []Teacher
-	Students      []Student
+	Teachers      []*Teacher
+	Students      []*Student
+}
+
+func GetClasses() ([]*Class, error) {
+	var classes []*Class
+	if err := DB().Order("name").Find(&classes).Error; err != nil {
+		return nil, err
+	}
+	return classes, nil
+}
+
+func (c *Class) GetTeachers() ([]*Teacher, error) {
+	if err := DB().Raw(selectUniqueClassTeachers, c.ID).Scan(&c.Teachers).Error; err != nil {
+		return nil, err
+	}
+	return c.Teachers, nil
+}
+
+func GetClassesAll() ([]*Class, error) {
+	var classes []*Class
+	if err := DB().Order("name").Find(&classes).Error; err != nil {
+		return nil, err
+	}
+	for _, class := range classes {
+		class.GetTeachers()
+	}
+	return classes, nil
+}
+
+func GetClass(id string) (*Class, error) {
+	var class Class
+
+	if err := DB().First(&class, id).Error; err != nil {
+		return nil, err
+	}
+
+	DB().Raw(selectUniqueClassTeachers, id).Scan(&class.Teachers)
+
+	if class.CoordinatorID != 0 {
+		if !DB().First(&class.Coordinator, class.CoordinatorID).RecordNotFound() {
+			if err := DB().First(&class.Coordinator, class.CoordinatorID).Error; err != nil {
+				return nil, err
+			}
+		}
+	}
+
+	if class.MinuterID != 0 {
+		if !DB().First(&class.Minuter, class.MinuterID).RecordNotFound() {
+			if err := DB().First(&class.Minuter, class.MinuterID).Error; err != nil {
+				return nil, err
+			}
+		}
+	}
+
+	return &class, nil
 }
 
 func (t *Class) Create(db *gorm.DB, record map[string]interface{}) error {

+ 35 - 0
orm/orm_test.go

@@ -59,6 +59,41 @@ func (t *testSuite) TestGetTeachers() {
 	t.Equal("1 A", class.Name)
 }
 
+func (t *testSuite) TestGetClasses() {
+	classes, err := GetClasses()
+	t.Nil(err)
+	t.Equal(1, len(classes))
+
+	class := classes[0]
+	teachers, err := class.GetTeachers()
+	t.Nil(err)
+	t.Equal(9, len(teachers))
+	t.Equal(9, len(class.Teachers))
+
+	teacher := teachers[0]
+	t.Equal("AGOSTINO", teacher.Surname)
+
+	classes, err = GetClassesAll()
+	t.True(len(classes[0].Teachers) > 0)
+	if !t.Failed() {
+		t.Equal("AGOSTINO", classes[0].Teachers[0].Surname)
+	}
+}
+
+func (t *testSuite) TestGetClass() {
+	class, err := GetClass("1")
+	t.Nil(err)
+	if !t.Failed() {
+		t.Equal("1 A", class.Name)
+		t.True(len(class.Teachers) > 0)
+		t.Equal("AGOSTINO", class.Teachers[0].Surname)
+		t.Equal("PETRUZZELLI", class.Teachers[8].Surname)
+		t.Equal("LUNGA", class.Coordinator.Surname)
+		t.Equal("DONADONI", class.Minuter.Surname)
+	}
+
+}
+
 // func (t *testSuite) Before() {
 // 	var activities []Activity
 // 	if err := DB().Find(&activities).Error; err != nil {

+ 47 - 24
renderer/renderer.go

@@ -2,26 +2,43 @@ package renderer
 
 import (
 	"encoding/json"
-	"errors"
 	"fmt"
 	"html/template"
-	"log"
 	"net/http"
 	"path"
 	"path/filepath"
+	"reflect"
 	"strings"
-
-	"gogs.carducci-dante.gov.it/karmen/config"
 )
 
-var currRenderer Renderer
-
 type Renderer interface {
-	Render(http.ResponseWriter, string, string, interface{}) error
+	Render(http.ResponseWriter, *http.Request, interface{}, ...string) error
 }
 
 type JSONRenderer struct{}
 
+var (
+	currRenderer Renderer
+	Render       map[string]func(http.ResponseWriter, *http.Request, interface{}, ...string)
+)
+
+func init() {
+	htmlRenderer, err := NewHTMLRenderer("templates/")
+	if err != nil {
+		panic(err)
+	}
+	Render = make(map[string]func(http.ResponseWriter, *http.Request, interface{}, ...string))
+
+	Render["html"] = func(w http.ResponseWriter, r *http.Request, data interface{}, options ...string) {
+		htmlRenderer.Render(w, r, data, options...)
+	}
+}
+
+// FIXME: Not safe. We should check if it responds to the error interface instead.
+func isErrorType(data interface{}) bool {
+	return strings.Contains(strings.ToLower(reflect.TypeOf(data).String()), "error")
+}
+
 func NewJSONRenderer() *JSONRenderer {
 	return &JSONRenderer{}
 }
@@ -49,18 +66,14 @@ func NewHTMLRenderer(templatePath string) (*HTMLRenderer, error) {
 	}
 	fns, err := filepath.Glob(filepath.Join(templatePath, "*.tpl"))
 	if err != nil {
-		return nil, err
+		panic(err)
 	}
 	lfns, err := filepath.Glob(filepath.Join(templatePath, "layout", "*.tpl"))
 	if err != nil {
-		return nil, err
+		panic(err)
 	}
 
 	for _, fn := range fns {
-		if config.Config.LogLevel > config.LOG_LEVEL_OFF {
-			log.Printf("Load %s template", fn)
-		}
-
 		tplName := filepath.Base(fn)
 		tplName = strings.TrimSuffix(tplName, path.Ext(tplName))
 		tplName = strings.TrimSuffix(tplName, path.Ext(tplName))
@@ -83,22 +96,32 @@ func Use(r Renderer) {
 	currRenderer = r
 }
 
-func (r *HTMLRenderer) Render(w http.ResponseWriter, layout string, name string, data interface{}) error {
-	t, ok := r.templates[name]
+func (rend *HTMLRenderer) writeError(w http.ResponseWriter, r *http.Request, err error) {
+	t, ok := rend.templates["error"]
 	if !ok {
-		return fmt.Errorf("Template %s not found", name)
+		panic(fmt.Errorf("Error template not found! Can't proceed, sorry."))
 	}
+
 	w.Header().Set("Content-Type", "text/html; charset=utf-8")
-	err := t.ExecuteTemplate(w, layout, data)
-	if err != nil {
-		return err
+	e := t.ExecuteTemplate(w, "base", err)
+	if e != nil {
+		panic(e)
 	}
-	return nil
 }
 
-func Render(w http.ResponseWriter, layout string, name string, data interface{}) error {
-	if currRenderer != nil {
-		return currRenderer.Render(w, layout, name, data)
+func (rend *HTMLRenderer) Render(w http.ResponseWriter, r *http.Request, data interface{}, options ...string) {
+	if isErrorType(data) {
+		rend.writeError(w, r, data.(error))
+	} else {
+
+		t, ok := rend.templates[options[1]]
+		if !ok {
+			rend.writeError(w, r, fmt.Errorf("Template %s not found", options[1]))
+		}
+		w.Header().Set("Content-Type", "text/html; charset=utf-8")
+		err := t.ExecuteTemplate(w, options[0], data)
+		if err != nil {
+			rend.writeError(w, r, err)
+		}
 	}
-	return errors.New("You should set a renderer with Use() first if you want to use Renderer() package function.")
 }

+ 11 - 0
templates/error.html.tpl

@@ -0,0 +1,11 @@
+{{ define "content" }}
+
+<div class="container">
+
+  <h1>Errore</h1>
+  <p>
+    {{.}}
+  </p>
+    
+</div>
+{{ end }}

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio