123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 |
- package api
- import (
- "encoding/json"
- "fmt"
- "html/template"
- "net/http"
- "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 saveActivity(r *http.Request, activity *orm.Activity) {
- var (
- class orm.Class
- subject orm.Subject
- )
- if err := r.ParseForm(); err != nil {
- panic(err)
- }
- decoder := schema.NewDecoder()
- if err := decoder.Decode(activity, r.PostForm); err != nil {
- panic(err)
- }
- if err := orm.DB().First(&class, activity.ClassID).Error; err != nil {
- panic(err)
- }
- if err := orm.DB().First(&subject, activity.SubjectID).Error; err != nil {
- panic(err)
- }
- activity.Name = fmt.Sprintf("%s %s %dh", class.Name, subject.Name, activity.Hours)
- if err := orm.DB().Save(activity).Error; err != nil {
- panic(err)
- }
- }
- func activitiesHandler() http.Handler {
- fn := func(w http.ResponseWriter, r *http.Request) {
- var data struct {
- Activities []orm.Activity
- }
- if err := orm.DB().Find(&data.Activities).Error; err != nil {
- panic(err)
- }
- 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)
- }
- }
- return http.HandlerFunc(fn)
- }
- func activitiesAddHandler() http.Handler {
- fn := func(w http.ResponseWriter, r *http.Request) {
- if r.Method == "GET" {
- var data struct {
- Update bool
- AllTeachers []orm.Teacher
- AllClasses []orm.Class
- AllSubjects []orm.Subject
- SubmitUrl template.URL
- }
- data.SubmitUrl = template.URL(fmt.Sprintf("/activities/add"))
- if err := orm.DB().Find(&data.AllTeachers).Error; err != nil {
- panic(err)
- }
- if err := orm.DB().Find(&data.AllClasses).Error; err != nil {
- panic(err)
- }
- if err := orm.DB().Find(&data.AllSubjects).Error; 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
- if err := orm.DB().Create(&activity).Error; err != nil {
- panic(err)
- }
- saveActivity(r, &activity)
- http.Redirect(w, r, fmt.Sprintf("/activities"), http.StatusSeeOther)
- }
- }
- return http.HandlerFunc(fn)
- }
- func activitiesDeleteHandler() http.Handler {
- fn := func(w http.ResponseWriter, r *http.Request) {
- var activity orm.Activity
- if err := orm.DB().First(&activity, mux.Vars(r)["id"]).Error; err != nil {
- panic(err)
- }
- if err := orm.DB().Delete(&activity).Error; err != nil {
- panic(err)
- }
- var data struct {
- RedirectUrl string `json:"redirect_url"`
- }
- // Handle associations
- if activity.TeacherID != 0 {
- var (
- class orm.Class
- subject orm.Class
- teacher orm.Teacher
- )
- if err := orm.DB().First(&teacher, activity.TeacherID).Error; err != nil {
- panic(err)
- }
- teacher.CalcHours(orm.DB())
- orm.DB().Save(&teacher)
- if err := orm.DB().First(&class, activity.ClassID).Error; err != nil {
- panic(err)
- }
- if err := orm.DB().First(&subject, activity.SubjectID).Error; err != nil {
- panic(err)
- }
- if err := orm.DB().Model(&teacher).Association("Classes").Delete(class).Error; err != nil {
- panic(err)
- }
- if err := orm.DB().Model(&teacher).Association("Subjects").Delete(subject).Error; err != nil {
- panic(err)
- }
- }
- data.RedirectUrl = "/activities"
- w.Header().Set("Content-Type", "application/json")
- json.NewEncoder(w).Encode(data)
- }
- return http.HandlerFunc(fn)
- }
- func activitiesUpdateHandler() http.Handler {
- fn := func(w http.ResponseWriter, r *http.Request) {
- if r.Method == "GET" {
- var data struct {
- Update bool
- SubmitUrl template.URL
- Activity orm.Activity
- AllTeachers []orm.Teacher
- AllSubjects []orm.Subject
- AllClasses []orm.Class
- SelectedTeacher map[uint]string
- SelectedSubject map[uint]string
- SelectedClass map[uint]string
- }
- if err := orm.DB().First(&data.Activity, mux.Vars(r)["id"]).Error; err != nil {
- panic(err)
- }
- if err := orm.DB().Find(&data.AllTeachers).Error; err != nil {
- panic(err)
- }
- if err := orm.DB().Find(&data.AllSubjects).Error; err != nil {
- panic(err)
- }
- if err := orm.DB().Find(&data.AllClasses).Error; err != nil {
- panic(err)
- }
- if id := data.Activity.TeacherID; id != 0 {
- data.SelectedTeacher = make(map[uint]string)
- data.SelectedTeacher[id] = "selected"
- }
- data.SelectedClass = make(map[uint]string)
- data.SelectedClass[data.Activity.ClassID] = "selected"
- data.SelectedSubject = make(map[uint]string)
- data.SelectedSubject[data.Activity.SubjectID] = "selected"
- 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)
- }
- } else if r.Method == "POST" {
- var activity orm.Activity
- if err := orm.DB().First(&activity, mux.Vars(r)["id"]).Error; err != nil {
- panic(err)
- }
- saveActivity(r, &activity)
- http.Redirect(w, r, fmt.Sprintf("/activities"), http.StatusSeeOther)
- }
- }
- return http.HandlerFunc(fn)
- }
|