コード例 #1
0
ファイル: app.py プロジェクト: philchristensen/modu
def get_process_info():
	"""
	Debug info table that can be appended to error output.
	Currently unused (a potential security risk, but good for debugging)
	"""
	import thread
	return tags.table()[[
		tags.tr()[[
			tags.th()['Thread Name:'],
			tags.td()[thread.get_ident()]
		]],
		tags.tr()[[
			tags.th()['Process ID:'],
			tags.td()[os.getpid()]
		]],
		tags.tr()[[
			tags.th()['Python Path:'],
			tags.td()[str(sys.path)]
		]],
		tags.tr()[[
			tags.th()['Site Tree:'],
			tags.td()[tags.encode_htmlentities(str(host_tree))]
		]],
	]]
コード例 #2
0
ファイル: resource.py プロジェクト: philchristensen/modu
    def prepare_detail(self, req, itemdef):
        """
		Handle creation and display of the detail page.
		
		@param req: the current request
		@type req: L{modu.web.app.Request}
		
		@param itemdef: the itemdef to use to generate the form
		@type itemdef: L{modu.editable.define.itemdef}
		"""
        self.template = itemdef.config.get("detail_template", "admin-detail.html.tmpl")
        self.set_slot("form", None)
        if len(req.postpath) > 2:
            item_id = req.postpath[2]
            table_name = itemdef.config.get("table", itemdef.name)

            if item_id == "new":
                if not (itemdef.creatable(req)):
                    app.raise403("You are not allowed to delete `%s` records." % storable.get_table())

                if "model_class" in itemdef.config:
                    selected_item = itemdef.config["model_class"]()
                else:
                    selected_item = storable.Storable(table_name)

                    # Populate the new item if necessary
                query_data = form.parse_query_string(req)
                if "__init__" in query_data:
                    for k, v in query_data["__init__"].items():
                        setattr(selected_item, k, v.value)

                        # we can be sure the factory is there, because configure_store
                        # already took care of it during prepare_content
                factory = req.store.get_factory(table_name)
                selected_item.set_factory(factory)
            else:
                try:
                    selected_item = req.store.load_one(table_name, {"id": int(item_id)})
                    if selected_item is None:
                        app.raise404("Couldn't load %s record #%s" % (table_name, item_id))
                except ValueError:
                    app.raise404("There is no detail view at the path: %s" % req["REQUEST_URI"])

            frm = itemdef.get_form(req, selected_item)
            if "theme" in itemdef.config:
                frm.theme = itemdef.config["theme"]

            frm["referer"](type="hidden", value=req.get("HTTP_REFERER", ""))

            if frm.execute(req):
                # we regenerate the form because some fields don't know their
                # value until after the form is saved (e.g., postwrite fields)
                new_frm = itemdef.get_form(req, selected_item)
                # this is technically only necessary if errors are reported
                # on form items but they do not prevent completion (e.g., return False)
                new_frm.errors = frm.errors
                frm = new_frm
            else:
                # If we haven't submitted the form, errors should definitely be empty
                def error_formatter(req, field, err):
                    return tags.a(href="#form-item-%s" % field)[err]

                frm.escalate_errors(req, formatter=error_formatter)

            template_variable_callback = itemdef.config.get("template_variable_callback")
            if callable(template_variable_callback):
                result = template_variable_callback(req, frm, selected_item)
                if isinstance(result, dict):
                    for key, value in result.items():
                        self.set_slot(key, value)

            self.set_slot("form", frm)
            self.set_slot("theme", frm.get_theme(req))
            self.set_slot("selected_item", selected_item)

            if "title_column" in itemdef.config and item_id != "new":
                item_name = "'%s'" % getattr(selected_item, itemdef.config["title_column"])
            else:
                item_name = "#" + str(selected_item.get_id())
            default_title = "Details for %s %s" % (itemdef.name.title(), item_name)
            custom_title = itemdef.config.get("detail_title", default_title)
            self.set_slot("title", tags.encode_htmlentities(custom_title))
        else:
            app.raise404("There is no detail view at the path: %s" % req["REQUEST_URI"])
