r18291 - gnucash/trunk - Python bindings patches by Mark Jenkins.

Phil Longstaff plongstaff at code.gnucash.org
Fri Sep 4 20:11:31 EDT 2009


Author: plongstaff
Date: 2009-09-04 20:11:31 -0400 (Fri, 04 Sep 2009)
New Revision: 18291
Trac: http://svn.gnucash.org/trac/changeset/18291

Modified:
   gnucash/trunk/AUTHORS
   gnucash/trunk/src/optional/python-bindings/example_scripts/simple_session.py
   gnucash/trunk/src/optional/python-bindings/example_scripts/simple_test.py
   gnucash/trunk/src/optional/python-bindings/gnucash_core.i
   gnucash/trunk/src/optional/python-bindings/gnucash_core.py
Log:
Python bindings patches by Mark Jenkins.

python_GetNthChild_remove.patch
remove the redundant GetNthChild code, gnc_account_nth_child supported

python_more_GUID.patch
Improve support for GUID


python_better_commodity.patch
* Removed custom __init__ from GncCommodity, not only is it wrong but 
the one
from GnuCashCoreClass is just fine.

* Supported the get_table method For Book

* Removed support for direct instantiation of GncCommodityTable. (via
gnc_commodity_table_new() ). Only methods and not the constructor
function are added to the class now. Python binding users can access a
GncCommodityTable instance via Book.get_table() and have no need to use
gnc_commodity_table_new(), which the apis advise is for internal use
only.


python_GncLot.patch
* included gnc-lot.h in gnucash_core.i again

* Made GncLot class use superclass __init__, it doesn't need its own.


python_more_documentation.patch
Documentation strings for many classes, which can be viewed in source 
and with python's help() mechanism.


python_business_module_load.patch
load the business module, not the business module specific backend


python_example_scripts.py
example scripts improved, new one added.  This new script originally 
came from this post:
http://lists.gnucash.org/pipermail/gnucash-devel/2008-July/023618.html


python_authors_update.patch
added Legal Aid Manitoba to credit line for Mark Jenkins


Modified: gnucash/trunk/AUTHORS
===================================================================
--- gnucash/trunk/AUTHORS	2009-09-04 01:34:28 UTC (rev 18290)
+++ gnucash/trunk/AUTHORS	2009-09-05 00:11:31 UTC (rev 18291)
@@ -174,7 +174,7 @@
 Edward J. Huff <ejhuff at huff20may77.us> Date handling in reports, quarterly option
 Tomokazu Iwashita <iwashita at center.nitech.ac.jp> Japanese translation of xea
 David Jafferian <david.jafferian at east.sun.com> Delete account query code.
