コード例 #1
0
ファイル: config.py プロジェクト: JR-Mitchell/DriveFinance
def config_setup_flow(config_dict):
    """ Interactive setup for changing key-value pairs in config_dict

    :param config_dict: the config dictionary
    :type config_dict: dict
    """
    mod_folder_bool = False
    if "__default_folder_name" in config_dict:
        print("Modify default folder name? (y/N)")
        mod_folder_bool = input.yes_no_input()
    else:
        print("No default folder name found.")
        mod_folder_bool = True
    if mod_folder_bool:
        print("Please type the new default folder name...")
        config_dict["__default_folder_name"] = input.text_input()
    print("Add/modify default payment account? (y/N)")
    if input.yes_no_input():
        print("Please type the new default payment account...")
        config_dict["__default_payment"] = input.text_input().lower()
    print("Add/modify default transfer sending account? (y/N)")
    if input.yes_no_input():
        print("Please type the new default transfer sending account...")
        config_dict["__default_from_account"] = input.text_input().lower()
    print("Add/modify default transfer receiving account? (y/N)")
    if input.yes_no_input():
        print("Please type the new default transfer receiving account...")
        config_dict["__default_to_account"] = input.text_input().lower()
    print("Saving updated config...")
    outstr = ""
    for key in config_dict:
        outstr += key + ":" + config_dict[key] + "\n"
    with open("config.ini","w") as configfile:
        configfile.write(outstr)
コード例 #2
0
def modify_section_flow(section):
    print("This section calls the function {}".format(section[0]) +
          "\nWould you like to change that? (y/N)")
    if input.yes_no_input():
        return create_section_flow()
    else:
        while True:
            print("Current arguments:")
            for i, item in enumerate(section[1:]):
                if isinstance(item, list):
                    print("{}: report function '{}'".format(i, item[0]))
                else:
                    print("{}: value '{}'".format(i, item))
            print("Do you wish to modify an argument (y)" +
                  " or stop modifying this section (N)?")
            if input.yes_no_input():
                print("Which index argument do you wish to modify?")
                modify_index = input.int_input()
                while True:
                    try:
                        val_to_change = section[modify_index + 1]
                        break
                    except:
                        print("The index you gave ({})".format(modify_index) +
                              " is not a valid index.")
                        modify_index = input.int_input()
                replace = True
                if isinstance(val_to_change, list):
                    print("This argument is the" +
                          " report function {}".format(val_to_change[0]) +
                          "\nDo you wish to modify this report function (y)" +
                          " or replace it with something else (N)?")
                    if input.yes_no_input():
                        replace = False
                if replace:
                    print("Is argument {} a value (y),".format(modify_index) +
                          "or is it a report function (N)?")
                    if input.yes_no_input():
                        print("What is the value of" +
                              " argument {}?".format(modify_index))
                        section[modify_index + 1] = input.text_input()
                    else:
                        section[modify_index +
                                1] = create_report_func_flow(modify_index)
                        print("Returned to section modification" +
                              " for section {}\n".format(section[0]))
                else:
                    section[modify_index +
                            1] = modify_report_func_flow(val_to_change)
                    print("Returned to section modification" +
                          " for section {}\n".format(section[0]))
            else:
                break
    return section
コード例 #3
0
def report_sections_flow(report_json):
    """ Interactive setup for modifying sections of a report

    :param report_json: the loaded json of the report
    :type report_json: dict
    """
    print("\nModifying report sections\n=========================\n")
    while True:
        print("Current sections:")
        for i, item in enumerate(report_json["sections"]):
            print("{}: {}".format(i, item[0]))
        print("\nYou may add, modify or delete a section," +
              " or cancel out of this dialogue.")
        print("Do you want to add a section? (y/N)")
        if input.yes_no_input():
            print("At which index should this section be added?")
            modify_index = input.int_input()
            report_json["sections"].insert(modify_index, create_section_flow())
            continue
        if len(report_json["sections"]) == 0:
            print("No sections left to modify / delete!")
        else:
            print("Do you want to modify a section? (y/N)")
            if input.yes_no_input():
                print("Which number section would you like to modify?")
                modify_index = input.int_input()
                while True:
                    try:
                        sec_to_modify = report_json["sections"][modify_index]
                        break
                    except:
                        print("The index you gave ({})".format(modify_index) +
                              " is not a valid index.")
                        modify_index = input.int_input()
                report_json["sections"] \
                           [modify_index] = modify_section_flow(sec_to_modify)
                continue
            print("Do you want to delete a section? (y/N)")
            if input.yes_no_input():
                print("Which number section would you like to delete?")
                delete_index = input.int_input()
                while True:
                    try:
                        del report_json["sections"][delete_index]
                        break
                    except:
                        print("The index you gave ({})".format(delete_index) +
                              " is not a valid index.")
                        delete_index = input.int_input()
                continue
        print("Do you want to finish editing sections? (y/N)")
        if input.yes_no_input():
            break
