def test_vcalendar_no_effect(self):

        data = """BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
BEGIN:VEVENT
UID:12345-67890
DTSTART:20080601T120000Z
DTEND:20080601T130000Z
ATTENDEE:mailto:[email protected]
ATTENDEE:mailto:[email protected]
ORGANIZER;CN=User 01:mailto:[email protected]
END:VEVENT
END:VCALENDAR
""".replace("\n", "\r\n")

        no_effect = CalendarData(CalendarComponent(name="VCALENDAR"))
        for item in (
                data,
                Component.fromString(data),
        ):
            self.assertEqual(str(CalendarDataFilter(no_effect).filter(item)),
                             data)

        no_effect = CalendarData(
            CalendarComponent(AllComponents(),
                              AllProperties(),
                              name="VCALENDAR"))
        for item in (
                data,
                Component.fromString(data),
        ):
            self.assertEqual(str(CalendarDataFilter(no_effect).filter(item)),
                             data)
    def compFilter(self, comp, component):
        """
        Returns a calendar component object containing the data in the given
        component which is specified by this CalendarComponent.
        """
        if comp.type != component.name():
            raise ValueError(
                "%s of type %r can't get data from component of type %r" %
                (comp.sname(), comp.type, component.name()))

        result = Component(comp.type)

        xml_components = comp.components
        xml_properties = comp.properties

        # Empty element means do all properties and components
        if xml_components is None and xml_properties is None:
            xml_components = AllComponents()
            xml_properties = AllProperties()

        if xml_components is not None:
            if xml_components == AllComponents():
                for ical_subcomponent in component.subcomponents():
                    result.addComponent(ical_subcomponent)
            else:
                for xml_subcomponent in xml_components:
                    for ical_subcomponent in component.subcomponents():
                        if ical_subcomponent.name() == xml_subcomponent.type:
                            result.addComponent(
                                self.compFilter(xml_subcomponent,
                                                ical_subcomponent))

        if xml_properties is not None:
            if xml_properties == AllProperties():
                for ical_property in component.properties():
                    result.addProperty(ical_property)
            else:
                for xml_property in xml_properties:
                    name = xml_property.property_name
                    for ical_property in component.properties(name):
                        result.addProperty(ical_property)

        return result
    def test_vevent_some_props(self):

        data = """BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
BEGIN:VEVENT
UID:12345-67890
DTSTART:20080601T120000Z
DTEND:20080601T130000Z
ATTENDEE:mailto:[email protected]
ATTENDEE:mailto:[email protected]
ORGANIZER;CN=User 01:mailto:[email protected]
BEGIN:VALARM
ACTION:DISPLAY
DESCRIPTION:Test
TRIGGER;RELATED=START:-PT10M
END:VALARM
END:VEVENT
END:VCALENDAR
""".replace("\n", "\r\n")

        result = """BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
BEGIN:VEVENT
UID:12345-67890
DTSTART:20080601T120000Z
DTEND:20080601T130000Z
BEGIN:VALARM
ACTION:DISPLAY
DESCRIPTION:Test
TRIGGER;RELATED=START:-PT10M
END:VALARM
END:VEVENT
END:VCALENDAR
""".replace("\n", "\r\n")

        empty = CalendarData(
            CalendarComponent(CalendarComponent(AllComponents(),
                                                Property(name="UID", ),
                                                Property(name="DTSTART", ),
                                                Property(name="DTEND", ),
                                                name="VEVENT"),
                              AllProperties(),
                              name="VCALENDAR"))

        for item in (
                data,
                Component.fromString(data),
        ):
            self.assertEqual(str(CalendarDataFilter(empty).filter(item)),
                             result)
    def filter(self, ical):
        """
        Filter the supplied iCalendar object using the request information.

        @param ical: iCalendar object
        @type ical: L{Component} or C{str}

        @return: L{Component} for the filtered calendar data
        """

        if self.isowner or self.accessRestriction == Component.ACCESS_PUBLIC or not self.accessRestriction:
            # No need to filter for the owner or public event
            return ical

        elif self.accessRestriction == Component.ACCESS_PRIVATE:
            # We should never get here because ACCESS_PRIVATE is protected via an ACL
            raise HTTPError(
                StatusResponse(responsecode.FORBIDDEN, "Access Denied"))

        elif self.accessRestriction == Component.ACCESS_PUBLIC:
            return ical
        elif self.accessRestriction in (Component.ACCESS_CONFIDENTIAL,
                                        Component.ACCESS_RESTRICTED):
            # Create a CALDAV:calendar-data element with the appropriate iCalendar Component/Property
            # filter in place for the access restriction in use

            extra_access = ()
            if self.accessRestriction == Component.ACCESS_RESTRICTED:
                extra_access = (
                    Property(name="SUMMARY"),
                    Property(name="LOCATION"),
                )

            calendardata = CalendarData(
                CalendarComponent(

                    # VCALENDAR properties
                    Property(name="PRODID"),
                    Property(name="VERSION"),
                    Property(name="CALSCALE"),
                    Property(name=Component.ACCESS_PROPERTY),

                    # VEVENT
                    CalendarComponent(Property(name="UID"),
                                      Property(name="RECURRENCE-ID"),
                                      Property(name="SEQUENCE"),
                                      Property(name="DTSTAMP"),
                                      Property(name="STATUS"),
                                      Property(name="TRANSP"),
                                      Property(name="DTSTART"),
                                      Property(name="DTEND"),
                                      Property(name="DURATION"),
                                      Property(name="RRULE"),
                                      Property(name="RDATE"),
                                      Property(name="EXRULE"),
                                      Property(name="EXDATE"), *extra_access,
                                      **{"name": "VEVENT"}),

                    # VTODO
                    CalendarComponent(Property(name="UID"),
                                      Property(name="RECURRENCE-ID"),
                                      Property(name="SEQUENCE"),
                                      Property(name="DTSTAMP"),
                                      Property(name="STATUS"),
                                      Property(name="DTSTART"),
                                      Property(name="COMPLETED"),
                                      Property(name="DUE"),
                                      Property(name="DURATION"),
                                      Property(name="RRULE"),
                                      Property(name="RDATE"),
                                      Property(name="EXRULE"),
                                      Property(name="EXDATE"), *extra_access,
                                      **{"name": "VTODO"}),

                    # VJOURNAL
                    CalendarComponent(Property(name="UID"),
                                      Property(name="RECURRENCE-ID"),
                                      Property(name="SEQUENCE"),
                                      Property(name="DTSTAMP"),
                                      Property(name="STATUS"),
                                      Property(name="TRANSP"),
                                      Property(name="DTSTART"),
                                      Property(name="RRULE"),
                                      Property(name="RDATE"),
                                      Property(name="EXRULE"),
                                      Property(name="EXDATE"), *extra_access,
                                      **{"name": "VJOURNAL"}),

                    # VFREEBUSY
                    CalendarComponent(Property(name="UID"),
                                      Property(name="DTSTAMP"),
                                      Property(name="DTSTART"),
                                      Property(name="DTEND"),
                                      Property(name="DURATION"),
                                      Property(name="FREEBUSY"), *extra_access,
                                      **{"name": "VFREEBUSY"}),

                    # VTIMEZONE
                    CalendarComponent(
                        AllProperties(),
                        AllComponents(),
                        name="VTIMEZONE",
                    ),
                    name="VCALENDAR",
                ), )

            # Now "filter" the resource calendar data through the CALDAV:calendar-data element
            return CalendarDataFilter(calendardata).filter(ical)
        else:
            # Unknown access restriction
            raise HTTPError(
                StatusResponse(responsecode.FORBIDDEN, "Access Denied"))