list.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. package list
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "log"
  6. "os"
  7. "path/filepath"
  8. "strings"
  9. "sync"
  10. "text/template"
  11. "time"
  12. "github.com/remogatto/cloud"
  13. karmen_client "gogs.carducci-dante.gov.it/karmen/client"
  14. "gogs.carducci-dante.gov.it/karmen/core/config"
  15. "gogs.carducci-dante.gov.it/karmen/core/orm"
  16. "gogs.carducci-dante.gov.it/karmen/util/fileutil"
  17. "gogs.carducci-dante.gov.it/karmen/util/libreoffice"
  18. "gogs.carducci-dante.gov.it/karmen/util/pandoc"
  19. tpl_util "gogs.carducci-dante.gov.it/karmen/util/template"
  20. )
  21. type ListGenerator struct {
  22. sync.Mutex
  23. Config *config.ConfigT
  24. CloudPath string
  25. JobID uint
  26. ncClient *cloud.Client
  27. kaClient *karmen_client.Client
  28. }
  29. var funcMap template.FuncMap = template.FuncMap{
  30. "comma": comma,
  31. "groupClasses": groupClasses,
  32. "abbrev": abbrev,
  33. "nbsp": nbsp,
  34. }
  35. func (generator *ListGenerator) generate(outputPath string, cloudPath string, teachers []*orm.Teacher, funcMap template.FuncMap) {
  36. filename := filepath.Join(outputPath, "elenco_docenti")
  37. tplContent, err := generator.ncClient.Download(filepath.Join(cloudPath, "list.tpl.md"))
  38. if err != nil {
  39. log.Println(err)
  40. }
  41. refContent, err := generator.ncClient.Download(filepath.Join(cloudPath, "reference.odt"))
  42. if err != nil {
  43. log.Println(err)
  44. }
  45. err = ioutil.WriteFile(filepath.Join(outputPath, "reference.odt"), refContent, 0777)
  46. if err != nil {
  47. log.Println(err)
  48. }
  49. tpl, err := tpl_util.LoadTextTemplateFromString(string(tplContent), funcMap)
  50. if err != nil {
  51. log.Println(err)
  52. }
  53. f, err := os.Create(filename + ".md")
  54. if err != nil {
  55. log.Println(err)
  56. }
  57. defer f.Close()
  58. err = tpl.Execute(f, teachers)
  59. if err != nil {
  60. log.Println(err)
  61. }
  62. odtFilename := fileutil.ReplaceExt(filename, "odt")
  63. log.Println("Generate", odtFilename)
  64. if err := pandoc.Convert(filename+".md", odtFilename, "--data-dir", outputPath); err != nil {
  65. log.Println(outputPath, err)
  66. }
  67. if err := libreoffice.Convert(filename+".odt", "pdf", "--outdir", outputPath); err != nil {
  68. log.Println(err)
  69. }
  70. }
  71. func comma(classes []*orm.Class) string {
  72. var names []string
  73. for _, c := range classes {
  74. names = append(names, c.Name)
  75. }
  76. return strings.Join(names, ",")
  77. }
  78. func abbrev(name string) string {
  79. var result string
  80. splits := strings.Split(name, " ")
  81. for i := len(splits) - 1; i >= 0; i-- {
  82. if i == len(splits)-1 {
  83. result += splits[i] + " "
  84. continue
  85. }
  86. result += strings.ToUpper(string(splits[i][0]) + ".")
  87. }
  88. return result
  89. }
  90. func nbsp(num int, text string) string {
  91. return text + strings.Repeat(" ", num)
  92. }
  93. func groupClasses(classes []*orm.Class) string {
  94. var groups []string
  95. groupByAddresses := make(map[string][]string)
  96. addressesAbbrev := map[string]string{
  97. "Linguistico": "LIN",
  98. "Classico": "CLA",
  99. "Musicale": "M",
  100. "Economico sociale": "ES",
  101. "Scienze umane": "SU",
  102. }
  103. for _, c := range classes {
  104. groupByAddresses[c.Field] = append(groupByAddresses[c.Field], fmt.Sprintf("%d%s", c.Year, c.Section))
  105. }
  106. for address, classes := range groupByAddresses {
  107. var group string
  108. if len(classes) > 1 {
  109. group = fmt.Sprintf("[%s]%s", strings.Join(classes, ","), addressesAbbrev[address])
  110. } else {
  111. group = fmt.Sprintf("%s %s", strings.Join(classes, ","), addressesAbbrev[address])
  112. }
  113. groups = append(groups, group)
  114. }
  115. return strings.Join(groups, ",")
  116. }
  117. func NewListGenerator(config *config.ConfigT) *ListGenerator {
  118. return &ListGenerator{Config: config}
  119. }
  120. func (generator *ListGenerator) SetJobId(id uint) {
  121. generator.Lock()
  122. generator.JobID = id
  123. generator.Unlock()
  124. }
  125. func (generator *ListGenerator) Run() {
  126. var err error
  127. generator.ncClient, err = cloud.Dial(
  128. generator.Config.Cloud.Url,
  129. generator.Config.Cloud.Username,
  130. generator.Config.Cloud.Password,
  131. )
  132. if err != nil {
  133. log.Println(err)
  134. }
  135. log.Printf("Connecting to karmen...")
  136. generator.kaClient, err = karmen_client.Dial(
  137. generator.Config.Url,
  138. generator.Config.Admin.Username,
  139. generator.Config.Admin.Password,
  140. )
  141. if err != nil {
  142. log.Println(err)
  143. }
  144. var job *orm.Job
  145. if generator.JobID > 0 {
  146. job, err = generator.kaClient.GetJob(generator.JobID)
  147. if err != nil {
  148. log.Println(err)
  149. }
  150. job.Start = time.Now()
  151. err = generator.kaClient.UpdateJob(job)
  152. if err != nil {
  153. log.Println(err)
  154. }
  155. }
  156. teachers, err := generator.kaClient.GetTeachers()
  157. if err != nil {
  158. log.Println(err)
  159. }
  160. var (
  161. outputPath string
  162. cloudPath string
  163. )
  164. if generator.JobID > 0 {
  165. outputPath = filepath.Join(generator.Config.Documents.OutputPath, fmt.Sprintf("%d/%d", job.DocumentID, job.ID))
  166. cloudPath = job.Document.CloudPath
  167. } else {
  168. outputPath = "output"
  169. cloudPath = "Documents"
  170. }
  171. if err := os.MkdirAll(outputPath, 0777); err != nil {
  172. log.Println(err)
  173. }
  174. generator.generate(outputPath, cloudPath, teachers, funcMap)
  175. if generator.JobID > 0 {
  176. job.End = time.Now()
  177. job.Files = append(job.Files, &orm.File{Path: "elenco_docenti.pdf"})
  178. err = generator.kaClient.UpdateJob(job)
  179. if err != nil {
  180. log.Println(err)
  181. }
  182. }
  183. log.Println("Uploading files to the cloud...")
  184. src, err := ioutil.ReadFile(filepath.Join(outputPath, "elenco_docenti.pdf"))
  185. if err != nil {
  186. log.Println(err)
  187. }
  188. err = generator.ncClient.Upload(src, filepath.Join(cloudPath, "elenco_docenti.pdf"))
  189. if err != nil {
  190. log.Println(err)
  191. }
  192. log.Println("Files were uploaded to the cloud...")
  193. }