def calculate_rrule_exclusions(start_date, end_date, exclusion_commands, settings):
    exclusion_ruleset = rruleset()

    exclusion_types = exclusion_commands.exclusionList

    for exclusion_type in exclusion_types:

        if hasattr(exclusion_type, "exclusionRange"):
            from_date, _ = convert_date_time(exclusion_type.exclusionRange.fromDateTime, settings)
            to_date, _ = convert_date_time(exclusion_type.exclusionRange.toDateTime, settings)
            exclusion_ruleset.rrule(rrule(freq=DAILY, dtstart=from_date, until=to_date))

        elif hasattr(exclusion_type, "exclusionDateTime"):
            real_date, _ = convert_date_time(exclusion_type.exclusionDateTime, settings)
            exclusion_ruleset.rrule(rrule(freq=DAILY, dtstart=real_date, until=real_date))

        elif hasattr(exclusion_type, "exclusionMacro"):
            macro_value = exclusion_type.exclusionMacro
            exclusion_rule = EXCLUSION_MAP[macro_value]['rule'](start=start_date, end=end_date)
            exclusion_ruleset.rrule(exclusion_rule)
        else:
            # in that case, I have no idea what this is (the parser should have caught it) so just
            # raise an error or something
            raise UnknownExclusionTypeError

    matched_dates = list(exclusion_ruleset.between(after=start_date, before=end_date, inc=True))

    return len(matched_dates)
def do_subtraction(command, settings):
    date_time_1, output_format_1 = convert_date_time(command.dateTime1, settings)
    date_time_2, output_format_2 = convert_date_time(command.dateTime2, settings)

    # In a moment of madness, we've decided to allow operands in a date from date
    # subtraction. It's much easier to process these first.
    if hasattr(command, "operandList1"):
        for operand in command.operandList1:
            date_time_1 = delta_arithmetic(date_time_1, operand)

    if hasattr(command, "operandList2"):
        for operand in command.operandList2:
            date_time_2 = delta_arithmetic(date_time_2, operand)

    return normalised_days(command, date_time_1, date_time_2)
Exemple #3
0
def do_timespans(command, settings):
    date_time, output_format = convert_date_time(command.dateTime, settings)

    for operand in command.operandList:
        date_time = delta_arithmetic(date_time, operand)

    return date_time.strftime(output_format)
def do_timespans(command, settings):
    date_time, output_format = convert_date_time(command.dateTime, settings)

    # Note the very first date in case there is an exclusion rule
    first_date_time = date_time

    for operand in command.operandList:
        date_time = delta_arithmetic(date_time, operand)

    last_date_time = date_time

    # Make sure the dates are the right way around, or the
    # following functions will not work correctly.

    first_date_time, last_date_time = later_date_last(first_date_time, last_date_time)

    if hasattr(command, "exclusionCommands"):

        rules = rruleset()
        exclusion_rules = build_exclusion_list(command, first_date_time, last_date_time, settings)

        for rule in exclusion_rules:
            rules.rrule(rule)

        days_to_exclude = len(rules.between(first_date_time, last_date_time, True))
        operand = relativedelta(days=days_to_exclude)
        date_time += operand

    return date_time.strftime(output_format)
Exemple #5
0
def do_formats(command, settings):
    date_time, _ = convert_date_time(command.dateTime, settings)

    if command.dateFormat.lower() in DATE_FORMATTERS_MAP:
        # noinspection PyCallingNonCallable
        return DATE_FORMATTERS_MAP[command.dateFormat.lower()](date_time)
    else:
        return "Invalid function . . . "
Exemple #6
0
def do_subtraction(command, settings):
    date_time_1, output_format_1 = convert_date_time(command.dateTime1,
                                                     settings)
    date_time_2, output_format_2 = convert_date_time(command.dateTime2,
                                                     settings)

    # In a moment of madness, we've decided to allow operands in a date from date
    # subtraction. It's much easier to process these first.
    if hasattr(command, "operandList1"):
        for operand in command.operandList1:
            date_time_1 = delta_arithmetic(date_time_1, operand)

    if hasattr(command, "operandList2"):
        for operand in command.operandList2:
            date_time_2 = delta_arithmetic(date_time_2, operand)

    return normalised_days(command, date_time_1, date_time_2)
def do_formats(command, settings):
    date_time, _ = convert_date_time(command.dateTime, settings)

    if command.dateFormat.lower() in DATE_FORMATTERS_MAP:
        # noinspection PyCallingNonCallable
        return DATE_FORMATTERS_MAP[command.dateFormat.lower()](date_time)
    else:
        return "Invalid function . . . "
def do_timespans(command, settings):
    date_time, output_format = convert_date_time(command.dateTime, settings)
    original_date_time = date_time

    for operand in command.operandList:
        date_time = delta_arithmetic(date_time, operand)

    date_time = exclusion_check(original_date_time, date_time, command, settings)

    return date_time.strftime(output_format)
