paulb@652 | 1 | #!/usr/bin/env python |
paulb@652 | 2 | # -*- coding: iso-8859-1 -*- |
paulb@652 | 3 | |
paulb@652 | 4 | "A very simple example application." |
paulb@652 | 5 | |
paulb@652 | 6 | import WebStack.Generic |
paulb@652 | 7 | import XSLForms.Resources.WebResources |
paulb@652 | 8 | import XSLForms.Utils |
paulb@652 | 9 | import os |
paulb@652 | 10 | |
paulb@652 | 11 | # Site map imports. |
paulb@652 | 12 | |
paulb@652 | 13 | from WebStack.Resources.ResourceMap import MapResource |
paulb@652 | 14 | from WebStack.Resources.Selectors import EncodingSelector, PathSelector |
paulb@652 | 15 | from WebStack.Resources.Static import DirectoryResource, StringResource |
paulb@652 | 16 | from XSLForms.Resources.OpenIDLogin import OpenIDLoginResource, Authenticator |
paulb@652 | 17 | from XSLForms.Resources.OpenIDRedirect import OpenIDRedirectResource, OpenIDRedirectAuthenticator |
paulb@652 | 18 | from XSLForms.Resources.OpenIDInitiation import OpenIDInitiationResource |
paulb@652 | 19 | |
paulb@652 | 20 | # Configuration settings. |
paulb@652 | 21 | |
paulb@652 | 22 | encoding = "utf-8" |
paulb@652 | 23 | |
paulb@652 | 24 | # Resource classes. |
paulb@652 | 25 | |
paulb@652 | 26 | class VerySimpleResource(XSLForms.Resources.WebResources.XSLFormsResource): |
paulb@652 | 27 | |
paulb@652 | 28 | "A very simple resource providing a hierarchy of editable fields." |
paulb@652 | 29 | |
paulb@652 | 30 | resource_dir = os.path.join(os.path.split(__file__)[0], "Resources") |
paulb@652 | 31 | template_resources = { |
paulb@652 | 32 | #"structure" : ("structure_template.xhtml", "structure_output.xsl") |
paulb@652 | 33 | #"structure" : ("structure_multivalue_template.xhtml", "structure_output.xsl") |
paulb@652 | 34 | "structure" : ("structure_multivalue_label_template.xhtml", "structure_output.xsl") |
paulb@652 | 35 | } |
paulb@652 | 36 | init_resources = { |
paulb@652 | 37 | #"structure" : ("structure_template.xhtml", "structure_input.xsl") |
paulb@652 | 38 | #"structure" : ("structure_multivalue_template.xhtml", "structure_input.xsl") |
paulb@652 | 39 | "structure" : ("structure_multivalue_label_template.xhtml", "structure_input.xsl") |
paulb@652 | 40 | } |
paulb@652 | 41 | transform_resources = { |
paulb@652 | 42 | "comments" : ["structure_comments.xsl"] |
paulb@652 | 43 | } |
paulb@652 | 44 | document_resources = { |
paulb@652 | 45 | #"types" : "structure_types.xml" |
paulb@652 | 46 | "types" : "structure_types_label.xml", |
paulb@652 | 47 | "translations" : "translations.xml" |
paulb@652 | 48 | } |
paulb@652 | 49 | in_page_resources = { |
paulb@652 | 50 | "comments" : ("structure", "structure_output_comments.xsl", "comment-node") |
paulb@652 | 51 | } |
paulb@652 | 52 | |
paulb@652 | 53 | def respond_to_form(self, trans, form): |
paulb@652 | 54 | |
paulb@652 | 55 | """ |
paulb@652 | 56 | Respond to a request having the given transaction 'trans' and the given |
paulb@652 | 57 | 'form' information. |
paulb@652 | 58 | """ |
paulb@652 | 59 | |
paulb@652 | 60 | in_page_resource = self.get_in_page_resource(trans) |
paulb@652 | 61 | parameters = form.get_parameters() |
paulb@652 | 62 | documents = form.get_documents() |
paulb@652 | 63 | |
paulb@652 | 64 | # Ensure the presence of a document. |
paulb@652 | 65 | |
paulb@652 | 66 | if documents.has_key("structure"): |
paulb@652 | 67 | structure = documents["structure"] |
paulb@652 | 68 | else: |
paulb@652 | 69 | structure = form.new_instance("structure") |
paulb@652 | 70 | |
paulb@652 | 71 | # Add and remove elements according to the selectors found. |
paulb@652 | 72 | |
paulb@652 | 73 | selectors = form.get_selectors() |
paulb@652 | 74 | XSLForms.Utils.remove_elements(selectors.get("remove2")) |
paulb@652 | 75 | XSLForms.Utils.add_elements(selectors.get("add2"), "subitem") |
paulb@652 | 76 | XSLForms.Utils.remove_elements(selectors.get("remove")) |
paulb@652 | 77 | XSLForms.Utils.add_elements(selectors.get("add"), "item") |
paulb@652 | 78 | |
paulb@652 | 79 | # Initialise the document, adding enumerations/ranges. |
paulb@652 | 80 | |
paulb@652 | 81 | structure_xsl = self.prepare_initialiser("structure") |
paulb@652 | 82 | types_xml = self.prepare_document("types") |
paulb@652 | 83 | structure = self.get_result([structure_xsl], structure, references={"type" : types_xml}) |
paulb@652 | 84 | |
paulb@652 | 85 | # Add the comments. |
paulb@652 | 86 | |
paulb@652 | 87 | comments_xsl_list = self.prepare_transform("comments") |
paulb@652 | 88 | structure = self.get_result(comments_xsl_list, structure) |
paulb@652 | 89 | |
paulb@652 | 90 | # Start the response. |
paulb@652 | 91 | |
paulb@652 | 92 | trans.set_content_type(WebStack.Generic.ContentType("application/xhtml+xml", encoding)) |
paulb@652 | 93 | |
paulb@652 | 94 | # Ensure that an output stylesheet exists. |
paulb@652 | 95 | |
paulb@652 | 96 | if in_page_resource in self.in_page_resources.keys(): |
paulb@652 | 97 | trans_xsl = self.prepare_fragment(in_page_resource) |
paulb@652 | 98 | stylesheet_parameters = self.prepare_parameters(parameters) |
paulb@652 | 99 | else: |
paulb@652 | 100 | trans_xsl = self.prepare_output("structure") |
paulb@652 | 101 | stylesheet_parameters = {} |
paulb@652 | 102 | |
paulb@652 | 103 | # Complete the response. |
paulb@652 | 104 | |
paulb@652 | 105 | try: |
paulb@652 | 106 | stylesheet_parameters["locale"] = trans.get_content_languages()[0] |
paulb@652 | 107 | except IndexError: |
paulb@652 | 108 | pass |
paulb@652 | 109 | self.send_output(trans, [trans_xsl], structure, stylesheet_parameters, |
paulb@652 | 110 | references={"translations" : self.prepare_document("translations")}) |
paulb@652 | 111 | |
paulb@652 | 112 | class InitiationResource(XSLForms.Resources.OpenIDInitiation.OpenIDInitiationResource): |
paulb@652 | 113 | |
paulb@652 | 114 | "Special initiation screen for this application." |
paulb@652 | 115 | |
paulb@652 | 116 | resource_dir = os.path.join(os.path.split(__file__)[0], "Resources") |
paulb@652 | 117 | template_resources = { |
paulb@652 | 118 | "initiation" : ("initiation_template.xhtml", "initiation_output.xsl"), |
paulb@652 | 119 | "success" : ("initiation_success_template.xhtml", "initiation_success_output.xsl") |
paulb@652 | 120 | } |
paulb@652 | 121 | |
paulb@652 | 122 | class LoginResource(XSLForms.Resources.OpenIDLogin.OpenIDLoginResource): |
paulb@652 | 123 | |
paulb@652 | 124 | "Special login screen for this application." |
paulb@652 | 125 | |
paulb@652 | 126 | resource_dir = os.path.join(os.path.split(__file__)[0], "Resources") |
paulb@652 | 127 | template_resources = { |
paulb@652 | 128 | "login" : ("login_template.xhtml", "login_output.xsl"), |
paulb@652 | 129 | "success" : ("success_template.xhtml", "success_output.xsl") |
paulb@652 | 130 | } |
paulb@652 | 131 | |
paulb@652 | 132 | # Site map initialisation. |
paulb@652 | 133 | |
paulb@655 | 134 | def get_site(host, secret_key, use_redirect=1, deployed_at=None): |
paulb@652 | 135 | |
paulb@652 | 136 | "Return a simple Web site resource." |
paulb@652 | 137 | |
paulb@655 | 138 | # Configure the user home pages below. |
paulb@655 | 139 | |
paulb@655 | 140 | deployed_at = deployed_at or host |
paulb@655 | 141 | |
paulb@652 | 142 | # Authentication objects. |
paulb@652 | 143 | |
paulb@652 | 144 | credentials = [ |
paulb@655 | 145 | ((deployed_at + "/badger", "badger"), "abc"), |
paulb@655 | 146 | ((deployed_at + "/vole", "vole"), "xyz"), |
paulb@655 | 147 | ((deployed_at + u"/???", u"???"), u"???") |
paulb@652 | 148 | ] |
paulb@652 | 149 | login_authenticator = Authenticator(credentials) |
paulb@652 | 150 | login_redirect_authenticator = OpenIDRedirectAuthenticator(secret_key, host) |
paulb@652 | 151 | |
paulb@652 | 152 | # Get the main resource and the directory used by the application. |
paulb@652 | 153 | |
paulb@652 | 154 | very_simple_resource = VerySimpleResource() |
paulb@652 | 155 | directory = very_simple_resource.resource_dir |
paulb@652 | 156 | |
paulb@652 | 157 | # Get some initiation/login resources. |
paulb@652 | 158 | |
paulb@652 | 159 | login_redirect_resource = XSLForms.Resources.OpenIDRedirect.OpenIDRedirectResource( |
paulb@652 | 160 | host, |
paulb@652 | 161 | "initiation", # see below |
paulb@652 | 162 | resource=very_simple_resource, |
paulb@652 | 163 | authenticator=login_redirect_authenticator, |
paulb@652 | 164 | logout_parameter_name="logout" |
paulb@652 | 165 | ) |
paulb@652 | 166 | initiation_resource = InitiationResource(use_redirect=use_redirect) |
paulb@655 | 167 | login_resource = LoginResource(host, login_authenticator, use_redirect=use_redirect) |
paulb@652 | 168 | |
paulb@652 | 169 | # Make a simple Web site. |
paulb@652 | 170 | |
paulb@652 | 171 | resource = MapResource({ |
paulb@652 | 172 | # Static resources: |
paulb@652 | 173 | "scripts" : DirectoryResource(os.path.join(directory, "scripts"), {"js" : "text/javascript"}), |
paulb@652 | 174 | # Initiation resource: |
paulb@652 | 175 | "initiation" : initiation_resource, |
paulb@652 | 176 | # Login resource: |
paulb@652 | 177 | "login" : login_resource, |
paulb@652 | 178 | |
paulb@652 | 179 | # Some local OpenID pages. |
paulb@652 | 180 | |
paulb@652 | 181 | "badger" : |
paulb@652 | 182 | StringResource(""" |
paulb@652 | 183 | <html> |
paulb@652 | 184 | <head> |
paulb@652 | 185 | <link rel="openid2.provider openid.server" href="%s/login" /> |
paulb@652 | 186 | <link rel="openid2.local_id openid.delegate" href="%s/badger" /> |
paulb@652 | 187 | <title>Badger's Home Page</title> |
paulb@652 | 188 | </head> |
paulb@652 | 189 | <body> |
paulb@652 | 190 | <p>Home page for the OpenID authenticated user, <code>badger</code>.</p> |
paulb@652 | 191 | </body> |
paulb@652 | 192 | </html> |
paulb@655 | 193 | """ % (deployed_at, deployed_at), WebStack.Generic.ContentType("text/html")), |
paulb@652 | 194 | u"???" : |
paulb@652 | 195 | StringResource(u""" |
paulb@652 | 196 | <html> |
paulb@652 | 197 | <head> |
paulb@652 | 198 | <link rel="openid2.provider openid.server" href="%s/login" /> |
paulb@652 | 199 | <link rel="openid2.local_id openid.delegate" href="%s/???" /> |
paulb@652 | 200 | <title>Home Page for ???</title> |
paulb@652 | 201 | </head> |
paulb@652 | 202 | <body> |
paulb@652 | 203 | <p>Home page for the OpenID authenticated user, <code>???</code>.</p> |
paulb@652 | 204 | </body> |
paulb@652 | 205 | </html> |
paulb@655 | 206 | """ % (deployed_at, deployed_at), WebStack.Generic.ContentType("text/html", "iso-8859-1")), |
paulb@652 | 207 | "vole" : |
paulb@652 | 208 | StringResource(""" |
paulb@652 | 209 | <html> |
paulb@652 | 210 | <head> |
paulb@652 | 211 | <link rel="openid2.provider openid.server" href="%s/login" /> |
paulb@652 | 212 | <link rel="openid2.local_id openid.delegate" href="%s/vole" /> |
paulb@652 | 213 | <title>Vole's Home Page</title> |
paulb@652 | 214 | </head> |
paulb@652 | 215 | <body> |
paulb@652 | 216 | <p>Home page for the OpenID authenticated user, <code>vole</code>.</p> |
paulb@652 | 217 | </body> |
paulb@652 | 218 | </html> |
paulb@655 | 219 | """ % (deployed_at, deployed_at), WebStack.Generic.ContentType("text/html")), |
paulb@652 | 220 | |
paulb@652 | 221 | # Main page and in-page resources: |
paulb@652 | 222 | # (Now protected!) |
paulb@652 | 223 | None : login_redirect_resource |
paulb@652 | 224 | }) |
paulb@652 | 225 | |
paulb@652 | 226 | # Wrap the resource up with information about the application root. |
paulb@652 | 227 | |
paulb@652 | 228 | return EncodingSelector(PathSelector(resource), encoding) |
paulb@652 | 229 | |
paulb@652 | 230 | # Resource preparation ahead of time - useful for making installations. |
paulb@652 | 231 | |
paulb@652 | 232 | def prepare_resources(): |
paulb@652 | 233 | for cls in [VerySimpleResource, LoginResource, InitiationResource]: |
paulb@652 | 234 | XSLForms.Resources.WebResources.prepare_resources(cls) |
paulb@652 | 235 | |
paulb@652 | 236 | # vim: tabstop=4 expandtab shiftwidth=4 |