mirror of
https://github.com/ansible/awx.git
synced 2026-05-10 19:07:36 -02:30
Complete rrule validation
This commit is contained in:
@@ -1360,21 +1360,37 @@ class ScheduleSerializer(BaseSerializer):
|
|||||||
# - DTSTART is not include
|
# - DTSTART is not include
|
||||||
# - INTERVAL is not included
|
# - INTERVAL is not included
|
||||||
# - TZID is used
|
# - TZID is used
|
||||||
# - multiple BYDAY (except WEEKLY), BYMONTHDAY, BYMONTH
|
# - multiple BYDAY (except WEEKLY and YEARLY (see below)), BYMONTHDAY, BYMONTH
|
||||||
|
# - multiple BYDAY yearly unless it lists all weekdays OR weekend days
|
||||||
# - BYDAY prefixed with a number (MO is good but not 20MO)
|
# - BYDAY prefixed with a number (MO is good but not 20MO)
|
||||||
# - BYYEARDAY
|
# - BYYEARDAY
|
||||||
# - BYWEEKNO
|
# - BYWEEKNO
|
||||||
def validate_rrule(self, attrs, source):
|
def validate_rrule(self, attrs, source):
|
||||||
rrule_value = attrs[source]
|
rrule_value = attrs[source]
|
||||||
|
multi_by_day = ".*?BYDAY[\:\=][a-zA-Z]{2},[a-zA-Z]{2}"
|
||||||
|
multi_by_month_day = ".*?BYMONTHDAY[\:\=][0-9]+,-*[0-9]+"
|
||||||
|
multi_by_month = ".*?BYMONTH[\:\=][0-9]+,[0-9]+"
|
||||||
|
by_day_with_numeric_prefix = ".*?BYDAY[\:\=][0-9]+[a-zA-Z]{2}"
|
||||||
if not re.match("DTSTART[\:\=][0-9]+T[0-9]+Z", rrule_value):
|
if not re.match("DTSTART[\:\=][0-9]+T[0-9]+Z", rrule_value):
|
||||||
raise serializers.ValidationError('DTSTART required in rrule, value should match: DTSTART:YYYYMMDDTHHMMSSZ')
|
raise serializers.ValidationError('DTSTART required in rrule, value should match: DTSTART:YYYYMMDDTHHMMSSZ')
|
||||||
if not 'interval' in rrule_value.lower():
|
if not 'interval' in rrule_value.lower():
|
||||||
raise serializers.ValidationError('INTERVAL required in rrule')
|
raise serializers.ValidationError('INTERVAL required in rrule')
|
||||||
if 'tzid' in rrule_value.lower():
|
if 'tzid' in rrule_value.lower():
|
||||||
raise serializers.ValidationError('TZID is not supported')
|
raise serializers.ValidationError('TZID is not supported')
|
||||||
|
|
||||||
if 'secondly' in rrule_value.lower():
|
if 'secondly' in rrule_value.lower():
|
||||||
raise serializers.ValidationError('SECONDLY is not supported')
|
raise serializers.ValidationError('SECONDLY is not supported')
|
||||||
|
if re.match(multi_by_month_day, rrule_value):
|
||||||
|
raise serializers.ValidationError('Multiple BYMONTHDAYs not supported')
|
||||||
|
if re.match(multi_by_month, rrule_value):
|
||||||
|
raise serializers.ValidationError('Multiple BYMONTHs not supported')
|
||||||
|
if re.match(by_day_with_numeric_prefix, rrule_value):
|
||||||
|
raise serializers.ValidationError("BYDAY with numeric prefix not supported")
|
||||||
|
if 'byyearday' in rrule_value.lower():
|
||||||
|
raise serializers.ValidationError("BYYEARDAY not supported")
|
||||||
|
if 'byweekno' in rrule_value.lower():
|
||||||
|
raise serializers.ValidationError("BYWEEKNO not supported")
|
||||||
|
if re.match(multi_by_day, rrule_value) and not re.match(".*?FREQ[\:\=](WEEKLY|YEARLY)", rrule_value):
|
||||||
|
raise serializers.ValidationError("Multiple BYDAY elements only supported with WEEKLY and YEARLY frequency")
|
||||||
try:
|
try:
|
||||||
sched_rule = rrule.rrulestr(rrule_value)
|
sched_rule = rrule.rrulestr(rrule_value)
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
|
|||||||
Reference in New Issue
Block a user