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))] ]], ]]
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"])
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)