コード例 #4
0
def modify_report_func_flow(report_func):
    print("Now modifying the report function {}".format(report_func[0]))
    while True:
        print("Current report function arguments:")
        for i, item in enumerate(report_func[1:]):
            if isinstance(item, list):
                print("{}: figure function '{}'".format(i, item[0]))
            else:
                print("{}: value '{}'".format(i, item))
        print("Do you wish to modify an argument (y)" +
              " or stop modifying this report function (N)?")
        if input.yes_no_input():
            print("Which index argument do you wish to modify?")
            modify_index = input.int_input()
            while True:
                try:
                    val_to_change = report_func[modify_index + 1]
                    break
                except:
                    print("The index you gave ({})".format(modify_index) +
                          " is not a valid index.")
                    modify_index = input.int_input()
            replace = True
            if isinstance(val_to_change, list):
                print("This argument is the" +
                      " figure function {}".format(val_to_change[0]) +
                      "\nDo you wish to modify this figure function (y)" +
                      " or replace it with something else (N)?")
                if input.yes_no_input():
                    replace = False
            if replace:
                print("Is argument {} a value (y),".format(modify_index) +
                      "or is it a figure function (N)?")
                if input.yes_no_input():
                    print("What is the value of" +
                          " argument {}?".format(modify_index))
                    report_func[modify_index + 1] = input.text_input()
                else:
                    report_func[modify_index +
                                1] = create_figure_func_flow(modify_index)
                    print("Returned to report function modification" +
                          " for report function {}\n".format(report_func[0]))
            else:
                report_func[modify_index +
                            1] = modify_figure_func_flow(val_to_change)
                print("Returned to report function modification" +
                      " for report function {}\n".format(report_func[0]))
        else:
            break
    return report_func
コード例 #5
0
def report_modification_flow(report_name):
    """ Interactive setup for modifying a report

    :param report_name: the name of the report to modify
    :type report_name: str
    """
    with open("report_json/{}.json".format(report_name), "r") as infile:
        report_json = json.load(infile)
    print("Modifying report '{}'\n".format(report_name))
    if "autodo" in report_json:
        print("'autodo' is set to '{}'. Change it to '{}'? (y/N)".format(
            report_json["autodo"], 1 - report_json["autodo"]))
        if input.yes_no_input():
            report_json["autodo"] = 1 - report_json["autodo"]
    else:
        print("No 'autodo' tag found." +
              " Do you want this report to be generated automatically? (y/N)")
        if input.yes_no_input():
            report_json["autodo"] = 1
    if "frequency" in report_json:
        announce_str = (
            "'frequency' is set to '{}'." +
            " This represents the period of the time that the report covers." +
            " Do you wish to change it? (y/N)")
        announce_str = announce_str.format(report_json["frequency"])
        print(announce_str)
        if input.yes_no_input():
            print("What period of time should this report cover?")
            report_json["frequency"] = input.frequency_input()
    else:
        print("No 'frequency' tag found." +
              " What should the frequency tag be?")
        report_json["frequency"] = input.frequency_input()
    if "offset" in report_json:
        announce_str = ("'offset' is set to '{}'." +
                        " Do you wish to change it? (y/N)")
        announce_str = announce_str.format(report_json["offset"])
        print(announce_str)
        if input.yes_no_input():
            print("What should the new offset tag be?")
            report_json["offset"] = input.int_input()
    else:
        print(
            "No 'offset' tag found." +
            " Should this report be offset a certain number of periods from" +
            " the current date? (y/N)")
        if input.yes_no_input():
            print("How many periods in the past should this report be?")
            report_json["offset"] = input.int_input()
    print("Do you wish to modify the sections in this report? (y/N)")
    if input.yes_no_input():
        if "sections" not in report_json:
            report_json["sections"] = []
        report_sections_flow(report_json)
    print("Saving report...")
    with open("report_json/{}.json".format(report_name), "w") as outfile:
        json.dump(report_json, outfile)
    print("Done modifying report '{}'\n".format(report_name))
