1.1 --- a/examples/Common/QuestionPlayer/__init__.py Tue Nov 25 00:07:07 2008 +0100
1.2 +++ b/examples/Common/QuestionPlayer/__init__.py Sat Nov 29 02:11:56 2008 +0100
1.3 @@ -15,9 +15,11 @@
1.4
1.5 # Site map imports.
1.6
1.7 -from WebStack.Resources.ResourceMap import MapResource
1.8 -from WebStack.Resources.Selectors import EncodingSelector
1.9 +from WebStack.Resources.ResourceMap import SimpleMap
1.10 +from WebStack.Resources.Selectors import EncodingSelector, PathSelector, AuthInfoSelector
1.11 from WebStack.Resources.Static import DirectoryResource
1.12 +from WebStack.Resources.Login import LoginAuthenticator, LoginResource
1.13 +from WebStack.Resources.LoginRedirect import LoginRedirectAuthenticator, SiteLoginRedirectResource
1.14
1.15 # Configuration settings.
1.16
1.17 @@ -49,8 +51,27 @@
1.18
1.19 def create_document(self, trans, form):
1.20 if XSLFormsResource.create_document(self, trans, form):
1.21 - questions_xml = self.prepare_document("questions")
1.22 - questions = libxml2dom.parse(questions_xml)
1.23 + admin = trans.get_user() == "admin"
1.24 + response = trans.get_virtual_path_info().split("/")
1.25 +
1.26 + repository = DirectoryRepository(storage_directory)
1.27 + if admin and len(response) > 1:
1.28 + key = response[1]
1.29 + try:
1.30 + questions_xml = repository.lock(key)
1.31 + try:
1.32 + questions = libxml2dom.parse(questions_xml)
1.33 + finally:
1.34 + repository.unlock(key)
1.35 + except KeyError:
1.36 + trans.set_response_code(404)
1.37 + trans.set_content_type(WebStack.Generic.ContentType("text/plain"))
1.38 + trans.get_response_stream().write("Questionnaire not found")
1.39 + raise WebStack.Generic.EndOfResponse
1.40 + else:
1.41 + questions_xml = self.prepare_document("questions")
1.42 + questions = libxml2dom.parse(questions_xml)
1.43 +
1.44 doc = form.get_document()
1.45 imported_questions = doc.importNode(questions.documentElement, 1)
1.46 doc.replaceChild(imported_questions, doc.documentElement)
1.47 @@ -79,32 +100,93 @@
1.48 repository.unlock(key)
1.49 repository.unlock("distilled-" + key)
1.50
1.51 + def create_output(self, trans, form):
1.52 + XSLFormsResource.create_output(self, trans, form, stylesheet_parameters=trans.get_attributes())
1.53 +
1.54 +class QuestionnaireAdminResource(XSLFormsResource):
1.55 +
1.56 + "A resource providing a list of questionnaires."
1.57 +
1.58 + resource_dir = resources(__file__)
1.59 + template_resources = {
1.60 + "questionnaires" : output("admin_template.xhtml")
1.61 + }
1.62 + init_resources = {
1.63 + "questionnaires" : input("admin_template.xhtml")
1.64 + }
1.65 +
1.66 + def select_activity(self, trans, form):
1.67 + form.set_activity("questionnaires")
1.68 +
1.69 + def create_document(self, trans, form):
1.70 + if XSLFormsResource.create_document(self, trans, form):
1.71 + doc = form.get_document()
1.72 + questionnaires = doc.documentElement
1.73 + for filename in os.listdir(storage_directory):
1.74 + if filename[0].isdigit():
1.75 + questionnaire = doc.createElement("questionnaire")
1.76 + questionnaire.setAttribute("name", filename)
1.77 + questionnaire.setAttribute("date-text", time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(float(filename))))
1.78 + questionnaires.appendChild(questionnaire)
1.79 +
1.80 + def create_output(self, trans, form):
1.81 + XSLFormsResource.create_output(self, trans, form, stylesheet_parameters=trans.get_attributes())
1.82 +
1.83 # Site map initialisation.
1.84
1.85 def get_site():
1.86
1.87 "Return a simple Web site resource."
1.88
1.89 + # Authentication objects.
1.90 +
1.91 + secret_key="this_must_be_secret"
1.92 + credentials = [
1.93 + ("admin", "123"),
1.94 + ]
1.95 + login_authenticator = LoginAuthenticator(secret_key, credentials)
1.96 + login_redirect_authenticator = LoginRedirectAuthenticator(secret_key)
1.97 +
1.98 # Get the main resource and the directory used by the application.
1.99
1.100 questionnaire_resource = QuestionnairePlayerResource()
1.101 + admin_resource = QuestionnaireAdminResource()
1.102 directory = questionnaire_resource.resource_dir
1.103
1.104 + # Get some login resources.
1.105 +
1.106 + login_redirector = SiteLoginRedirectResource(
1.107 + authenticator=login_redirect_authenticator,
1.108 + login_url="login",
1.109 + app_url="",
1.110 + resource=SimpleMap({
1.111 + "" : admin_resource,
1.112 + None : questionnaire_resource
1.113 + })
1.114 + )
1.115 + login_redirector.logout_parameter_name="logout"
1.116 +
1.117 + login_resource = LoginResource(login_authenticator)
1.118 +
1.119 # Make a simple Web site.
1.120
1.121 - resource = MapResource({
1.122 + resource = SimpleMap({
1.123 # Static resources:
1.124 "styles" : DirectoryResource(os.path.join(directory, "styles"), {"css" : "text/css"}),
1.125 + # Login resource:
1.126 + "login" : login_resource,
1.127 + # Administration resource:
1.128 + "admin" : login_redirector,
1.129 # Main page:
1.130 "" : questionnaire_resource
1.131 })
1.132
1.133 - return EncodingSelector(resource, encoding)
1.134 + return EncodingSelector(PathSelector(AuthInfoSelector(resource, login_redirect_authenticator)), encoding)
1.135
1.136 # Resource preparation ahead of time - useful for making installations.
1.137
1.138 def prepare_resources():
1.139 - for cls in [QuestionnairePlayerResource]:
1.140 + for cls in [QuestionnairePlayerResource, QuestionnaireAdminResource]:
1.141 xslforms_prepare_resources(cls)
1.142
1.143 # vim: tabstop=4 expandtab shiftwidth=4