def parse_duration(request, name, default_value=None, required=True): '''Parses a time duration parameter from the given request. :param request: The context of an active HTTP request. :type request: :class:`rest_framework.request.Request` :param name: The name of the parameter to parse. :type name: str :param default_value: The name of the parameter to parse. :type default_value: datetime.timedelta :param required: Indicates whether or not the parameter is required. An exception will be raised if the parameter does not exist, there is no default value, and required is True. :type required: bool :returns: The value of the named parameter or the default value if provided. :rtype: datetime.timedelta :raises :class:`util.rest.BadParameter`: If the value cannot be parsed. ''' value = _get_param(request, name, default_value, required) if not isinstance(value, basestring): return value try: result = parse_util.parse_duration(value) if result: return result raise except: raise BadParameter('Invalid duration format for parameter: %s' % name)
def parse_duration(request, name, default_value=None, required=True): """Parses a time duration parameter from the given request. :param request: The context of an active HTTP request. :type request: :class:`rest_framework.request.Request` :param name: The name of the parameter to parse. :type name: string :param default_value: The name of the parameter to parse. :type default_value: datetime.timedelta or string :param required: Indicates whether or not the parameter is required. An exception will be raised if the parameter does not exist, there is no default value, and required is True. :type required: bool :returns: The value of the named parameter or the default value if provided. :rtype: datetime.timedelta :raises :class:`util.rest.BadParameter`: If the value cannot be parsed. """ value = _get_param(request, name, default_value, required) if not isinstance(value, basestring): return value try: result = parse_util.parse_duration(value) if result: return result raise except: raise BadParameter('Invalid duration format for parameter: %s' % name)
def _check_rule(rule): '''Checks the given rule for validation errors and then triggers an event for processing if the schedule requires. :param rule: The system name of the processor, which is used in trigger rule configurations. :type rule: :class:`trigger.models.TriggerRule` :raises :class:`job.clock.ClockEventError`: If there is a configuration problem with the rule. ''' # Validate the processor name attribute if rule.name not in _PROCESSORS: raise ClockEventError('Clock trigger rule references unknown processor name: %s -> %s' % (rule.id, rule.name)) # Validate the event type attribute if 'event_type' not in rule.configuration or not rule.configuration['event_type']: raise ClockEventError('Clock trigger rule missing "event_type" attribute: ' % rule.id) # Validate the clock schedule if 'schedule' not in rule.configuration or not rule.configuration['schedule']: raise ClockEventError('Clock trigger rule missing "schedule" attribute: ' % rule.id) schedule = rule.configuration['schedule'] duration = parse.parse_duration(schedule) if not duration: raise ClockEventError('Invalid format for clock trigger "schedule" attribute: %s -> %s' % (rule.id, schedule)) # Trigger a new event when the schedule is surpassed last_event = TriggerEvent.objects.filter(rule=rule).order_by('-occurred').first() logger.debug('Checking rule schedule: %s -> %s since %s', rule.type, duration, last_event) if _check_schedule(duration, last_event): _trigger_event(rule, last_event)
def _check_rule(rule): """Checks the given rule for validation errors and then triggers an event for processing if the schedule requires. :param rule: The system name of the processor, which is used in trigger rule configurations. :type rule: :class:`trigger.models.TriggerRule` :raises :class:`job.clock.ClockEventError`: If there is a configuration problem with the rule. """ # Validate the processor name attribute if rule.name not in _PROCESSORS: raise ClockEventError('Clock trigger rule references unknown processor name: %s -> %s' % (rule.id, rule.name)) # Validate the event type attribute if 'event_type' not in rule.configuration or not rule.configuration['event_type']: raise ClockEventError('Clock trigger rule missing "event_type" attribute: ' % rule.id) # Validate the clock schedule if 'schedule' not in rule.configuration or not rule.configuration['schedule']: raise ClockEventError('Clock trigger rule missing "schedule" attribute: ' % rule.id) schedule = rule.configuration['schedule'] duration = parse.parse_duration(schedule) if not duration: raise ClockEventError('Invalid format for clock trigger "schedule" attribute: %s -> %s' % (rule.id, schedule)) # Trigger a new event when the schedule is surpassed last_event = TriggerEvent.objects.filter(rule=rule).order_by('-occurred').first() logger.debug('Checking rule schedule: %s -> %s since %s', rule.type, duration, last_event) if _check_schedule(duration, last_event): _trigger_event(rule, last_event)
def test_parse_duration_invalid(self): """Tests parsing an invalid ISO duration.""" self.assertIsNone(parse_util.parse_duration('BAD'))
def test_parse_duration(self): """Tests parsing a valid ISO duration.""" self.assertEqual(parse_util.parse_duration('PT3H0M0S'), datetime.timedelta(0, 10800))