Skip to content
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

Merged
merged 60 commits into from
Dec 13, 2024
Merged

Conversation

Dmarzorro
Copy link
Collaborator

Wprowadzono zmiany zgodnie z uwagami @marekwocka

Dokładny opis zmian w kodzie:

  1. Zmiana Nazwy Klasy :

BudgetManager -> Transactions

  1. 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.

  2. 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))

  1. Mechanizm Tworzenia Kopii Zapasowej:

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)

  1. Ulepszona walidacja i obsługa błędów

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.

  1. Formatowanie Wyświetlania Kwot

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']})")

  1. Ulepszone Metody Edycji i Usuwania Wpisów

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.

…tegory and show_outcomes_by_category instead
Deleted add_budget_entry with input.
Deleted load_budget_from_file
Deleted save_budget_to_file
@Dmarzorro Dmarzorro requested a review from marekwocka December 7, 2024 05:59
@Dmarzorro Dmarzorro changed the title Income outcome 14. Fix issues in income/outcome functionality Dec 7, 2024
@marekwocka
Copy link
Collaborator

  1. Do tego taska z jiry miał być osobny branch - tak ustaliliśmy

Ad 1.
Nazwa klasy zmieniona, zgodna projektem. Nie wszędzie jednak zostały zmienione nazwy funkcji ani printy dla użytkownika. (Nazwy funkcji łatwo i szybko mozna zmienić z rename, w PyCharm Shift+F6)

Ad 4.
Spoko :)

Ad 5.
Też dałem BIGINT, dla najmniejszych jednostek w danej walucie. Natomiast wszelkie konwersje (mnożenie/dzielenie przez 100) niepotrzebne, bo to jest już w klasie Monetary obsłużone. Poza innymi uwagami, to możesz już zostawić, żeby zamknąć ten PR. Jak będę poprawiał zmiany z tasku 35, to wyczyszczę (możesz podejrzeć jak wprowadziłem zmiany na podstawie poprzedniej wersji tej klasy)

Ad 6.
Spoko :) Mam jednak parę uwag - komentarze w kodzie. Z oszczędności czasu, żeby już nie blokować, nie udało mi się przetestować tej funkcjonalności.

Ad 7.
:)

Ad 8.
Ogólnie to już jest w klasie Monetary, w w/w pull requeście możesz zobaczyć. Tu tak samo, może już zostawić, a ja poprawię w kolejnym PR

Ad 9.
Nie umiem dodać komentarza do linii 270-273. Użytkownik jest proszony o wpisanie 'tak' lub 'nie', a tymczasem jeśli wpisze cokolwiek innego niż 'tak', to edycja jest anulowana. Jest to niespójne działanie z wyświetlonym komunikatem

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ś ;)

self.db_name = db_name
self.table_name = table_name
self.budget = []
Copy link
Collaborator

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

cursor.execute(f"DELETE FROM {self.table_name}")

for entry in self.budget:
amount_in_grosze = int(round(entry['amount'] * 100))
Copy link
Collaborator

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ć

self.db_name = db_name
self.table_name = table_name
self.budget = []
self.create_table()
self.load_budget_from_file()
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

j/w

conn.commit()
# Usunięcie kopii zapasowej po pomyślnym zapisie
os.remove(backup_db)
print("Budżet został zapisany do bazy danych.")
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Niepoprawiona nazwa Budżet

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}")
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Niepoprawiona nazwa Budżet

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))
Copy link
Collaborator

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

@@ -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']} "
Copy link
Collaborator

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'

@@ -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):
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TestTransactions

try:
# Tworzenie kopii zapasowej bazy danych
if os.path.exists(self.db_name):
shutil.copyfile(self.db_name, backup_db)
Copy link
Collaborator

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?

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)
Copy link
Collaborator

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)

@marekwocka marekwocka changed the title 14. Fix issues in income/outcome functionality 34. Fix issues in income/outcome functionality Dec 13, 2024
@marekwocka
Copy link
Collaborator

Testy automatyczne nie przechodzą, ale Jarosław przetestował manualnie - wszystko działa. Na potrzeby prezentacji PR będzie już zmergowany

@Dmarzorro Dmarzorro merged commit 5dff7bb into dev Dec 13, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants