mirror of
https://github.com/Gnucash/gnucash.git
synced 2024-11-28 19:53:58 -06:00
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 git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@18291 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
parent
26fc11909f
commit
f229f9ac8e
2
AUTHORS
2
AUTHORS
@ -174,7 +174,7 @@ Péter Hosszú <hosszu@web.de> Hungarian translation
|
||||
Edward J. Huff <ejhuff@huff20may77.us> Date handling in reports, quarterly option
|
||||
Tomokazu Iwashita <iwashita@center.nitech.ac.jp> Japanese translation of xea
|
||||
David Jafferian <david.jafferian@east.sun.com> Delete account query code.
|
||||
Mark Jenkins <mark@parit.ca> Python bindings, with grant funding from Assiniboine Credit Union (http://assiniboine.mb.ca/)
|
||||
Mark Jenkins <mark@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@mundomail.net> Spanish translation of manual
|
||||
Prakash Kailasa <PrakashK@bigfoot.com> for gnome build fixes
|
||||
Alexey Kakunin <small@arcadia.spb.ru> quickfill patch for Cyrillic
|
||||
|
@ -10,21 +10,21 @@ FILE_2 = "/tmp/example_file.xac"
|
||||
# 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()
|
||||
|
@ -1,25 +1,26 @@
|
||||
#!/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(savings_acct)
|
||||
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.SetValue(num2)
|
||||
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()
|
||||
|
@ -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);
|
||||
|
||||
%}
|
||||
|
@ -37,6 +37,18 @@ class GnuCashBackendException(Exception):
|
||||
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 @@ class Session(GnuCashCoreClass):
|
||||
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 @@ class GncNumeric(GnuCashCoreClass):
|
||||
# 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 @@ for error_name, error_value, error_name_after_prefix in \
|
||||
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 = method_function_returns_instance(
|
||||
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 @@ methods_return_instance(GncLot, gnclot_dict)
|
||||
|
||||
# Transaction
|
||||
Transaction.add_methods_with_prefix('xaccTrans')
|
||||
Transaction.add_method('gncTransGetGUID', 'GetGUID');
|
||||
|
||||
trans_dict = {
|
||||
'GetSplit': Split,
|
||||
@ -237,12 +312,14 @@ trans_dict = {
|
||||
'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 @@ split_dict = {
|
||||
'GetClearedBalance': GncNumeric,
|
||||
'GetReconciledBalance': GncNumeric,
|
||||
'VoidFormerAmount': GncNumeric,
|
||||
'VoidFormerValue': GncNumeric
|
||||
'VoidFormerValue': GncNumeric,
|
||||
'GetGUID': GUID
|
||||
}
|
||||
methods_return_instance(Split, split_dict)
|
||||
|
||||
@ -269,6 +347,7 @@ Split.parent = property( Split.GetParent, Split.SetParent )
|
||||
# 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 @@ account_dict = {
|
||||
'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 @@ account_dict = {
|
||||
'GetProjectedMinimumBalanceInCurrency' : GncNumeric,
|
||||
'GetBalanceAsOfDateInCurrency' : GncNumeric,
|
||||
'GetBalanceChangeForPeriod' : GncNumeric,
|
||||
'GetCommodity' : GncCommodity
|
||||
'GetCommodity' : GncCommodity,
|
||||
'GetGUID': GUID
|
||||
}
|
||||
methods_return_instance(Account, account_dict)
|
||||
|
||||
@ -306,4 +385,15 @@ Account.name = property( Account.GetName, Account.SetName )
|
||||
|
||||
#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)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user