|
|
|
|
|
|
|
|
|
|
|
package main |
|
|
|
|
|
|
|
|
|
|
|
import ( |
|
|
|
|
|
"fmt" |
|
|
|
|
|
"html/template" |
|
|
|
|
|
"io" |
|
|
|
|
|
"io/ioutil" |
|
|
|
|
|
"log" |
|
|
|
|
|
"net/http" |
|
|
|
|
|
"net/url" |
|
|
|
|
|
"os" |
|
|
|
|
|
"strings" |
|
|
|
|
|
"time" |
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
func spaEditMeetingHandler(w http.ResponseWriter, r *http.Request) { |
|
|
|
|
|
lead, found := getLeadFromRequest(r) |
|
|
|
|
|
if !found { |
|
|
|
|
|
response403Handler(w) |
|
|
|
|
|
// w.WriteHeader(http.StatusUnauthorized) |
|
|
|
|
|
// fmt.Fprintf(w, "User not found ") |
|
|
|
|
|
return |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
meeting, found := getMeetingFromRequest(r) |
|
|
|
|
|
|
|
|
|
|
|
switch r.Method { |
|
|
|
|
|
case "GET": |
|
|
|
|
|
if !found { |
|
|
|
|
|
//empty meeting |
|
|
|
|
|
meeting.showEdit(w) |
|
|
|
|
|
return |
|
|
|
|
|
} |
|
|
|
|
|
if lead.ID != meeting.ParentID { //is the meeting belongs to this user? |
|
|
|
|
|
response403Handler(w) |
|
|
|
|
|
return |
|
|
|
|
|
} |
|
|
|
|
|
//editing existing meeting |
|
|
|
|
|
meeting.showEdit(w) |
|
|
|
|
|
case "POST": |
|
|
|
|
|
if found && (lead.ID != meeting.ParentID) { //is the meeting belongs to this user? |
|
|
|
|
|
response403Handler(w) |
|
|
|
|
|
return |
|
|
|
|
|
} |
|
|
|
|
|
meeting.saveFromWeb(w, r) |
|
|
|
|
|
default: |
|
|
|
|
|
w.WriteHeader(http.StatusUnauthorized) |
|
|
|
|
|
fmt.Fprintf(w, "Unsupported Method %s", r.Method) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// e, err := crmGetEntity("Meeting", "595d064a6e372fc1f") |
|
|
|
|
|
// log.Println(err) |
|
|
|
|
|
// meeting, ok := e.(crmdMeeting) |
|
|
|
|
|
// log.Println(ok) |
|
|
|
|
|
// spaEditMeetingPopulateMeetingInfo(w, meeting) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (m crmdMeeting) showEdit(w http.ResponseWriter) { |
|
|
|
|
|
tTest := template.New("spaEditMeeting") |
|
|
|
|
|
str, err := ioutil.ReadFile("spa/editmeeting.html") |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
w.WriteHeader(http.StatusInternalServerError) |
|
|
|
|
|
fmt.Fprintf(w, "Formating information not available.") |
|
|
|
|
|
return |
|
|
|
|
|
} |
|
|
|
|
|
tTest, err = tTest.Parse(string(str)) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
w.WriteHeader(http.StatusInternalServerError) |
|
|
|
|
|
fmt.Fprintf(w, "Formating instruction invalid") |
|
|
|
|
|
return |
|
|
|
|
|
} |
|
|
|
|
|
err = tTest.Execute(w, m) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
w.WriteHeader(http.StatusInternalServerError) |
|
|
|
|
|
fmt.Fprintf(w, "Monkey runs into our computer room...") |
|
|
|
|
|
log.Println("ERROR: Template execution on spa/Edit, failed \n" + err.Error()) |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func getMeetingFromRequest(r *http.Request) (meeting crmdMeeting, found bool) { |
|
|
|
|
|
q, err := url.ParseQuery(r.URL.RawQuery) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
return |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
id, ok := q["mid"] //meetingid |
|
|
|
|
|
if !ok { |
|
|
|
|
|
return |
|
|
|
|
|
} |
|
|
|
|
|
meeting, err = crmGetMeeting(id[0]) |
|
|
|
|
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
|
found = false |
|
|
|
|
|
log.Printf("WARNING: cannot find meeting with id [%s]", id[0]) |
|
|
|
|
|
return |
|
|
|
|
|
} |
|
|
|
|
|
found = true |
|
|
|
|
|
return |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (m crmdMeeting) saveFromWeb(w http.ResponseWriter, r *http.Request) { |
|
|
|
|
|
|
|
|
|
|
|
meeting := crmdMeeting{} |
|
|
|
|
|
err := r.ParseMultipartForm(32 << 20) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
response400Handler(w) |
|
|
|
|
|
return |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//if !checkCSRF(r.Form["csrf"]) |
|
|
|
|
|
//csrf, ook := r.Form["csrf"] |
|
|
|
|
|
ok := meeting.validateFormInput(r.Form) |
|
|
|
|
|
if !ok { |
|
|
|
|
|
meeting.showEdit(w) |
|
|
|
|
|
return |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//check to see if there is file, cover picture |
|
|
|
|
|
meeting.validateFormFile(r) |
|
|
|
|
|
|
|
|
|
|
|
meeting.ID = m.ID |
|
|
|
|
|
updatedMeeting, err := meeting.save() |
|
|
|
|
|
if err == nil { |
|
|
|
|
|
updatedMeeting.showEdit(w) |
|
|
|
|
|
return |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
response500Handler(w) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (m *crmdMeeting) validateFormInput(form url.Values) bool { |
|
|
|
|
|
|
|
|
|
|
|
val, ok := form["meetingname"] |
|
|
|
|
|
if ok { |
|
|
|
|
|
m.Name = val[0] |
|
|
|
|
|
} else { |
|
|
|
|
|
m.addSpaErr("活动主题/标题不能为空") |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
val, ok = form["description"] |
|
|
|
|
|
if ok { |
|
|
|
|
|
m.Description = val[0] |
|
|
|
|
|
} else { |
|
|
|
|
|
m.addSpaErr("清添加描述活动本身") |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
startdate, sok := form["startdate"] |
|
|
|
|
|
starthour, hok := form["starthour"] |
|
|
|
|
|
duration, rok := form["duration"] |
|
|
|
|
|
if sok && hok && rok { |
|
|
|
|
|
m.buildStartDate(startdate[0], starthour[0]) |
|
|
|
|
|
m.buildDuration(duration[0]) |
|
|
|
|
|
} else { |
|
|
|
|
|
m.addSpaErr("活动日期,开始时间,持续时间 不能为空") |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
val, ok = form["venue"] |
|
|
|
|
|
if ok { |
|
|
|
|
|
m.Venue = val[0] |
|
|
|
|
|
} else { |
|
|
|
|
|
m.addSpaErr("请添加活动地点/集合地点") |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return !m.hasError() |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (m *crmdMeeting) validateFormFile(r *http.Request) (ok bool) { |
|
|
|
|
|
file, _, err := r.FormFile("cover") |
|
|
|
|
|
if err == nil { |
|
|
|
|
|
defer file.Close() |
|
|
|
|
|
f, err := ioutil.TempFile(os.TempDir(), "wechat_hitxy_spa_edit_meeting") |
|
|
|
|
|
if err == nil { |
|
|
|
|
|
defer f.Close() |
|
|
|
|
|
io.Copy(f, file) |
|
|
|
|
|
attch, err := crmCreateAttachment(f.Name()) |
|
|
|
|
|
if err == nil { |
|
|
|
|
|
m.CoverID = attch.ID |
|
|
|
|
|
os.Remove(f.Name()) |
|
|
|
|
|
return true |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
return false |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (m *crmdMeeting) buildStartDate(date, hour string) { |
|
|
|
|
|
layout := "2 January, 2006 15:04" |
|
|
|
|
|
value := strings.TrimSpace(date) + " " + strings.TrimSpace(hour) |
|
|
|
|
|
t, err := time.Parse(layout, value) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
m.addSpaErr("开始日期,时间,无法识别") |
|
|
|
|
|
return |
|
|
|
|
|
} |
|
|
|
|
|
m.DateStart = t.Format(getCrmTimeLayout()) |
|
|
|
|
|
log.Println(m.DateStart) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (m *crmdMeeting) buildDuration(duration string) { |
|
|
|
|
|
var hour, minute int |
|
|
|
|
|
cnt, err := fmt.Sscanf(duration, "%d:%d", &hour, &minute) |
|
|
|
|
|
if cnt != 2 && err != nil { |
|
|
|
|
|
m.addSpaErr("持续时间不正确") |
|
|
|
|
|
return |
|
|
|
|
|
} |
|
|
|
|
|
m.Duration = (hour * 3600) + (minute * 60) |
|
|
|
|
|
} |