1.1 --- a/examples/Common/Calendar/__init__.py Tue Nov 15 15:10:00 2005 +0000
1.2 +++ b/examples/Common/Calendar/__init__.py Tue Nov 15 15:10:18 2005 +0000
1.3 @@ -3,6 +3,7 @@
1.4 "A calendar application."
1.5
1.6 import WebStack.Generic
1.7 +from WebStack.Repositories.Directory import DirectoryRepository
1.8 import time
1.9 import os, tempfile
1.10
1.11 @@ -18,40 +19,50 @@
1.12 resource_dir = os.path.join(os.path.split(__file__)[0], "calendars")
1.13 encoding = "utf-8"
1.14
1.15 - def __init__(self, fsencoding=None):
1.16 - if not os.path.exists(self.resource_dir):
1.17 - try:
1.18 - os.mkdir(self.resource_dir)
1.19 - except OSError:
1.20 - self.resource_dir = os.path.join(tempfile.gettempdir(), "calendars")
1.21 - if not os.path.exists(self.resource_dir):
1.22 - os.mkdir(self.resource_dir)
1.23 -
1.24 - # Guess the filesystem encoding.
1.25 + dav_header = \
1.26 +"""<?xml version="1.0"?>
1.27 +<D:multistatus xmlns:D="DAV:">
1.28 +"""
1.29 + propfind_header = \
1.30 +"""<D:response>
1.31 + <D:href>%s</D:href>
1.32 + <D:propstat>
1.33 + <D:prop>
1.34 + <D:creationdate>%s</D:creationdate>
1.35 + <D:displayname>%s</D:displayname>
1.36 + <D:resourcetype>
1.37 + <D:collection/>
1.38 + </D:resourcetype>
1.39 + </D:prop>
1.40 + <D:status>HTTP/1.1 200 OK</D:status>
1.41 + </D:propstat>
1.42 + </D:response>
1.43 +"""
1.44 + propfind_item = \
1.45 +"""<D:response>
1.46 + <D:href>%s%s</D:href>
1.47 + <D:propstat>
1.48 + <D:prop>
1.49 + <D:creationdate>%s</D:creationdate>
1.50 + <D:displayname>%s</D:displayname>
1.51 + <D:resourcetype/>
1.52 + <D:getcontenttype>%s</D:getcontenttype>
1.53 + <D:getcontentlength>%s</D:getcontentlength>
1.54 + </D:prop>
1.55 + <D:status>HTTP/1.1 200 OK</D:status>
1.56 + </D:propstat>
1.57 + </D:response>
1.58 +"""
1.59 + propfind_footer = \
1.60 +"""</D:multistatus>
1.61 +"""
1.62
1.63 - if fsencoding is None:
1.64 - if os.path.supports_unicode_filenames:
1.65 - self.fsencoding = None
1.66 - else:
1.67 - import locale
1.68 - self.fsencoding = locale.getdefaultlocale()[1]
1.69 -
1.70 - # Or override any guesses.
1.71 -
1.72 - else:
1.73 - self.fsencoding = fsencoding
1.74 -
1.75 - def _convert_name(self, name):
1.76 - if self.fsencoding:
1.77 - return name.encode(self.fsencoding)
1.78 - else:
1.79 - return name
1.80 -
1.81 - def _convert_fsname(self, name):
1.82 - if self.fsencoding:
1.83 - return unicode(name, self.fsencoding)
1.84 - else:
1.85 - return name
1.86 + def __init__(self, fsencoding=None):
1.87 + try:
1.88 + self.repository = DirectoryRepository(self.resource_dir, fsencoding)
1.89 + except OSError:
1.90 + self.resource_dir = os.path.join(tempfile.gettempdir(), "calendars")
1.91 + self.repository = DirectoryRepository(self.resource_dir, fsencoding)
1.92
1.93 def respond(self, trans):
1.94
1.95 @@ -81,9 +92,7 @@
1.96
1.97 # Store the calendar in the directory.
1.98
1.99 - f = open(self._convert_name(os.path.join(self.resource_dir, calendar_name)), "wb")
1.100 - f.write(data)
1.101 - f.close()
1.102 + self.repository[calendar_name] = data
1.103
1.104 # Handle directory browsing.
1.105
1.106 @@ -91,75 +100,41 @@
1.107 trans.set_response_code(207)
1.108 trans.set_content_type(WebStack.Generic.ContentType("text/xml", self.encoding))
1.109 out = trans.get_response_stream()
1.110 - out.write("""<?xml version="1.0"?>
1.111 -<D:multistatus xmlns:D="DAV:">
1.112 -""")
1.113 + out.write(self.dav_header)
1.114
1.115 if trans.get_virtual_path_info(self.encoding) == "/":
1.116 time_now = time.strftime("%Y-%m-%dT%TZ", time.gmtime(time.time()))
1.117 - out.write("""
1.118 - <D:response>
1.119 - <D:href>%s</D:href>
1.120 - <D:propstat>
1.121 - <D:prop>
1.122 - <D:creationdate>%s</D:creationdate>
1.123 - <D:displayname>%s</D:displayname>
1.124 - <D:resourcetype>
1.125 - <D:collection/>
1.126 - </D:resourcetype>
1.127 - </D:prop>
1.128 - <D:status>HTTP/1.1 200 OK</D:status>
1.129 - </D:propstat>
1.130 - </D:response>
1.131 -""" % (
1.132 - trans.get_path_without_query(self.encoding),
1.133 - time_now,
1.134 - trans.get_path_without_query(self.encoding)))
1.135 + out.write(self.propfind_header % (
1.136 + trans.get_path_without_query(self.encoding),
1.137 + time_now,
1.138 + trans.get_path_without_query(self.encoding)))
1.139
1.140 - for filename in os.listdir(self.resource_dir):
1.141 - pathname = os.path.join(self.resource_dir, filename)
1.142 + for filename in self.repository.keys():
1.143 + pathname = self.repository.full_path(filename)
1.144 created = time.strftime("%Y-%m-%dT%TZ", time.gmtime(os.path.getctime(pathname)))
1.145 size = os.path.getsize(pathname)
1.146 - out.write("""
1.147 - <D:response>
1.148 - <D:href>%s%s</D:href>
1.149 - <D:propstat>
1.150 - <D:prop>
1.151 - <D:creationdate>%s</D:creationdate>
1.152 - <D:displayname>%s</D:displayname>
1.153 - <D:resourcetype/>
1.154 - <D:getcontenttype>%s</D:getcontenttype>
1.155 - <D:getcontentlength>%s</D:getcontentlength>
1.156 - </D:prop>
1.157 - <D:status>HTTP/1.1 200 OK</D:status>
1.158 - </D:propstat>
1.159 - </D:response>
1.160 -""" % (
1.161 - trans.get_path_without_query(self.encoding),
1.162 - self._convert_fsname(filename),
1.163 - created,
1.164 - self._convert_fsname(filename),
1.165 - "text/calendar",
1.166 - size))
1.167 + out.write(self.propfind_item % (
1.168 + trans.get_path_without_query(self.encoding),
1.169 + filename,
1.170 + created,
1.171 + filename,
1.172 + "text/calendar",
1.173 + size))
1.174
1.175 - out.write("""
1.176 -</D:multistatus>
1.177 -""")
1.178 + out.write(self.propfind_footer)
1.179
1.180 # Handle downloads.
1.181
1.182 elif method == "GET":
1.183 trans.set_content_type(WebStack.Generic.ContentType("text/calendar"))
1.184 out = trans.get_response_stream()
1.185 - f = open(self._convert_name(os.path.join(self.resource_dir, calendar_name)))
1.186 - out.write(f.read())
1.187 - f.close()
1.188 + out.write(self.repository[calendar_name])
1.189
1.190 # Handle deletion.
1.191
1.192 elif method == "DELETE":
1.193 try:
1.194 - os.remove(os.path.join(self.resource_dir, calendar_name))
1.195 + del self.repository[calendar_name]
1.196 except OSError:
1.197 trans.set_response_code(500)
1.198
1.199 @@ -177,17 +152,9 @@
1.200 destination = destinations[0].split("/")[-1]
1.201 destination = trans.decode_path(destination, self.encoding)
1.202
1.203 + self.repository[destination] = self.repository[calendar_name]
1.204 if method == "MOVE":
1.205 - os.rename(
1.206 - self._convert_name(os.path.join(self.resource_dir, calendar_name)),
1.207 - self._convert_name(os.path.join(self.resource_dir, destination))
1.208 - )
1.209 - elif method == "COPY":
1.210 - f_old = open(self._convert_name(os.path.join(self.resource_dir, calendar_name)), "rb")
1.211 - f_new = open(self._convert_name(os.path.join(self.resource_dir, destination)), "wb")
1.212 - f_new.write(f_old.read())
1.213 - f_new.close()
1.214 - f_old.close()
1.215 + del self.repository[calendar_name]
1.216
1.217 # NOTE: We do not observe the rules regarding overwriting
1.218 # NOTE: and the appropriate status codes.