r20714 - gnucash/trunk/src/optional/python-bindings - Bug #651329: Add some python convenience functions

Christian Stimming cstim at code.gnucash.org
Sat May 28 14:53:35 EDT 2011


Author: cstim
Date: 2011-05-28 14:53:35 -0400 (Sat, 28 May 2011)
New Revision: 20714
Trac: http://svn.gnucash.org/trac/changeset/20714

Added:
   gnucash/trunk/src/optional/python-bindings/example_scripts/gnc_convenience.py
Modified:
   gnucash/trunk/src/optional/python-bindings/example_scripts/quotes_historic.py
   gnucash/trunk/src/optional/python-bindings/gnucash_core.py
Log:
Bug #651329: Add some python convenience functions

Patch by Christoph Holtermann:

1) gnc_convenience.py adds some convenient functions.
2) quotes_historic.py uses find_account() from 1)
3) Small Bug removed : GetNthSplit() already returns a Split-Object because
that is returned by GetSplitList(). In this case it returns a nested
Split-Object.

Added: gnucash/trunk/src/optional/python-bindings/example_scripts/gnc_convenience.py
===================================================================
--- gnucash/trunk/src/optional/python-bindings/example_scripts/gnc_convenience.py	                        (rev 0)
+++ gnucash/trunk/src/optional/python-bindings/example_scripts/gnc_convenience.py	2011-05-28 18:53:35 UTC (rev 20714)
@@ -0,0 +1,222 @@
+#!/usr/bin/python
+# -*- coding: UTF-8 -*-
+
+##@file
+# @ingroup python_bindings_examples
+# @author Christoph Holtermann (c.holtermann at gmx.de)
+# @date May 2011
+# @brief some functions to make life easier when using python-bindings
+#
+
+from gnucash import Session, Account, Transaction, Split
+import gnucash
+
+
+def get_transaction_list(account):
+    """Returns all transactions in account.
+
+    Splits are derived from account.GetSplitList().
+   
+    options:
+
+    account:    Account to get transactions from.
+    
+    """
+    
+    split_list=account.GetSplitList()
+    transaction_list=[]
+    for split in split_list:
+        if type(split) != Split:
+              split = Split(instance=split)
+        transaction=split.GetParent()
+        if not (transaction in transaction_list):       # this check may not be necessary.
+          transaction_list.append(transaction)
+    return transaction_list
+
+
+def get_splits_without_lot(account=None,split_list=None):
+  """Returns a list of those Splits in split_list or account which do not have an according lot.
+
+  options:
+
+  account:      (optional) Account to search in.
+  split_list:   (optional) List of Splits to search in.
+
+  one or the other has to be provided.
+
+  """
+  if split_list==None:
+      if account==None:
+          return []
+      else:
+          split_list=account.GetSplitList()
+  
+  rlist=[]
+  for split in split_list:
+      if type(split).__name__ == 'SwigPyObject':
+          split = Split(instance=split) 
+      lot=split.GetLot()
+      if lot == None:
+          rlist.append(split)
+  return rlist
+
+
+def find_account(account,name,account_list=None):
+  """Recursively searches full names of account and descendents
+
+  returns a list of accounts which contain name.
+  
+  options:
+  
+  account:      account to start search in.
+  name:         name to search for.
+  account_list: (optional) list to append accounts to.
+  
+  """
+
+  if not account_list:
+    account_list=[]
+
+  for child in account.get_children():
+    if type(child) != Account:
+      child=Account(instance=child)
+    account_list=find_account(child,name,account_list)
+  
+  account_name=account.GetName()
+  if name in account_name:
+    account_list.append(account)
+  
+  return account_list
+
+
+def find_lot(lot_list,search_string):
+  """Searches lots in lot_list for search_string.
+
+  returns list of lots where title contains search_string.
+
+  options:
+
+  lot_list:       List of Lots to search in.
+  search_string:  String to search for.
+  
+  """
+  
+  rlist=[]
+  for lot in lot_list:
+    if type(lot).__name__ == 'SwigPyObject':
+        lot = gnucash.GncLot(instance=lot)
+    ltitle=lot.get_title()
+    if search_string in ltitle: 
+      rlist.append(lot)
+  return rlist
+
+
+def find_split(split_list,search_string):
+  """Searches a list of splits for search_string
+  
+  returns a list of splits that have search_string as part of
+  memo or
+  description of parent transaction.
+  
+  options:
+ 
+  split_list:     List of Splits to search in.
+  search_string:  String to search for.
+  
+  """
+  
+  rlist=[]
+  for split in split_list:
+      memo=split.GetMemo()
+      transaction_description=split.GetParent().GetDescription()
+      if (search_string in memo) or (search_string in transaction_description):
+          rlist.append(split)
+  return rlist
+
+
+def find_split_recursive(account, search_string):
+  """Searches account and descendants for Splits containing search_string
+  
+  returns a list of splits that have search_string as part of
+  memo or
+  description of parent transaction.
+  
+  options:
+ 
+  account:        Account to search in.
+  search_string:  String to search for.
+  
+  """
+  
+  rlist = []
+  child_account_splits = []
+  
+  # Get all splits in descendants
+  for child in account.get_children():
+      if type(child) != Account:
+          child = Account(instance=child)
+      childsplits = find_split_recursive(child, search_string)
+      for split in childsplits:
+          if type(split) != Split:
+              split = Split(instance=split)
+      child_account_splits += childsplits
+
+  # Get all splits in account
+  splits=account.GetSplitList()
+  for split in splits:
+      if type(split) != Split:
+          split = Split(instance=split)
+  basic_account_splits=find_split(splits,search_string)
+
+  rlist=child_account_splits+basic_account_splits
+  return rlist
+
+
+def find_transaction(account,name,ignore_case=True,transaction_list=None):
+  """Searches the transactions of an account for name.
+  
+  Searches in description and in memo of each split.
+  returns a list of transactions that match criteria.
+  
+  options:
+  
+  account:          Account to search in.
+  name:             String to search for.
+  ignore_case:      (optional, default=True) Ignore case if True.
+  transaction_list: (optional) list of transactions to search in.
+  
+  """
+
+  if not transaction_list:
+      transaction_list=get_transaction_list(account)
+
+  ret = []
+  if ignore_case:
+      name=name.lower()
+
+  for transaction in transaction_list:
+      found = False
+      
+      desc=transaction.GetDescription()
+      if ignore_case:
+          desc=desc.lower()
+      
+      if name in desc:
+          found=True
+      
+      sl=transaction.GetSplitList()
+      for split in sl:
+          if type(split) != Split:
+              split=Split(instance=split)
+          
+          memo = split.GetMemo()
+          if ignore_case:
+              memo=memo.lower()
+
+          if name in memo:
+              found=True
+
+      if found:
+          ret.append(transaction)
+
+  return ret

