Multiple fixes on the addition of new raw files
The initialize function has been updated with a new possible option for a new raw file, where the Last Accessed date changed the content hadn't. Also removes sort() when using extend() on a list as it doesn't work correctly. Categorization code moved to if False statement to add posterior toggle behaviour. New transaction print added (.desc()) which prints the description of a transaction instead of its category to help on the manual categorization. Raw files now on raw dir instead of .raw It now also accepts empty lines and # at the start for comments on data files. TODO these are overwritten whenever the data files are updated.
This commit is contained in:
parent
ad9bc4a7c4
commit
806bf258e4
@ -52,7 +52,7 @@ class Categories:
|
||||
and transaction.category != Travel().name
|
||||
):
|
||||
new_category = input(
|
||||
f"{transaction} already has a {transaction.category} assigned. Would you like "
|
||||
f"{transaction.desc()} already has a {transaction.category} assigned. Would you like "
|
||||
f"to change it to {category.name}? (Y/N) "
|
||||
)
|
||||
correct_answer = False
|
||||
|
||||
39
main.py
39
main.py
@ -40,11 +40,14 @@ def initialize(raw_dir, data_dir, restart=False):
|
||||
logging.debug("no .raw.pickle found")
|
||||
|
||||
updated_trs, update = dict(), False
|
||||
prompt = " has been modified since last update. Do you want to update the data files? (Yes/No)"
|
||||
prompt = " has been modified since last update. Do you want to update the data files? (Yes/Update/No)"
|
||||
for rf in Path(raw_dir).iterdir():
|
||||
if rf.name in rfs and rfs[rf.name][0] == rf.stat().st_mtime:
|
||||
logging.debug(f"{rf.name} hasn't been modified since last access")
|
||||
elif rf.name not in rfs or input(f"{rf.name}" + prompt).lower() == "yes":
|
||||
elif (
|
||||
rf.name not in rfs
|
||||
or (answer := input(f"{rf.name}" + prompt).lower()) == "yes"
|
||||
):
|
||||
trs = Parser.parse_csv(rf)
|
||||
updated_trs[rf.name] = trs
|
||||
try:
|
||||
@ -53,6 +56,11 @@ def initialize(raw_dir, data_dir, restart=False):
|
||||
rfs[rf.name] = [rf.stat().st_mtime, []]
|
||||
update = True
|
||||
logging.info(f"{rf.name} parsed")
|
||||
elif answer == "update":
|
||||
rfs[rf.name][0] = rf.stat().st_mtime
|
||||
update = True
|
||||
else: # prompt = no
|
||||
update = True
|
||||
|
||||
if update:
|
||||
for rf_name, updated_trs in updated_trs.items():
|
||||
@ -66,7 +74,8 @@ def initialize(raw_dir, data_dir, restart=False):
|
||||
rem_trs = [tr for tr in rfs[rf_name][1] if tr not in trs]
|
||||
|
||||
if new_trs:
|
||||
dfs[filename].extend(new_trs).sort()
|
||||
dfs[filename].extend(new_trs)
|
||||
dfs[filename].sort()
|
||||
|
||||
for rem in rem_trs:
|
||||
dfs[filename].remove(rem)
|
||||
@ -95,7 +104,7 @@ def manual_categorization(trs):
|
||||
trs.sort_by_bank()
|
||||
for i, transaction in enumerate(trs):
|
||||
if not transaction.category:
|
||||
category = input(f"{transaction} category: ")
|
||||
category = input(f"{transaction.desc()} category: ")
|
||||
if category == "stop":
|
||||
break
|
||||
if category:
|
||||
@ -106,9 +115,9 @@ def manual_categorization(trs):
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
logging.basicConfig(level=logging.DEBUG)
|
||||
# logging.basicConfig(level=logging.DEBUG)
|
||||
|
||||
datafiles = initialize(".raw", "data", restart=False)
|
||||
datafiles = initialize("raw", "data", restart=False)
|
||||
|
||||
transactions = Transactions()
|
||||
for file in datafiles.values():
|
||||
@ -121,15 +130,15 @@ if __name__ == "__main__":
|
||||
# if transaction.category in reprocess:
|
||||
# transaction.category = ''
|
||||
|
||||
# Categories.categorize(transactions)
|
||||
#
|
||||
# manual_categorization(transactions)
|
||||
#
|
||||
# for f, file in datafiles.items():
|
||||
# file_transactions = [t for t in transactions if t in file]
|
||||
# Tr.write_transactions(Path("data") / f, file_transactions)
|
||||
#
|
||||
Tr.write_transactions("transactions.csv", transactions)
|
||||
if False:
|
||||
Categories.categorize(transactions)
|
||||
manual_categorization(transactions)
|
||||
|
||||
for f, file in datafiles.items():
|
||||
file_transactions = [t for t in transactions if t in file]
|
||||
Tr.write_transactions(Path("data") / f, file_transactions)
|
||||
|
||||
Tr.write_transactions("transactions.csv", transactions)
|
||||
|
||||
monthly_transactions = transactions.get_transactions_by_month(
|
||||
start=date(2020, 1, 1), end=date(2020, 8, 31)
|
||||
|
||||
@ -37,7 +37,7 @@ class Transaction:
|
||||
def read_transactions(file, encoding="utf-8"):
|
||||
with open(file, newline="", encoding=encoding) as f:
|
||||
r = reader(f, delimiter="\t")
|
||||
transactions = [Transaction(row) for row in r]
|
||||
transactions = [Transaction(row) for row in r if row and row[0][0] != "#"]
|
||||
return transactions
|
||||
|
||||
@staticmethod
|
||||
@ -89,6 +89,11 @@ class Transaction:
|
||||
def __ge__(self, other):
|
||||
return self.date >= other.date
|
||||
|
||||
def desc(self):
|
||||
return "{} {} {}€ ({})".format(
|
||||
self.date.strftime("%d/%m/%y"), self.description, self.value, self.bank
|
||||
)
|
||||
|
||||
def __repr__(self):
|
||||
return "{} {} {}€ ({})".format(
|
||||
self.date.strftime("%d/%m/%y"), self.category, self.value, self.bank
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user