コード例 #6
0
def report_creation_flow(report_name):
    """ Interactive setup for creating a report

    :param report_name: the name of the report to create
    :type report_name: str
    """
    print("Creating report '{}'\n".format(report_name))
    report_json = {}
    print("Do you want this report to be generated automatically? (y/N)")
    if input.yes_no_input():
        report_json["autodo"] = 1
    print("What period of time should this report cover?")
    report_json["frequency"] = input.frequency_input()
    print("Should this report be offset a certain number of periods from the" +
          " current date? (y/N)")
    if input.yes_no_input():
        print("How many periods in the past should this report be?")
        report_json["offset"] = input.int_input()
    report_json["sections"] = []
    report_sections_flow(report_json)
    print("Saving report...")
    with open("report_json/{}.json".format(report_name), "w") as outfile:
        json.dump(report_json, outfile)
    print("Successfully created report '{}'\n".format(report_name))
コード例 #7
0
def create_report_func_flow(index):
    print("What report function is argument {}?".format(index))
    report_function = [input.text_input()]
    print("How many arguments does" + " {} take?".format(report_function[0]))
    no_args = input.int_input()
    for i in range(no_args):
        print("Is {} argument {} a value (y),".format(report_function[0], i) +
              "or is it a figure function (N)?")
        if input.yes_no_input():
            print("What is the value of argument {}?".format(i))
            report_function.append(input.text_input())
        else:
            report_function.append(create_figure_func_flow(index, i))
            print("Returned to report function creation" +
                  " for report function {}\n".format(report_function[0]))
    return report_function
コード例 #8
0
def create_section_flow():
    print("What LaTeX function should this section call?")
    new_section = [input.text_input()]
    print("How many arguments does {} take?".format(new_section[0]))
    no_args = input.int_input()
    for i in range(no_args):
        print("Is {} argument {} a value (y),".format(new_section[0], i) +
              "or is it a report function (N)?")
        if input.yes_no_input():
            print("What is the value of argument {}?".format(i))
            new_section.append(input.text_input())
        else:
            new_section.append(create_report_func_flow(i))
            print("Returned to section creation" +
                  " for section {}\n".format(new_section[0]))
    return new_section
コード例 #9
0
def modify_figure_func_flow(figure_func):
    print("Now modifying the figure function {}".format(figure_func[0]))
    while True:
        print("Current figure function arguments:")
        for i, item in enumerate(figure_func[1:]):
            print("{}: value '{}'".format(i, item))
        print("Do you wish to replace an argument (y)" +
              " or stop modifying this figure function (N)?")
        if input.yes_no_input():
            print("Which index argument do you wish to modify?")
            modify_index = input.int_input()
            while True:
                try:
                    val_to_change = figure_func[modify_index + 1]
                    break
                except:
                    print("The index you gave ({})".format(modify_index) +
                          " is not a valid index.")
                    modify_index = input.int_input()
            print("What is the value of argument {}?".format(modify_index))
            figure_func[modify_index + 1] = input.text_input()
        else:
            break
    return figure_func
