Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

209 lines
4.6KB

  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], duration[0])
  133. } else {
  134. m.addSpaErr("活动日期,开始时间,持续时间 不能为空")
  135. }
  136. val, ok = form["venue"]
  137. if ok {
  138. m.Venue = val[0]
  139. } else {
  140. m.addSpaErr("请添加活动地点/集合地点")
  141. }
  142. return !m.hasError()
  143. }
  144. func (m *crmdMeeting) validateFormFile(r *http.Request) (ok bool) {
  145. file, _, err := r.FormFile("cover")
  146. if err == nil {
  147. defer file.Close()
  148. f, err := ioutil.TempFile(os.TempDir(), "wechat_hitxy_spa_edit_meeting")
  149. if err == nil {
  150. defer f.Close()
  151. io.Copy(f, file)
  152. attch, err := crmCreateAttachment(f.Name())
  153. if err == nil {
  154. m.CoverID = attch.ID
  155. os.Remove(f.Name())
  156. return true
  157. }
  158. }
  159. }
  160. return false
  161. }
  162. func (m *crmdMeeting) buildStartDate(date, hour, duration string) {
  163. layout := "2 January, 2006 15:04"
  164. value := strings.TrimSpace(date) + " " + strings.TrimSpace(hour)
  165. t, err := time.Parse(layout, value)
  166. if err != nil {
  167. m.addSpaErr("开始日期,时间,无法识别")
  168. return
  169. }
  170. m.DateStart = t.Format(getCrmTimeLayout())
  171. log.Println(m.DateStart)
  172. m.buildDuration(duration)
  173. m.DateEnd = t.Add(time.Second * time.Duration(m.Duration)).Format(getCrmTimeLayout())
  174. }
  175. func (m *crmdMeeting) buildDuration(duration string) {
  176. var hour, minute int
  177. cnt, err := fmt.Sscanf(duration, "%d:%d", &hour, &minute)
  178. if cnt != 2 && err != nil {
  179. m.addSpaErr("持续时间不正确")
  180. return
  181. }
  182. m.Duration = (hour * 3600) + (minute * 60)
  183. }