def _validate_period()

in source/lambda/configuration/config_admin.py [0:0]


    def _validate_period(self, **period):

        result = {}

        def is_valid_time(s):
            return re.match(ConfigAdmin.TIME_REGEX, s) is not None

        # allowed and validated parameters
        valid_parameters = [configuration.BEGINTIME,
                            configuration.ENDTIME,
                            configuration.WEEKDAYS,
                            configuration.MONTHDAYS,
                            configuration.MONTHS,
                            configuration.NAME,
                            configuration.DESCRIPTION]

        for attr in period:
            # indicates type for config entry
            if attr == ConfigAdmin.TYPE_ATTR:
                continue

            # parameter is allowed?
            if attr not in valid_parameters:
                raise ValueError(ERR_PERIOD_UNKNOWN_PARAMETER.format(attr, str(valid_parameters)))

            # remove None values
            if period[attr] is None or len(str(period[attr])) == 0:
                continue

            # period name
            if attr == configuration.NAME:
                result[attr] = period[attr]
                continue

            # description
            if attr == configuration.DESCRIPTION:
                result[attr] = period[attr]
                continue

            # validate start and end types times
            if attr in [configuration.BEGINTIME, configuration.ENDTIME]:
                time_str = period[attr]
                if not is_valid_time(time_str):
                    raise ValueError(ERR_PERIOD_INVALID_TIME.format(attr, time_str))
                result[attr] = str(datetime.strptime(time_str, configuration.TIME_FORMAT_STRING).time())[
                               0:len(configuration.TIME_FORMAT_STRING)]
                if configuration.BEGINTIME in result and configuration.ENDTIME in result:
                    begintime = datetime.strptime(result[configuration.BEGINTIME], configuration.TIME_FORMAT_STRING).time()
                    endtime = datetime.strptime(result[configuration.ENDTIME], configuration.TIME_FORMAT_STRING).time()
                    if begintime > endtime:
                        raise ValueError(
                            ERR_PERIOD_BEGIN_LATER_THAN_END.format(result[configuration.BEGINTIME], result[configuration.ENDTIME]))

                continue

            # check weekdays, monthdays and month sets
            if attr in [configuration.WEEKDAYS, configuration.MONTHDAYS, configuration.MONTHS]:
                temp = self._ensure_set(period[attr])

                if len(temp) == 0:
                    continue

                # validate month
                if attr == configuration.MONTHS:
                    # noinspection PyPep8
                    try:
                        MonthSetBuilder().build(temp)
                        result[attr] = temp
                        continue
                    except:
                        raise ValueError(ERR_PERIOD_INVALID_MONTHS.format(str(period[attr])))

                # validate weekdays
                if attr == configuration.WEEKDAYS:
                    try:
                        wdb = WeekdaySetBuilder(year=2016, month=12, day=31)
                        wdb.build(temp)
                        result[attr] = temp
                        continue
                    except Exception as ex:
                        raise ValueError(ERR_PERIOD_INVALID_WEEKDAYS.format(str(period[attr]), ex))

                # validate monthdays
                if attr == configuration.MONTHDAYS:
                    # noinspection PyPep8
                    try:
                        MonthdaySetBuilder(year=2016, month=12).build(temp)
                        result[attr] = temp
                        continue
                    except:
                        raise ValueError(ERR_PERIOD_INVALID_MONTHDAYS.format(str(period[attr])))

        if configuration.NAME not in result:
            raise ValueError(ERR_NAME_PARAM_MISSING)

        for condition in [configuration.BEGINTIME,
                          configuration.ENDTIME,
                          configuration.WEEKDAYS,
                          configuration.MONTHS,
                          configuration.MONTHDAYS]:
            if condition in result:
                break
        else:
            raise ValueError(ERR_NO_PERIODS)

        result[ConfigAdmin.TYPE_ATTR] = configuration.PERIOD

        return result