def isAdvancedRule()

in src/pycalendar/icalendar/recurrence.py [0:0]


    def isAdvancedRule(self):
        # One that has BYMONTH,
        # BYMONTHDAY (with no negative value),
        # BYDAY (with multiple unnumbered, or numbered with all the same number
        # (1..4, -2, -1)
        # BYSETPOS with +1, or -1 only
        # no others

        # First checks the ones we do not handle at all
        if (
            (self.mBySeconds is not None) and (len(self.mBySeconds) != 0) or
            (self.mByMinutes is not None) and (len(self.mByMinutes) != 0) or
            (self.mByHours is not None) and (len(self.mByHours) != 0) or
            (self.mByYearDay is not None) and (len(self.mByYearDay) != 0) or
            (self.mByWeekNo is not None) and (len(self.mByWeekNo) != 0)
        ):
            return False

        # Check BYMONTHDAY numbers (we can handle -7...-1, 1..31)
        if self.mByMonthDay is not None:
            for iter in self.mByMonthDay:
                if (iter < -7) or (iter > 31) or (iter == 0):
                    return False

        # Check BYDAY numbers
        if self.mByDay is not None:
            number = 0
            first = True
            for iter in self.mByDay:

                # Get the first number
                if (first):
                    number = iter[0]
                    first = False

                    # Check number range
                    if (number > 4) or (number < -2):
                        return False

                # If current differs from last, then we have an error
                elif number != iter[0]:
                    return False

        # Check BYSETPOS numbers
        if self.mBySetPos is not None:
            if len(self.mBySetPos) > 1:
                return False
            if (len(self.mBySetPos) == 1) and (self.mBySetPos[0] != -1) and (self.mBySetPos[0] != 1):
                return False

        # If we get here it must be OK
        return True