1
0
Эх сурвалжийг харах

revert improper PR#1839, finally fix #1812 and #1880

Peter Bieringer 5 сар өмнө
parent
commit
2899c677c1
1 өөрчлөгдсөн 24 нэмэгдсэн , 18 устгасан
  1. 24 18
      radicale/app/report.py

+ 24 - 18
radicale/app/report.py

@@ -156,6 +156,7 @@ def xml_report(base_prefix: str, path: str, xml_request: Optional[ET.Element],
     Read rfc3253-3.6 for info.
 
     """
+    logger.debug("TRACE/REPORT/xml_report: base_prefix=%r path=%r", base_prefix, path)
     multistatus = ET.Element(xmlutils.make_clark("D:multistatus"))
     if xml_request is None:
         return client.MULTI_STATUS, multistatus
@@ -239,6 +240,7 @@ def xml_report(base_prefix: str, path: str, xml_request: Optional[ET.Element],
         filter_copy = copy.deepcopy(filter_)
 
         if expand is not None:
+            logger.debug("TRACE/REPORT/xml_report: expand")
             for comp_filter in filter_copy.findall(".//" + xmlutils.make_clark("C:comp-filter")):
                 if comp_filter.get("name", "").upper() == "VCALENDAR":
                     continue
@@ -275,21 +277,15 @@ def xml_report(base_prefix: str, path: str, xml_request: Optional[ET.Element],
 
         found_props = []
         not_found_props = []
-        item_etag: str = ""
 
         for prop in props:
             element = ET.Element(prop.tag)
-            if prop.tag == xmlutils.make_clark("D:getetag"):
-                if expand is not None:
-                    item_etag = item.etag
-                else:
-                    element.text = item.etag
-                    found_props.append(element)
-            elif prop.tag == xmlutils.make_clark("D:getcontenttype"):
+            if prop.tag == xmlutils.make_clark("D:getcontenttype"):
                 element.text = xmlutils.get_content_type(item, encoding)
                 found_props.append(element)
             elif prop.tag in (
                     xmlutils.make_clark("C:calendar-data"),
+                    xmlutils.make_clark("D:getetag"),
                     xmlutils.make_clark("CR:address-data")):
                 element.text = item.serialize()
 
@@ -326,11 +322,24 @@ def xml_report(base_prefix: str, path: str, xml_request: Optional[ET.Element],
                         continue
 
                     n_vevents += n_vev
-                    found_props.append(expanded_element)
+                    if prop.tag == xmlutils.make_clark("D:getetag"):
+                        if n_vev > 0:
+                            logger.debug("TRACE/REPORT/xml_report: getetag/expanded element")
+                            element.text = item.etag
+                            found_props.append(element)
+                        else:
+                            logger.debug("TRACE/REPORT/xml_report: getetag/no expanded element")
+                    else:
+                        logger.debug("TRACE/REPORT/xml_report: default")
+                        found_props.append(expanded_element)
                 else:
-                    found_props.append(element)
-                    if hasattr(item.vobject_item, "vevent_list"):
-                        n_vevents += len(item.vobject_item.vevent_list)
+                    if prop.tag == xmlutils.make_clark("D:getetag"):
+                        element.text = item.etag
+                        found_props.append(element)
+                    else:
+                        found_props.append(element)
+                        if hasattr(item.vobject_item, "vevent_list"):
+                            n_vevents += len(item.vobject_item.vevent_list)
                 # Avoid DoS with too many events
                 if max_occurrence and n_vevents > max_occurrence:
                     raise ValueError("REPORT occurrences limit of {} hit"
@@ -345,7 +354,7 @@ def xml_report(base_prefix: str, path: str, xml_request: Optional[ET.Element],
         if found_props or not_found_props:
             multistatus.append(xml_item_response(
                 base_prefix, uri, found_props=found_props,
-                not_found_props=not_found_props, found_item=True, item_etag=item_etag))
+                not_found_props=not_found_props, found_item=True))
 
     return client.MULTI_STATUS, multistatus
 
@@ -664,7 +673,7 @@ def _find_overridden(
 def xml_item_response(base_prefix: str, href: str,
                       found_props: Sequence[ET.Element] = (),
                       not_found_props: Sequence[ET.Element] = (),
-                      found_item: bool = True, item_etag: str = "") -> ET.Element:
+                      found_item: bool = True) -> ET.Element:
     response = ET.Element(xmlutils.make_clark("D:response"))
 
     href_element = ET.Element(xmlutils.make_clark("D:href"))
@@ -678,10 +687,6 @@ def xml_item_response(base_prefix: str, href: str,
                 status = ET.Element(xmlutils.make_clark("D:status"))
                 status.text = xmlutils.make_response(code)
                 prop_element = ET.Element(xmlutils.make_clark("D:prop"))
-                if (item_etag != "") and (code == 200):
-                    prop_etag = ET.Element(xmlutils.make_clark("D:getetag"))
-                    prop_etag.text = item_etag
-                    prop_element.append(prop_etag)
                 for prop in props:
                     prop_element.append(prop)
                 propstat.append(prop_element)
@@ -735,6 +740,7 @@ def retrieve_items(
         else:
             yield item, False
     if collection_requested:
+        logger.debug("TRACE/REPORT/retrieve_items: get_filtered")
         yield from collection.get_filtered(filters)