You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

226 satır
5.3KB

  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. if !found {
  24. cookie := cookieClear("meetingid")
  25. http.SetCookie(w, &cookie) //clear meeting id
  26. }
  27. switch r.Method {
  28. case "GET":
  29. if !found {
  30. //empty meeting
  31. meeting.showEdit(w)
  32. return
  33. }
  34. if lead.ID != meeting.ParentID { //is the meeting belongs to this user?
  35. response403Handler(w)
  36. return
  37. }
  38. //editing existing meeting
  39. meeting.showEdit(w)
  40. case "POST":
  41. if found && (lead.ID != meeting.ParentID) { //is the meeting belongs to this user?
  42. response403Handler(w)
  43. return
  44. }
  45. if meeting.ID == "" {
  46. meeting.ParentID = lead.ID
  47. meeting.ParentType = "Lead"
  48. meeting.Status = "submitted"
  49. }
  50. meeting.saveFromWeb(w, r)
  51. default:
  52. w.WriteHeader(http.StatusUnauthorized)
  53. fmt.Fprintf(w, "Unsupported Method %s", r.Method)
  54. }
  55. // e, err := crmGetEntity("Meeting", "595d064a6e372fc1f")
  56. // log.Println(err)
  57. // meeting, ok := e.(crmdMeeting)
  58. // log.Println(ok)
  59. // spaEditMeetingPopulateMeetingInfo(w, meeting)
  60. }
  61. func (m crmdMeeting) showEdit(w http.ResponseWriter) {
  62. tTest := template.New("spaEditMeeting")
  63. str, err := ioutil.ReadFile("spa/editmeeting.html")
  64. if err != nil {
  65. w.WriteHeader(http.StatusInternalServerError)
  66. fmt.Fprintf(w, "Formating information not available.")
  67. return
  68. }
  69. tTest, err = tTest.Parse(string(str))
  70. if err != nil {
  71. w.WriteHeader(http.StatusInternalServerError)
  72. fmt.Fprintf(w, "Formating instruction invalid")
  73. return
  74. }
  75. err = tTest.Execute(w, m)
  76. if err != nil {
  77. w.WriteHeader(http.StatusInternalServerError)
  78. fmt.Fprintf(w, "Monkey runs into our computer room...")
  79. log.Println("ERROR: Template execution on spa/Edit, failed \n" + err.Error())
  80. }
  81. }
  82. func getMeetingFromRequest(r *http.Request) (meeting crmdMeeting, found bool) {
  83. id, ok := cookieVerifyAndGet(r, "meetingid")
  84. if !ok {
  85. return
  86. }
  87. meeting, err := crmGetMeeting(id)
  88. if err != nil {
  89. found = false
  90. log.Printf("WARNING: cannot find meeting with id [%s]", id)
  91. return
  92. }
  93. found = true
  94. return
  95. }
  96. func (m crmdMeeting) saveFromWeb(w http.ResponseWriter, r *http.Request) {
  97. meeting := crmdMeeting{} //collecting input
  98. err := r.ParseMultipartForm(32 << 20)
  99. if err != nil {
  100. response400Handler(w)
  101. return
  102. }
  103. //if !checkCSRF(r.Form["csrf"])
  104. //csrf, ook := r.Form["csrf"]
  105. ok := meeting.validateFormInput(r.Form)
  106. if !ok {
  107. meeting.showEdit(w)
  108. return
  109. }
  110. //check to see if there is file, cover picture
  111. meeting.validateFormFile(r)
  112. meeting.ID = m.ID
  113. meeting.ParentID = m.ParentID
  114. meeting.ParentType = m.ParentType
  115. meeting.Status = m.Status
  116. updatedMeeting, err := meeting.save()
  117. if err == nil {
  118. updatedMeeting.setFlashTitle("成功保存")
  119. updatedMeeting.addFlashMsg("活动信息已经成功保存,其他校友可通过公众号查阅本活动信息")
  120. //remember this meeting
  121. cookie := cookieCreate("meetingid", updatedMeeting.ID, 7200)
  122. http.SetCookie(w, &cookie)
  123. //show editing dialog again
  124. updatedMeeting.showEdit(w)
  125. return
  126. }
  127. response500Handler(w)
  128. }
  129. func (m *crmdMeeting) validateFormInput(form url.Values) bool {
  130. val, ok := form["meetingname"]
  131. if ok {
  132. m.Name = val[0]
  133. } else {
  134. m.addFlashMsg("活动主题/标题不能为空")
  135. }
  136. val, ok = form["description"]
  137. if ok {
  138. m.Description = val[0]
  139. } else {
  140. m.addFlashMsg("清添加描述活动本身")
  141. }
  142. startdate, sok := form["startdate"]
  143. starthour, hok := form["starthour"]
  144. duration, rok := form["duration"]
  145. if sok && hok && rok {
  146. m.buildStartDate(startdate[0], starthour[0], duration[0])
  147. } else {
  148. m.addFlashMsg("活动日期,开始时间,持续时间 不能为空")
  149. }
  150. val, ok = form["venue"]
  151. if ok {
  152. m.Venue = val[0]
  153. } else {
  154. m.addFlashMsg("请添加活动地点/集合地点")
  155. }
  156. return !m.hasError()
  157. }
  158. func (m *crmdMeeting) validateFormFile(r *http.Request) (ok bool) {
  159. file, _, err := r.FormFile("cover")
  160. if err == nil {
  161. defer file.Close()
  162. f, err := ioutil.TempFile(os.TempDir(), "wechat_hitxy_spa_edit_meeting")
  163. if err == nil {
  164. defer f.Close()
  165. io.Copy(f, file)
  166. attch, err := crmCreateAttachment(f.Name())
  167. if err == nil {
  168. m.CoverID = attch.ID
  169. os.Remove(f.Name())
  170. return true
  171. }
  172. }
  173. }
  174. return false
  175. }
  176. func (m *crmdMeeting) buildStartDate(date, hour, duration string) {
  177. layout := "2 January, 2006 15:04 MST"
  178. value := strings.TrimSpace(date) + " " + strings.TrimSpace(hour) + " AEST" //Force Sydney time
  179. t, err := time.Parse(layout, value)
  180. if err != nil {
  181. m.addFlashMsg("开始日期,时间,无法识别")
  182. return
  183. }
  184. utc, err := time.LoadLocation("UTC")
  185. if err == nil {
  186. m.DateStart = t.In(utc).Format(getCrmTimeLayout())
  187. log.Println(m.DateStart)
  188. m.buildDuration(duration)
  189. m.DateEnd = t.In(utc).Add(time.Second * time.Duration(m.Duration)).Format(getCrmTimeLayout())
  190. }
  191. }
  192. func (m *crmdMeeting) buildDuration(duration string) {
  193. var hour, minute int
  194. cnt, err := fmt.Sscanf(duration, "%d:%d", &hour, &minute)
  195. if cnt != 2 && err != nil {
  196. m.addFlashMsg("持续时间不正确")
  197. return
  198. }
  199. m.Duration = (hour * 3600) + (minute * 60)
  200. }