-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.py
executable file
·132 lines (107 loc) · 4.23 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#!/usr/bin/python2
from PyQt4 import QtCore, QtGui
from balancer import schema, db
from balancer.window_ui import Ui_MainWindow
class TransactionsViewModel(QtCore.QAbstractTableModel):
def __init__(self, db):
super(TransactionsViewModel, self).__init__()
self.acc = None
self.payeeFilter = None
self.db = db
self.cols = ['trn_type', 'amount', 'payee', 'date', 'category_id']
self.tids = []
def set_account(self, acc):
if self.acc == acc:
return
self.acc = acc
self.reload_data()
def set_filter(self, payeeFilter):
f = None if payeeFilter == '' else payeeFilter
if self.payeeFilter == f:
return
self.payeeFilter = f
self.reload_data()
def reload_data(self):
tn = schema.Transaction
q = self.db.query(tn.id).filter_by(account_id = self.acc)
if self.payeeFilter:
q = q.filter(tn.payee.like('%{}%'.format(self.payeeFilter)))
self.tids = q.order_by(tn.date.desc(), tn.payee, tn.amount).all()
self.modelReset.emit()
def rowCount(self, parent):
return len(self.tids) if not parent.isValid() else 0
def columnCount(self, parent):
return len(self.cols) if not parent.isValid() else 0
def data(self, idx, role):
if not idx.isValid() or role != QtCore.Qt.DisplayRole:
return QtCore.QVariant()
t = self.db.get(schema.Transaction, self.tids[idx.row()])
return QtCore.QVariant(unicode(getattr(t, self.cols[idx.column()])))
def headerData(self, sect, orient, role):
if orient != QtCore.Qt.Horizontal or role != QtCore.Qt.DisplayRole:
return QtCore.QVariant()
return QtCore.QVariant(self.cols[sect])
class Main(QtGui.QMainWindow):
def __init__(self, parent=None):
super(Main, self).__init__(parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.db = db.Db('t.db')
self.model = TransactionsViewModel(self.db)
self.ui.transactionsList.setModel(self.model)
#self.ui.transactionsList.current = None
self.show_accounts()
def show_accounts(self):
items = []
for a in self.db.query(schema.Account).order_by(schema.Account.name):
i = QtGui.QTreeWidgetItem(map(str, [a.nick, a.number, a.name]))
i.db_item = a
items.append(i)
self.ui.accountsList.clear()
self.ui.accountsList.addTopLevelItems(items)
def show_transactions(self, acc):
if acc == self.ui.transactionsList.current:
return
self.ui.transactionsList.current = acc
items = []
for t in self.get_data(acc):
if hasattr(t, 'amount'):
i = QtGui.QTreeWidgetItem(
map(unicode, [t.amount, t.payee, t.date, t.category_id]))
i.db_item = t
else:
i = QtGui.QTreeWidgetItem(
map(unicode, ['Balance', t.balance, t.date]))
items.append(i)
self.ui.transactionsList.clear()
self.ui.transactionsList.addTopLevelItems(items)
## FIXME: mix transactions and balances
#def get_data(self, acc):
#tn = schema.Transaction
#bn = schema.Balance
#tns = self.db.query(tn).filter_by(account_id = acc)\
#.order_by(tn.date.desc(), tn.payee, tn.amount).all()
#bns = self.db.query(bn).filter_by(account_id = acc)\
#.order_by(bn.date.desc()).all()
#while len(tns) != 0 or len(bns) != 0:
#if len(tns) == 0:
#yield bns.pop(0)
#elif len(bns) == 0:
#yield tns.pop(0)
#elif bns[0].date >= tns[0].date:
#yield bns.pop(0)
#else:
#yield tns.pop(0)
def on_accountsList_currentItemChanged(self, current=None, prev=None):
if current is None:
return
self.model.set_account(current.db_item.id)
def on_payeeFilter_editingFinished(self):
self.model.set_filter(str(self.ui.payeeFilter.text()))
if __name__ == '__main__':
import sys
sys.path.append('..')
app = QtGui.QApplication(sys.argv)
win = Main()
win.show()
sys.exit(app.exec_())