# HG changeset patch # User Paul Boddie # Date 1227921116 -3600 # Node ID c35cc4e223bd9b1fef8398a67d84729dbeca1c7c # Parent c48af72fbd716f2af1a70cdb80d84d7de423df25 Added an administrator mode for viewing responses. Added a sample questionnaire. Made templates use root-relative stylesheet resources, introducing necessary changes in the resources and site map. diff -r c48af72fbd71 -r c35cc4e223bd examples/Common/QuestionPlayer/Resources/admin_template.xhtml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/examples/Common/QuestionPlayer/Resources/admin_template.xhtml Sat Nov 29 02:11:56 2008 +0100 @@ -0,0 +1,35 @@ + + + + + Questionnaires + + + + +

Questionnaires

+ + + + + + + + + + + + + + +
QuestionnaireCreated
+ name + + date +
+ + + diff -r c48af72fbd71 -r c35cc4e223bd examples/Common/QuestionPlayer/Resources/player_template.xhtml --- a/examples/Common/QuestionPlayer/Resources/player_template.xhtml Tue Nov 25 00:07:07 2008 +0100 +++ b/examples/Common/QuestionPlayer/Resources/player_template.xhtml Sat Nov 29 02:11:56 2008 +0100 @@ -5,7 +5,7 @@ xmlns:template="http://www.boddie.org.uk/ns/xmltools/template"> Questionnaire - diff -r c48af72fbd71 -r c35cc4e223bd examples/Common/QuestionPlayer/Resources/questions.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/examples/Common/QuestionPlayer/Resources/questions.xml Sat Nov 29 02:11:56 2008 +0100 @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff -r c48af72fbd71 -r c35cc4e223bd examples/Common/QuestionPlayer/__init__.py --- a/examples/Common/QuestionPlayer/__init__.py Tue Nov 25 00:07:07 2008 +0100 +++ b/examples/Common/QuestionPlayer/__init__.py Sat Nov 29 02:11:56 2008 +0100 @@ -15,9 +15,11 @@ # Site map imports. -from WebStack.Resources.ResourceMap import MapResource -from WebStack.Resources.Selectors import EncodingSelector +from WebStack.Resources.ResourceMap import SimpleMap +from WebStack.Resources.Selectors import EncodingSelector, PathSelector, AuthInfoSelector from WebStack.Resources.Static import DirectoryResource +from WebStack.Resources.Login import LoginAuthenticator, LoginResource +from WebStack.Resources.LoginRedirect import LoginRedirectAuthenticator, SiteLoginRedirectResource # Configuration settings. @@ -49,8 +51,27 @@ def create_document(self, trans, form): if XSLFormsResource.create_document(self, trans, form): - questions_xml = self.prepare_document("questions") - questions = libxml2dom.parse(questions_xml) + admin = trans.get_user() == "admin" + response = trans.get_virtual_path_info().split("/") + + repository = DirectoryRepository(storage_directory) + if admin and len(response) > 1: + key = response[1] + try: + questions_xml = repository.lock(key) + try: + questions = libxml2dom.parse(questions_xml) + finally: + repository.unlock(key) + except KeyError: + trans.set_response_code(404) + trans.set_content_type(WebStack.Generic.ContentType("text/plain")) + trans.get_response_stream().write("Questionnaire not found") + raise WebStack.Generic.EndOfResponse + else: + questions_xml = self.prepare_document("questions") + questions = libxml2dom.parse(questions_xml) + doc = form.get_document() imported_questions = doc.importNode(questions.documentElement, 1) doc.replaceChild(imported_questions, doc.documentElement) @@ -79,32 +100,93 @@ repository.unlock(key) repository.unlock("distilled-" + key) + def create_output(self, trans, form): + XSLFormsResource.create_output(self, trans, form, stylesheet_parameters=trans.get_attributes()) + +class QuestionnaireAdminResource(XSLFormsResource): + + "A resource providing a list of questionnaires." + + resource_dir = resources(__file__) + template_resources = { + "questionnaires" : output("admin_template.xhtml") + } + init_resources = { + "questionnaires" : input("admin_template.xhtml") + } + + def select_activity(self, trans, form): + form.set_activity("questionnaires") + + def create_document(self, trans, form): + if XSLFormsResource.create_document(self, trans, form): + doc = form.get_document() + questionnaires = doc.documentElement + for filename in os.listdir(storage_directory): + if filename[0].isdigit(): + questionnaire = doc.createElement("questionnaire") + questionnaire.setAttribute("name", filename) + questionnaire.setAttribute("date-text", time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(float(filename)))) + questionnaires.appendChild(questionnaire) + + def create_output(self, trans, form): + XSLFormsResource.create_output(self, trans, form, stylesheet_parameters=trans.get_attributes()) + # Site map initialisation. def get_site(): "Return a simple Web site resource." + # Authentication objects. + + secret_key="this_must_be_secret" + credentials = [ + ("admin", "123"), + ] + login_authenticator = LoginAuthenticator(secret_key, credentials) + login_redirect_authenticator = LoginRedirectAuthenticator(secret_key) + # Get the main resource and the directory used by the application. questionnaire_resource = QuestionnairePlayerResource() + admin_resource = QuestionnaireAdminResource() directory = questionnaire_resource.resource_dir + # Get some login resources. + + login_redirector = SiteLoginRedirectResource( + authenticator=login_redirect_authenticator, + login_url="login", + app_url="", + resource=SimpleMap({ + "" : admin_resource, + None : questionnaire_resource + }) + ) + login_redirector.logout_parameter_name="logout" + + login_resource = LoginResource(login_authenticator) + # Make a simple Web site. - resource = MapResource({ + resource = SimpleMap({ # Static resources: "styles" : DirectoryResource(os.path.join(directory, "styles"), {"css" : "text/css"}), + # Login resource: + "login" : login_resource, + # Administration resource: + "admin" : login_redirector, # Main page: "" : questionnaire_resource }) - return EncodingSelector(resource, encoding) + return EncodingSelector(PathSelector(AuthInfoSelector(resource, login_redirect_authenticator)), encoding) # Resource preparation ahead of time - useful for making installations. def prepare_resources(): - for cls in [QuestionnairePlayerResource]: + for cls in [QuestionnairePlayerResource, QuestionnaireAdminResource]: xslforms_prepare_resources(cls) # vim: tabstop=4 expandtab shiftwidth=4