1.1 --- a/examples/Common/Candidate/__init__.py Sat Nov 29 02:11:56 2008 +0100
1.2 +++ b/examples/Common/Candidate/__init__.py Sat Mar 21 00:29:05 2009 +0100
1.3 @@ -12,7 +12,7 @@
1.4 # Site map imports.
1.5
1.6 from WebStack.Resources.ResourceMap import MapResource
1.7 -from WebStack.Resources.Selectors import EncodingSelector
1.8 +from WebStack.Resources.Selectors import EncodingSelector, StoreSelector
1.9 from WebStack.Resources.Static import DirectoryResource
1.10
1.11 # Configuration setting.
1.12 @@ -33,9 +33,6 @@
1.13 "admin" : input("admin_template.xhtml")
1.14 }
1.15
1.16 - def __init__(self, repository):
1.17 - self.repository = repository
1.18 -
1.19 def select_activity(self, trans, form):
1.20 form.set_activity("admin")
1.21
1.22 @@ -58,26 +55,30 @@
1.23 selectors = form.get_selectors()
1.24 if selectors.has_key("show"):
1.25 name = selectors["show"][0].getAttribute("name")
1.26 - trans.redirect(trans.encode_path(show_path) +
1.27 - "?name=%s" % trans.encode_path(name))
1.28 + if name:
1.29 + trans.redirect(trans.encode_path(show_path) +
1.30 + "?name=%s" % trans.encode_path(name))
1.31 elif selectors.has_key("edit"):
1.32 name = selectors["edit"][0].getAttribute("name")
1.33 - trans.redirect(trans.encode_path(edit_path) +
1.34 - "?name=%s" % trans.encode_path(name))
1.35 + if name:
1.36 + trans.redirect(trans.encode_path(edit_path) +
1.37 + "?name=%s" % trans.encode_path(name))
1.38
1.39 - # Add and remove elements according to the selectors found.
1.40 + # Add and remove elements (and documents) according to the selectors found.
1.41
1.42 + self.remove_documents(trans, selectors.get("remove"))
1.43 self.remove_elements(selectors.get("remove"))
1.44 self.add_elements(selectors.get("new"), "cv", "cvs")
1.45
1.46 def respond_to_document(self, trans, form):
1.47
1.48 admin = form.get_document()
1.49 + repository = trans.get_attributes()["store"]
1.50
1.51 # Synchronise the repository with the CVs found.
1.52
1.53 cvs = admin.xpath("/admin/cvs")[0]
1.54 - for key in self.repository.keys():
1.55 + for key in repository.keys():
1.56 if key.startswith("candidate-"):
1.57 name = key[len("candidate-"):]
1.58 # NOTE: Apostrophes not quoted.
1.59 @@ -87,15 +88,21 @@
1.60 cv.setAttribute("name", name)
1.61 cvs.appendChild(cv)
1.62 else:
1.63 - del self.repository[key]
1.64 + del repository[key]
1.65 +
1.66 + def remove_documents(self, trans, selected):
1.67 + repository = trans.get_attributes()["store"]
1.68 +
1.69 + for element in selected or []:
1.70 + name = element.getAttribute("name")
1.71 + docname = "candidate-%s" % name
1.72 + if repository.has_key(docname):
1.73 + del repository[docname]
1.74
1.75 class CandidateUtils:
1.76
1.77 "Methods used by candidate-related resources."
1.78
1.79 - def __init__(self, repository):
1.80 - self.repository = repository
1.81 -
1.82 def select_activity(self, trans, form):
1.83 form.set_activity("candidate")
1.84
1.85 @@ -103,16 +110,17 @@
1.86 documents = form.get_documents()
1.87 fields = trans.get_fields_from_path()
1.88 name = fields.get("name", [u"None"])[0]
1.89 + repository = trans.get_attributes()["store"]
1.90
1.91 # Ensure the presence of a document.
1.92
1.93 if documents.has_key("candidate"):
1.94 form.set_document(documents["candidate"])
1.95 else:
1.96 - if self.repository is None or not self.repository.has_key("candidate-%s" % name):
1.97 + if repository is None or not repository.has_key("candidate-%s" % name):
1.98 form.set_document(form.new_instance("candidate"))
1.99 else:
1.100 - form.set_document(libxml2dom.parseString(self.repository["candidate-%s" % name]))
1.101 + form.set_document(libxml2dom.parseString(repository["candidate-%s" % name]))
1.102
1.103 def init_document(self, trans, form):
1.104 status_xml = self.prepare_document("status")
1.105 @@ -162,9 +170,26 @@
1.106
1.107 candidate = form.get_document()
1.108 parameters = form.get_parameters()
1.109 + files = form.get_files()
1.110 fields = trans.get_fields_from_path()
1.111 name = fields.get("name", [u"None"])[0]
1.112
1.113 + repository = trans.get_attributes()["store"]
1.114 + image_repository = trans.get_attributes()["images"]
1.115 +
1.116 + # Find uploaded pictures and place them in the image repository.
1.117 +
1.118 + for element in candidate.xpath("//*[@new-picture]"):
1.119 + filename = element.getAttributeNS(self.EMPTY_NAMESPACE, "new-picture")
1.120 + index = int(element.getAttributeNS(self.FILE_NAMESPACE, "new-picture"))
1.121 +
1.122 + if filename.find(".") != -1:
1.123 + suffix = filename.split(".")[-1]
1.124 + saved_filename = "candidate-%s.%s" % (name, suffix)
1.125 + image_repository[saved_filename] = files[index][1] # content
1.126 + element.setAttribute("picture", saved_filename)
1.127 + break
1.128 +
1.129 # Get the "show" resource path.
1.130 # NOTE: This should be obtained from the site map.
1.131
1.132 @@ -178,7 +203,7 @@
1.133
1.134 # Save the candidate information.
1.135
1.136 - self.repository["candidate-%s" % name] = candidate.toString()
1.137 + repository["candidate-%s" % name] = candidate.toString()
1.138 trans.redirect(trans.encode_path(show_path) +
1.139 "?name=%s" % trans.encode_path(name))
1.140
1.141 @@ -188,7 +213,7 @@
1.142
1.143 # Save the candidate information.
1.144
1.145 - self.repository["candidate-%s" % name] = candidate.toString()
1.146 + repository["candidate-%s" % name] = candidate.toString()
1.147 trans.redirect(trans.encode_path(admin_path))
1.148
1.149 # Site map initialisation.
1.150 @@ -201,23 +226,37 @@
1.151 resource_dir = os.getcwd()
1.152 else:
1.153 resource_dir = resources(__file__)
1.154 +
1.155 + images_dir = os.path.join(resource_dir, "candidate-images")
1.156 +
1.157 repository = DirectoryRepository(os.path.join(resource_dir, "candidates"), fsencoding)
1.158 + image_repository = DirectoryRepository(images_dir, fsencoding)
1.159
1.160 # Get the main resource and the directory used by the application.
1.161
1.162 - candidate_resource = CandidateResource(repository)
1.163 - display_resource = DisplayResource(repository)
1.164 - admin_resource = AdminResource(repository)
1.165 + candidate_resource = CandidateResource()
1.166 + display_resource = DisplayResource()
1.167 + admin_resource = AdminResource()
1.168
1.169 # Make a simple Web site.
1.170
1.171 resource = MapResource({
1.172 "edit" : candidate_resource,
1.173 "show" : display_resource,
1.174 - "" : admin_resource
1.175 + "" : admin_resource,
1.176 + "images" : DirectoryResource(images_dir, {"png" : "image/png", "jpg" : "image/jpeg", "jpeg" : "image/jpeg"})
1.177 })
1.178
1.179 - return EncodingSelector(resource, encoding)
1.180 + # Return the site with some extra boilerplate.
1.181 +
1.182 + return \
1.183 + StoreSelector(
1.184 + StoreSelector(
1.185 + EncodingSelector(resource, encoding),
1.186 + repository),
1.187 + image_repository,
1.188 + "images"
1.189 + )
1.190
1.191 # Resource preparation ahead of time - useful for making installations.
1.192