Ver código fonte

Working on groups

Andrea Fazzi 5 anos atrás
pai
commit
44667f529c

+ 102 - 6
orm/group.go

@@ -1,20 +1,40 @@
 package orm
 
 import (
+	"fmt"
 	"net/http"
 
 	"github.com/jinzhu/gorm"
+	"gogs.carducci-dante.gov.it/karmen/core/renderer"
 )
 
 type Group struct {
 	gorm.Model
 
 	Name string
+
+	TeacherIDs []uint `schema:"teacher_ids" gorm:"-"`
+
+	Teachers []*Teacher `gorm:"many2many:group_teachers"`
+}
+
+type GroupForAdd struct {
+	AllTeachers []*Teacher
+}
+
+type GroupForUpdate struct {
+	Group Group
+
+	AllTeachers []*Teacher
+
+	SelectedTeacher map[uint]string
 }
 
+func (g *Group) GetID() uint { return g.ID }
+
 func GetGroupsAll(args map[string]string) (interface{}, error) {
 	var groups []*Group
-	if err := DB().Order("name").Find(&groups).Error; err != nil {
+	if err := DB().Debug().Preload("Teachers").Order("name").Find(&groups).Error; err != nil {
 		return nil, err
 	}
 
@@ -22,15 +42,46 @@ func GetGroupsAll(args map[string]string) (interface{}, error) {
 }
 
 func GetGroupAll(args map[string]string) (interface{}, error) {
-	return nil, nil
+	var group Group
+
+	id := args["id"]
+
+	if err := DB().Preload("Teachers").Where("id = ?", id).Find(&group).Error; err != nil {
+		return nil, err
+	}
+
+	return group, nil
 }
 
 func GetGroupForUpdate(args map[string]string) (interface{}, error) {
-	return nil, nil
+	var data GroupForUpdate
+
+	id := args["id"]
+
+	if err := DB().Preload("Teachers").First(&data.Group, id).Error; err != nil {
+		return nil, err
+	}
+
+	if err := DB().Find(&data.AllTeachers).Error; err != nil {
+		return nil, err
+	}
+
+	data.SelectedTeacher = make(map[uint]string)
+	for _, t := range data.Group.Teachers {
+		data.SelectedTeacher[t.ID] = "selected"
+	}
+
+	return data, nil
 }
 
 func GetGroupForAdd(args map[string]string) (interface{}, error) {
-	return nil, nil
+	var data GroupForAdd
+
+	if err := DB().Find(&data.AllTeachers).Error; err != nil {
+		return nil, err
+	}
+
+	return data, nil
 }
 
 func GetGroup(args map[string]string) (interface{}, error) {
@@ -38,7 +89,24 @@ func GetGroup(args map[string]string) (interface{}, error) {
 }
 
 func UpdateGroup(args map[string]string, r *http.Request) (IDer, error) {
-	return nil, nil
+	group, err := GetGroup(args)
+	if err != nil {
+		return nil, err
+	}
+	err = renderer.Decode(group, r)
+	if err != nil {
+		return nil, err
+	}
+
+	_, err = SaveGroup(group)
+	if err != nil {
+		return nil, err
+	}
+	group, err = GetGroup(args)
+	if err != nil {
+		return nil, err
+	}
+	return group.(*Group), nil
 }
 
 func DeleteGroup(args map[string]string, r *http.Request) (IDer, error) {
@@ -46,5 +114,33 @@ func DeleteGroup(args map[string]string, r *http.Request) (IDer, error) {
 }
 
 func AddGroup(args map[string]string, r *http.Request) (IDer, error) {
-	return nil, nil
+	group := new(Group)
+	err := renderer.Decode(group, r)
+	if err != nil {
+		return nil, err
+	}
+	group, err = CreateGroup(group)
+	if err != nil {
+		return nil, err
+	}
+	return group, nil
+}
+
+func CreateGroup(group *Group) (*Group, error) {
+	var groups []*Group
+	if err := DB().Where("name=?", group.Name).Find(&groups).Error; err != nil {
+		return nil, err
+	}
+	if len(groups) > 0 {
+		return nil, fmt.Errorf("Group %s already exists!", group.Name)
+	}
+
+	if err := DB().Where(group.TeacherIDs).Find(&group.Teachers).Error; err != nil {
+		return nil, err
+	}
+
+	if err := DB().Create(group).Error; err != nil {
+		return nil, err
+	}
+	return group, nil
 }

+ 0 - 2
orm/teacher.go

@@ -21,8 +21,6 @@ type Teacher struct {
 	Activities  []*Activity
 	Departments []*Department
 
-	Groups []*Group `gorm:many2may:teacher_groups`
-
 	SubjectsByClass map[uint][]*Subject `gorm:"-"`
 
 	Hours       int

+ 1 - 1
templates/groups.html.tpl

@@ -10,7 +10,7 @@
       <div class="col-md-4">
 	<a href="/groups/add/?{{query "tpl_layout" "base" "tpl_content" "groups_add_update"}}" class="btn btn-primary float-right">
 	  <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
-	  Crea nuovo group
+	  Crea nuovo gruppo
 	</a>
       </div>
     </div>

+ 50 - 29
templates/groups_add_update.html.tpl

@@ -3,51 +3,72 @@
 <div class="container">
 
   {{if .Options.Get "update"}}
-  <ol class="breadcrumb">
-    <li><a href="/groups?{{query "tpl_layout" "base" "tpl_content" "groups"}}">group</a></li>
-    <li class="active"><a href="#">Aggiorna group</a></li>
-  </ol>  
+  <nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+      <li class="breadcrumb-item"><a href="/groups?{{query "tpl_layout" "base" "tpl_content" "groups"}}">Gruppi</a></li>
+      <li class="breadcrumb-item active"><a href="#">Aggiorna gruppo</a></li>
+    </ol>
+  </nav>
   {{else}}
-  <ol class="breadcrumb">
-    <li><a href="/groups?{{query "tpl_layout" "base" "tpl_content" "groups"}}">group</a></li>
-    <li class="active"><a href="#">Aggiungi</a></li>
-  </ol>
+  <nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+      <li class="breadcrumb-item"><a href="/groups?{{query "tpl_layout" "base" "tpl_content" "groups"}}">Gruppi</a></li>
+      <li class="breadcrumb-item active"><a href="#">Aggiungi</a></li>
+    </ol>
+  </nav>
   {{end}}
 
- {{if .Options.Get "update"}}
+  {{if .Options.Get "update"}}
   <div class="karmen-info-header">
     <div class="row">
       <div class="col-md-8">
-	<h1>Aggiorna group</h1>
+	<h1>Aggiorna gruppo</h1>
       </div>
     </div>
   </div>
   
   {{else}}
-  <h1 class="karmen-info-header">Crea nuovo group</h1>
+  <h1 class="karmen-info-header">Crea nuovo gruppo</h1>
   {{end}}
 
   {{if .Options.Get "update"}}
-  <form id="form_groups_add_update" action="/groups/{{.Data.ID}}/update" method="POST" role="form" data-toggle="validator">
-  {{else}}
-  <form id="form_groups_add_update" action="/groups/add/" method="POST" role="form" data-toggle="validator">
-  {{end}}
-
-    <div class="form-group has-feedback">
-      <label class="control-label" for="group_name">Nome</label>
-      <input type="text" name="Name" class="form-control" id="group_name" placeholder="Nome" {{if .Options.Get "update"}} value="{{.Data.Name}}" {{end}} required>
-    </div>
-        
-    <div class="form-group">
-      <button type="submit" class="btn btn-primary">Salva</button>
-      {{if .Options.Get "update"}}
-      <a href="/groups/{{.Data.ID}}?{{query "tpl_layout" "base" "tpl_content" "groups_show"}}" class="btn btn-default">Annulla</a>
-      {{else}}
-      <a href="/groups?{{query "tpl_layout" "base" "tpl_content" "groups"}}" class="btn btn-default">Annulla</a>
+  <form id="form_groups_add_update" action="/groups/{{.Data.Group.ID}}/update" method="POST" role="form" data-toggle="validator">
+    {{else}}
+    <form id="form_groups_add_update" action="/groups/add/" method="POST" role="form" data-toggle="validator">
       {{end}}
-    </div>
+
+      <div class="form-group has-feedback">
+        <label class="control-label" for="group_name">Nome</label>
+        <input type="text" name="Name" class="form-control" id="group_name" placeholder="Nome" {{if .Options.Get "update"}} value="{{.Data.Group.Name}}" {{end}} required>
+      </div>
+
+      <div class="form-group">
+        <label class="control-label" for="teacher_id">Docenti</label>
+        <select name="teacher_ids" class="form-control selectpicker" id="teacher_ids" placeholder="Docenti" data-live-search="true" form="form_groups_add_update" title="Seleziona i nomi dei docenti" data-dropup-auto="false" multiple>
+          <option value="0"></option>
+          {{range $teacher := .Data.AllTeachers}}
+          {{if $.Options.Get "update"}}
+          <option
+	    value="{{$teacher.ID}}"
+	    {{index $.Data.SelectedTeacher $teacher.ID}}>{{$teacher.CompleteName}}
+          </option>
+          {{else}}
+          <option value="{{$teacher.ID}}">{{$teacher.CompleteName}}</option>
+          {{end}}
+          {{end}}
+        </select>
+      </div>
+
+      <div class="form-group">
+        <button type="submit" class="btn btn-primary">Salva</button>
+        {{if .Options.Get "update"}}
+        <a href="/groups/{{.Data.Group.ID}}?{{query "tpl_layout" "base" "tpl_content" "groups_show"}}" class="btn btn-default">Annulla</a>
+        {{else}}
+        <a href="/groups?{{query "tpl_layout" "base" "tpl_content" "groups"}}" class="btn btn-default">Annulla</a>
+        {{end}}
+      </div>
     
-  </form>
+    </form>
 
 </div>
 

+ 14 - 12
templates/groups_show.html.tpl

@@ -2,10 +2,12 @@
 
 <div class="container">
 
+  <nav aria-label="breadcrumb">
   <ol class="breadcrumb">
-    <li><a href="/groups?{{query "tpl_layout" "base" "tpl_content" "groups"}}">groups</a></li>
-    <li class="active"><a href="#">{{.Data.Name}}</a></li>
+    <li class="breadcrumb-item"><a href="/groups?{{query "tpl_layout" "base" "tpl_content" "groups"}}">Gruppi</a></li>
+    <li class="breadcrumb-item active"><a href="#">{{.Data.Name}}</a></li>
   </ol>
+  </nav>
 
   <div class="karmen-info-header">
     <div class="row">
@@ -39,18 +41,18 @@
   <div class="row">
     <div class="col-md-12">
       
-      <h2 class="karmen-relation-header">sub items</h2>
-      {{if .Data.Items}}
-      <div class="list-group" id="materie_list_group">
-    	<a href="/subjects/{{.Data.Subject.ID}}?{{query "tpl_layout" "base" "tpl_content" "subjects_show"}}" class="list-group-item clearfix">
-    	  <span class="glyphicon glyphicon-book"></span>
-    	  {{.Data.Subject.Name}}
-    	</a>
+      <h2 class="karmen-relation-header">Docenti associati al gruppo</h2>
+      {{if .Data.Teachers}}
+      <div class="list-group" id="students_list_group">
+	{{range $teacher := .Data.Teachers}}
+	<a href="/teachers/{{$teacher.ID}}?{{query "tpl_layout" "base" "tpl_content" "teachers_show"}}" class="list-group-item list-group-item-action">
+	  <span class="fa fa-user"></span>
+	  {{$teacher.CompleteName}}
+	  {{end}}
+	  </a>
       </div>
       {{else}}
-      <p>All'attività non è associata alcuna materia
-    	didattica. Clicca <a href="/activities/update?{{query "tpl_layout" "base" "tpl_content" "activities_add_update"}}">qui</a> per
-    	modificare questa attività didattica.</p>
+      <p>Al gruppo non è associato alcun docente. Clicca <a href="/groups/{{.Data.ID}}/update?{{query "tpl_layout" "base" "tpl_content" "groups_add_update"}}">qui</a> per modificare questo gruppo.</p>
       {{end}}
     </div>
     

+ 1 - 0
watch.sh

@@ -1,5 +1,6 @@
 #!/bin/sh
 while inotifywait -r -e modify ./; do
+  # docker image prune -a -f
   docker-compose -f compose/karmen/docker-compose.yml down -v
   docker-compose -f compose/karmen/docker-compose.yml up --build -d
 done