@@ -160,7 +160,7 @@ def _validate_time_format(time_str):
160160 def _validate_scheduled_setting (self , setting ):
161161 schedule_type = setting .get ('schedule_type' )
162162
163- valid_types = ['daily' , 'weekly' , 'monthly' , 'interval' ]
163+ valid_types = ['daily' , 'weekly' , 'monthly' , 'interval' , 'cron' ]
164164 if schedule_type not in valid_types :
165165 raise serializers .ValidationError (
166166 {'trigger_setting' : _ ('schedule_type must be one of %s' ) % ', ' .join (valid_types )
@@ -173,7 +173,8 @@ def _validate_scheduled_setting(self, setting):
173173 self ._validate_monthly (setting )
174174 elif schedule_type == 'interval' :
175175 self ._validate_interval (setting )
176-
176+ elif schedule_type == 'cron' :
177+ self ._validate_cron (setting )
177178 def _validate_daily (self , setting ):
178179 self ._validate_required_field (setting , 'time' , 'daily' )
179180 self ._validate_time_array (setting ['time' ])
@@ -212,6 +213,21 @@ def _validate_interval(self, setting):
212213 raise serializers .ValidationError ({
213214 'trigger_setting' : _ ('interval_unit must be one of %s' ) % ', ' .join (valid_units )
214215 })
216+ @staticmethod
217+ def _validate_cron (setting ):
218+ from apscheduler .triggers .cron import CronTrigger
219+
220+ cron_expression : str = setting .get ('cron_expression' )
221+ if not cron_expression :
222+ raise serializers .ValidationError ({
223+ 'trigger_setting' : _ ('cron type requires cron_expression field' )
224+ })
225+ try :
226+ CronTrigger .from_crontab (cron_expression .strip ())
227+ except ValueError :
228+ raise serializers .ValidationError ({
229+ 'trigger_setting' : _ ('Invalid cron expression: %s' ) % cron_expression
230+ })
215231
216232 @staticmethod
217233 def _validate_event_setting (setting ):
0 commit comments