您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

214 行
4.8KB

  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.setFlashTitle("成功保存")
  111. updatedMeeting.addFlashMsg("活动信息已经成功保存,其他校友可通过公众号查阅本活动信息")
  112. updatedMeeting.showEdit(w)
  113. return
  114. }
  115. response500Handler(w)
  116. }
  117. func (m *crmdMeeting) validateFormInput(form url.Values) bool {
  118. val, ok := form["meetingname"]
  119. if ok {
  120. m.Name = val[0]
  121. } else {
  122. m.addFlashMsg("活动主题/标题不能为空")
  123. }
  124. val, ok = form["description"]
  125. if ok {
  126. m.Description = val[0]
  127. } else {
  128. m.addFlashMsg("清添加描述活动本身")
  129. }
  130. startdate, sok := form["startdate"]
  131. starthour, hok := form["starthour"]
  132. duration, rok := form["duration"]
  133. if sok && hok && rok {
  134. m.buildStartDate(startdate[0], starthour[0], duration[0])
  135. } else {
  136. m.addFlashMsg("活动日期,开始时间,持续时间 不能为空")
  137. }
  138. val, ok = form["venue"]
  139. if ok {
  140. m.Venue = val[0]
  141. } else {
  142. m.addFlashMsg("请添加活动地点/集合地点")
  143. }
  144. return !m.hasError()
  145. }
  146. func (m *crmdMeeting) validateFormFile(r *http.Request) (ok bool) {
  147. file, _, err := r.FormFile("cover")
  148. if err == nil {
  149. defer file.Close()
  150. f, err := ioutil.TempFile(os.TempDir(), "wechat_hitxy_spa_edit_meeting")
  151. if err == nil {
  152. defer f.Close()
  153. io.Copy(f, file)
  154. attch, err := crmCreateAttachment(f.Name())
  155. if err == nil {
  156. m.CoverID = attch.ID
  157. os.Remove(f.Name())
  158. return true
  159. }
  160. }
  161. }
  162. return false
  163. }
  164. func (m *crmdMeeting) buildStartDate(date, hour, duration string) {
  165. layout := "2 January, 2006 15:04 MST"
  166. value := strings.TrimSpace(date) + " " + strings.TrimSpace(hour) + " AEST" //Force Sydney time
  167. t, err := time.Parse(layout, value)
  168. if err != nil {
  169. m.addFlashMsg("开始日期,时间,无法识别")
  170. return
  171. }
  172. utc, err := time.LoadLocation("UTC")
  173. if err == nil {
  174. m.DateStart = t.In(utc).Format(getCrmTimeLayout())
  175. log.Println(m.DateStart)
  176. m.buildDuration(duration)
  177. m.DateEnd = t.In(utc).Add(time.Second * time.Duration(m.Duration)).Format(getCrmTimeLayout())
  178. }
  179. }
  180. func (m *crmdMeeting) buildDuration(duration string) {
  181. var hour, minute int
  182. cnt, err := fmt.Sscanf(duration, "%d:%d", &hour, &minute)
  183. if cnt != 2 && err != nil {
  184. m.addFlashMsg("持续时间不正确")
  185. return
  186. }
  187. m.Duration = (hour * 3600) + (minute * 60)
  188. }