예제 #1
0
// Controller for path sort form.
func SortPathForm(w *wrapper.Wrapper) {
	var parentid string
	if len(w.APIParams) > 0 {
		parentid = w.APIParams[0]
	} else {
		http.Error(w.Writer, "Forbidden", 403)
		w.Serve()
		return
	}
	p, err := paths.LoadPath(parentid, w)
	if err != nil {
		errmessage := fmt.Sprintf("Path not found to sort for %s by %s.", parentid, w.Request.Host)
		w.SiteConfig.Logger.Error(errmessage)
		services.AddMessage("This element was not found", "Error", w)
		w.Serve()
		return
	} else {
		if len(p.Elements) > 0 {
			w.SetPayload("elements", p.Elements)
		} else {
			services.AddMessage("This has no elements assigned yet.", "Error", w)
		}
		w.SetTemplate("admin/element_sorter.html")
		w.Serve()
		return
	}
}
예제 #2
0
파일: path.go 프로젝트: bdatchar/mongolar
// Controller to present path editor form
func PathEditorForm(w *wrapper.Wrapper) {
	pathid := w.APIParams[0]
	f := form.NewForm()
	f.AddText("title", "text").AddLabel("Title").Required()
	f.AddText("path", "text").AddLabel("Path").Required()
	f.AddText("template", "text").AddLabel("Template").Required()
	f.AddCheckBox("wildcard").AddLabel("Wildcard")
	ops := []map[string]string{
		map[string]string{"name": "published", "value": "published"},
		map[string]string{"name": "unpublished", "value": "unpublished"},
	}
	f.AddRadio("status", ops).AddLabel("Status").Required()
	f.AddText("id", "text").Hidden()
	var p paths.Path
	var err error
	if pathid != "new" {
		p, err = paths.LoadPath(pathid, w)
		if err != nil {
			errmessage := fmt.Sprintf("Could not retrieve path %s by %s: %s", w.APIParams[0], w.Request.Host, err.Error())
			w.SiteConfig.Logger.Error(errmessage)
			services.AddMessage("Error retrieving path information.", "Error", w)
			w.Serve()
			return
		}
	} else {
		p = paths.NewPath()
	}
	f.FormData = p
	f.Register(w)
	w.SetTemplate("admin/form.html")
	w.SetPayload("form", f)
	w.Serve()
	return
}
예제 #3
0
// Controller for content editing form.
func ContentEditorForm(w *wrapper.Wrapper) {
	elementid := w.APIParams[0]
	e, err := elements.LoadContentElement(elementid, w)
	if err != nil {
		errmessage := fmt.Sprintf("Element not found to edit for %s by %s", elementid, w.Request.Host)
		w.SiteConfig.Logger.Error(errmessage)
		services.AddMessage("This element was not found", "Error", w)
		w.Serve()
		return
	}
	if e.ContentValues.Type == "" {
		errmessage := fmt.Sprintf("No content type set for %s", elementid, w.Request.Host)
		w.SiteConfig.Logger.Error(errmessage)
		services.AddMessage("This element doesn't have a content type set.  Set a content type to edit values.", "Error", w)
		w.Serve()
		return
	}
	var ct contenttypes.ContentType
	ct, err = contenttypes.LoadContentTypeT(e.ContentValues.Type, w)
	if err != nil {
		errmessage := fmt.Sprintf("Unable to find content type %s : %s", e.ContentValues.Type, err.Error())
		w.SiteConfig.Logger.Error(errmessage)
		services.AddMessage("Unable to find content type.", "Error", w)
		w.Serve()
		return
	}
	f := form.NewForm()
	f.Fields = ct.Form
	f.FormData = e.ContentValues.Content
	f.Register(w)
	w.SetTemplate("admin/form.html")
	w.SetPayload("form", f)
	w.Serve()
	return
}
예제 #4
0
파일: slug.go 프로젝트: bdatchar/mongolar
func SlugUrlEditorForm(w *wrapper.Wrapper) {
	slugid := w.APIParams[0]
	e, err := elements.LoadSlugElement(slugid, w)
	if err != nil {
		errmessage := fmt.Sprintf("Element not found to edit for %s by %s", slugid, w.Request.Host)
		w.SiteConfig.Logger.Error(errmessage)
		services.AddMessage("Unable to load slug parent", "Error", w)
		w.Serve()
		return
	}
	f := form.NewForm()
	data := make(map[string]string)
	for slug, id := range e.Slugs {
		data[id] = slug
		e := elements.NewElement()
		err = elements.GetById(id, &e, w)
		if err != nil {
			errmessage := fmt.Sprintf("Content not found %s : %s", id, err.Error())
			w.SiteConfig.Logger.Error(errmessage)
			services.AddMessage("There was a problem loading some slug elements.", "Error", w)
			w.Serve()
			return
		}
		f.AddText(id, "text").AddLabel(e.Title).Required()

	}
	f.FormData = data
	f.Register(w)
	w.SetTemplate("admin/form.html")
	w.SetPayload("form", f)
	w.Serve()
	return
}
예제 #5
0
func EditContentTypeForm(w *wrapper.Wrapper) {
	f := form.NewForm()
	ct := new(ContentType)
	if w.APIParams[0] != "new" {
		c := w.DbSession.DB("").C("content_types")
		i := bson.M{"_id": bson.ObjectIdHex(w.APIParams[0])}
		err := c.Find(i).One(ct)
		if err != nil {
			errmessage := fmt.Sprintf("Content Type not found %s : %s", w.APIParams[0], err.Error())
			w.SiteConfig.Logger.Error(errmessage)
			services.AddMessage("Your content types was not found ", "Error", w)
			w.Serve()
			return
		}
		var elements []map[string]interface{}
		for _, field := range ct.Form {
			element := make(map[string]interface{})
			element["type"] = field.Type
			element["key"] = field.Key
			element["label"] = field.TemplateOptions.Label
			element["placeholder"] = field.TemplateOptions.Placeholder
			element["rows"] = field.TemplateOptions.Rows
			element["cols"] = field.TemplateOptions.Cols
			element["options"] = ""
			for _, opt := range field.TemplateOptions.Options {
				element["options"] = fmt.Sprintf("%s%s|%s\n", element["options"], opt["name"], opt["value"])
			}
			elements = append(elements, element)
		}
		data := make(map[string]interface{})
		data["elements"] = elements
		data["content_type"] = ct.Type
		f.FormData = data
	} else {
		data := make(map[string]interface{})
		fd := make([]map[string]string, 0)
		data["elements"] = fd
		data["content_type"] = ""
		f.FormData = data
	}
	f.AddText("content_type", "text").AddLabel("Content Type Name")
	f.AddRepeatSection("elements", "Add another field", FieldFormGroup())
	f.Register(w)
	w.SetPayload("form", f)
	w.SetTemplate("admin/form.html")
	w.Serve()
	return

}
예제 #6
0
func GetAllContentTypes(w *wrapper.Wrapper) {
	c := w.DbSession.DB("").C("content_types")
	var cts []ContentType
	err := c.Find(nil).Limit(50).Iter().All(&cts)
	if err != nil {
		errmessage := fmt.Sprintf("Unable to retrieve a list of content types.")
		w.SiteConfig.Logger.Error(errmessage)
		services.AddMessage("Unable to retrieve a list of elements.", "Error", w)
		w.Serve()
		return
	}
	w.SetPayload("content_types", cts)
	w.Serve()
	return
}
예제 #7
0
// Controller to list all elements
func AllElements(w *wrapper.Wrapper) {
	c := w.DbSession.DB("").C("elements")
	var es []elements.Element
	err := c.Find(nil).Limit(50).Iter().All(&es)
	if err != nil {
		errmessage := fmt.Sprintf("Unable to retrieve a list of all elements: %s", err.Error())
		w.SiteConfig.Logger.Error(errmessage)
		services.AddMessage("There was a problem retrieving the element list.", "Error", w)
		w.Serve()
		return
	}
	w.SetPayload("elements", es)
	w.Serve()
	return
}
예제 #8
0
func (lo *LoginMap) LoginUrls(w *wrapper.Wrapper) {
	us := make(map[string]map[string]string)
	oauthlogins := make(map[string]map[string]string)
	w.SiteConfig.RawConfig.MarshalKey("OAuthLogins", &oauthlogins)
	for k, l := range oauthlogins {
		c := "http://" + w.Request.Host + "/" + w.SiteConfig.APIEndPoint + "/login/callback/" + k
		login := lo.Logins[k]
		login.SetConfig(l, c, lo.State)
		u := login.GetUrl()
		m := map[string]string{"url": u, "login_text": l["login_text"]}
		us[k] = m
	}
	w.SetPayload("login_links", us)
	w.Serve()
	return
}
예제 #9
0
func GetContentType(w *wrapper.Wrapper) {
	c := w.DbSession.DB("").C("content_types")
	i := bson.M{"_id": bson.ObjectIdHex(w.APIParams[0])}
	var ct ContentType
	err := c.Find(i).One(&ct)
	if err != nil {
		errmessage := fmt.Sprintf("Content Type not found %s : %s", w.APIParams[0], err.Error())
		w.SiteConfig.Logger.Error(errmessage)
		services.AddMessage("Your content types was not found.", "Error", w)
		w.Serve()
		return
	}
	w.SetPayload("content_type", ct)
	w.Serve()
	return
}
예제 #10
0
파일: paths.go 프로젝트: bdatchar/mongolar
// The controller function to retrieve elements ids from the path
func PathValues(w *wrapper.Wrapper) {
	// Request is never url based so we can Never cache this request.
	// TODO: move no caching into a reusable function.
	w.Writer.Header().Add("Cache-Control", "no-cache, no-store, must-revalidate")
	w.Writer.Header().Add("Pragma", "no-cache")
	w.Writer.Header().Add("Expires", "0")
	p := paths.NewPath()
	u := w.Request.Header.Get("CurrentPath")
	if u == "" {
		http.Error(w.Writer, "Forbidden", 403)
		w.Serve()
		return
	}
	qp, err := p.PathMatch(u, "published", w)
	if err != nil {
		if err.Error() == "not found" {
			if "/"+w.SiteConfig.FourOFour != u {
				services.Redirect("/"+w.SiteConfig.FourOFour, w)
				w.Serve()
				return
			} else {
				services.AddMessage("There was a problem with the system.", "Error", w)
				w.Serve()
				return
			}

		}

	}
	var v []elements.Element
	for _, eid := range p.Elements {
		e := elements.NewElement()
		err = elements.GetById(eid, &e, w)
		if err != nil {
			errmessage := fmt.Sprintf("Content not found %s : %s", eid, err.Error())
			w.SiteConfig.Logger.Error(errmessage)
		} else {
			v = append(v, e)
		}
	}
	w.SetPayload("mongolar_slug", qp)
	w.SetContent(v)
	w.SetTemplate(p.Template)
	w.Serve()
	return
}
예제 #11
0
// Controller to render an element in content editor
func Element(w *wrapper.Wrapper) {
	e := elements.NewElement()
	var id string
	if len(w.APIParams) == 0 {
		http.Error(w.Writer, "Forbidden", 403)
		return
	} else {
		id = w.APIParams[0]
	}
	err := elements.GetById(id, &e, w)
	if err != nil {
		errmessage := fmt.Sprintf("Element not found to edit for %s by %s.", id, w.Request.Host)
		w.SiteConfig.Logger.Error(errmessage)
		services.AddMessage("This element was not found", "Error", w)
	} else {
		w.SetPayload("mongolarid", e.MongoId.Hex())
		w.SetPayload("title", e.Title)
		w.SetPayload("mongolartype", e.Controller)
		w.SetDynamicId(e.MongoId.Hex())
		if e.Controller == "wrapper" {
			we, err := elements.LoadWrapperElement(id, w)
			if err != nil {
				errmessage := fmt.Sprintf("Element not found to edit for %s by %s.", id, w.Request.Host)
				w.SiteConfig.Logger.Error(errmessage)
				services.AddMessage("This element was not found", "Error", w)
			}
			w.SetPayload("elements", we.Elements)
		}
		if e.Controller == "slug" {
			we, err := elements.LoadSlugElement(id, w)
			if err != nil {
				errmessage := fmt.Sprintf("Element not found to edit for %s by %s.", id, w.Request.Host)
				w.SiteConfig.Logger.Error(errmessage)
				services.AddMessage("This element was not found", "Error", w)
			}
			w.SetPayload("elements", we.Slugs)
		}
	}
	w.Serve()
}
예제 #12
0
파일: path.go 프로젝트: bdatchar/mongolar
// Retrieve a list of elements in a path for content editor.
func PathElements(w *wrapper.Wrapper) {
	if len(w.APIParams) == 0 {
		http.Error(w.Writer, "Forbidden", 403)
		w.Serve()
		return
	}
	pathid := w.APIParams[0]
	p, err := paths.LoadPath(pathid, w)
	if err != nil {
		errmessage := fmt.Sprintf("Path not found to edit for %s by %s ", pathid, w.Request.Host)
		w.SiteConfig.Logger.Error(errmessage)
		services.AddMessage("This path was not found", "Error", w)
		w.Serve()
	} else {
		w.SetPayload("path", p)
		if len(p.Elements) == 0 {
			services.AddMessage("This path has no elements.", "Info", w)
		}
		w.Serve()
	}

}
예제 #13
0
// Controller to ddisplay form to change content type for conteent element
func ContentTypeEditorForm(w *wrapper.Wrapper) {
	elementid := w.APIParams[0]
	e, err := elements.LoadContentElement(elementid, w)
	if err != nil {
		errmessage := fmt.Sprintf("Element not found to edit for %s by %s", elementid, w.Request.Host)
		w.SiteConfig.Logger.Error(errmessage)
		services.AddMessage("This element was not found", "Error", w)
		w.Serve()
		return
	}
	cts := make([]contenttypes.ContentType, 0)
	cts, err = contenttypes.AllContentTypes(w)
	if err != nil {
		errmessage := fmt.Sprintf("Unable to query all Content Types: %s", err.Error())
		w.SiteConfig.Logger.Error(errmessage)
		services.AddMessage("Unable to retrieve content types.", "Error", w)
		w.Serve()
		return
	}
	opts := make([]map[string]string, 0)
	for _, ct := range cts {
		opt := map[string]string{
			"name":  ct.Type,
			"value": ct.Type,
		}
		opts = append(opts, opt)
	}
	f := form.NewForm()
	f.AddSelect("type", opts)
	data := map[string]string{"type": e.ContentValues.Type}
	f.FormData = data
	f.Register(w)
	w.SetTemplate("admin/form.html")
	w.SetPayload("form", f)
	w.Serve()
	return

}
예제 #14
0
// Controller for adding existing element form.
func AddExistingChildForm(w *wrapper.Wrapper) {
	elems, err := elements.ElementList(w)
	if err != nil {
		errmessage := fmt.Sprintf("Unable to retrieve a list of all elements: %s", err.Error())
		w.SiteConfig.Logger.Error(errmessage)
		services.AddMessage("There was a problem retrieving the element list.", "Error", w)
		w.Serve()
		return
	}
	options := make([]map[string]string, 0)
	for _, element := range elems {
		option := map[string]string{"name": element.Title, "value": element.MongoId.Hex(), "group": element.Controller}
		options = append(options, option)
	}
	f := form.NewForm()
	f.AddSelect("element", options).AddLabel("Element").Required()
	f.Register(w)
	w.SetTemplate("admin/form.html")
	w.SetPayload("form", f)
	w.Serve()
	return

}
예제 #15
0
func (lo *LoginMap) Logout(w *wrapper.Wrapper) {
	w.SetPayload("logout", "test logout")
	w.Serve()
	return
}
예제 #16
0
파일: orphan.go 프로젝트: bdatchar/mongolar
// Controller to retrive a list of all orphaned elements.
func OrphanElements(w *wrapper.Wrapper) {
	assigned := make([]bson.ObjectId, 0)
	paths, err := paths.PathList(w)
	if err != nil {
		errmessage := fmt.Sprintf("Could not retrieve path elements for orphan list: %s", err.Error())
		w.SiteConfig.Logger.Error(errmessage)
		services.AddMessage("Could not retrieve path elements.", "Error", w)
		w.Serve()
	}
	for _, path := range paths {
		for _, element := range path.Elements {
			id := bson.ObjectIdHex(element)
			assigned = append(assigned, id)
		}
	}
	wrappers := make([]elements.WrapperElement, 0)
	c := w.DbSession.DB("").C("elements")
	s := bson.M{"controller": "wrapper"}
	i := c.Find(s).Limit(50).Iter()
	err = i.All(&wrappers)
	if err != nil {
		errmessage := fmt.Sprintf("Could not retrieve wrapper elements for orphan list: %s", err.Error())
		w.SiteConfig.Logger.Error(errmessage)
		services.AddMessage("Could not retrieve wrapper elements.", "Error", w)
		w.Serve()
	}
	for _, wrapper := range wrappers {
		for _, eid := range wrapper.Elements {
			bsonid := bson.ObjectIdHex(eid)
			assigned = append(assigned, bsonid)
		}
	}
	slugs := make([]elements.SlugElement, 0)
	s = bson.M{"controller": "slug"}
	i = c.Find(s).Limit(50).Iter()
	err = i.All(&slugs)
	if err != nil {
		errmessage := fmt.Sprintf("Could not retrieve slug elements for orphan list: %s", err.Error())
		w.SiteConfig.Logger.Error(errmessage)
		services.AddMessage("Could not retrieve slug elements.", "Error", w)
		w.Serve()
	}
	for _, slug := range slugs {
		for _, eid := range slug.Slugs {
			bsonid := bson.ObjectIdHex(eid)
			assigned = append(assigned, bsonid)
		}
	}
	unassigned := new([]elements.Element)
	s = bson.M{"_id": bson.M{"$nin": assigned}}
	i = c.Find(s).Limit(50).Iter()
	err = i.All(unassigned)
	if err != nil {
		errmessage := fmt.Sprintf("Could not retrieve unassigned elements: %s", err.Error())
		w.SiteConfig.Logger.Error(errmessage)
		services.AddMessage("Could not retrieve unassigned elements.", "Error", w)
		w.Serve()
	}
	w.SetTemplate("admin/orphan_path_elements.html")
	w.SetPayload("elements", unassigned)
	w.Serve()
	return
}
예제 #17
0
// Controller to edit an elements properties
// TODO: break this into smaller functions to make it easier to maintain
func ElementEditor(w *wrapper.Wrapper) {
	var elementid string
	if len(w.APIParams) > 0 {
		elementid = w.APIParams[0]
	} else {
		http.Error(w.Writer, "Forbidden", 403)
	}
	if w.Request.Method != "POST" {
		f := form.NewForm()
		f.AddText("title", "text").AddLabel("Title")
		op := make([]map[string]string, 0)
		for _, ec := range w.SiteConfig.ElementControllers {
			uc := []rune(ec)
			uc[0] = unicode.ToUpper(uc[0])
			name := string(uc)
			op = append(op, map[string]string{"name": name, "value": ec})
		}
		f.AddSelect("controller", op).AddLabel("Controller")
		f.AddText("template", "text").AddLabel("Template")
		f.AddText("dyn", "text").AddLabel("Dynamic Id")
		f.AddText("classes", "text").AddLabel("Classes")
		f.AddText("id", "text").Hidden()
		if elementid != "new" {
			e := elements.NewElement()
			err := elements.GetById(elementid, &e, w)
			if err != nil {
				errmessage := fmt.Sprintf("Element not found to edit for %s by %s", elementid, w.Request.Host, err.Error())
				w.SiteConfig.Logger.Error(errmessage)
				services.AddMessage("This element was not found", "Error", w)
				w.Serve()
				return
			}
			// Have to do this for namespacing stuff on the AngularJs side.
			data := map[string]string{
				"controller": e.Controller,
				"template":   e.Template,
				"dyn":        e.DynamicId,
				"classes":    e.Classes,
				"id":         e.MongoId.Hex(),
				"title":      e.Title,
			}
			f.FormData = data
		}
		f.Register(w)
		w.SetTemplate("admin/form.html")
		w.SetPayload("form", f)
	} else {
		post := make(map[string]string)
		err := form.GetValidFormData(w, &post)
		if err != nil {
			return
		} else {
			c := w.DbSession.DB("").C("elements")
			if post["mongolarid"] == "new" {
				p := elements.Element{
					Controller: post["controller"],
					DynamicId:  post["dyn"],
					Template:   post["template"],
					Title:      post["title"],
					Classes:    post["classes"],
				}
				err := c.Insert(p)
				if err != nil {
					errmessage := fmt.Sprintf("Unable to save new element by %s : %s", w.Request.Host, err.Error())
					w.SiteConfig.Logger.Error(errmessage)
					services.AddMessage("There was a problem saving your element.", "Error", w)
				} else {
					services.AddMessage("Your element was saved.", "Success", w)
				}
			} else {
				p := bson.M{
					"$set": bson.M{
						"template":   post["template"],
						"title":      post["title"],
						"dynamic_id": post["dyn"],
						"controller": post["controller"],
						"classes":    post["classes"],
					},
				}
				s := bson.M{"_id": bson.ObjectIdHex(post["mongolarid"])}
				err := c.Update(s, p)
				if err != nil {
					errmessage := fmt.Sprintf("Unable to save element %s by %s : %s",
						post["mongolarid"], w.Request.Host, err.Error())
					w.SiteConfig.Logger.Error(errmessage)
					services.AddMessage("There was a problem saving your element.", "Error", w)
				} else {
					services.AddMessage("Your element was saved.", "Success", w)
					dynamic := services.Dynamic{
						Target:     post["mongolarid"],
						Id:         post["mongolarid"],
						Controller: "admin/element",
						Template:   "admin/element.html",
					}
					services.SetDynamic(dynamic, w)
				}
			}
		}
	}
	w.Serve()
	return
}
예제 #18
0
파일: menu.go 프로젝트: bdatchar/mongolar
// Controller to edit a menu element
// TODO: break this into smaller functions
func MenuEditor(w *wrapper.Wrapper) {
	if len(w.APIParams) == 0 {
		http.Error(w.Writer, "Forbidden", 403)
		return
	}
	menuid := w.APIParams[0]
	if w.Request.Method != "POST" {
		e, err := elements.LoadMenuElement(menuid, w)
		if err != nil {
			errmessage := fmt.Sprintf("Element not found to edit for %s by %s.", menuid, w.Request.Host)
			w.SiteConfig.Logger.Error(errmessage)
			services.AddMessage("This element was not found", "Error", w)
			w.Serve()
			return
		}
		if e.MenuItems == nil {
			items := make(map[string][]map[string]string)
			items["menu_items"] = make([]map[string]string, 0)
			w.SetPayload("menu", items)
		} else {
			w.SetPayload("menu", e)
		}
		w.SetPayload("title", e.Title)
		w.SetTemplate("admin/menu_editor.html")
		w.Serve()
		return
	} else {
		e, err := elements.LoadMenuElement(menuid, w)
		if err != nil {
			errmessage := fmt.Sprintf("Element not found to edit for %s by %s.", menuid, w.Request.Host)
			w.SiteConfig.Logger.Error(errmessage)
			services.AddMessage("This element was not found", "Error", w)
			w.Serve()
			return
		}
		err = json.NewDecoder(w.Request.Body).Decode(&e)
		if err != nil {
			errmessage := fmt.Sprintf("Unable to update marshall menu elements by %s: %s", w.Request.Host, err.Error())
			w.SiteConfig.Logger.Error(errmessage)
			services.AddMessage("Unable to save menu element.", "Error", w)
			w.Serve()
			return
		}
		err = e.Save(w)
		if err != nil {
			errmessage := fmt.Sprintf("Unable to update menu element %s by %s: %s", menuid, w.Request.Host, err.Error())
			w.SiteConfig.Logger.Error(errmessage)
			services.AddMessage("Unable to save menu element.", "Error", w)
			w.Serve()
			return
		}
		dynamic := services.Dynamic{
			Target:     "modaleditor",
			Controller: "",
			Template:   "",
			Id:         "",
		}
		services.SetDynamic(dynamic, w)
		services.AddMessage("You menu element have been updated.", "Success", w)
		w.Serve()
	}

}