コード例 #3
0
ファイル: resource.py プロジェクト: philchristensen/modu
    def prepare_listing(self, req, itemdef):
        """
		Handle creation and display of the listing page.
		
		@param req: the current request
		@type req: L{modu.web.app.Request}
		
		@param itemdef: the itemdef to use to generate the listing
		@type itemdef: L{modu.editable.define.itemdef}
		"""
        table_name = itemdef.config.get("table", itemdef.name)
        session_search_data = req.session.setdefault("search_form", {}).setdefault(itemdef.name, {})
        # import pdb; pdb.set_trace()
        form_data = req.data.get("%s-search-form" % itemdef.name, {})
        if isinstance(form_data, dict) and form_data.get("clear_search", None).value:
            req.session.setdefault("search_form", {})[itemdef.name] = {}
            app.redirect(req.get_path(req.prepath, "listing", itemdef.name))

            # create a fake storable to make itemdef/form happy
        search_storable = storable.Storable(table_name)
        if "default_search" in itemdef.config:
            for k, v in itemdef.config["default_search"].items():
                k = itemdef[k].get_column_name()
                setattr(search_storable, k, v)
        if session_search_data:
            for k, v in session_search_data.items():
                if k in itemdef:
                    k = itemdef[k].get_column_name()
                setattr(search_storable, k, v)

                # give it a factory so fields can use its store reference
        search_storable.set_factory(req.store.get_factory(table_name))
        # build the form tree
        search_form = itemdef.get_search_form(req, search_storable)
        # this will make sure that if we're on a page other than 1,
        # a search submission will take us back to page 1
        search_form(action=req.get_path(req.path))

        order_by = itemdef.config.get("order_by", "id DESC")
        if "order" in req.data and re.match(r"^\w+$", req.data["order"].value):
            order_by = req.data["order"].value
            if "desc" in req.data and req.data["desc"].value:
                order_by += " DESC"

        search_attribs = {"__order_by": order_by}
        # search_attribs.update(itemdef.config.get('default_where', {}))

        # this function will call search_form.execute()
        search_params = self.get_search_params(req, itemdef, search_form)
        search_attribs.update(search_params)

        if req.postpath[0] == "listing":
            pager = page.Paginator(calc_found=req.app.config.get("admin_calc_found_rows", True))
            if "page" in req.data:
                pager.page = int(req.data["page"].value)
            else:
                pager.page = 1
            pager.per_page = itemdef.config.get("per_page", 25)

            items = pager.get_results(req.store, table_name, search_attribs)
            forms = itemdef.get_listing(req, items)
            thm = theme.Theme(req)

            if len(search_form):
                self.set_slot("search_form", search_form.render(req))
            else:
                self.set_slot("search_form", "")

            self.set_slot("pager", pager)
            self.set_slot("page_guide", thm.page_guide(pager, req.get_path(req.path)))
            self.set_slot("forms", forms)
            self.set_slot("theme", thm)
            self.set_slot("selected_items", items)

            default_title = "Listing %s Records" % itemdef.name.title()
            custom_title = itemdef.config.get("listing_title", default_title)
            self.set_slot("title", tags.encode_htmlentities(custom_title))

            template_variable_callback = itemdef.config.get("template_variable_callback")
            if callable(template_variable_callback):
                for key, value in template_variable_callback(req, forms, search_storable).items():
                    self.set_slot(key, value)

            self.template = itemdef.config.get("list_template", "admin-listing.html.tmpl")
        elif req.postpath[0] == "export":
            if callable(itemdef.config.get("export_query_builder")):
                data = itemdef.config["export_query_builder"](req, itemdef, search_attribs)
            else:
                data = search_attribs
            items = req.store.load(table_name, data)
            self.prepare_export(req, itemdef, items)