-Mark Jenkins <mark at parit.ca> Python bindings, with grant funding from Assiniboine Credit Union (http://assiniboine.mb.ca/)
+Mark Jenkins <mark at parit.ca> Python bindings, with grant funding from Assiniboine Credit Union (http://assiniboine.mb.ca/) and Legal Aid Manitoba (http://www.legalaid.mb.ca/)
 Miquel Jordana Vilamitjana <jjvmjv at mundomail.net> Spanish translation of manual
 Prakash Kailasa <PrakashK at bigfoot.com> for gnome build fixes
 Alexey Kakunin <small at arcadia.spb.ru> quickfill patch for Cyrillic

Modified: gnucash/trunk/src/optional/python-bindings/example_scripts/simple_session.py
===================================================================
--- gnucash/trunk/src/optional/python-bindings/example_scripts/simple_session.py	2009-09-04 01:34:28 UTC (rev 18290)
+++ gnucash/trunk/src/optional/python-bindings/example_scripts/simple_session.py	2009-09-05 00:11:31 UTC (rev 18291)
@@ -10,21 +10,21 @@
 # open a file that isn't there, detect the error
 session = None
 try:
-    session = Session("file:%s" % FILE_1)
+    session = Session("xml:%s" % FILE_1)
 except GnuCashBackendException, backend_exception:
     assert( ERR_FILEIO_FILE_NOT_FOUND in backend_exception.errors)
 
 
 # create a new file
-session = Session("file:%s" % FILE_2, True)
+session = Session("xml:%s" % FILE_2, True)
 session.save()
 session.end()
 session.destroy()
 
 # open the new file, try to open it a second time, detect the lock
-session = Session("file:%s" % FILE_2)
+session = Session("xml:%s" % FILE_2)
 try:
-    session_2 = Session("file:%s" % FILE_2)
+    session_2 = Session("xml:%s" % FILE_2)
 except GnuCashBackendException, backend_exception:
     assert( ERR_BACKEND_LOCKED in backend_exception.errors )
 session.end()

Modified: gnucash/trunk/src/optional/python-bindings/example_scripts/simple_test.py
===================================================================
--- gnucash/trunk/src/optional/python-bindings/example_scripts/simple_test.py	2009-09-04 01:34:28 UTC (rev 18290)
+++ gnucash/trunk/src/optional/python-bindings/example_scripts/simple_test.py	2009-09-05 00:11:31 UTC (rev 18291)
@@ -1,26 +1,27 @@
 #!/usr/bin/env python
 # Creates a basic set of accounts and a couple of transactions
 
-import gnucash
+from gnucash import Session, Account, Transaction, Split, GncNumeric
 
-FILE_1 = "/tmp/example.xac"
+FILE_1 = "/tmp/example.gnucash"
 
-session = None
-session = gnucash.Session("file:%s" % FILE_1, True)
+session = Session("xml:%s" % FILE_1, True)
 
 book = session.book
-root_acct = gnucash.Account(book)
-expenses_acct = gnucash.Account(book)
-savings_acct = gnucash.Account(book)
-opening_acct = gnucash.Account(book)
-trans1 = gnucash.Transaction(book)
-trans2 = gnucash.Transaction(book)
-split1 = gnucash.Split(book)
-split3 = gnucash.Split(book)
-comm = gnucash.GncCommodity(book, "Canadian Dollars", "CURRENCY", "CAD", None, 100)
-num1 = gnucash.GncNumeric(4, 1)
-num2 = gnucash.GncNumeric(100, 1)
+root_acct = Account(book)
+expenses_acct = Account(book)
+savings_acct = Account(book)
+opening_acct = Account(book)
+trans1 = Transaction(book)
+trans2 = Transaction(book)
+split1 = Split(book)
+split3 = Split(book)
+comm_table = book.get_table()
+cad = comm_table.lookup("CURRENCY", "CAD")
 
+num1 = GncNumeric(4, 1)
+num2 = GncNumeric(100, 1)
+
 #Set new root account
 book.set_root_account(root_acct)
 
@@ -32,17 +33,17 @@
 root_acct.append_child(opening_acct)
 
 #Set up Expenses account
-expenses_acct.SetCommodity(comm)
+expenses_acct.SetCommodity(cad)
 expenses_acct.SetName("Expenses")
 expenses_acct.SetType(9) #ACCT_TYPE_EXPENSE = 9
 
 #Set up Savings account
-savings_acct.SetCommodity(comm)
+savings_acct.SetCommodity(cad)
 savings_acct.SetName("Savings")
 savings_acct.SetType(0) #ACCT_TYPE_BANK = 0
 
 #Set up Opening Balance account
-opening_acct.SetCommodity(comm)
+opening_acct.SetCommodity(cad)
 opening_acct.SetName("Opening Balance")
 opening_acct.SetType(10) #ACCT_TYPE_EQUITY = 10
 
@@ -54,10 +55,10 @@
 split3.SetAccount(savings_acct)
 split3.SetParent(trans2)
 
-trans1.SetCurrency(comm)
+trans1.SetCurrency(cad)
 trans1.SetDescription("Groceries")
 
-trans2.SetCurrency(comm)
+trans2.SetCurrency(cad)
 trans2.SetDescription("Opening Savings Balance")
 
 split2 = split1.GetOtherSplit()

Modified: gnucash/trunk/src/optional/python-bindings/gnucash_core.i
===================================================================
--- gnucash/trunk/src/optional/python-bindings/gnucash_core.i	2009-09-04 01:34:28 UTC (rev 18290)
+++ gnucash/trunk/src/optional/python-bindings/gnucash_core.i	2009-09-05 00:11:31 UTC (rev 18291)
@@ -79,7 +79,7 @@
 
 %include <gnc-commodity.h>
 
-/* %include <gnc-lot.h> */
+%include <gnc-lot.h>
 
 //business-core includes
 %include <gncCustomer.h>
@@ -93,6 +93,6 @@
 g_type_init();
 scm_init_guile();
 gnc_module_load("gnucash/engine", 0);
-gnc_module_load("gnucash/business-core-file", 0);
+gnc_module_load("gnucash/business-core", 0);
 
 %}

Modified: gnucash/trunk/src/optional/python-bindings/gnucash_core.py
===================================================================
--- gnucash/trunk/src/optional/python-bindings/gnucash_core.py	2009-09-04 01:34:28 UTC (rev 18290)
+++ gnucash/trunk/src/optional/python-bindings/gnucash_core.py	2009-09-05 00:11:31 UTC (rev 18291)
@@ -37,6 +37,18 @@
         self.errors = errors
 
 class Session(GnuCashCoreClass):
+    """A GnuCash book editing session
+
+    To commit changes to the session you may need to call save,
+    (this is allways the case with the file backend).
+    
+    When you're down with a session you may need to call end()
+
+    Every Session has a Book in the book attribute, which you'll definetely
+    be interested in, as every GnuCash entity (Transaction, Split, Vendor,
+    Invoice..) is associated with a particular book where it is stored.
+    """
+
     def __init__(self, book_uri=None, is_new=False):
         """A convienent contructor that allows you to specify a book URI,
         begin the session, and load the book.
@@ -104,10 +116,37 @@
             return return_value
         return new_function
 
-class Book(GnuCashCoreClass): pass
+class Book(GnuCashCoreClass):
+    """A Book encapsulates all of the GnuCash data, it is the place where
+    all GnuCash entities (Transaction, Split, Vendor, Invoice...), are
+    stored. You'll notice that all of the constructors for those entities
+    need a book to be associated with.
 
+    The most common way to get a book is through the book property in the
+    Session class, that is, create a session that connects to some storage,
+    such as through 'my_session = Session('file:my_books.xac')', and access
+    the book via the book property, 'my_session.book'
+
+    If you would like to create a Book without any backing storage, call the
+    Book constructor wihout any parameters, 'Book()'. You can later merge
+    such a book into a book with actual store by using merge_init.
+
+    Methods of interest
+    get_root_account -- Returns the root level Account
+    get_table -- Returns a commodity lookup table, of type GncCommodityTable
+    """
+    pass
+
 class GncNumeric(GnuCashCoreClass):
-    def __init__(self, num=0, denom=0, **kargs):
+    """Object used by GnuCash to store all numbers. Always consists of a
+    numerator and denominator.
+    """
+
+    def __init__(self, num=0, denom=1, **kargs):
+        """Constructor that allows you to set the numerator and denominator or
+        leave them blank with a default value of 0 (not a good idea since there
+        is currently no way to alter the value after instantiation)
+        """
         GnuCashCoreClass.__init__(self, num, denom, **kargs)
         #if INSTANCE_ARG in kargs:
         #    GnuCashCoreClass.__init__(**kargs)
@@ -115,28 +154,60 @@
         #    self.set_denom(denom) # currently undefined
         #    self.set_num(num)     # currently undefined
 
-class GncCommodity(GnuCashCoreClass):
-    def __init__(self, book, name=None, namespace=None, mnemonic=None, cusip=None, fraction=1, **kargs):
-        GnuCashCoreClass.__init__(self, book, name, namespace, mnemonic, cusip, fraction, **kargs)
+class GncCommodity(GnuCashCoreClass): pass
 
-class GncCommodityTable(GnuCashCoreClass): pass
+class GncCommodityTable(GnuCashCoreClass):
+    """A CommodityTable provides a way to store and lookup commoditys.
+    Commoditys are primarily currencies, but other tradable things such as
+    stocks, mutual funds, and material substances are posible.
 
+    Users of this library should not create thier own CommodityTable, instead
+    the get_table method from the Book class should be used.
+
+    This table is automatically populated with the GnuCash default commodity's
+    which includes most of the world's currencies.
+    """
+    pass
+
 class GncLot(GnuCashCoreClass):
-    def __init__(self, book, **kargs):
-        GnuCashCoreClass.__init__(self, book, **kargs)
+    pass
 
 class Transaction(GnuCashCoreClass):
+    """A GnuCash Transaction
+    
+    Consists of at least one (generally two) splits to represent a transaction
+    between two accounts.
+    """
     _new_instance = 'xaccMallocTransaction'
     def GetNthSplit(self, n):
         return self.GetSplitList().pop(n)
 
 class Split(GnuCashCoreClass):
+    """A GnuCash Split
+
+    The most basic representation of a movement of currency from one account to
+    another.
+    """
     _new_instance = 'xaccMallocSplit'
 
 class Account(GnuCashCoreClass):
+    """A GnuCash Account.
+
+    A fundamental entity in accounting, an Account provides representation
+    for a financial object, such as a BANK account, an ASSET (like a building),
+    a LIABILITY (such as a bank loan), a summary of some type of EXPENSE, or
+    a summary of some source of INCOME.
+
+    The words in upper case are the constants that GnuCash and this library uses
+    to describe account type. Here is the full list:
+    BANK, CASH, CREDIT, ASSET, LIABILITY, STOCK, MUTUAL
+    CURRENCY, INCOME, EXPENSE, EQUITY, RECEIVABLE, PAYABLE, 
+    CHECKING, SAVINGS, MONEYMRKT, CREDITLINE
+
+    These are not strings, they are attributes you can import from this
+    module
+    """
     _new_instance = 'xaccMallocAccount'
-    def GetNthChild(self, n):
-        return self.get_children().pop(n)
 
 class GUID(GnuCashCoreClass):
     _new_instance = 'guid_new_return'
@@ -165,9 +236,13 @@
 Book.add_constructor_and_methods_with_prefix('qof_book_', 'new')
 Book.add_method('gnc_book_get_root_account', 'get_root_account')
 Book.add_method('gnc_book_set_root_account', 'set_root_account')
+Book.add_method('gnc_commodity_table_get_table', 'get_table')
 #Functions that return Account
 Book.get_root_account = method_function_returns_instance(
     Book.get_root_account, Account )
+#Functions that return GncCommodityTable
+Book.get_table = method_function_returns_instance(
+    Book.get_table, GncCommodityTable ) 
 
 # GncNumeric
 GncNumeric.add_constructor_and_methods_with_prefix('gnc_numeric_', 'create')
@@ -198,8 +273,7 @@
     GncCommodity.clone, GncCommodity )
 
 # GncCommodityTable
-GncCommodityTable.add_constructor_and_methods_with_prefix('gnc_commodity_table_', 'get_table')
-
+GncCommodityTable.add_methods_with_prefix('gnc_commodity_table_')
 commoditytable_dict =   { 
                             'lookup' : GncCommodity, 
                             'lookup_unique' : GncCommodity, 
@@ -224,6 +298,7 @@
 
 # Transaction
 Transaction.add_methods_with_prefix('xaccTrans')
+Transaction.add_method('gncTransGetGUID', 'GetGUID');
 
 trans_dict =    {
                     'GetSplit': Split, 
@@ -237,12 +312,14 @@
                     'GetAccountAmount': GncNumeric, 
                     'GetAccountConvRate': GncNumeric, 
                     'GetAccountBalance': GncNumeric, 
-                    'GetCurrency': GncCommodity 
+                    'GetCurrency': GncCommodity,
+                    'GetGUID': GUID
                 }
 methods_return_instance(Transaction, trans_dict)
 
 # Split
 Split.add_methods_with_prefix('xaccSplit')
+Split.add_method('gncSplitGetGUID', 'GetGUID');
 
 split_dict =    {
                     'GetBook': Book, 
@@ -259,7 +336,8 @@
                     'GetClearedBalance': GncNumeric, 
                     'GetReconciledBalance': GncNumeric, 
                     'VoidFormerAmount': GncNumeric, 
-                    'VoidFormerValue': GncNumeric 
+                    'VoidFormerValue': GncNumeric,
+                    'GetGUID': GUID
                 }
 methods_return_instance(Split, split_dict)
 
@@ -269,6 +347,7 @@
 # Account
 Account.add_methods_with_prefix('xaccAccount')
 Account.add_methods_with_prefix('gnc_account_')
+Account.add_method('gncAccountGetGUID', 'GetGUID');
 
 account_dict =  {   
                     'get_book' : Book, 
@@ -278,7 +357,6 @@
                     'nth_child' : Account, 
                     'lookup_by_name' : Account, 
                     'lookup_by_full_name' : Account, 
-                    'GetNthChild' : Account, 
                     'FindTransByDesc' : Transaction, 
                     'FindSplitByDesc' : Split, 
                     'get_start_balance' : GncNumeric, 
@@ -298,7 +376,8 @@
                     'GetProjectedMinimumBalanceInCurrency' : GncNumeric, 
                     'GetBalanceAsOfDateInCurrency' : GncNumeric, 
                     'GetBalanceChangeForPeriod' : GncNumeric, 
-                    'GetCommodity' : GncCommodity 
+                    'GetCommodity' : GncCommodity,
+                    'GetGUID': GUID 
                 }
 methods_return_instance(Account, account_dict)
 
@@ -306,4 +385,15 @@
 
 #GUID
 GUID.add_methods_with_prefix('guid_')
+GUID.add_method('xaccAccountLookup', 'AccountLookup')
+GUID.add_method('xaccTransLookup', 'TransLookup')
+GUID.add_method('xaccSplitLookup', 'SplitLookup')
 
+guid_dict = {
+                'copy' : GUID,
+                'TransLookup': Transaction,
+                'AccountLookup': Account,
+                'SplitLookup': Split
+            }
+methods_return_instance(GUID, guid_dict)
+                



More information about the gnucash-changes mailing list