コード例 #10
0
def default_setup_flow(foldername=None):
    """ Interactive setup for the user.
    Called with --setup argument.

    :param foldername: the name of the drive folder,
        defaults to None (in which case, if a config.ini exists, the default
        folder name in it is used, and otherwise config setup is executed to
        get a default folder name set up.)
    :type foldername: str, optional
    """
    config_already_done = False
    #If necessary, generate defaults
    try:
        with open("config.ini", "r") as configfile:
            config_txt = configfile.read()
        config_dict = dict([
            item.split(":") for item in config_txt.split("\n")
            if len(item.split(":")) == 2
        ])
    except IOError:
        print("No config.ini found. Running config setup...")
        config_dict = {
            "__default_payment": "__default_payment",
            "__default_to_account": "__default_to_account",
            "__default_from_account": "__default_from_account"
        }
        config.config_setup_flow(config_dict)
        config_already_done = True
    if foldername is None:
        foldername = config_dict["__default_folder_name"]
    #Create an auth token
    drive_folder = odf.DriveFolder(foldername)
    #Create missing subdirectories and files on machine
    dirlist = os.listdir(os.getcwd())
    for folder_name in ["databases", "templates", "report_json"]:
        if folder_name not in dirlist:
            print("Creating '{}' folder".format(folder_name))
            os.mkdir(folder_name)
    #Opt: modify defaults
    if not config_already_done:
        print("Do you wish to modify the values in config.ini? (y/N)")
        if input.yes_no_input():
            config.config_setup_flow(config_dict)
    #Opt: initialise financial account(s)
    print("Do you wish to initialise a financial account? (y/N)")
    finance_init = input.yes_no_input()
    if finance_init:
        finance_data = fdat.FinanceData(foldername)
        while (finance_init):
            print("Which account would you like to set the" +
                  " initial balance for?")
            account_name = input.text_input()
            print("What is the initial balance for '{}'".format(account_name))
            balance = input.money_input()
            init_time = datetime.datetime.now()
            finance_data.set_initial_balance(account_name, balance, init_time)
            print("Set initial balance of '{}' to {}".format(
                account_name, balance))
            print("Do you wish to initialise another financial account? (y/N)")
            finance_init = input.yes_no_input()
    #Opt: initialise shortcut(s)
    print("Do you want to set up payment shortcuts? (y/N)")
    shortcut_init = input.yes_no_input()
    if shortcut_init:
        #Get parsed payments file
        import src.parse.shortcuts as shortparse
        raw_shortcut_file = drive_folder.child_file("Shortcuts")
        parsed_shortcut_file = shortparse.ParsedShortcuts(raw_shortcut_file)
        #Do shortcuts flow
        while shortcut_init:
            shortcuts.shortcut_setup_flow(parsed_shortcut_file)
            print("Do you want to set up another payment shortcut? (y/N)")
            shortcut_init = input.yes_no_input()
        #Save to drive
        write_text = "\r\n".join([line for line in parsed_shortcut_file])
        raw_shortcut_file.write_from_string(write_text)
    #Opt: initialise report(s)
    print("Do you want to create/modify/clone a report? (y/N)")
    report_init = input.yes_no_input()
    while report_init:
        reports.report_setup_flow()
        print("Do you want to set up another report? (y/N)")
        report_init = input.yes_no_input()
コード例 #11
0
def report_setup_flow():
    """ Interactive setup for creating, cloning or modifying a report
    """
    report_names = [item[:-5] for item in os.listdir("report_json/")]
    print("\nReport Setup\n============\n")
    print("You may create, clone or modify a report," +
          " or cancel out of this dialogue.")
    dokey = ""
    modify_name = None
    while True:
        print("Do you want to create a new report? (y/N)")
        if input.yes_no_input():
            dokey = "create"
            break
        print("Do you want to clone an existing report? (y/N)")
        if input.yes_no_input():
            dokey = "clone"
            break
        print("Do you want to modify an existing report? (y/N)")
        if input.yes_no_input():
            dokey = "modify"
            break
        print("Do you want to exit this dialogue? (y/N)")
        if input.yes_no_input():
            dokey = "leave"
            break
    if dokey == "create":
        print("What should the new report be named?")
        new_name = input.text_input()
        while new_name in report_names:
            print("The name you gave ({})".format(clone_name) +
                  " is already a recognised report name." +
                  " Please input an original name.")
            print("Existing reports are:")
            print(report_names)
        report_creation_flow(new_name)
    if dokey == "clone":
        print("Existing reports are:")
        print(report_names)
        print("Which report would you like to clone?")
        clone_name = input.text_input()
        while clone_name not in report_names:
            print("The name you gave ({})".format(clone_name) +
                  " is not a recognised report name.")
            print("Existing reports are:")
            print(report_names)
        print("Selected '{}' to clone".format(clone_name))
        print("What should the cloned report be named?")
        new_name = input.text_input()
        while new_name in report_names:
            print("The name you gave ({})".format(clone_name) +
                  " is already a recognised report name." +
                  " Please input an original name.")
            print("Existing reports are:")
            print(report_names)
        with open("report_json/{}.json".format(clone_name), "r") as infile:
            clone_file_txt = infile.read()
        with open("report_json/{}.json".format(new_name), "w") as outfile:
            outfile.write(clone_file_txt)
        print(
            "Successfully cloned '{}' to '{}'.".format(clone_name, new_name) +
            " Would you like to further modify '{}'? (y/N)".format(new_name))
        if input.yes_no_input():
            dokey = "modify"
            modify_name = new_name
    if dokey == "modify":
        if modify_name is None:
            print("Existing reports are:")
            print(report_names)
            print("Which report would you like to modify?")
            modify_name = input.text_input()
            while modify_name not in report_names:
                print("The name you gave ({})".format(modify_name) +
                      " is not a recognised report name.")
                print("Existing reports are:")
                print(report_names)
        report_modification_flow(modify_name)
