-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
34. Fix issues in income/outcome functionality #16
Conversation
…tegory and show_outcomes_by_category instead
Deleted add_budget_entry with input. Deleted load_budget_from_file Deleted save_budget_to_file
Ad 1. Ad 4. Ad 5. Ad 6. Ad 7. Ad 8. Ad 9. Brakuje podawania daty przez użytkownika, czy to przy pierwszym wpisie czy przy edycji. Być może pominąłeś to, bo u mnie github zwinął 4 komentarze i nie zauważyłeś ;) |
in-ou/income_outcome.py
Outdated
self.db_name = db_name | ||
self.table_name = table_name | ||
self.budget = [] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Konsekwentnie, ta lista też powinna się nazywać transactions
albo operations
in-ou/income_outcome.py
Outdated
cursor.execute(f"DELETE FROM {self.table_name}") | ||
|
||
for entry in self.budget: | ||
amount_in_grosze = int(round(entry['amount'] * 100)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Najmniejsze wartości waluty obsługuje klasa Monetary. Obsługa będzie wprowadzone razem z taskiem 35, więc nie trzeba zmieniać
in-ou/income_outcome.py
Outdated
self.db_name = db_name | ||
self.table_name = table_name | ||
self.budget = [] | ||
self.create_table() | ||
self.load_budget_from_file() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
j/w
in-ou/income_outcome.py
Outdated
conn.commit() | ||
# Usunięcie kopii zapasowej po pomyślnym zapisie | ||
os.remove(backup_db) | ||
print("Budżet został zapisany do bazy danych.") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Niepoprawiona nazwa Budżet
in-ou/income_outcome.py
Outdated
os.remove(backup_db) | ||
print("Budżet został zapisany do bazy danych.") | ||
except Exception as e: | ||
print(f"Błąd podczas zapisywania budżetu: {e}") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Niepoprawiona nazwa Budżet
in-ou/income_outcome.py
Outdated
print(f"Pomyślnie dodano wpis: {entry_type}, - {amount} PLN, opis: {description}, kategoria: {category}") | ||
|
||
def add_budget_entry_input(self): #Dodawanie wpisów z inputem, również do usunięcia w przyszłości. | ||
amount_in_grosze = int(round(amount * 100)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
To obsłuży klasa Monetary
in-ou/income_outcome.py
Outdated
@@ -115,7 +156,7 @@ def show_budget(self): | |||
sorted_budget = sorted(self.budget, key=lambda x: x['date']) | |||
for i, entry in enumerate(sorted_budget, 1): | |||
category = entry.get('category', 'Brak kategorii') | |||
print(f"{i}. {entry['type']}: {entry['amount']} PLN, {entry['description']} " | |||
print(f"{i}. {entry['type']}: {entry['amount']:.2f} PLN, {entry['description']} " |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
To obsłuży klasa Monetary
(wyświetlanie w formie czytelnej dla użytkownika, 'z przecinkiem'
in-ou/income-outcome-test.py
Outdated
@@ -1,13 +1,13 @@ | |||
import unittest | |||
import os | |||
from datetime import datetime | |||
from budget_manager import BudgetManager | |||
|
|||
from income_outcome import Transactions | |||
|
|||
class TestBudgetManager(unittest.TestCase): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
TestTransactions
in-ou/income_outcome.py
Outdated
try: | ||
# Tworzenie kopii zapasowej bazy danych | ||
if os.path.exists(self.db_name): | ||
shutil.copyfile(self.db_name, backup_db) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Co się stanie, jeśli kopia bazy danych istnieje?
in-ou/income_outcome.py
Outdated
except Exception as e: | ||
print(f"Błąd podczas zapisywania budżetu: {e}") | ||
# Przywrócenie bazy danych z kopii zapasowej | ||
shutil.copyfile(backup_db, self.db_name) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Moim zdaniem, po odzyskaniu, backup powinien zostać usunięty. Co by się stało, jeśli przy ponownej próbie zapisu listy transakcji okazało się, że kopia bazy danych już jest? (pytanie powiązane z komentarzem do linii 41)
…y with peewee. No more SQLite3 needed
Testy automatyczne nie przechodzą, ale Jarosław przetestował manualnie - wszystko działa. Na potrzeby prezentacji PR będzie już zmergowany |
Wprowadzono zmiany zgodnie z uwagami @marekwocka
Dokładny opis zmian w kodzie:
BudgetManager -> Transactions
Dynamiczne Nazewnictwo Tabeli z walidacją:
Dodano parametr: table_name z domyślną wartością 'operations'.
Walidacja: Sprawdzenie, czy table_name zawiera tylko znaki alfanumeryczne, co zapobiega SQL injection.
Zmiana Schematu Bazy Danych
Typ kolumny amount: Zmieniono z REAL na BIGINT dla przechowywania kwot w mniejszych jednostkach (grosze).
Konwersja kwot: Przed zapisem kwoty są mnożone przez 100 i zaokrąglane, a przy odczycie dzielone przez 100:
amount_in_grosze = int(round(entry['amount'] * 100))
Dodano backup: Przed zapisaniem danych tworzona jest kopia zapasowa bazy (budget.db.bak).
Przywracanie z backupu: W przypadku błędu podczas zapisu, baza jest przywracana z kopii zapasowej:
shutil.copyfile(self.db_name, backup_db)
Zbieranie błędów: Zamiast zwracać po pierwszym błędzie, zbierane są wszystkie błędy i wyświetlane jednocześnie, zgodnie z propozycją @wiktorpiela. Usunięto zbędne "return'y" z printami.
errors = []
...
if errors:
for error in errors:
print(error)
return
Obsługa wyjątków: Dodano bardziej rozbudowane bloki try-except dla lepszej obsługi błędów podczas operacji na bazie danych.
Kwoty wyświetlane są z dwoma miejscami po przecinku dla lepszej czytelności:
print(f"{i}. {entry['type']}: {entry['amount']:.2f} PLN, {entry['description']} "
f"(Kategoria: {category}, Data: {entry['date']})")
edit_budget_entry:
Dodano potwierdzenie przed zapisaniem zmian.
Aktualizacja daty modyfikacji wpisu.
delete_budget_entry:
Formatowanie usuniętych kwot do dwóch miejsc po przecinku.