GnuCash  5.6-150-g038405b370+
gnc_convenience.py
Go to the documentation of this file.
1 #!/usr/bin/env python3
2 # -*- coding: UTF-8 -*-
3 
4 
10 
11 from gnucash import Session, Account, Transaction, Split
12 
13 
14 def get_transaction_list(account):
15  """Returns all transactions in account.
16 
17  Splits are derived from account.GetSplitList().
18 
19  options:
20 
21  account: Account to get transactions from.
22 
23  """
24 
25  split_list=account.GetSplitList()
26  transaction_list=[]
27  for split in split_list:
28  transaction=split.GetParent()
29  if not (transaction in transaction_list): # this check may not be necessary.
30  transaction_list.append(transaction)
31  return transaction_list
32 
33 
34 def get_splits_without_lot(account=None,split_list=None):
35  """Returns a list of those Splits in split_list or account which do not have an according lot.
36 
37  options:
38 
39  account: (optional) Account to search in.
40  split_list: (optional) List of Splits to search in.
41 
42  one or the other has to be provided.
43 
44  """
45  if split_list==None:
46  if account==None:
47  return []
48  else:
49  split_list=account.GetSplitList()
50 
51  rlist=[]
52  for split in split_list:
53  lot=split.GetLot()
54  if lot == None:
55  rlist.append(split)
56  return rlist
57 
58 
59 def find_account(account,name,account_list=None):
60  """Recursively searches full names of account and descendents
61 
62  returns a list of accounts which contain name.
63 
64  options:
65 
66  account: account to start search in.
67  name: name to search for.
68  account_list: (optional) list to append accounts to.
69 
70  """
71 
72  if not account_list:
73  account_list=[]
74 
75  for child in account.get_children():
76  account_list=find_account(child,name,account_list)
77 
78  account_name=account.GetName()
79  if name in account_name:
80  account_list.append(account)
81 
82  return account_list
83 
84 
85 def find_lot(lot_list,search_string):
86  """Searches lots in lot_list for search_string.
87 
88  returns list of lots where title contains search_string.
89 
90  options:
91 
92  lot_list: List of Lots to search in.
93  search_string: String to search for.
94 
95  """
96 
97  rlist=[]
98  for lot in lot_list:
99  ltitle=lot.get_title()
100  if search_string in ltitle:
101  rlist.append(lot)
102  return rlist
103 
104 
105 def find_split(split_list,search_string):
106  """Searches a list of splits for search_string
107 
108  returns a list of splits that have search_string as part of
109  memo or
110  description of parent transaction.
111 
112  options:
113 
114  split_list: List of Splits to search in.
115  search_string: String to search for.
116 
117  """
118 
119  rlist=[]
120  for split in split_list:
121  memo=split.GetMemo()
122  transaction_description=split.GetParent().GetDescription()
123  if (search_string in memo) or (search_string in transaction_description):
124  rlist.append(split)
125  return rlist
126 
127 
128 def find_split_recursive(account, search_string):
129  """Searches account and descendants for Splits containing search_string
130 
131  returns a list of splits that have search_string as part of
132  memo or
133  description of parent transaction.
134 
135  options:
136 
137  account: Account to search in.
138  search_string: String to search for.
139 
140  """
141 
142  rlist = []
143  child_account_splits = []
144 
145  # Get all splits in descendants
146  for child in account.get_children():
147  childsplits = find_split_recursive(child, search_string)
148  child_account_splits += childsplits
149 
150  # Get all splits in account
151  splits=account.GetSplitList()
152  basic_account_splits=find_split(splits,search_string)
153 
154  rlist=child_account_splits+basic_account_splits
155  return rlist
156 
157 
158 def find_transaction(account,name,ignore_case=True,transaction_list=None):
159  """Searches the transactions of an account for name.
160 
161  Searches in description and in memo of each split.
162  returns a list of transactions that match criteria.
163 
164  options:
165 
166  account: Account to search in.
167  name: String to search for.
168  ignore_case: (optional, default=True) Ignore case if True.
169  transaction_list: (optional) list of transactions to search in.
170 
171  """
172 
173  if not transaction_list:
174  transaction_list=get_transaction_list(account)
175 
176  ret = []
177  if ignore_case:
178  name=name.lower()
179 
180  for transaction in transaction_list:
181  found = False
182 
183  desc=transaction.GetDescription()
184  if ignore_case:
185  desc=desc.lower()
186 
187  if name in desc:
188  found=True
189 
190  sl=transaction.GetSplitList()
191  for split in sl:
192  memo = split.GetMemo()
193  if ignore_case:
194  memo=memo.lower()
195 
196  if name in memo:
197  found=True
198 
199  if found:
200  ret.append(transaction)
201 
202  return ret