Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

207 lignes
4.5KB

  1. package main
  2. import (
  3. "fmt"
  4. "html/template"
  5. "io"
  6. "io/ioutil"
  7. "log"
  8. "net/http"
  9. "net/url"
  10. "os"
  11. "strings"
  12. "time"
  13. )
  14. func spaEditMeetingHandler(w http.ResponseWriter, r *http.Request) {
  15. lead, found := getLeadFromRequest(r)
  16. if !found {
  17. response403Handler(w)
  18. // w.WriteHeader(http.StatusUnauthorized)
  19. // fmt.Fprintf(w, "User not found ")
  20. return
  21. }
  22. meeting, found := getMeetingFromRequest(r)
  23. switch r.Method {
  24. case "GET":
  25. if !found {
  26. //empty meeting
  27. meeting.showEdit(w)
  28. return
  29. }
  30. if lead.ID != meeting.ParentID { //is the meeting belongs to this user?
  31. response403Handler(w)
  32. return
  33. }
  34. //editing existing meeting
  35. meeting.showEdit(w)
  36. case "POST":
  37. if found && (lead.ID != meeting.ParentID) { //is the meeting belongs to this user?
  38. response403Handler(w)
  39. return
  40. }
  41. meeting.saveFromWeb(w, r)
  42. default:
  43. w.WriteHeader(http.StatusUnauthorized)
  44. fmt.Fprintf(w, "Unsupported Method %s", r.Method)
  45. }
  46. // e, err := crmGetEntity("Meeting", "595d064a6e372fc1f")
  47. // log.Println(err)
  48. // meeting, ok := e.(crmdMeeting)
  49. // log.Println(ok)
  50. // spaEditMeetingPopulateMeetingInfo(w, meeting)
  51. }
  52. func (m crmdMeeting) showEdit(w http.ResponseWriter) {
  53. tTest := template.New("spaEditMeeting")
  54. str, err := ioutil.ReadFile("spa/editmeeting.html")
  55. if err != nil {
  56. w.WriteHeader(http.StatusInternalServerError)
  57. fmt.Fprintf(w, "Formating information not available.")
  58. return
  59. }
  60. tTest, err = tTest.Parse(string(str))
  61. if err != nil {
  62. w.WriteHeader(http.StatusInternalServerError)
  63. fmt.Fprintf(w, "Formating instruction invalid")
  64. return
  65. }
  66. err = tTest.Execute(w, m)
  67. if err != nil {
  68. w.WriteHeader(http.StatusInternalServerError)
  69. fmt.Fprintf(w, "Monkey runs into our computer room...")
  70. log.Println("ERROR: Template execution on spa/Edit, failed \n" + err.Error())
  71. }
  72. }
  73. func getMeetingFromRequest(r *http.Request) (meeting crmdMeeting, found bool) {
  74. q, err := url.ParseQuery(r.URL.RawQuery)
  75. if err != nil {
  76. return
  77. }
  78. id, ok := q["mid"] //meetingid
  79. if !ok {
  80. return
  81. }
  82. meeting, err = crmGetMeeting(id[0])
  83. if err != nil {
  84. found = false
  85. log.Printf("WARNING: cannot find meeting with id [%s]", id[0])
  86. return
  87. }
  88. found = true
  89. return
  90. }
  91. func (m crmdMeeting) saveFromWeb(w http.ResponseWriter, r *http.Request) {
  92. meeting := crmdMeeting{}
  93. err := r.ParseMultipartForm(32 << 20)
  94. if err != nil {
  95. response400Handler(w)
  96. return
  97. }
  98. //if !checkCSRF(r.Form["csrf"])
  99. //csrf, ook := r.Form["csrf"]
  100. ok := meeting.validateFormInput(r.Form)
  101. if !ok {
  102. meeting.showEdit(w)
  103. return
  104. }
  105. //check to see if there is file, cover picture
  106. meeting.validateFormFile(r)
  107. meeting.ID = m.ID
  108. updatedMeeting, err := meeting.save()
  109. if err == nil {
  110. updatedMeeting.showEdit(w)
  111. return
  112. }
  113. response500Handler(w)
  114. }
  115. func (m *crmdMeeting) validateFormInput(form url.Values) bool {
  116. val, ok := form["meetingname"]
  117. if ok {
  118. m.Name = val[0]
  119. } else {
  120. m.addSpaErr("活动主题/标题不能为空")
  121. }
  122. val, ok = form["description"]
  123. if ok {
  124. m.Description = val[0]
  125. } else {
  126. m.addSpaErr("清添加描述活动本身")
  127. }
  128. startdate, sok := form["startdate"]
  129. starthour, hok := form["starthour"]
  130. duration, rok := form["duration"]
  131. if sok && hok && rok {
  132. m.buildStartDate(startdate[0], starthour[0])
  133. m.buildDuration(duration[0])
  134. } else {
  135. m.addSpaErr("活动日期,开始时间,持续时间 不能为空")
  136. }
  137. val, ok = form["venue"]
  138. if ok {
  139. m.Venue = val[0]
  140. } else {
  141. m.addSpaErr("请添加活动地点/集合地点")
  142. }
  143. return !m.hasError()
  144. }
  145. func (m *crmdMeeting) validateFormFile(r *http.Request) (ok bool) {
  146. file, _, err := r.FormFile("cover")
  147. if err == nil {
  148. defer file.Close()
  149. f, err := ioutil.TempFile(os.TempDir(), "wechat_hitxy_spa_edit_meeting")
  150. if err == nil {
  151. defer f.Close()
  152. io.Copy(f, file)
  153. attch, err := crmCreateAttachment(f.Name())
  154. if err == nil {
  155. m.CoverID = attch.ID
  156. os.Remove(f.Name())
  157. return true
  158. }
  159. }
  160. }
  161. return false
  162. }
  163. func (m *crmdMeeting) buildStartDate(date, hour string) {
  164. layout := "2 January, 2006 15:04"
  165. value := strings.TrimSpace(date) + " " + strings.TrimSpace(hour)
  166. t, err := time.Parse(layout, value)
  167. if err != nil {
  168. m.addSpaErr("开始日期,时间,无法识别")
  169. return
  170. }
  171. m.DateStart = t.Format(getCrmTimeLayout())
  172. log.Println(m.DateStart)
  173. }
  174. func (m *crmdMeeting) buildDuration(duration string) {
  175. var hour, minute int
  176. cnt, err := fmt.Sscanf(duration, "%d:%d", &hour, &minute)
  177. if cnt != 2 && err != nil {
  178. m.addSpaErr("持续时间不正确")
  179. return
  180. }
  181. m.Duration = (hour * 3600) + (minute * 60)
  182. }