def build_exclusion_list(command, date_time_1, date_time_2, settings):
    """
    If the user has build an exclusion list then we process it here
    :param command:
    :return: a set of rules that denote the exclusion
    """
    exclusion_rules = []

    if hasattr(command, "exclusionCommands"):

        for exclusion_command in command.exclusionCommands:

            # process the exclusion list
            for exclusion_item in exclusion_command.exclusionList:

                if hasattr(exclusion_item, "exclusionMacro"):

                    start_date_time, end_date_time = later_date_last(date_time_1, date_time_2)

                    # noinspection PyCallingNonCallable
                    new_rule = DATE_EXCLUSION_RULES_MAP[exclusion_item.exclusionMacro](start=start_date_time,
                                                                                       end=end_date_time)
                elif hasattr(exclusion_item, "exclusionDateTime"):

                    date_time, _ = convert_date_time(exclusion_item.exclusionDateTime, settings)

                    new_rule = rrule(freq=DAILY, dtstart=date_time, until=date_time)

                elif hasattr(exclusion_item, "exclusionRange"):
                    exclusion_date_1, _ = convert_date_time(exclusion_item.exclusionRange.fromDateTime, settings)

                    exclusion_date_2, _ = convert_date_time(exclusion_item.exclusionRange.toDateTime, settings)

                    date_1, date_2 = later_date_last(exclusion_date_1, exclusion_date_2)

                    new_rule = rrule(freq=DAILY, dtstart=date_1, until=date_2)

                else:
                    raise UnknownExclusionTypeError

                exclusion_rules.append(new_rule)

        return exclusion_rules
Exemple #10
0
def do_timespans(command, settings):
    date_time, output_format = convert_date_time(command.dateTime, settings)
    original_date_time = date_time

    for operand in command.operandList:
        date_time = delta_arithmetic(date_time, operand)

    date_time = exclusion_check(original_date_time, date_time, command,
                                settings)

    return date_time.strftime(output_format)
def change_anniversary(anniversaries, command, date_mapping, wf):

    if "%Y" not in date_mapping["date-format"]:
        return FOUR_DIGIT_DATE_ERROR

    if command.anniversaryName not in anniversaries:
        output = "{anniversaryName} does not exist".format(anniversaryName=command.anniversaryName)
    else:
        date_time, output_format = convert_date_time(command.dateTime, wf.settings)
        anniversary_date = date_time.isoformat()
        anniversaries[command.anniversaryName.lower()] = anniversary_date
        wf.settings["anniversaries"] = anniversaries
        output = "{anniversaryName} changed".format(anniversaryName=command.anniversaryName)
    return output
Exemple #12
0
def calculate_rrule_exclusions(start_date, end_date, exclusion_commands,
                               settings):
    exclusion_ruleset = rruleset()

    exclusion_types = exclusion_commands.exclusionList

    for exclusion_type in exclusion_types:

        if hasattr(exclusion_type, "exclusionRange"):
            from_date, _ = convert_date_time(
                exclusion_type.exclusionRange.fromDateTime, settings)
            to_date, _ = convert_date_time(
                exclusion_type.exclusionRange.toDateTime, settings)
            exclusion_ruleset.rrule(
                rrule(freq=DAILY, dtstart=from_date, until=to_date))

        elif hasattr(exclusion_type, "exclusionDateTime"):
            real_date, _ = convert_date_time(exclusion_type.exclusionDateTime,
                                             settings)
            exclusion_ruleset.rrule(
                rrule(freq=DAILY, dtstart=real_date, until=real_date))

        elif hasattr(exclusion_type, "exclusionMacro"):
            macro_value = exclusion_type.exclusionMacro
            exclusion_rule = EXCLUSION_MAP[macro_value]['rule'](
                start=start_date, end=end_date)
            exclusion_ruleset.rrule(exclusion_rule)
        else:
            # in that case, I have no idea what this is (the parser should have caught it) so just
            # raise an error or something
            raise UnknownExclusionTypeError

    matched_dates = list(
        exclusion_ruleset.between(after=start_date, before=end_date, inc=True))

    return len(matched_dates)
Exemple #13
0
def change_anniversary(anniversaries, command, date_mapping, wf):

    if "%Y" not in date_mapping["date-format"]:
        return FOUR_DIGIT_DATE_ERROR

    if command.anniversaryName not in anniversaries:
        output = "{anniversaryName} does not exist".format(
            anniversaryName=command.anniversaryName)
    else:
        date_time, output_format = convert_date_time(command.dateTime,
                                                     wf.settings)
        anniversary_date = date_time.isoformat()
        anniversaries[command.anniversaryName.lower()] = anniversary_date
        wf.settings["anniversaries"] = anniversaries
        output = "{anniversaryName} changed".format(
            anniversaryName=command.anniversaryName)
    return output