Parcourir la source

Get teacher->class relation from activities using SQL raw query

Andrea Fazzi il y a 6 ans
Parent
commit
384ac502ef
5 fichiers modifiés avec 70 ajouts et 33 suppressions
  1. 39 14
      api/classes.go
  2. 21 7
      api/teachers.go
  3. 2 2
      templates/classes.html.tpl
  4. 6 8
      templates/classes_show.html.tpl
  5. 2 2
      templates/teachers.html.tpl

+ 39 - 14
api/classes.go

@@ -18,18 +18,36 @@ import (
 	"gogs.carducci-dante.gov.it/karmen/orm"
 	"gogs.carducci-dante.gov.it/karmen/orm"
 )
 )
 
 
+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`
+)
+
 func classesHandler() http.Handler {
 func classesHandler() http.Handler {
 	fn := func(w http.ResponseWriter, r *http.Request) {
 	fn := func(w http.ResponseWriter, r *http.Request) {
-		var data struct {
-			Classes []orm.Class
-		}
-		if err := orm.DB().Preload("Teachers").Find(&data.Classes).Error; err != nil {
+		var classes []*orm.Class
+
+		if err := orm.DB().Find(&classes).Error; err != nil {
 			panic(err)
 			panic(err)
 		}
 		}
-		sort.Slice(data.Classes, func(i, j int) bool {
-			return strings.ToLower(data.Classes[i].Name) < strings.ToLower(data.Classes[j].Name)
+
+		for _, class := range classes {
+			orm.DB().Raw(selectUniqueClassTeachers, class.ID).Scan(&class.Teachers)
+		}
+
+		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", data); err != nil {
+		if err := renderer.Render(w, "base", "classes", classes); err != nil {
 			panic(err)
 			panic(err)
 		}
 		}
 	}
 	}
@@ -38,20 +56,27 @@ func classesHandler() http.Handler {
 
 
 func classesShowHandler() http.Handler {
 func classesShowHandler() http.Handler {
 	fn := func(w http.ResponseWriter, r *http.Request) {
 	fn := func(w http.ResponseWriter, r *http.Request) {
+
+		type teacherActivity struct {
+			ActivityID int
+			Name       string
+			Surname    string
+			Subject    string
+			Hours      int
+		}
+
 		var data struct {
 		var data struct {
-			Class    orm.Class
-			Teachers []orm.Teacher
+			Class             orm.Class
+			TeacherActivities []teacherActivity
 		}
 		}
 		if err := orm.DB().First(&data.Class, mux.Vars(r)["id"]).Error; err != nil {
 		if err := orm.DB().First(&data.Class, mux.Vars(r)["id"]).Error; err != nil {
 			panic(err)
 			panic(err)
 		}
 		}
 
 
-		if err := orm.DB().Model(&data.Class).Preload("Subjects").Related(&data.Teachers, "Teachers").Error; err != nil {
-			panic(err)
-		}
+		orm.DB().Raw(selectClassActivities, mux.Vars(r)["id"]).Scan(&data.TeacherActivities)
 
 
-		sort.Slice(data.Teachers, func(i, j int) bool {
-			return strings.ToLower(data.Teachers[i].Surname) < strings.ToLower(data.Teachers[j].Surname)
+		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 data.Class.CoordinatorID != 0 {

+ 21 - 7
api/teachers.go

@@ -16,18 +16,32 @@ import (
 	"gogs.carducci-dante.gov.it/karmen/orm"
 	"gogs.carducci-dante.gov.it/karmen/orm"
 )
 )
 
 
+var (
+	selectUniqueTeacherClasses = `
+SELECT name FROM (SELECT activities.id,classes.name FROM activities 
+INNER JOIN classes on classes.id=activities.class_id 
+WHERE teacher_id=?) as grouped GROUP BY name`
+
+	selectUniqueTeacherSubjects = `
+SELECT name FROM (SELECT activities.id,subjects.name FROM activities 
+INNER JOIN subjects on subjects.id=activities.subject_id 
+WHERE activities.teacher_id=?) as grouped GROUP BY name`
+)
+
 func teachersHandler() http.Handler {
 func teachersHandler() http.Handler {
 	fn := func(w http.ResponseWriter, r *http.Request) {
 	fn := func(w http.ResponseWriter, r *http.Request) {
-		var data struct {
-			Teachers []orm.Teacher
-		}
-		if err := orm.DB().Preload("Classes").Preload("Subjects").Find(&data.Teachers).Error; err != nil {
+		var teachers []*orm.Teacher
+		if err := orm.DB().Find(&teachers).Error; err != nil {
 			panic(err)
 			panic(err)
 		}
 		}
-		sort.Slice(data.Teachers, func(i, j int) bool {
-			return strings.ToLower(data.Teachers[i].Surname) < strings.ToLower(data.Teachers[j].Surname)
+		for _, teacher := range teachers {
+			orm.DB().Raw(selectUniqueTeacherClasses, teacher.ID).Scan(&teacher.Classes)
+			orm.DB().Raw(selectUniqueTeacherSubjects, teacher.ID).Scan(&teacher.Subjects)
+		}
+		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", data); err != nil {
+		if err := renderer.Render(w, "base", "teachers", teachers); err != nil {
 			panic(err)
 			panic(err)
 		}
 		}
 	}
 	}

+ 2 - 2
templates/classes.html.tpl

@@ -40,11 +40,11 @@
     <span class="input-group-addon" id="search-query"><span class="glyphicon glyphicon-search"></span></span>
     <span class="input-group-addon" id="search-query"><span class="glyphicon glyphicon-search"></span></span>
     <input type="text" id="myInput" class="form-control" aria-describedby="search-query">
     <input type="text" id="myInput" class="form-control" aria-describedby="search-query">
   </div>
   </div>
-  {{if not .Classes}}
+  {{if not .}}
   <p>Non c'è alcun elemento da visualizzare.</p>
   <p>Non c'è alcun elemento da visualizzare.</p>
   {{else}}
   {{else}}
   <div class="list-group" id="myUL">
   <div class="list-group" id="myUL">
-    {{range $class := .Classes}}
+    {{range $class := .}}
     <a class="list-group-item clearfix" href="/classes/{{$class.ID}}">
     <a class="list-group-item clearfix" href="/classes/{{$class.ID}}">
       <span class="glyphicon glyphicon-blackboard"></span>
       <span class="glyphicon glyphicon-blackboard"></span>
       {{$class.Name}}
       {{$class.Name}}

+ 6 - 8
templates/classes_show.html.tpl

@@ -31,19 +31,17 @@
 
 
   <h2 class="karmen-relation-header">Docenti della {{.Class.Name}}</h2>
   <h2 class="karmen-relation-header">Docenti della {{.Class.Name}}</h2>
   <div class="list-group" id="classes_list_group">
   <div class="list-group" id="classes_list_group">
-    {{if not .Teachers}}
+    {{if not .TeacherActivities}}
     <p>Alla classe non è associata alcuna attività
     <p>Alla classe non è associata alcuna attività
 	didattica. Clicca <a href="/activities/add">qui</a> per creare
 	didattica. Clicca <a href="/activities/add">qui</a> per creare
 	una nuova attività didattica da associare alla classe.</p>
 	una nuova attività didattica da associare alla classe.</p>
     {{else}}
     {{else}}
-    {{range $teacher := .Teachers}}
-      <a href="/teachers/{{$teacher.ID}}" class="list-group-item clearfix">
+    {{range $teacher := .TeacherActivities}}
+      <a href="/activities/{{$teacher.ActivityID}}/update" class="list-group-item clearfix">
 	<span class="glyphicon glyphicon-user"></span>
 	<span class="glyphicon glyphicon-user"></span>
-	{{$teacher.Name}} {{$teacher.Surname}}
+	{{$teacher.Surname}} {{$teacher.Name}}
 	<div class="text-right">
 	<div class="text-right">
-	  {{range $subject := $teacher.GetSubjectsByClassID $.Class.ID}}
-	  <small>{{$subject.Name}}</small>
-	  {{end}}
+	  <small>{{$teacher.Subject}} {{$teacher.Hours}}h</small>
 	</div>
 	</div>
       </a>
       </a>
     {{end}}
     {{end}}
@@ -52,7 +50,7 @@
 
 
   <h2 class="karmen-relation-header">Coordinatore e verbalizzante</h2>
   <h2 class="karmen-relation-header">Coordinatore e verbalizzante</h2>
   <div class="list-group" id="classes_list_group">
   <div class="list-group" id="classes_list_group">
-    {{if not .Teachers}}
+    {{if not .TeacherActivities}}
     <p>Alla classe non è associata alcuna attività
     <p>Alla classe non è associata alcuna attività
 	didattica. Clicca <a href="/activities/add">qui</a> per creare
 	didattica. Clicca <a href="/activities/add">qui</a> per creare
 	una nuova attività didattica da associare alla classe.</p>
 	una nuova attività didattica da associare alla classe.</p>

+ 2 - 2
templates/teachers.html.tpl

@@ -42,11 +42,11 @@
     <input type="text" id="myInput" class="form-control" aria-describedby="search-query">
     <input type="text" id="myInput" class="form-control" aria-describedby="search-query">
   </div>
   </div>
   
   
-  {{if not .Teachers}}
+  {{if not .}}
   <p>Non c'è alcun elemento da visualizzare</p>
   <p>Non c'è alcun elemento da visualizzare</p>
   {{else}}
   {{else}}
   <div class="list-group" id="myUL">
   <div class="list-group" id="myUL">
-    {{range $teacher := .Teachers}}
+    {{range $teacher := .}}
     <a class="list-group-item clearfix" href="/teachers/{{$teacher.ID}}">
     <a class="list-group-item clearfix" href="/teachers/{{$teacher.ID}}">
       <span class="glyphicon glyphicon-user"></span>
       <span class="glyphicon glyphicon-user"></span>
       {{$teacher.Name}} {{$teacher.Surname}}
       {{$teacher.Name}} {{$teacher.Surname}}