Fix a lot of details

This commit is contained in:
Guillaume Ayoub 2016-04-12 18:21:18 +02:00
parent 406027f3c9
commit e586569b31
4 changed files with 29 additions and 10 deletions

View File

@ -429,7 +429,7 @@ class Application(object):
props = xmlutils.props_from_request(content) props = xmlutils.props_from_request(content)
# TODO: use this? # TODO: use this?
# timezone = props.get("C:calendar-timezone") # timezone = props.get("C:calendar-timezone")
collection = storage.create_collection( collection = storage.Collection.create_collection(
collection.path, tag="VCALENDAR") collection.path, tag="VCALENDAR")
for key, value in props.items(): for key, value in props.items():
collection.set_meta(key, value) collection.set_meta(key, value)
@ -444,7 +444,7 @@ class Application(object):
collection = write_collections[0] collection = write_collections[0]
props = xmlutils.props_from_request(content) props = xmlutils.props_from_request(content)
collection = storage.create_collection(collection.path) collection = storage.Collection.create_collection(collection.path)
for key, value in props.items(): for key, value in props.items():
collection.set_meta(key, value) collection.set_meta(key, value)
return client.CREATED, {}, None return client.CREATED, {}, None

View File

@ -127,7 +127,7 @@ def authorized(user, collection, permission):
If the user is empty, check for anonymous rights. If the user is empty, check for anonymous rights.
""" """
collection_url = collection.url.rstrip("/") or "/" collection_url = collection.path.rstrip("/") or "/"
if collection_url in (".well-known/carddav", ".well-known/caldav"): if collection_url in (".well-known/carddav", ".well-known/caldav"):
return permission == "r" return permission == "r"
rights_type = config.get("rights", "type").lower() rights_type = config.get("rights", "type").lower()

View File

@ -180,17 +180,17 @@ class Collection:
collection = cls(path, principal) collection = cls(path, principal)
yield collection yield collection
if depth != "0": if depth != "0":
# TODO: fix this
items = list(collection.list()) items = list(collection.list())
if items: if items:
for item in items: for item in items:
yield collection.get(item[0]) yield collection.get(item[0])
else: else:
_, directories, files = next(os.walk(collection._filesystem_path)) _, directories, _ = next(os.walk(collection._filesystem_path))
for sub_path in directories + files: for sub_path in directories:
full_path = os.path.join(collection._filesystem_path, sub_path) full_path = os.path.join(collection._filesystem_path, sub_path)
if os.path.exists(path_to_filesystem(full_path)): if os.path.exists(path_to_filesystem(full_path)):
collection = cls(posixpath.join(path, sub_path)) yield cls(posixpath.join(path, sub_path))
yield collection
@classmethod @classmethod
def create_collection(cls, href, collection=None, tag=None): def create_collection(cls, href, collection=None, tag=None):
@ -364,7 +364,7 @@ class Collection:
items = [] items = []
for href in os.listdir(self._filesystem_path): for href in os.listdir(self._filesystem_path):
path = os.path.join(self._filesystem_path, href) path = os.path.join(self._filesystem_path, href)
if os.path.isfile(path): if os.path.isfile(path) and not path.endswith(".props"):
with open(path, encoding=STORAGE_ENCODING) as fd: with open(path, encoding=STORAGE_ENCODING) as fd:
items.append(vobject.readOne(fd.read())) items.append(vobject.readOne(fd.read()))
if self.get_meta("tag") == "VCALENDAR": if self.get_meta("tag") == "VCALENDAR":
@ -377,6 +377,7 @@ class Collection:
return collection.serialize() return collection.serialize()
elif self.get_meta("tag") == "VADDRESSBOOK": elif self.get_meta("tag") == "VADDRESSBOOK":
return "".join([item.serialize() for item in items]) return "".join([item.serialize() for item in items])
return ""
@property @property
def etag(self): def etag(self):

View File

@ -239,7 +239,18 @@ def _propfind_response(path, item, props, user, write=False):
response = ET.Element(_tag("D", "response")) response = ET.Element(_tag("D", "response"))
href = ET.Element(_tag("D", "href")) href = ET.Element(_tag("D", "href"))
uri = item.path if is_collection else "%s/%s" % (path, item.href) if is_collection:
uri = item.path
else:
# TODO: fix this
if path.split("/")[-1] == item.href:
# Happening when depth is 0
uri = path
else:
# Happening when depth is 1
uri = "/".join((path, item.href))
# TODO: fix this
href.text = _href(uri.replace("//", "/")) href.text = _href(uri.replace("//", "/"))
response.append(href) response.append(href)
@ -549,8 +560,15 @@ def report(path, xml_request, collection):
else: else:
not_found_props.append(element) not_found_props.append(element)
# TODO: fix this
if hreference.split("/")[-1] == item.href:
# Happening when depth is 0
uri = "/" + hreference
else:
# Happening when depth is 1
uri = posixpath.join(hreference, item.href)
multistatus.append(_item_response( multistatus.append(_item_response(
posixpath.join(hreference, item.href), found_props=found_props, uri, found_props=found_props,
not_found_props=not_found_props, found_item=True)) not_found_props=not_found_props, found_item=True))
return _pretty_xml(multistatus) return _pretty_xml(multistatus)