作者:kshedde
项目:randomizatio
// Edit_sharing
func Edit_sharing(w http.ResponseWriter,
r *http.Request) {
if r.Method != "GET" {
Serve404(w)
return
}
c := appengine.NewContext(r)
user := user.Current(c)
pkey := r.FormValue("pkey")
shr := strings.Split(pkey, "::")
owner := shr[0]
project_name := shr[1]
if strings.ToLower(owner) != strings.ToLower(user.String()) {
msg := "Only the owner of a project can manage sharing."
return_msg := "Return to dashboard"
Message_page(w, r, user, msg, return_msg, "/dashboard")
return
}
shared_users, err := Get_shared_users(pkey, &c)
if err != nil {
shared_users = make([]string, 0)
c.Infof("Failed to retrieve sharing: %v %v", project_name, owner)
}
type TV struct {
User string
LoggedIn bool
SharedUsers []string
AnySharedUsers bool
ProjectName string
Pkey string
}
template_values := new(TV)
template_values.User = user.String()
template_values.LoggedIn = user != nil
template_values.SharedUsers = shared_users
template_values.AnySharedUsers = len(shared_users) > 0
template_values.ProjectName = project_name
template_values.Pkey = pkey
tmpl, err := template.ParseFiles("header.html",
"edit_sharing.html")
if err != nil {
ServeError(&c, w, err)
return
}
if err := tmpl.ExecuteTemplate(w, "edit_sharing.html",
template_values); err != nil {
c.Errorf("Failed to execute template: %v", err)
}
}
作者:kshedde
项目:randomizatio
// Create_project_step2 asks if the subject-level data are to be logged.
func Create_project_step2(w http.ResponseWriter,
r *http.Request) {
if r.Method != "POST" {
Serve404(w)
return
}
c := appengine.NewContext(r)
if err := r.ParseForm(); err != nil {
ServeError(&c, w, err)
return
}
user := user.Current(c)
project_name := r.FormValue("project_name")
// Check if the project name has already been used.
pkey := user.String() + "::" + project_name
key := datastore.NewKey(c, "EncodedProject", pkey, 0, nil)
var pr EncodedProject
err := datastore.Get(c, key, &pr)
if err == nil {
msg := fmt.Sprintf("A project named \"%s\" belonging to user %s already exists.", project_name, user.String())
return_msg := "Return to dashboard"
Message_page(w, r, user, msg, return_msg, "/dashboard")
return
}
type TV struct {
User string
LoggedIn bool
Name string
Pkey string
}
template_values := new(TV)
template_values.User = user.String()
template_values.LoggedIn = user != nil
template_values.Name = r.FormValue("project_name")
tmpl, err := template.ParseFiles("header.html",
"create_project_step2.html")
if err != nil {
ServeError(&c, w, err)
return
}
if err := tmpl.ExecuteTemplate(w, "create_project_step2.html",
template_values); err != nil {
c.Errorf("Failed to execute template: %v", err)
}
}
作者:kshedde
项目:randomizatio
// Create_project_step1 gets the project name from the user.
func Delete_project_step1(w http.ResponseWriter,
r *http.Request) {
if r.Method != "GET" {
Serve404(w)
return
}
c := appengine.NewContext(r)
user := user.Current(c)
_, projlist, err := GetProjects(user.String(), false, &c)
if err != nil {
msg := "A datastore error occured, your projects cannot be retrieved."
c.Errorf("Delete_project_step1: %v", err)
return_msg := "Return to dashboard"
Message_page(w, r, user, msg, return_msg, "/dashboard")
return
}
if len(projlist) == 0 {
msg := "You are not the owner of any projects. A project can only be deleted by its owner."
return_msg := "Return to dashboard"
Message_page(w, r, user, msg, return_msg, "/dashboard")
return
}
type TV struct {
User string
LoggedIn bool
Proj []*EncodedProjectView
}
template_values := new(TV)
template_values.User = user.String()
template_values.Proj = Format_encoded_projects(projlist)
template_values.LoggedIn = user != nil
tmpl, err := template.ParseFiles("header.html",
"delete_project_step1.html")
if err != nil {
c.Errorf("Delete_project_step1: %v", err)
ServeError(&c, w, err)
return
}
if err := tmpl.ExecuteTemplate(w, "delete_project_step1.html",
template_values); err != nil {
c.Errorf("Delete_project_step1: %v", err)
}
}
作者:kshedde
项目:randomizatio
// Create_project_step1 gets the project name from the user.
func Create_project_step1(w http.ResponseWriter,
r *http.Request) {
if r.Method != "GET" {
Serve404(w)
return
}
c := appengine.NewContext(r)
user := user.Current(c)
type TV struct {
User string
LoggedIn bool
}
template_values := new(TV)
template_values.User = user.String()
template_values.LoggedIn = user != nil
tmpl, err := template.ParseFiles("header.html",
"create_project_step1.html")
if err != nil {
ServeError(&c, w, err)
return
}
if err := tmpl.ExecuteTemplate(w, "create_project_step1.html",
template_values); err != nil {
c.Errorf("Failed to execute template: %v", err)
}
}
作者:kshedde
项目:randomizatio
func Copy_project(w http.ResponseWriter, r *http.Request) {
if r.Method != "GET" {
Serve404(w)
return
}
c := appengine.NewContext(r)
user := user.Current(c)
pkey := r.FormValue("pkey")
ok := Check_access(user, pkey, &c, &w, r)
if !ok {
msg := "Only the project owner can copy a project."
return_msg := "Return to project dashboard"
Message_page(w, r, user, msg, return_msg,
"/project_dashboard?pkey="+pkey)
return
}
key := datastore.NewKey(c, "EncodedProject", pkey, 0, nil)
var eproj EncodedProject
err := datastore.Get(c, key, &eproj)
if err != nil {
c.Errorf("Copy_project: %v", err)
msg := "Unknown datastore error."
return_msg := "Return to project dashboard"
Message_page(w, r, user, msg, return_msg,
"/project_dashboard?pkey="+pkey)
return
}
type TV struct {
User string
LoggedIn bool
Pkey string
ProjectName string
}
template_values := new(TV)
template_values.User = user.String()
template_values.LoggedIn = user != nil
template_values.Pkey = pkey
template_values.ProjectName = eproj.Name
tmpl, err := template.ParseFiles("header.html", "copy_project.html")
if err != nil {
ServeError(&c, w, err)
return
}
if err := tmpl.ExecuteTemplate(w, "copy_project.html",
template_values); err != nil {
c.Errorf("Failed to execute template: %v", err)
}
}
作者:kshedde
项目:randomizatio
func Dashboard(w http.ResponseWriter,
r *http.Request) {
if r.Method != "GET" {
Serve404(w)
return
}
c := appengine.NewContext(r)
user := user.Current(c)
_, projlist, err := GetProjects(user.String(), true, &c)
if err != nil {
msg := "A datastore error occured, projects cannot be retrieved."
c.Errorf("Dashboard: %v", err)
return_msg := "Return to dashboard"
Message_page(w, r, nil, msg, return_msg, "/dashboard")
return
}
type TV struct {
User string
LoggedIn bool
PRN bool
PR []*EncodedProjectView
}
template_values := new(TV)
template_values.User = user.String()
template_values.PR = Format_encoded_projects(projlist)
template_values.PRN = len(projlist) > 0
template_values.LoggedIn = user != nil
tmpl, err := template.ParseFiles("header.html", "dashboard.html")
if err != nil {
ServeError(&c, w, err)
return
}
if err := tmpl.ExecuteTemplate(w, "dashboard.html",
template_values); err != nil {
c.Errorf("Failed to execute template: %v", err)
}
}
作者:kshedde
项目:randomizatio
// Confirm_add_comment
func Confirm_add_comment(w http.ResponseWriter,
r *http.Request) {
if r.Method != "POST" {
Serve404(w)
return
}
c := appengine.NewContext(r)
user := user.Current(c)
pkey := r.FormValue("pkey")
if ok := Check_access(user, pkey, &c, &w, r); !ok {
return
}
proj, err := Get_project_from_key(pkey, &c)
if err != nil {
msg := "Datastore error, unable to add comment."
return_msg := "Return to project"
Message_page(w, r, user, msg, return_msg,
"/project_dashboard?pkey="+pkey)
c.Errorf("Confirm_add_comment [1]: %v", err)
return
}
comment_text := r.FormValue("comment_text")
comment_text = strings.TrimSpace(comment_text)
comment_lines := strings.Split(comment_text, "\n")
if len(comment_text) == 0 {
msg := "No comment was entered."
return_msg := "Return to project"
Message_page(w, r, user, msg, return_msg,
"/project_dashboard?pkey="+pkey)
return
}
comment := new(Comment)
comment.Person = user.String()
comment.DateTime = time.Now()
loc, _ := time.LoadLocation("America/New_York")
t := comment.DateTime.In(loc)
comment.Date = t.Format("2006-1-2")
comment.Time = t.Format("3:04pm")
comment.Comment = comment_lines
proj.Comments = append(proj.Comments, comment)
Store_project(proj, pkey, &c)
msg := "Your comment has been added to the project."
return_msg := "Return to project"
Message_page(w, r, user, msg, return_msg,
"/project_dashboard?pkey="+pkey)
}
作者:kshedde
项目:randomizatio
// Create_project_step4
func Create_project_step4(w http.ResponseWriter,
r *http.Request) {
if r.Method != "POST" {
Serve404(w)
return
}
c := appengine.NewContext(r)
if err := r.ParseForm(); err != nil {
ServeError(&c, w, err)
return
}
user := user.Current(c)
numgroups, _ := strconv.Atoi(r.FormValue("numgroups"))
type TV struct {
User string
LoggedIn bool
Name string
Pkey string
StoreRawData bool
NumGroups int
IX []int
}
// Group numbers (they don't have names yet)
IX := make([]int, numgroups, numgroups)
for i := 0; i < numgroups; i++ {
IX[i] = i + 1
}
template_values := new(TV)
template_values.User = user.String()
template_values.LoggedIn = user != nil
template_values.Name = r.FormValue("project_name")
template_values.StoreRawData = r.FormValue("store_rawdata") == "true"
template_values.IX = IX
template_values.NumGroups = numgroups
tmpl, err := template.ParseFiles("header.html",
"create_project_step4.html")
if err != nil {
ServeError(&c, w, err)
return
}
if err := tmpl.ExecuteTemplate(w, "create_project_step4.html",
template_values); err != nil {
c.Errorf("Failed to execute template: %v", err)
}
}
作者:kshedde
项目:randomizatio
// View_comment
func View_comments(w http.ResponseWriter,
r *http.Request) {
if r.Method != "GET" {
Serve404(w)
return
}
c := appengine.NewContext(r)
user := user.Current(c)
pkey := r.FormValue("pkey")
if ok := Check_access(user, pkey, &c, &w, r); !ok {
return
}
PR, _ := Get_project_from_key(pkey, &c)
PV := Format_project(PR)
for _, c := range PV.Comments {
c.Date = c.DateTime.Format("2006-1-2")
c.Time = c.DateTime.Format("3:04pm")
}
type TV struct {
User string
LoggedIn bool
PR *Project
PV *ProjectView
Pkey string
Any_comments bool
}
template_values := new(TV)
template_values.User = user.String()
template_values.LoggedIn = user != nil
template_values.PR = PR
template_values.PV = PV
template_values.Any_comments = len(PR.Comments) > 0
template_values.Pkey = pkey
tmpl, err := template.ParseFiles("header.html",
"view_comments.html")
if err != nil {
c.Errorf("View_comments: %v", err)
ServeError(&c, w, err)
return
}
if err := tmpl.ExecuteTemplate(w, "view_comments.html",
template_values); err != nil {
c.Errorf("View_comments: %v", err)
}
}
作者:kshedde
项目:randomizatio
func validation_error_step8(w http.ResponseWriter,
r *http.Request) {
if r.Method != "POST" {
Serve404(w)
return
}
c := appengine.NewContext(r)
user := user.Current(c)
if err := r.ParseForm(); err != nil {
ServeError(&c, w, err)
return
}
type TV struct {
User string
LoggedIn bool
Name string
NumGroups int
Pkey string
GroupNames string
StoreRawData bool
Numvar int
SamplingRates string
}
template_values := new(TV)
template_values.User = user.String()
template_values.LoggedIn = user != nil
template_values.Name = r.FormValue("project_name")
template_values.GroupNames = r.FormValue("group_names")
template_values.NumGroups, _ = strconv.Atoi(r.FormValue("numgroups"))
template_values.Numvar, _ = strconv.Atoi(r.FormValue("numvar"))
template_values.StoreRawData = r.FormValue("store_rawdata") == "true"
template_values.SamplingRates = r.FormValue("rates")
tmpl, err := template.ParseFiles("header.html",
"validation_error_step8.html")
if err != nil {
ServeError(&c, w, err)
return
}
if err := tmpl.ExecuteTemplate(w, "validation_error_step8.html",
template_values); err != nil {
c.Errorf("Failed to execute template: %v", err)
}
}
作者:kshedde
项目:randomizatio
// Delete_project_step2 confirms that a project should be deleted.
func Delete_project_step2(w http.ResponseWriter,
r *http.Request) {
if r.Method != "POST" {
Serve404(w)
return
}
c := appengine.NewContext(r)
user := user.Current(c)
if err := r.ParseForm(); err != nil {
ServeError(&c, w, err)
return
}
pkey := r.FormValue("project_list")
svec := strings.Split(pkey, "::")
type TV struct {
User string
LoggedIn bool
ProjectName string
Pkey string
Nokey bool
}
template_values := new(TV)
template_values.User = user.String()
template_values.LoggedIn = user != nil
template_values.Pkey = pkey
if len(svec) >= 2 {
template_values.ProjectName = svec[1]
}
template_values.Nokey = len(pkey) == 0
tmpl, err := template.ParseFiles("header.html",
"delete_project_step2.html")
if err != nil {
c.Errorf("Delete_project_step2: %v", err)
ServeError(&c, w, err)
return
}
if err := tmpl.ExecuteTemplate(w, "delete_project_step2.html",
template_values); err != nil {
c.Errorf("Delete_project_step2: %v", err)
}
}
作者:kshedde
项目:randomizatio
// OpenClose_completed
func OpenClose_completed(w http.ResponseWriter,
r *http.Request) {
if r.Method != "POST" {
Serve404(w)
return
}
c := appengine.NewContext(r)
user := user.Current(c)
pkey := r.FormValue("pkey")
if ok := Check_access(user, pkey, &c, &w, r); !ok {
msg := "You do not have access to this page."
return_msg := "Return"
Message_page(w, r, user, msg, return_msg, "/")
return
}
proj, err := Get_project_from_key(pkey, &c)
if err != nil {
msg := "Datastore error: unable to retrieve project."
return_msg := "Return to project dashboard"
Message_page(w, r, user, msg, return_msg, "/project_dashboard?pkey="+pkey)
return
}
if proj.Owner != user.String() {
msg := "Only the project owner can open or close a project for enrollment."
return_msg := "Return to project dashboard"
Message_page(w, r, user, msg, return_msg, "/project_dashboard?pkey="+pkey)
return
}
status := r.FormValue("open")
if status == "open" {
msg := fmt.Sprintf("The project \"%s\" is now open for enrollment.", proj.Name)
return_msg := "Return to project dashboard"
Message_page(w, r, user, msg, return_msg, "/project_dashboard?pkey="+pkey)
proj.Open = true
} else {
msg := fmt.Sprintf("The project \"%s\" is now closed for enrollment.", proj.Name)
return_msg := "Return to project dashboard"
Message_page(w, r, user, msg, return_msg, "/project_dashboard?pkey="+pkey)
proj.Open = false
}
Store_project(proj, pkey, &c)
}
作者:kshedde
项目:randomizatio
// Add_comment
func Add_comment(w http.ResponseWriter,
r *http.Request) {
if r.Method != "GET" {
Serve404(w)
return
}
c := appengine.NewContext(r)
user := user.Current(c)
pkey := r.FormValue("pkey")
if ok := Check_access(user, pkey, &c, &w, r); !ok {
return
}
proj, _ := Get_project_from_key(pkey, &c)
PV := Format_project(proj)
type TV struct {
User string
LoggedIn bool
PR *Project
PV *ProjectView
Pkey string
}
template_values := new(TV)
template_values.User = user.String()
template_values.LoggedIn = user != nil
template_values.PR = proj
template_values.PV = PV
template_values.Pkey = pkey
tmpl, err := template.ParseFiles("header.html",
"add_comment.html")
if err != nil {
c.Errorf("Add_comment: %v", err)
ServeError(&c, w, err)
return
}
if err := tmpl.ExecuteTemplate(w, "add_comment.html",
template_values); err != nil {
c.Errorf("Add_comment: %v", err)
}
}
作者:kshedde
项目:randomizatio
// Create_project_step3 gets the number of treatment groups.
func Create_project_step3(w http.ResponseWriter,
r *http.Request) {
if r.Method != "POST" {
Serve404(w)
return
}
c := appengine.NewContext(r)
if err := r.ParseForm(); err != nil {
ServeError(&c, w, err)
return
}
user := user.Current(c)
type TV struct {
User string
LoggedIn bool
Name string
Pkey string
StoreRawData bool
}
template_values := new(TV)
template_values.User = user.String()
template_values.LoggedIn = user != nil
template_values.Name = r.FormValue("project_name")
template_values.StoreRawData = r.FormValue("store_rawdata") == "yes"
tmpl, err := template.ParseFiles("header.html",
"create_project_step3.html")
if err != nil {
ServeError(&c, w, err)
return
}
if err := tmpl.ExecuteTemplate(w, "create_project_step3.html",
template_values); err != nil {
c.Errorf("Failed to execute template: %v", err)
}
}
作者:kshedde
项目:randomizatio
// Information_page displays a page of information about this application.
func Information_page(w http.ResponseWriter,
r *http.Request) {
if r.Method != "GET" {
Serve404(w)
return
}
c := appengine.NewContext(r)
user := user.Current(c)
type TV struct {
User string
LoggedIn bool
}
template_values := new(TV)
if user != nil {
template_values.User = user.String()
} else {
template_values.User = ""
}
template_values.LoggedIn = user != nil
tmpl, err := template.ParseFiles("header.html", "information_page.html")
if err != nil {
c.Errorf("Information_page: %v", err)
ServeError(&c, w, err)
return
}
if err := tmpl.ExecuteTemplate(w, "information_page.html",
template_values); err != nil {
c.Errorf("Information page: %v", err)
}
}
作者:kshedde
项目:randomizatio
// Create_project_step6
func Create_project_step6(w http.ResponseWriter,
r *http.Request) {
if r.Method != "POST" {
Serve404(w)
return
}
c := appengine.NewContext(r)
if err := r.ParseForm(); err != nil {
ServeError(&c, w, err)
return
}
user := user.Current(c)
type TV struct {
User string
LoggedIn bool
Name string
Pkey string
GroupNames string
StoreRawData bool
SamplingRates string
NumGroups int
}
numgroups, _ := strconv.Atoi(r.FormValue("numgroups"))
// Get the sampling rates from the previous page
group_names_arr := Clean_split(r.FormValue("group_names"), ",")
sampling_rates := make([]string, numgroups, numgroups)
for i := 0; i < numgroups; i++ {
sampling_rates[i] = r.FormValue(fmt.Sprintf("rate%s", group_names_arr[i]))
x, err := strconv.ParseFloat(sampling_rates[i], 64)
if (err != nil) || (x <= 0) {
msg := "The sampling rates must be positive numbers."
return_msg := "Return to dashboard"
Message_page(w, r, user, msg, return_msg, "/dashboard")
return
}
}
template_values := new(TV)
template_values.User = user.String()
template_values.LoggedIn = user != nil
template_values.Name = r.FormValue("project_name")
template_values.GroupNames = r.FormValue("group_names")
template_values.StoreRawData = r.FormValue("store_rawdata") == "true"
template_values.SamplingRates = strings.Join(sampling_rates, ",")
template_values.NumGroups = numgroups
tmpl, err := template.ParseFiles("header.html", "create_project_step6.html")
if err != nil {
ServeError(&c, w, err)
return
}
if err := tmpl.ExecuteTemplate(w, "create_project_step6.html",
template_values); err != nil {
c.Errorf("Failed to execute template: %v", err)
}
}
作者:kshedde
项目:randomizatio
// Edit_sharing_confirm
func Edit_sharing_confirm(w http.ResponseWriter,
r *http.Request) {
if r.Method != "POST" {
Serve404(w)
return
}
c := appengine.NewContext(r)
user := user.Current(c)
pkey := r.FormValue("pkey")
spkey := strings.Split(pkey, "::")
project_name := spkey[1]
ap := r.FormValue("additional_people")
add_users := []string{}
add_users = Clean_split(ap, ",")
for k, x := range add_users {
add_users[k] = strings.ToLower(x)
}
// Gmail addresses don't use @gmail.com.
invalid_emails := make([]string, 0)
for k, x := range add_users {
uparts := strings.Split(x, "@")
if len(uparts) != 2 {
invalid_emails = append(invalid_emails, x)
} else {
if uparts[1] == "gmail.com" {
add_users[k] = uparts[0]
}
}
}
if len(invalid_emails) > 0 {
msg := "The project was not shared because the following email addresses are not valid: "
msg += strings.Join(invalid_emails, ", ") + "."
return_msg := "Return to project"
Message_page(w, r, user, msg, return_msg, "/project_dashboard?pkey="+pkey)
return
}
var err error
err = Add_sharing(pkey, add_users, &c)
if err != nil {
msg := "Datastore error: unable to update sharing information."
return_msg := "Return to dashboard"
Message_page(w, r, user, msg, return_msg, "/dashboard")
c.Errorf("Edit_sharing_confirm [1]: %v", err)
return
}
remove_users := r.Form["remove_users"]
err = Remove_sharing(pkey, remove_users, &c)
if err != nil {
msg := "Datastore error: unable to update sharing information."
return_msg := "Return to dashboard"
Message_page(w, r, user, msg, return_msg, "/dashboard")
c.Errorf("Edit_sharing_confirm [2]: %v", err)
return
}
type TV struct {
User string
LoggedIn bool
ProjectName string
Pkey string
}
template_values := new(TV)
template_values.User = user.String()
template_values.LoggedIn = user != nil
template_values.ProjectName = project_name
template_values.Pkey = pkey
tmpl, err := template.ParseFiles("header.html",
"edit_sharing_confirm.html")
if err != nil {
ServeError(&c, w, err)
return
}
if err := tmpl.ExecuteTemplate(w, "edit_sharing_confirm.html",
template_values); err != nil {
c.Errorf("Failed to execute template: %v", err)
}
}
作者:kshedde
项目:randomizatio
// Create_project_step8
func Create_project_step8(w http.ResponseWriter,
r *http.Request) {
if r.Method != "POST" {
Serve404(w)
return
}
c := appengine.NewContext(r)
user := user.Current(c)
if err := r.ParseForm(); err != nil {
ServeError(&c, w, err)
return
}
numgroups, _ := strconv.Atoi(r.FormValue("numgroups"))
numvar, _ := strconv.Atoi(r.FormValue("numvar"))
variables, ok := process_variable_info(r, numvar)
if !ok {
validation_error_step8(w, r)
return
}
type TV struct {
User string
LoggedIn bool
Name string
Pkey string
IX []int
GroupNames string
StoreRawData bool
NumGroups int
Numvar int
Variables string
SamplingRates string
}
IX := make([]int, numvar, numvar)
for i := 0; i < numvar; i++ {
IX[i] = i + 1
}
template_values := new(TV)
template_values.User = user.String()
template_values.LoggedIn = user != nil
template_values.Name = r.FormValue("project_name")
template_values.GroupNames = r.FormValue("group_names")
template_values.IX = IX
template_values.NumGroups = numgroups
template_values.Numvar = numvar
template_values.Variables = variables
template_values.StoreRawData = r.FormValue("store_rawdata") == "true"
template_values.SamplingRates = r.FormValue("rates")
tmpl, err := template.ParseFiles("header.html",
"create_project_step8.html")
if err != nil {
ServeError(&c, w, err)
return
}
if err := tmpl.ExecuteTemplate(w, "create_project_step8.html",
template_values); err != nil {
c.Errorf("Failed to execute template: %v", err)
}
}
作者:kshedde
项目:randomizatio
func Copy_project_completed(w http.ResponseWriter, r *http.Request) {
if r.Method != "GET" {
Serve404(w)
return
}
c := appengine.NewContext(r)
user := user.Current(c)
pkey := r.FormValue("pkey")
ok := Check_access(user, pkey, &c, &w, r)
if !ok {
msg := "You do not have access to the requested project."
return_msg := "Return to project dashboard"
Message_page(w, r, user, msg, return_msg,
"/project_dashboard?pkey="+pkey)
return
}
key := datastore.NewKey(c, "EncodedProject", pkey, 0, nil)
var eproj EncodedProject
err := datastore.Get(c, key, &eproj)
if err != nil {
msg := "Unknown error, the project was not copied."
return_msg := "Return to dashboard"
Message_page(w, r, user, msg, return_msg, "/dashboard")
c.Errorf("Copy_project: %v", err)
return
}
eproj_copy := Copy_encoded_project(&eproj)
// Check if the name is valid (not blank)
new_name := r.FormValue("new_project_name")
new_name = strings.TrimSpace(new_name)
if len(new_name) == 0 {
msg := "A name for the new project must be provided."
return_msg := "Return to project dashboard"
Message_page(w, r, user, msg, return_msg,
"/project_dashboard?pkey="+pkey)
return
}
eproj_copy.Name = new_name
// The owner of the copied project is the current user
eproj_copy.Owner = user.String()
// Check if the project name has already been used.
new_pkey := user.String() + "::" + new_name
new_key := datastore.NewKey(c, "EncodedProject", new_pkey, 0, nil)
var pr EncodedProject
err = datastore.Get(c, new_key, &pr)
if err == nil {
msg := fmt.Sprintf("A project named \"%s\" belonging to user %s already exists.", new_name,
user.String())
return_msg := "Return to dashboard"
Message_page(w, r, user, msg, return_msg, "/dashboard")
return
}
_, err = datastore.Put(c, new_key, eproj_copy)
if err != nil {
c.Errorf("Copy_project: %v", err)
msg := "Unknown error, the project was not copied."
return_msg := "Return to dashboard"
Message_page(w, r, user, msg, return_msg, "/dashboard")
return
}
c.Infof("Copied %s to %s", pkey, new_pkey)
msg := "The project has been successfully copied."
return_msg := "Return to dashboard"
Message_page(w, r, user, msg, return_msg, "/dashboard")
return
}
作者:kshedde
项目:randomizatio
// Assign_treatment
func Assign_treatment(w http.ResponseWriter,
r *http.Request) {
if r.Method != "POST" {
Serve404(w)
return
}
c := appengine.NewContext(r)
user := user.Current(c)
pkey := r.FormValue("pkey")
if ok := Check_access(user, pkey, &c, &w, r); !ok {
return
}
if err := r.ParseForm(); err != nil {
ServeError(&c, w, err)
return
}
proj, err := Get_project_from_key(pkey, &c)
if err != nil {
c.Errorf("Assign_treatment %v", err)
msg := "A datastore error occured, the project could not be loaded."
return_msg := "Return to dashboard"
Message_page(w, r, user, msg, return_msg, "/dashboard")
return
}
subject_id := r.FormValue("subject_id")
// Check this a second time in case someone lands on this page
// without going through the previous checks
// (e.g. inappropriate use of back button on browser).
ok := check_before_assigning(proj, pkey, subject_id, user, w, r)
if !ok {
return
}
pview := Format_project(proj)
fields := strings.Split(r.FormValue("fields"), ",")
values := strings.Split(r.FormValue("values"), ",")
// mpv maps variable names to values for the unit that is about
// to be randomized to a treatment group.
mpv := make(map[string]string)
for i, x := range fields {
mpv[x] = values[i]
}
ax, err := Do_assignment(&mpv, proj, subject_id, user.String())
if err != nil {
c.Errorf("%v", err)
}
proj.Modified = time.Now()
// Update the project in the database.
eproj, _ := Encode_Project(proj)
key := datastore.NewKey(c, "EncodedProject", pkey, 0, nil)
_, err = datastore.Put(c, key, eproj)
if err != nil {
c.Errorf("Assign_treatment: %v", err)
msg := "A datastore error occured, the project could not be updated."
return_msg := "Return to dashboard"
Message_page(w, r, user, msg, return_msg, "/dashboard")
return
}
type TV struct {
User string
LoggedIn bool
PR *Project
PV *ProjectView
NumGroups int
Ax string
Pkey string
}
template_values := new(TV)
template_values.User = user.String()
template_values.LoggedIn = user != nil
template_values.Ax = ax
template_values.PR = proj
template_values.PV = pview
template_values.NumGroups = len(proj.GroupNames)
template_values.Pkey = pkey
tmpl, err := template.ParseFiles("header.html",
"assign_treatment.html")
if err != nil {
ServeError(&c, w, err)
return
}
if err := tmpl.ExecuteTemplate(w, "assign_treatment.html",
template_values); err != nil {
//.........这里部分代码省略.........