コード例 #12
0
def shortcut_setup_flow(shortcuts):
    """ Interactive setup for adding payment shortcuts

    :param shortcuts: the parsed shortcuts file
    :type shortcuts: class: `src.parse.shortcuts.ParsedShortcuts`
    """
    #Get shortcut key
    input_fine = False
    while not input_fine:
        print("What would you like the shortcut to be named?")
        print("(Note: all shortcuts start with an asterisk (*)."
            + " One will be added if not given.)")
        shortcut_key = input.text_input()
        if shortcut_key[0] != "*":
            shortcut_key = "*" + shortcut_key
        print("Shortcut key: '{}'. Is this fine? (y/N)".format(shortcut_key))
        input_fine = input.yes_no_input()
    #Is the shortcut a purchase or a transfer?
    input_fine = False
    while not input_fine:
        print("Is the shortcut a purchase or is it a transfer?")
        shortcut_type = input.text_input().lower().strip()
        if shortcut_type in ["purchase","transfer"]:
            print("Shortcut type: '{}'. Is this fine? (y/N)".format(shortcut_type))
            input_fine = input.yes_no_input()
        else:
            print("Please type either 'purchase' or 'transfer'.")
    isTransfer = shortcut_type == "transfer"
    #To account (leave blank for default)
    input_fine = False
    while not input_fine:
        if isTransfer:
            print("Which account are you transferring to?"
                + " (Leave blank for default transfer account)")
        else:
            print("What are you purchasing?")
        to_account = input.text_input().lower().strip()
        if to_account == "":
            if isTransfer:
                to_account = "__default_to_account"
                print("Transferring to default account. Is this fine? (y/N)")
                input_fine = input.yes_no_input()
            else:
                print("Please input a valid (non-blank) purchase item.")
        else:
            if isTransfer:
                print("Transferring to account '{}'.".format(to_account)
                    + " Is this fine? (y/N)")
            else:
                print("Purchasing '{}'.".format(to_account)
                    + " Is this fine? (y/N)")
            input_fine = input.yes_no_input()
    #Get shortcut amount
    input_fine = False
    while not input_fine:
        if isTransfer:
            print("How much money is this transfer?")
        else:
            print("How much does this purchase cost?")
        shortcut_amount = input.money_input()
        print("Amount: '£{}'. Is this fine? (y/N)".format(shortcut_amount))
        input_fine = input.yes_no_input()
    #From account (leave blank for default)
    input_fine = False
    while not input_fine:
        if isTransfer:
            print("Which account are you transferring from?"
                + " (Leave blank for default transfer account)")
        else:
            print("Which account are you using to pay?"
                + " (Leave blank for default payment account)")
        from_account = input.text_input().lower().strip()
        if from_account == "":
            if isTransfer:
                from_account = "__default_from_account"
                print("Transferring from default account. Is this fine? (y/N)")
                input_fine = input.yes_no_input()
            else:
                from_account = "__default_payment"
                print("Paying with default payment account."
                    + " Is this fine? (y/N)")
                input_fine = input.yes_no_input()
        else:
            if isTransfer:
                print("Transferring from account '{}'.".format(from_account)
                    + " Is this fine? (y/N)")
            else:
                print("Paying with account '{}'.".format(from_account)
                    + " Is this fine? (y/N)")
            input_fine = input.yes_no_input()
    #Create shortcut code
    if isTransfer:
        #Transfer: £{amount} transferred from {from_account} to {to_account}
        shortcut_code = "£{} transferred".format(shortcut_amount)
        if from_account != "__default_from_account":
            shortcut_code += " from {}".format(from_account)
        if to_account != "__default_to_account":
            shortcut_code += " to {}".format(to_account)
    else:
        #Payment: £{amount} spent on {item} paid by {account}
        shortcut_code = "£{} spent on {}".format(shortcut_amount,to_account)
        if from_account != "__default_payment":
            shortcut_code += " paid by {}".format(from_account)
    #Add shortcut to file
    shortcuts.add_line(shortcut_key,shortcut_code)