-
Notifications
You must be signed in to change notification settings - Fork 445
/
Copy pathvalidators.py
106 lines (81 loc) · 2.85 KB
/
validators.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
"""Validators."""
import crontab
from django.core.exceptions import ValidationError
class _CronSlices(crontab.CronSlices):
"""Cron slices with customized validation."""
def __init__(self, *args):
super(crontab.CronSlices, self).__init__(
[_CronSlice(info) for info in crontab.S_INFO]
)
self.special = None
self.setall(*args)
self.is_valid = self.is_self_valid
@classmethod
def validate(cls, *args):
try:
cls(*args)
except Exception as e:
raise ValueError(e)
class _CronSlice(crontab.CronSlice):
"""Cron slice with custom range parser."""
def get_range(self, *vrange):
ret = _CronRange(self, *vrange)
if ret.dangling is not None:
return [ret.dangling, ret]
return [ret]
class _CronRange(crontab.CronRange):
"""Cron range parser class."""
# rewrite whole method to raise error on bad range
def parse(self, value):
if value.count('/') == 1:
value, seq = value.split('/')
try:
self.seq = self.slice.parse_value(seq)
except crontab.SundayError:
self.seq = 1
value = "0-0"
if self.seq < 1 or self.seq > self.slice.max:
raise ValueError("Sequence can not be divided by zero or max")
if value.count('-') == 1:
vfrom, vto = value.split('-')
self.vfrom = self.slice.parse_value(vfrom, sunday=0)
try:
self.vto = self.slice.parse_value(vto)
except crontab.SundayError:
if self.vfrom == 1:
self.vfrom = 0
else:
self.dangling = 0
self.vto = self.slice.parse_value(vto, sunday=6)
if self.vto < self.vfrom:
raise ValueError("Bad range '{0.vfrom}-{0.vto}'".format(self))
elif value == '*':
self.all()
else:
raise ValueError('Unknown cron range value "%s"' % value)
def crontab_validator(value):
"""Validate crontab."""
try:
_CronSlices.validate(value)
except ValueError as e:
raise ValidationError(e)
def minute_validator(value):
"""Validate minutes crontab value."""
_validate_crontab(value, 0)
def hour_validator(value):
"""Validate hours crontab value."""
_validate_crontab(value, 1)
def day_of_month_validator(value):
"""Validate day of month crontab value."""
_validate_crontab(value, 2)
def month_of_year_validator(value):
"""Validate month crontab value."""
_validate_crontab(value, 3)
def day_of_week_validator(value):
"""Validate day of week crontab value."""
_validate_crontab(value, 4)
def _validate_crontab(value, index):
tab = ['*'] * 5
tab[index] = value
tab = ' '.join(tab)
crontab_validator(tab)