Compare commits

..

2 Commits

9 changed files with 41 additions and 76 deletions

1
.gitignore vendored
View File

@@ -2,4 +2,3 @@
__pycache__/ __pycache__/
venv/ venv/
build/ build/
banking_breakdown.egg-info

View File

@@ -0,0 +1,9 @@
Metadata-Version: 2.1
Name: banking_breakdown
Version: 1.0
Summary: Visualize bank statements
Author: Andreas Tsouchlos
Requires-Dist: numpy==1.26.3
Requires-Dist: pandas==1.5.3
Requires-Dist: PyQt6==6.6.1
Requires-Dist: setuptools==69.0.3

View File

@@ -0,0 +1,24 @@
MANIFEST.in
README.md
setup.py
banking_breakdown/__init__.py
banking_breakdown/__main__.py
banking_breakdown/regex_categorizer.py
banking_breakdown/statement_parser.py
banking_breakdown/types.py
banking_breakdown.egg-info/PKG-INFO
banking_breakdown.egg-info/SOURCES.txt
banking_breakdown.egg-info/dependency_links.txt
banking_breakdown.egg-info/requires.txt
banking_breakdown.egg-info/top_level.txt
banking_breakdown/document_builder/.latexmkrc
banking_breakdown/document_builder/Dockerfile.alpine
banking_breakdown/document_builder/__init__.py
banking_breakdown/document_builder/common.tex
banking_breakdown/document_builder/report.tex
banking_breakdown/ui/__init__.py
banking_breakdown/ui/custom_ui_items.py
banking_breakdown/ui/main_window.py
banking_breakdown/ui/main_window.ui
banking_breakdown/ui/pandas_model.py
banking_breakdown/ui/warning.png

View File

@@ -0,0 +1 @@

View File

@@ -0,0 +1,4 @@
numpy==1.26.3
pandas==1.5.3
PyQt6==6.6.1
setuptools==69.0.3

View File

@@ -0,0 +1 @@
banking_breakdown

View File

@@ -29,8 +29,6 @@ class MainWindow(QMainWindow):
= self.findChild(QVBoxLayout, "warningLayout") = self.findChild(QVBoxLayout, "warningLayout")
self._create_button \ self._create_button \
= self.findChild(QPushButton, "createCategoryButton") = self.findChild(QPushButton, "createCategoryButton")
self._rename_button \
= self.findChild(QPushButton, "renameCategoryButton")
self._delete_button \ self._delete_button \
= self.findChild(QPushButton, "deleteCategoryButton") = self.findChild(QPushButton, "deleteCategoryButton")
self._apply_button \ self._apply_button \
@@ -61,7 +59,6 @@ class MainWindow(QMainWindow):
# Set event handlers # Set event handlers
self._create_button.clicked.connect(self._handle_create_click) self._create_button.clicked.connect(self._handle_create_click)
self._rename_button.clicked.connect(self._handle_rename_click)
self._delete_button.clicked.connect(self._handle_delete_click) self._delete_button.clicked.connect(self._handle_delete_click)
self._clear_button.clicked.connect(self._handle_clear_click) self._clear_button.clicked.connect(self._handle_clear_click)
self._apply_button.clicked.connect(self._handle_apply_click) self._apply_button.clicked.connect(self._handle_apply_click)
@@ -179,25 +176,6 @@ class MainWindow(QMainWindow):
callback=self._dataframe_update_callback) callback=self._dataframe_update_callback)
context.exec(self.sender().mapToGlobal(pos)) context.exec(self.sender().mapToGlobal(pos))
def _handle_rename_click(self):
selected_item = self._list_widget.currentItem()
new_name, flag = QInputDialog.getText(self, "Rename category",
"New name:",
text=selected_item.text())
if not flag:
return
current_items = [self._list_widget.item(x).text() for x
in range(self._list_widget.count())]
if new_name not in current_items:
self._pandas_model.rename_category(selected_item.text(), new_name)
selected_item.setText(new_name)
else:
QMessageBox.warning(self, "No action performed",
f"Category '{new_name}' already exists.")
def _handle_create_click(self): def _handle_create_click(self):
new_name, flag = QInputDialog.getText(self, "Create category", new_name, flag = QInputDialog.getText(self, "Create category",
"New category:", "New category:",
@@ -215,7 +193,7 @@ class MainWindow(QMainWindow):
f"Category '{new_name}' already exists.") f"Category '{new_name}' already exists.")
def _handle_delete_click(self): def _handle_delete_click(self):
selected_item = self._list_widget.currentItem() selected_item = self._list_widget.selectedItems()[0]
button = QMessageBox.question(self, "Delete category", button = QMessageBox.question(self, "Delete category",
f"Are you sure you want to delete" f"Are you sure you want to delete"
@@ -267,16 +245,9 @@ class MainWindow(QMainWindow):
else: else:
self._apply_button.setEnabled(False) self._apply_button.setEnabled(False)
def _check_enable_rename_button(self):
if (len(self._list_widget.selectedItems()) > 0):
self._rename_button.setEnabled(True)
else:
self._rename_button.setEnabled(False)
def _handle_list_selection_changed(self): def _handle_list_selection_changed(self):
self._check_enable_delete_button() self._check_enable_delete_button()
self._check_enable_apply_button() self._check_enable_apply_button()
self._check_enable_rename_button()
def _handle_table_selection_changed(self): def _handle_table_selection_changed(self):
self._check_enable_clear_button() self._check_enable_clear_button()

View File

@@ -60,36 +60,6 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QPushButton" name="renameCategoryButton">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Rename selected category</string>
</property>
<property name="text">
<string>Rename</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item> <item>
<widget class="QPushButton" name="deleteCategoryButton"> <widget class="QPushButton" name="deleteCategoryButton">
<property name="enabled"> <property name="enabled">
@@ -110,9 +80,6 @@
<property name="sizeAdjustPolicy"> <property name="sizeAdjustPolicy">
<enum>QAbstractScrollArea::AdjustToContents</enum> <enum>QAbstractScrollArea::AdjustToContents</enum>
</property> </property>
<property name="sortingEnabled">
<bool>true</bool>
</property>
</widget> </widget>
</item> </item>
<item> <item>
@@ -156,9 +123,6 @@
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<item> <item>
<widget class="QTableView" name="transactionTableView"> <widget class="QTableView" name="transactionTableView">
<property name="autoScroll">
<bool>false</bool>
</property>
<property name="selectionBehavior"> <property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum> <enum>QAbstractItemView::SelectRows</enum>
</property> </property>

View File

@@ -83,14 +83,6 @@ class PandasModel(QtCore.QAbstractTableModel):
row_indices = self._data.loc[self._data['category'] == category].index row_indices = self._data.loc[self._data['category'] == category].index
self.assign_category(' ', row_indices) self.assign_category(' ', row_indices)
def rename_category(self, old_name, new_name):
if 'category' not in self._data.columns:
self.create_column('category')
row_indices = self._data.loc[self._data['category'] == old_name].index
self.assign_category(new_name, row_indices)
def get_categories(self) -> typing.List[str]: def get_categories(self) -> typing.List[str]:
if 'category' not in self._data.columns: if 'category' not in self._data.columns:
self.create_column('category') self.create_column('category')