def __init__(self, app, name, html_page): super(UpdatePage, self).__init__(app, name) self.widget_tmpl = WidgetTemplate(self, "widget_html") self.html_page = html_page self.session = self.SessionParameter(app, "session") self.add_parameter(self.session) item = self.WidgetParameter(app, "item", self.html_page) self.widgets = ListParameter(app, "widget", item) self.add_parameter(self.widgets)
class UpdatePage(Page): def __init__(self, app, name, html_page): super(UpdatePage, self).__init__(app, name) self.widget_tmpl = WidgetTemplate(self, "widget_html") self.html_page = html_page self.session = self.SessionParameter(app, "session") self.add_parameter(self.session) item = self.WidgetParameter(app, "item", self.html_page) self.widgets = ListParameter(app, "widget", item) self.add_parameter(self.widgets) def get_content_type(self, session): return self.xml_content_type def get_cache_control(self, session): return "no-cache" def do_process(self, session): # get the session for the main page sess = self.session.get(session) # Allow object frames to have None as an object # during the process pass. self.allow_object_not_found.set(sess, True) self.html_page.process(sess) # if the main page set its redirect attribute in its session redirect = self.html_page.redirect.get(sess) # pass that redirect on to the the update page if redirect: self.redirect.set(session, redirect) def service(self, session): self.process(session) # Skip the render if a redirect has been set if not self.redirect.get(session): res = self.render(session) # Check for a redirect from either process or render url = self.redirect.get(session) if url: # Send the url to the ajax script in the update response raise UpdateRedirect(url) return res def render_widgets(self, session): writer = Writer() sess = self.session.get(session) widgets = self.widgets.get(session) for widget in widgets: self.widget_tmpl.render(writer, sess, widget) # If a widget generated a redirect url, # there is no sense finishing the render redirect = self.redirect.get(sess) if redirect: self.redirect.set(session, redirect) break return writer.to_string() def render_widget_id(self, session, widget): return widget.path def render_widget(self, session, widget): return widget.render(session) class SessionParameter(Parameter): def do_marshal(self, session): return session.marshal() def do_unmarshal(self, string): return Session.unmarshal(self.app, string) def get(self, session): sess = super(UpdatePage.SessionParameter, self).get(session) sess.client_session = session.client_session sess.background = True return sess class WidgetParameter(Parameter): def __init__(self, app, name, page): self.page = page def do_marshal(self, widget): return widget.path def do_unmarshal(self, path): return self.page.page_widgets_by_path.get(path)