Modified: gnucash/trunk/src/optional/python-bindings/example_scripts/quotes_historic.py
===================================================================
--- gnucash/trunk/src/optional/python-bindings/example_scripts/quotes_historic.py	2011-05-28 09:40:02 UTC (rev 20713)
+++ gnucash/trunk/src/optional/python-bindings/example_scripts/quotes_historic.py	2011-05-28 18:53:35 UTC (rev 20714)
@@ -21,26 +21,8 @@
 import gnucash
 import datetime
 from fractions import Fraction
+from gnc_convenience import find_account
 
-# Function definition from Christoph Holtermann
-def findAccount(account,name,account_list=None):
-  """Searches full names of account and descendents
-
-  returns a list of accounts which contain name."""
-
-  if not account_list:
-    account_list=[]
-
-  for child in account.get_children():
-     child=Account(instance=child)
-     account_list=findAccount(child,name,account_list)
-  
-  Account_name=account.GetName()
-  if name in Account_name:
-    account_list.append(account)
-  
-  return account_list
-
 FILE = "./test.gnucash"
 url = "xml://"+FILE
 
@@ -72,7 +54,7 @@
 account = book.get_root_account()
 pdb = book.get_price_db()
 comm_table = book.get_table()
-ac = findAccount(account,'Intel')[0] 
+ac = find_account(account,'Intel')[0] 
 
 stock = ac.GetCommodity()
 # Add the prices

Modified: gnucash/trunk/src/optional/python-bindings/gnucash_core.py
===================================================================
--- gnucash/trunk/src/optional/python-bindings/gnucash_core.py	2011-05-28 09:40:02 UTC (rev 20713)
+++ gnucash/trunk/src/optional/python-bindings/gnucash_core.py	2011-05-28 18:53:35 UTC (rev 20714)
@@ -553,7 +553,6 @@
 trans_dict =    {
                     'GetSplit': Split,
                     'FindSplitByAccount': Split,
-                    'GetNthSplit': Split,
                     'Clone': Transaction,
                     'Reverse': Transaction,
                     'GetReversedBy': Transaction,



More information about the gnucash-changes mailing list