Compare commits
2 Commits
feature/in
...
29e3aaf06a
| Author | SHA1 | Date | |
|---|---|---|---|
| 29e3aaf06a | |||
| d8273c994f |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -2,4 +2,3 @@
|
|||||||
__pycache__/
|
__pycache__/
|
||||||
venv/
|
venv/
|
||||||
build/
|
build/
|
||||||
banking_breakdown.egg-info
|
|
||||||
|
|||||||
9
banking_breakdown.egg-info/PKG-INFO
Normal file
9
banking_breakdown.egg-info/PKG-INFO
Normal 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
|
||||||
24
banking_breakdown.egg-info/SOURCES.txt
Normal file
24
banking_breakdown.egg-info/SOURCES.txt
Normal 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
|
||||||
1
banking_breakdown.egg-info/dependency_links.txt
Normal file
1
banking_breakdown.egg-info/dependency_links.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
4
banking_breakdown.egg-info/requires.txt
Normal file
4
banking_breakdown.egg-info/requires.txt
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
numpy==1.26.3
|
||||||
|
pandas==1.5.3
|
||||||
|
PyQt6==6.6.1
|
||||||
|
setuptools==69.0.3
|
||||||
1
banking_breakdown.egg-info/top_level.txt
Normal file
1
banking_breakdown.egg-info/top_level.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
banking_breakdown
|
||||||
@@ -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()
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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')
|
||||||
|
|||||||
Reference in New Issue
Block a user