Răsfoiți Sursa

Working on templates, handlers, etc. Not in a working state.

Andrea Fazzi 6 ani în urmă
părinte
comite
a97c77ed86

+ 2 - 5
handlers/classes.go

@@ -22,7 +22,7 @@ func classesHandler() http.Handler {
 		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"]...)
+			renderer.Render[r.URL.Query()["format"][0]](w, r, classes, r.URL.Query())
 		}
 
 	}
@@ -35,12 +35,9 @@ func classesShowHandler() http.Handler {
 		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"]...)
+			renderer.Render[r.URL.Query()["format"][0]](w, r, class, r.URL.Query())
 		}
 
-		// if err := renderer.Render(w, "base", "classes_show", data); err != nil {
-		// 	panic(err)
-		// }
 	}
 	return http.HandlerFunc(fn)
 }

+ 3 - 2
handlers/login.go

@@ -4,6 +4,7 @@ import (
 	"errors"
 	"log"
 	"net/http"
+	"net/url"
 	"time"
 
 	jwt "github.com/dgrijalva/jwt-go"
@@ -31,7 +32,7 @@ func logoutHandler() http.Handler {
 func loginHandler() http.Handler {
 	fn := func(w http.ResponseWriter, r *http.Request) {
 		if r.Method == "GET" {
-			renderer.Render["html"](w, r, nil, "login", "login")
+			renderer.Render["html"](w, r, nil, url.Values{"tpl_layout": []string{"login"}, "tpl_content": []string{"login"}})
 		}
 		if r.Method == "POST" {
 			r.ParseForm()
@@ -47,7 +48,7 @@ func loginHandler() http.Handler {
 				session.Values["token"] = token
 				session.Save(r, w)
 				r.Method = "GET"
-				http.Redirect(w, r, "/teachers", http.StatusSeeOther)
+				http.Redirect(w, r, "/teachers?format=html&tpl_layout=base&tpl_content=teachers", http.StatusSeeOther)
 			}
 		}
 	}

+ 19 - 55
handlers/teachers.go

@@ -5,13 +5,13 @@ import (
 	"fmt"
 	"html/template"
 	"io/ioutil"
+	"log"
 	"net/http"
-	"sort"
-	"strings"
 
 	"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"
 )
 
@@ -29,53 +29,24 @@ WHERE activities.teacher_id=?`
 
 func teachersHandler() http.Handler {
 	fn := func(w http.ResponseWriter, r *http.Request) {
-		var teachers []*orm.Teacher
-		if err := orm.DB().Find(&teachers).Error; err != nil {
-			panic(err)
-		}
-		for _, teacher := range teachers {
-			orm.DB().Raw(selectUniqueTeacherClasses, teacher.ID).Scan(&teacher.Classes)
-			orm.DB().Raw(selectUniqueTeacherSubjects, teacher.ID).Scan(&teacher.Subjects)
+		teachers, err := orm.GetTeachersAll()
+		if err != nil {
+			renderer.Render[r.URL.Query()["format"][0]](w, r, err)
+		} else {
+			renderer.Render[r.URL.Query()["format"][0]](w, r, teachers, r.URL.Query())
 		}
-		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)
-		// }
 	}
 	return http.HandlerFunc(fn)
 }
 
 func teacherShowHandler() http.Handler {
 	fn := func(w http.ResponseWriter, r *http.Request) {
-		var teacher orm.Teacher
-
-		if err := orm.DB().First(&teacher, mux.Vars(r)["id"]).Error; err != nil {
-			panic(err)
+		teacher, err := orm.GetTeacher(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, teacher, r.URL.Query())
 		}
-
-		orm.DB().Raw(selectUniqueTeacherClasses, mux.Vars(r)["id"]).Scan(&teacher.Classes)
-
-		sort.Slice(teacher.Classes, func(i, j int) bool {
-			return strings.ToLower(teacher.Classes[i].Name) < strings.ToLower(teacher.Classes[j].Name)
-		})
-
-		orm.DB().Raw(selectUniqueTeacherSubjects, mux.Vars(r)["id"]).Scan(&teacher.Subjects)
-
-		sort.Slice(teacher.Subjects, func(i, j int) bool {
-			return strings.ToLower(teacher.Subjects[i].Name) < strings.ToLower(teacher.Subjects[j].Name)
-		})
-
-		orm.DB().Table("activities").Select("*").Where("teacher_id = ?", mux.Vars(r)["id"]).Scan(&teacher.Activities)
-
-		sort.Slice(teacher.Activities, func(i, j int) bool {
-			return teacher.Activities[i].Hours < teacher.Activities[j].Hours
-		})
-
-		// if err := renderer.Render(w, "base", "teachers_show", teacher); err != nil {
-		// 	panic(err)
-		// }
 	}
 	return http.HandlerFunc(fn)
 }
@@ -146,20 +117,13 @@ func teachersDeleteHandler() http.Handler {
 func teacherUpdateHandler() http.Handler {
 	fn := func(w http.ResponseWriter, r *http.Request) {
 		if r.Method == "GET" {
-			var data struct {
-				Update    bool
-				SubmitUrl template.URL
-				Teacher   orm.Teacher
+			teacher, err := orm.GetTeacher(mux.Vars(r)["id"])
+			if err != nil {
+				renderer.Render[r.URL.Query()["format"][0]](w, r, err)
+			} else {
+				log.Println(r.URL.Query())
+				renderer.Render[r.URL.Query()["format"][0]](w, r, teacher, r.URL.Query())
 			}
-
-			if err := orm.DB().First(&data.Teacher, mux.Vars(r)["id"]).Error; err != nil {
-				panic(err)
-			}
-			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)
-			// }
 		} else if r.Method == "POST" {
 			var (
 				teacher     orm.Teacher
@@ -197,7 +161,7 @@ func teacherUpdateHandler() http.Handler {
 				panic(err)
 			}
 
-			http.Redirect(w, r, fmt.Sprintf("/teachers/%d", teacher.ID), http.StatusSeeOther)
+			http.Redirect(w, r, fmt.Sprintf("/teachers/%d?format=html&tpl_layout=base&tpl_content=teachers_show", teacher.ID), http.StatusSeeOther)
 		}
 
 	}

+ 1 - 1
orm/activity.go

@@ -6,7 +6,7 @@ type Activity struct {
 	gorm.Model
 	Name      string
 	Class     Class
-	Teacher   Teacher
+	Teacher   *Teacher
 	Subject   Subject
 	ClassID   uint `schema:"class_id"`
 	TeacherID uint `schema:"teacher_id"`

+ 5 - 15
orm/class.go

@@ -2,7 +2,6 @@ package orm
 
 import (
 	"errors"
-	"strconv"
 
 	"github.com/jinzhu/gorm"
 )
@@ -10,16 +9,11 @@ import (
 var (
 	selectClassActivities = "SELECT * FROM activities WHERE class_id=?"
 
-	// 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`
+SELECT teachers.* FROM activities
+INNER JOIN teachers on teachers.id=activities.teacher_id
+WHERE class_id=?
+`
 )
 
 type Class struct {
@@ -70,14 +64,10 @@ func GetClass(id string) (*Class, error) {
 	if err := DB().Raw(selectUniqueClassTeachers, id).Scan(&class.Teachers).Error; err != nil {
 		return nil, err
 	}
-	if err := DB().Raw(selectClassActivities, id).Scan(&class.Activities).Error; err != nil {
+	if err := DB().Preload("Teacher").Preload("Subject").Where("class_id=?", id).Find(&class.Activities).Error; err != nil {
 		return nil, err
 	}
 
-	for _, teacher := range class.Teachers {
-		teacher.GetActivitiesByClass(strconv.Itoa(int(class.ID)))
-	}
-
 	if class.CoordinatorID != 0 {
 		if !DB().First(&class.Coordinator, class.CoordinatorID).RecordNotFound() {
 			if err := DB().First(&class.Coordinator, class.CoordinatorID).Error; err != nil {

+ 12 - 2
orm/orm_test.go

@@ -59,6 +59,15 @@ func (t *testSuite) TestGetTeachers() {
 	t.Equal("1 A", class.Name)
 }
 
+func (t *testSuite) TestGetTeachersAll() {
+	teachers, err := GetTeachersAll()
+	t.Nil(err)
+	t.Equal(9, len(teachers))
+
+	t.Equal("1 A", teachers[0].Classes[0].Name)
+	t.Equal("MATEMATICA", teachers[0].Subjects[0].Name)
+}
+
 func (t *testSuite) TestGetTeacherActivitiesByClass() {
 	teacher, err := GetTeacher("1")
 	t.Nil(err)
@@ -108,12 +117,13 @@ func (t *testSuite) TestGetClass() {
 		t.Equal("LUNGA", class.Coordinator.Surname)
 		t.Equal("DONADONI", class.Minuter.Surname)
 
-		t.True(len(class.Teachers[0].Activities) > 0)
-
 		// Test activities
 
 		t.True(len(class.Activities) > 0)
 		t.Equal("1 A MATEMATICA 2h", class.Activities[0].Name)
+		t.Equal("AGOSTINO", class.Activities[0].Teacher.Surname)
+		t.Equal("MATEMATICA", class.Activities[0].Subject.Name)
+		t.Equal(2, class.Activities[0].Hours)
 	}
 
 }

+ 64 - 31
orm/teacher.go

@@ -22,6 +22,10 @@ type Teacher struct {
 }
 
 var (
+	selectDistinctTeachers = `
+SELECT teachers.* FROM activities
+INNER JOIN teachers ON activities.teacher_id=teachers.id
+`
 	selectUniqueTeacherClasses = `
 SELECT DISTINCT classes.* FROM activities 
 INNER JOIN classes on classes.id=activities.class_id 
@@ -38,6 +42,19 @@ func GetTeacher(id string) (*Teacher, error) {
 	if err := DB().Find(&teacher, id).Error; err != nil {
 		return nil, err
 	}
+
+	if err := DB().Raw(selectUniqueTeacherClasses, id).Scan(&teacher.Classes).Error; err != nil {
+		return nil, err
+	}
+
+	if err := DB().Raw(selectUniqueTeacherSubjects, id).Scan(&teacher.Subjects).Error; err != nil {
+		return nil, err
+	}
+
+	if err := DB().Preload("Teacher").Preload("Subject").Where("teacher_id=?", id).Find(&teacher.Activities).Error; err != nil {
+		return nil, err
+	}
+
 	return &teacher, nil
 }
 
@@ -49,6 +66,21 @@ func GetTeachers() ([]*Teacher, error) {
 	return teachers, nil
 }
 
+func GetTeachersAll() ([]*Teacher, error) {
+	var teachers []*Teacher
+	if err := DB().Order("surname,name").Find(&teachers).Error; err != nil {
+		return nil, err
+	}
+	for _, teacher := range teachers {
+		teacher.GetClasses()
+	}
+	for _, teacher := range teachers {
+		teacher.GetSubjects()
+	}
+
+	return teachers, nil
+}
+
 func (t *Teacher) GetClasses() ([]*Class, error) {
 	if err := DB().Raw(selectUniqueTeacherClasses, t.ID).Scan(&t.Classes).Error; err != nil {
 		return nil, err
@@ -56,8 +88,15 @@ func (t *Teacher) GetClasses() ([]*Class, error) {
 	return t.Classes, nil
 }
 
+func (t *Teacher) GetSubjects() ([]*Subject, error) {
+	if err := DB().Raw(selectUniqueTeacherSubjects, t.ID).Scan(&t.Subjects).Error; err != nil {
+		return nil, err
+	}
+	return t.Subjects, nil
+}
+
 func (t *Teacher) GetActivitiesByClass(id string) ([]*Activity, error) {
-	if err := DB().Debug().Where("class_id=? AND teacher_id=?", id, t.ID).Find(&t.Activities).Error; err != nil {
+	if err := DB().Preload("Teacher").Where("class_id=? AND teacher_id=?", id, t.ID).Find(&t.Activities).Error; err != nil {
 		return nil, err
 	}
 	return t.Activities, nil
@@ -119,17 +158,14 @@ func (t Teacher) GetSubjectsByClassID(classID uint) []Subject {
 	}
 
 	return subjects
-
 }
 
-func (t Teacher) IsCoordinator() []Class {
-	var (
-		classes []Class
-		output  []Class
-	)
+func (t *Teacher) IsCoordinator() ([]*Class, error) {
+	var output []*Class
 
-	if err := DB().Model(t).Related(&classes, "Classes").Error; err != nil {
-		panic(err)
+	classes, err := t.GetClasses()
+	if err != nil {
+		return nil, err
 	}
 
 	for _, class := range classes {
@@ -138,11 +174,28 @@ func (t Teacher) IsCoordinator() []Class {
 		}
 	}
 
-	return output
+	return output, nil
 
 }
 
-func (t Teacher) IsCoordinatorInClass(className string) bool {
+func (t *Teacher) IsMinuter() ([]*Class, error) {
+	var output []*Class
+
+	classes, err := t.GetClasses()
+	if err != nil {
+		return nil, err
+	}
+
+	for _, class := range classes {
+		if class.MinuterID == t.ID {
+			output = append(output, class)
+		}
+	}
+
+	return output, nil
+}
+
+func (t *Teacher) IsCoordinatorInClass(className string) bool {
 	var classes []Class
 
 	if err := DB().Model(t).Where("name = ?", className).Related(&classes, "Classes").Error; err != nil {
@@ -211,26 +264,6 @@ func (t Teacher) HasSubjectInClass(subjectName string, className string) bool {
 	return false
 }
 
-func (t Teacher) IsMinuter() []Class {
-	var (
-		classes []Class
-		output  []Class
-	)
-
-	if err := DB().Model(t).Related(&classes, "Classes").Error; err != nil {
-		panic(err)
-	}
-
-	for _, class := range classes {
-		if class.MinuterID == t.ID {
-			output = append(output, class)
-		}
-	}
-
-	return output
-
-}
-
 // func (t *Teacher) CheckForIssues(tx *gorm.DB) {
 // 	if t.CurrHours != t.Hours {
 // 		var issues []Issue

+ 37 - 15
renderer/renderer.go

@@ -5,6 +5,7 @@ import (
 	"fmt"
 	"html/template"
 	"net/http"
+	"net/url"
 	"path"
 	"path/filepath"
 	"reflect"
@@ -17,9 +18,19 @@ type Renderer interface {
 
 type JSONRenderer struct{}
 
+type htmlTemplateData struct {
+	Data    interface{}
+	Options url.Values
+}
+
 var (
 	currRenderer Renderer
-	Render       map[string]func(http.ResponseWriter, *http.Request, interface{}, ...string)
+	Render       map[string]func(http.ResponseWriter, *http.Request, interface{}, ...url.Values)
+
+	funcMap = template.FuncMap{
+		"queryString": queryString,
+		"query":       query,
+	}
 )
 
 func init() {
@@ -27,13 +38,29 @@ func init() {
 	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) {
+	Render = make(map[string]func(http.ResponseWriter, *http.Request, interface{}, ...url.Values))
+	Render["html"] = func(w http.ResponseWriter, r *http.Request, data interface{}, options ...url.Values) {
 		htmlRenderer.Render(w, r, data, options...)
 	}
 }
 
+func queryString(layout string, content string) string {
+	return fmt.Sprintf("?format=html&tpl_layout=%s&tpl_content=%s", layout, content)
+}
+
+func query(values ...string) template.URL {
+	var urlValues url.Values
+
+	urlValues = make(url.Values)
+	urlValues.Set("format", "html")
+
+	for i := 0; i < len(values); i += 2 {
+		urlValues.Add(values[i], values[i+1])
+	}
+	return template.URL(urlValues.Encode())
+}
+
 // 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")
@@ -72,7 +99,6 @@ func NewHTMLRenderer(templatePath string) (*HTMLRenderer, error) {
 	if err != nil {
 		panic(err)
 	}
-
 	for _, fn := range fns {
 		tplName := filepath.Base(fn)
 		tplName = strings.TrimSuffix(tplName, path.Ext(tplName))
@@ -82,11 +108,8 @@ func NewHTMLRenderer(templatePath string) (*HTMLRenderer, error) {
 		if err != nil {
 			return nil, err
 		}
-		r.templates[tplName] = template.Must(r.templates[tplName].ParseFiles(files...))
-		if err != nil {
-			return nil, err
-		}
-
+		r.templates[tplName] = template.New(tplName)
+		r.templates[tplName] = template.Must(r.templates[tplName].Funcs(funcMap).ParseFiles(files...))
 	}
 
 	return r, nil
@@ -109,17 +132,16 @@ func (rend *HTMLRenderer) writeError(w http.ResponseWriter, r *http.Request, err
 	}
 }
 
-func (rend *HTMLRenderer) Render(w http.ResponseWriter, r *http.Request, data interface{}, options ...string) {
-	if isErrorType(data) {
+func (rend *HTMLRenderer) Render(w http.ResponseWriter, r *http.Request, data interface{}, options ...url.Values) {
+	if data != nil && isErrorType(data) {
 		rend.writeError(w, r, data.(error))
 	} else {
-
-		t, ok := rend.templates[options[1]]
+		t, ok := rend.templates[options[0]["tpl_content"][0]]
 		if !ok {
-			rend.writeError(w, r, fmt.Errorf("Template %s not found", options[1]))
+			rend.writeError(w, r, fmt.Errorf("Template %s not found", options[0]["tpl_content"][0]))
 		}
 		w.Header().Set("Content-Type", "text/html; charset=utf-8")
-		err := t.ExecuteTemplate(w, options[0], data)
+		err := t.ExecuteTemplate(w, options[0]["tpl_layout"][0], &htmlTemplateData{data, options[0]})
 		if err != nil {
 			rend.writeError(w, r, err)
 		}

+ 4 - 4
templates/classes_show.html.tpl

@@ -36,12 +36,12 @@
 	didattica. Clicca <a href="/activities/add">qui</a> per creare
 	una nuova attività didattica da associare alla classe.</p>
     {{else}}
-    {{range $teacher := .Teachers}}
-      <a href="/activities/{{$teacher.ID}}/update" class="list-group-item clearfix">
+    {{range $activity := .Activities}}
+      <a href="/activities/{{$activity.ID}}/update" class="list-group-item clearfix">
 	<span class="glyphicon glyphicon-user"></span>
-	{{$teacher.Surname}} {{$teacher.Name}}
+	{{$activity.Teacher.Surname}} {{$activity.Teacher.Name}}
 	<div class="text-right">
-	  <small>{{$teacher.Subject}} {{$teacher.Hours}}h</small>
+	  <small>{{$activity.Subject.Name}} {{$activity.Hours}}h</small>
 	</div>
       </a>
     {{end}}

+ 5 - 5
templates/layout/base.html.tpl

@@ -24,11 +24,11 @@
         </div>
         <div id="navbar" class="collapse navbar-collapse">
           <ul class="nav navbar-nav">
-	    <li><a href="/school/1">Scuola</a></li>
-            <li><a href="/teachers">Docenti</a></li>
-	    <li><a href="/subjects">Materie</a></li>
-	    <li><a href="/classes">Classi</a></li>
-	    <li><a href="/activities">Attività</a></li>
+	    <li><a href="/school/1{{queryString "base" "school_show"}}">Scuola</a></li>
+            <li><a href="/teachers{{queryString "base" "teachers"}}">Docenti</a></li>
+	    <li><a href="/subjects{{queryString "base" "subjects"}}">Materie</a></li>
+	    <li><a href="/classes{{queryString "base" "classes"}}">Classi</a></li>
+	    <li><a href="/activities{{queryString "base" "activities"}}">Attività</a></li>
           </ul>
 
 	  <ul class="nav navbar-nav navbar-right">

+ 3 - 3
templates/teachers.html.tpl

@@ -11,7 +11,7 @@
 	
 	<div class="btn-group pull-right">
 	  
-	  <a href="/teachers/add" class="btn btn-primary">
+	  <a href="/teachers/add{{queryString "base" "teachers_add_update"}}" class="btn btn-primary">
 	    <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
 	    Crea nuovo docente
 	  </a>
@@ -46,8 +46,8 @@
   <p>Non c'è alcun elemento da visualizzare</p>
   {{else}}
   <div class="list-group" id="myUL">
-    {{range $teacher := .}}
-    <a class="list-group-item clearfix" href="/teachers/{{$teacher.ID}}">
+    {{range $teacher := .Data}}
+    <a class="list-group-item clearfix" href="/teachers/{{$teacher.ID}}{{queryString "base" "teachers_show"}}">
       <span class="glyphicon glyphicon-user"></span>
       {{$teacher.Name}} {{$teacher.Surname}}
       <div class="text-right">

+ 15 - 15
templates/teachers_add_update.html.tpl

@@ -2,10 +2,10 @@
 
 <div class="container">
 
-  {{if .Update}}
+  {{if .Options.Get "update"}}
   <ol class="breadcrumb">
-    <li><a href="/teachers">Docenti</a></li>
-    <li><a href="/teachers/{{.Teacher.ID}}">{{.Teacher.Name}} {{.Teacher.Surname}}</a></li>
+    <li><a href="/teachers?{{query "tpl_layout" "base" "tpl_content" "teachers_show"}}">Docenti</a></li>
+    <li><a href="/teachers/{{.Data.ID}}?{{query "tpl_layout" "base" "tpl_content" "teachers_show"}}">{{.Data.Name}} {{.Data.Surname}}</a></li>
     <li class="active"><a href="#">Aggiorna</a></li>
   </ol>  
   {{else}}  
@@ -15,50 +15,50 @@
   </ol>
   {{end}}
 
-  {{if .Update}}
-  <h1 class="karmen-info-header">Aggiorna il docente "{{.Teacher.Name}} {{.Teacher.Surname}}"</h1>
+  {{if .Options.Get "update"}}
+  <h1 class="karmen-info-header">Aggiorna il docente "{{.Data.Name}} {{.Data.Surname}}"</h1>
   {{else}}
   <h1 class="karmen-info-header">Crea un nuovo docente</h1>
   {{end}}
   
-  <form action="{{.SubmitUrl}}" method="POST" role="form" data-toggle="validator">
+  <form action="/teachers/{{.Data.ID}}/update" method="POST" role="form" data-toggle="validator">
     
     <div class="form-group has-feedback">
       <label class="control-label" for="teacher_name">Nome</label>
-      <input type="text" name="Name" class="form-control" id="teacher_name" placeholder="Nome" {{if .Update}} value="{{.Teacher.Name}}" {{end}} required>
+      <input type="text" name="Name" class="form-control" id="teacher_name" placeholder="Nome" {{if .Options.Get "update"}} value="{{.Data.Name}}" {{end}} required>
     </div>
     
     <div class="form-group has-feedback">
       <label class="control-label" for="teacher_surname">Cognome</label>
-      <input type="text" name="Surname" class="form-control" id="teacher_surname" placeholder="Cognome" {{if .Update}} value="{{.Teacher.Surname}}" {{end}} required>
+      <input type="text" name="Surname" class="form-control" id="teacher_surname" placeholder="Cognome" {{if .Options.Get "update"}} value="{{.Data.Surname}}" {{end}} required>
     </div>
 
     <div class="form-group has-feedback">
       <label class="control-label has-feedback" for="teacher_hours">Numero di ore</label>
-      <input type="number" name="Hours" class="form-control" id="teacher_hours" {{if .Update}}value="{{.Teacher.Hours}}"{{else}}value="18"{{end}} required>
+      <input type="number" name="Hours" class="form-control" id="teacher_hours" {{if .Options.Get "update"}}value="{{.Data.Hours}}"{{else}}value="18"{{end}} required>
     </div>
 
-    {{if .Update}}
+    {{if .Options.Get "update"}}
     <div class="form-group has-feedback">
       <label class="control-label" for="teacher_password">Password</label>
-      <input type="password" name="Password" class="form-control" id="password" placeholder="Password" value="{{.Teacher.Password}}" required>
+      <input type="password" name="Password" class="form-control" id="password" placeholder="Password" value="{{.Data.Password}}" required>
     </div>
 
     <div class="form-group has-feedback">
       <label class="control-label">Nome utente</label>
-      <p class="form-control-static">{{.Teacher.Username}}</p>
+      <p class="form-control-static">{{.Data.Username}}</p>
     </div>
 
     <div class="form-group has-feedback">
       <label class="control-label">Email</label>
-      <p class="form-control-static">{{.Teacher.Email}}</p>
+      <p class="form-control-static">{{.Data.Email}}</p>
     </div>    
     {{end}}
     
     <div class="form-group">
       <button type="submit" class="btn btn-primary">Salva</button>
-      {{if .Update}}
-      <a href="/teachers/{{.Teacher.ID}}" class="btn btn-default">Annulla</a>
+      {{if .Options.Get "update"}}
+      <a href="/teachers/{{.Data.ID}}" class="btn btn-default">Annulla</a>
       {{else}}
       <a href="/teachers" class="btn btn-default">Annulla</a>
       {{end}}

+ 22 - 22
templates/teachers_show.html.tpl

@@ -3,23 +3,23 @@
 <div class="container">
 
   <ol class="breadcrumb">
-    <li><a href="/teachers">Docenti</a></li>
-    <li class="active"><a href="#">{{.Name}} {{.Surname}}</a></li>
+    <li><a href="/teachers{{queryString "base" "teachers"}}">Docenti</a></li>
+    <li class="active"><a href="#">{{.Data.Name}} {{.Data.Surname}}</a></li>
   </ol>
 
   <div class="karmen-info-header">
     <div class="row">
       <div class="col-md-8">
-	<h1>{{.Name}} {{.Surname}}</h1>
+	<h1>{{.Data.Name}} {{.Data.Surname}}</h1>
       </div>
       <div class="col-md-4">
 	<div class="btn-group pull-right" role="group">
-	  <a href="/teachers/{{.ID}}/update" class="btn btn-primary">
+	  <a href="/teachers/{{.Data.ID}}/update?{{query "tpl_layout" "base" "tpl_content" "teachers_add_update" "update" "true"}}" class="btn btn-primary">
 	    <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>
 	    Modifica
 	  </a>
-	  <button href="/teachers/{{.ID}}/delete"
-		  data-url="/teachers/{{.ID}}/delete"
+	  <button href="/teachers/{{.Data.ID}}/delete"
+		  data-url="/teachers/{{.Data.ID}}/delete"
 		  class="btn btn-danger karmen-ajax-delete">
 	    <span class="glyphicon glyphicon-trash" aria-hidden="true"></span>
 	    Elimina
@@ -33,10 +33,10 @@
     <div class="col-md-12">
       
       <h2 class="karmen-relation-header">Materie</h2>
-      {{if .Subjects}}
+      {{if .Data.Subjects}}
       <div class="list-group" id="materie_list_group">
-    	{{range $subject := .Subjects}}
-    	<a href="/subjects/{{$subject.ID}}" class="list-group-item clearfix">
+    	{{range $subject := .Data.Subjects}}
+    	<a href="/subjects/{{$subject.ID}}{{queryString "base" "subjects_show"}}" class="list-group-item clearfix">
     	  <span class="glyphicon glyphicon-book"></span>
     	  {{$subject.Name}}
     	  {{end}}
@@ -44,7 +44,7 @@
       </div>
       {{else}}
       <p>Al docente non è associata alcuna attività
-    	didattica. Clicca <a href="/activities/add">qui</a> per
+    	didattica. Clicca <a href="/activities/add{{queryString "base" "activities_add_update"}}">qui</a> per
     	creare una nuova attività didattica da associare al docente.</p>
       {{end}}
     </div>
@@ -55,10 +55,10 @@
     <div class="col-md-12">
       
       <h2 class="karmen-relation-header">Classi</h2>
-      {{if .Classes}}
+      {{if .Data.Classes}}
       <div class="list-group" id="classes_list_group">
-	{{range $class := .Classes}}
-	<a href="/classes/{{$class.ID}}" class="list-group-item clearfix">
+	{{range $class := .Data.Classes}}
+	<a href="/classes/{{$class.ID}}{{queryString "base" "classes_show"}}" class="list-group-item clearfix">
 	  <span class="glyphicon glyphicon-blackboard"></span>
 	  {{$class.Name}}
 	  {{end}}
@@ -66,7 +66,7 @@
       </div>
       {{else}}
       <p>Al docente non è associata alcuna attività
-	didattica. Clicca <a href="/activities/add">qui</a> per
+	didattica. Clicca <a href="/activities/add{{queryString "base" "activities_add_update"}}">qui</a> per
 	creare una nuova attività didattica da associare al docente.</p>
       {{end}}
     </div>
@@ -77,21 +77,21 @@
     <div class="col-md-12">
       
       <h2 class="karmen-relation-header">Cattedra</h2>
-      {{if .Activities}}
+      {{if .Data.Activities}}
       <div class="list-group" id="classes_list_group">
-	{{range $activity := .Activities}}
-	<a href="/activities/{{$activity.ID}}/update" class="list-group-item clearfix">
+	{{range $activity := .Data.Activities}}
+	<a href="/activities/{{$activity.ID}}/update{{queryString "base" "activities_add_update"}}" class="list-group-item clearfix">
 	  <span class="glyphicon glyphicon-briefcase"></span>
 	  {{$activity.Name}}
 	  {{end}}
 	</a>
       </div>
       
-      {{if $classes := $.IsCoordinator}}
+      {{if $classes := .Data.IsCoordinator}}
       <p>Il docente è <strong>coordinatore</strong> nelle seguenti classi</p>
       <div class="list-group" id="coord_classes_list_group">
 	{{range $class := $classes}}
-	<a href="/classes/{{$class.ID}}" class="list-group-item clearfix">
+	<a href="/classes/{{$class.ID}}{{queryString "base" "classes_show"}}" class="list-group-item clearfix">
 	  <span class="glyphicon glyphicon-blackboard"></span>
 	  {{$class.Name}}
 	  {{end}}
@@ -99,11 +99,11 @@
       </div>
       {{end}}
 
-      {{if $classes := $.IsMinuter}}
+      {{if $classes := .Data.IsMinuter}}
       <p>Il docente è <strong>verbalizzante</strong> nelle seguenti classi</p>
       <div class="list-group" id="coord_classes_list_group">
 	{{range $class := $classes}}
-	<a href="/classes/{{$class.ID}}" class="list-group-item clearfix">
+	<a href="/classes/{{$class.ID}}{{queryString "base" "classes_show"}}" class="list-group-item clearfix">
 	  <span class="glyphicon glyphicon-blackboard"></span>
 	  {{$class.Name}}
 	  {{end}}
@@ -114,7 +114,7 @@
       
       {{else}}
       <p>Al docente non è associata alcuna attività
-	didattica. Clicca <a href="/activities/add">qui</a> per
+	didattica. Clicca <a href="/activities/add{{queryString "base" "activities_add_update"}}">qui</a> per
 	creare una nuova attività didattica da associare al docente.</p>
       {{end}}
     </div>