From 7855fad59324f3996b9d5d89721d14ba2892ab37 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Thu, 24 Feb 2011 13:18:30 +0100 Subject: [PATCH 01/47] [FIX] setup.py: use the new openerp module. - python setup.py build seems to work (it produces the same result as before). - the install seems not good: code and data are duplicated in both site-packages and dist-packages. (This was already true before.) - The bin/openerp-server is not good yet. bzr revid: vmt@openerp.com-20110224121830-hte18v9zzvel5zb5 --- MANIFEST.in | 23 +++++++++++------------ setup.py | 30 ++++++++++++++---------------- 2 files changed, 25 insertions(+), 28 deletions(-) diff --git a/MANIFEST.in b/MANIFEST.in index ac545d3d8d4..1c615eb97b0 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,17 +1,16 @@ -include rpminstall_sh.txt +include rpminstall_sh.txt # TODO do we need this file ? include README -include MANIFEST.in +include MANIFEST.in # TODO do we really need this three files ? include setup.nsi include setup.cfg -include bin/import_xml.rng -include bin/server.cert -include bin/server.pkey -include bin/gpl.txt +#include openerp/server.cert +#include openerp/server.pkey +#include openerp/gpl.txt include man/openerp-server.1 include man/openerp_serverrc.5 -recursive-include pixmaps * -recursive-include win32 * -recursive-include doc * -recursive-include bin *xml *xsl *sql *rml *sxw *csv *rng -graft bin/addons -global-exclude *pyc *~ +recursive-include pixmaps *bmp *ico *png +recursive-include win32 *.py *.bat +recursive-include openerp *css *csv *html *png *po *pot +recursive-include openerp *rml *rng *sql *sxw *xml *xsl *yml +graft doc +global-exclude *pyc *~ # Exclude possible garbage from previous graft. diff --git a/setup.py b/setup.py index 00667bcdf96..de2ad54eb70 100755 --- a/setup.py +++ b/setup.py @@ -42,9 +42,7 @@ if os.name == 'nt': import py2exe has_py2exe = True -sys.path.append(join(os.path.abspath(os.path.dirname(__file__)), "bin")) - -execfile(join('bin', 'release.py')) +execfile(join('openerp', 'release.py')) if 'bdist_rpm' in sys.argv: version = version.split('-')[0] @@ -85,7 +83,7 @@ if sys.version_info < (2, 6): os.walk = walk_followlinks def find_addons(): - for root, _, names in os.walk(join('bin', 'addons'), followlinks=True): + for root, _, names in os.walk(join('openerp', 'addons'), followlinks=True): if '__openerp__.py' in names or '__terp__.py' in names: yield basename(root), root #look for extra modules @@ -111,9 +109,9 @@ def data_files(): '''Build list of data files to be installed''' files = [] if os.name == 'nt': - os.chdir('bin') + os.chdir('openerp') for (dp, dn, names) in os.walk('addons'): - files.append((dp, map(lambda x: join('bin', dp, x), names))) + files.append((dp, map(lambda x: join('openerp', dp, x), names))) os.chdir('..') #for root, _, names in os.walk(join('bin','addons')): # files.append((root, [join(root, name) for name in names])) @@ -121,7 +119,7 @@ def data_files(): files.append((root, [join(root, name) for name in names])) #for root, _, names in os.walk('pixmaps'): # files.append((root, [join(root, name) for name in names])) - files.append(('.', [join('bin', 'import_xml.rng'),])) + files.append(('.', [join('openerp', 'import_xml.rng'),])) else: man_directory = join('share', 'man') files.append((join(man_directory, 'man1'), ['man/openerp-server.1'])) @@ -134,9 +132,9 @@ def data_files(): files.append((join(doc_directory, 'migrate', '3.4.0-4.0.0'), filter(isfile, glob.glob('doc/migrate/3.4.0-4.0.0/*')))) - openerp_site_packages = join(get_python_lib(prefix=''), 'openerp-server') + openerp_site_packages = join(get_python_lib(prefix=''), 'openerp') - files.append((openerp_site_packages, [join('bin', 'import_xml.rng'),])) + files.append((openerp_site_packages, [join('openerp', 'import_xml.rng'),])) if sys.version_info[0:2] == (2,5): files.append((openerp_site_packages, [ join('python25-compat','BaseHTTPServer.py'), @@ -144,7 +142,7 @@ def data_files(): join('python25-compat','SocketServer.py')])) for addonname, add_path in find_addons(): - addon_path = join(get_python_lib(prefix=''), 'openerp-server','addons', addonname) + addon_path = join(get_python_lib(prefix=''), 'openerp','addons', addonname) for root, dirs, innerfiles in os.walk(add_path): innerfiles = filter(lambda fil: os.path.splitext(fil)[1] not in ('.pyc', '.pyd', '.pyo'), innerfiles) if innerfiles: @@ -163,16 +161,16 @@ exit 1 f.close() def find_package_dirs(): - package_dirs = {'openerp-server': 'bin'} + package_dirs = {'openerp': 'openerp'} for mod, path in find_addons(): - package_dirs['openerp-server.addons.' + mod] = path + package_dirs['openerp.addons.' + mod] = path return package_dirs class openerp_server_install(install): def run(self): - # create startup script + # create startup script TODO not correct since the openerp lib was made start_script = "#!/bin/sh\ncd %s\nexec %s ./openerp-server.py $@\n"\ - % (join(self.install_libbase, "openerp-server"), sys.executable) + % (join(self.install_libbase, "openerp"), sys.executable) # write script f = open('openerp-server', 'w') f.write(start_script) @@ -214,7 +212,7 @@ setup(name = name, }, scripts = ['openerp-server'], packages = [ - '.'.join(['openerp-server'] + package.split('.')[1:]) + '.'.join(['openerp'] + package.split('.')[1:]) for package in find_packages() ], include_package_data = True, @@ -224,7 +222,7 @@ setup(name = name, package_dir = find_package_dirs(), console = [ { - "script": join("bin", "openerp-server.py"), + "script": "openerp-server.py", "icon_resources": [(1, join("pixmaps","openerp-icon.ico"))] } ], From 44b392ef0996b2cb077b02cfec5ff21ead7476af Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Thu, 24 Feb 2011 15:26:59 +0100 Subject: [PATCH 02/47] [FIX] setup.py: easy_install seems to work. - the generated bin/openerp-server.py seems to work. - I would like to remove the data_files() call as it seems redundant with MANIFEST.in. - Same for find_package_dirs(). - I have to check first how the build on windows work (as it includes different files than on unix). bzr revid: vmt@openerp.com-20110224142659-r2wbm9f8tkldgwe6 --- setup.py | 46 ++++++++-------------------------------------- 1 file changed, 8 insertions(+), 38 deletions(-) diff --git a/setup.py b/setup.py index de2ad54eb70..c9008920fa9 100755 --- a/setup.py +++ b/setup.py @@ -34,7 +34,6 @@ import glob from pprint import pprint as pp from setuptools import setup, find_packages -from setuptools.command.install import install from distutils.sysconfig import get_python_lib has_py2exe = False @@ -152,33 +151,12 @@ def data_files(): return files -f = file('openerp-server','w') -f.write("""#!/bin/sh -echo "Error: the content of this file should have been replaced during " -echo "installation\n" -exit 1 -""") -f.close() - def find_package_dirs(): package_dirs = {'openerp': 'openerp'} for mod, path in find_addons(): package_dirs['openerp.addons.' + mod] = path return package_dirs -class openerp_server_install(install): - def run(self): - # create startup script TODO not correct since the openerp lib was made - start_script = "#!/bin/sh\ncd %s\nexec %s ./openerp-server.py $@\n"\ - % (join(self.install_libbase, "openerp"), sys.executable) - # write script - f = open('openerp-server', 'w') - f.write(start_script) - f.close() - install.run(self) - - - options = { "py2exe": { "compressed": 1, @@ -197,6 +175,10 @@ options = { } } +#import pprint +#def setup(**args): +# pprint.pprint(args) + setup(name = name, version = version, description = description, @@ -207,32 +189,20 @@ setup(name = name, classifiers = filter(None, classifiers.split("\n")), license = license, data_files = data_files(), - cmdclass = { - 'install' : openerp_server_install, - }, - scripts = ['openerp-server'], - packages = [ - '.'.join(['openerp'] + package.split('.')[1:]) - for package in find_packages() - ], + scripts = ['openerp-server.py'], + packages = find_packages(), include_package_data = True, package_data = { '': ['*.yml', '*.xml', '*.po', '*.pot', '*.csv'], }, package_dir = find_package_dirs(), - console = [ - { - "script": "openerp-server.py", - "icon_resources": [(1, join("pixmaps","openerp-icon.ico"))] - } - ], options = options, install_requires = [ - 'lxml', + 'lxml==2.1.5', # we require the same version as caldav 'mako', 'python-dateutil', 'psycopg2', - 'pychart', + 'pychart', # if not available from pypi, an alternate site is http://home.gna.org/pychart/ 'pydot', 'pytz', 'reportlab', From a9b4e238afd4e60b8c78a61ccb6eff4da4b241f3 Mon Sep 17 00:00:00 2001 From: "ksa (Open ERP)" Date: Tue, 1 Mar 2011 15:40:41 +0530 Subject: [PATCH 03/47] [FIX]: Selling a product with phantom BOM ignores chained locations and procurement gets stuck lp bug: https://launchpad.net/bugs/700154 fixed bzr revid: ksa@tinyerp.co.in-20110301101041-q0zfe5rlque3q6zs --- addons/mrp/stock.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/mrp/stock.py b/addons/mrp/stock.py index 5ccb7c8ba7a..0c1454edf98 100644 --- a/addons/mrp/stock.py +++ b/addons/mrp/stock.py @@ -95,9 +95,10 @@ class StockMove(osv.osv): 'location_id': move.location_dest_id.id, 'auto_validate': True, 'picking_id': False, - 'state': 'waiting' + 'state': 'confirmed' }) for m in procurement_obj.search(cr, uid, [('move_id','=',move.id)], context): + wf_service.trg_validate(uid, 'procurement.order', m, 'button_confirm', cr) wf_service.trg_validate(uid, 'procurement.order', m, 'button_wait_done', cr) return True From ddf5c95aa8eabf23480bea026600b89e21fe7465 Mon Sep 17 00:00:00 2001 From: "ksa (Open ERP)" Date: Fri, 4 Mar 2011 16:51:02 +0530 Subject: [PATCH 04/47] [FIX]:physical inventory, action import production lots do not get imported lp bug: https://launchpad.net/bugs/725908 fixed bzr revid: ksa@tinyerp.co.in-20110304112102-o0bfpek0o6m6ex6c --- addons/stock/wizard/stock_fill_inventory.py | 70 +++++++++++++-------- 1 file changed, 43 insertions(+), 27 deletions(-) diff --git a/addons/stock/wizard/stock_fill_inventory.py b/addons/stock/wizard/stock_fill_inventory.py index afb1299fe2b..754554f375e 100644 --- a/addons/stock/wizard/stock_fill_inventory.py +++ b/addons/stock/wizard/stock_fill_inventory.py @@ -58,15 +58,16 @@ class stock_fill_inventory(osv.osv_memory): @return: """ if context is None: - context = {} + context = {} inventory_line_obj = self.pool.get('stock.inventory.line') location_obj = self.pool.get('stock.location') product_obj = self.pool.get('product.product') stock_location_obj = self.pool.get('stock.location') - if ids and len(ids): + move_obj = self.pool.get('stock.move') + if ids and len(ids): ids = ids[0] else: - return {'type': 'ir.actions.act_window_close'} + return {'type': 'ir.actions.act_window_close'} fill_inventory = self.browse(cr, uid, ids, context=context) res = {} res_location = {} @@ -81,39 +82,54 @@ class stock_fill_inventory(osv.osv_memory): res = location_obj._product_get(cr, uid, fill_inventory.location_id.id, context=context) res_location[fill_inventory.location_id.id] = res - + product_ids = [] + res = {} for location in res_location.keys(): - res = res_location[location] - for product_id in res.keys(): - prod = product_obj.browse(cr, uid, product_id, context=context) - uom = prod.uom_id.id - context.update(uom=uom, compute_child=False) - amount = stock_location_obj._product_get(cr, uid, - location, [product_id], context=context)[product_id] - if(amount): + datas = {} + res[location] = {} + if fill_inventory.recursive : + move_ids = move_obj.search(cr, uid, [('location_dest_id','child_of',location),('state','=','done')], context=context) + else: + move_ids = move_obj.search(cr, uid, [('location_dest_id','=',location),('state','=','done')], context=context) + if not move_ids: + raise osv.except_osv(_('Message !'), _('No product in this location.')) + + for move in move_obj.browse(cr, uid, move_ids, context=context): + lot_id = move.prodlot_id.id + prod_id = move.product_id.id + qty = move.product_qty + location_dest_id = move.location_dest_id.id + if datas.get((prod_id, lot_id)): + qty = datas[(prod_id, lot_id)]['product_qty'] + qty + datas[(prod_id, lot_id)] = {'product_id': prod_id, 'location_dest_id': location_dest_id, 'product_qty': qty, 'product_uom': move.product_id.uom_id.id, 'prodlot_id': lot_id} + res[location] = datas + + for i in datas.items(): + if(i[1]['product_qty']): if fill_inventory.set_stock_zero: - amount = 0 - line_ids=inventory_line_obj.search(cr, uid, - [('inventory_id', '=', context['active_ids']), - ('location_id', '=', location), - ('product_id', '=', product_id), - ('product_uom', '=', uom), - ('product_qty', '=', amount)]) + i[1]['product_qty'] = 0 + + line_ids = inventory_line_obj.search(cr, uid, + [('inventory_id','=', context['active_ids']), + ('location_id','=', i[1]['location_dest_id']), + ('product_id','=', i[1]['product_id']), + ('product_uom','=', i[1]['product_uom']), + ('product_qty','=', i[1]['product_qty']), + ('prod_lot_id','=', i[1]['prodlot_id']) + ]) if not len(line_ids): inventory_line = { 'inventory_id': context['active_ids'][0], - 'location_id': location, - 'product_id': product_id, - 'product_uom': uom, - 'product_qty': amount + 'location_id': i[1]['location_dest_id'], + 'product_id': i[1]['product_id'], + 'product_uom': i[1]['product_uom'], + 'product_qty': i[1]['product_qty'], + 'prod_lot_id': i[1]['prodlot_id'] } inventory_line_obj.create(cr, uid, inventory_line) - product_ids.append(product_id) - if(len(product_ids) == 0): - raise osv.except_osv(_('Message !'), _('No product in this location.')) - return {'type': 'ir.actions.act_window_close'} + return {'type': 'ir.actions.act_window_close'} stock_fill_inventory() From 175dc967475198d681892fb0c40d42750e09f114 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Fri, 4 Mar 2011 17:09:11 +0100 Subject: [PATCH 05/47] [IMP] setup.py: cleaning - Removed unnecessary custom code to search/list files and addons. - Handling of some environment variable and files created specifically by debian/rule. - This case should be handled by simply copying the addons in the server (as is done) for packaging if needed. A setup.py file will probably be created for addons in the future. - The console option has been reintroduced (it is needed for py2exe) but taking care of adding it only on os=nt. - The dependency on pychart as been commented out as we already include its code. - Building (with py2exe) on windows has yet to be tested. bzr revid: vmt@openerp.com-20110304160911-4redpkh8mbn19rid --- doc/Changelog-4.x.moved | 951 ---------------------------------------- setup.README | 27 ++ setup.py | 188 ++------ 3 files changed, 66 insertions(+), 1100 deletions(-) delete mode 100644 doc/Changelog-4.x.moved create mode 100644 setup.README diff --git a/doc/Changelog-4.x.moved b/doc/Changelog-4.x.moved deleted file mode 100644 index d884fe8d391..00000000000 --- a/doc/Changelog-4.x.moved +++ /dev/null @@ -1,951 +0,0 @@ -4.2.1 - Bugfixes - Fix context for source_count function - Create stock move on production for products without BOM lines - Add IBAN fields in bank view - Fix uninitialize variable in import data - Update due date on invoice when payment term change - Fix store on field function that have type many2one or one2one - Request summary must be truncate - Partner event name must be truncate - Remove parent field on partner contact view - Fix icon type on journal period - Remove exception on the size of char field - Fix reference on move line that comes from invoice (Customer != Supplier) - Add function search on sheet_id of timesheet_sheet - Don't return 0 for balance account if there is no fiscal year - Fix set to draft for expense, now really set to draft - Add product and partner in the recursive call of tax compute - Don't compute balance account for inactive account - Fix bad encoding in log message on report_sxw - Fix overdue report for refund lines - Don't start server in non secure mode if secure mode have been set - Fix default value of move line if move_id is not find - Fix _product_partner_ref for cannot concatenate 'str' and 'bool' objects - Add partner_id in the context of SO for browsing the product - Fix multi-tax code on invoice - Fix tax definition for Belgium chart - Remove compute debit/credit on inactive account - Fix the way the tax are rounded for invoice with tax included prices - Fix SO to use the right uom and price to create invoice - Fix on_chnage uos on SO to return the id not the browse record - Add condition on the button "Sending goods>Packing to be invoiced" to show - only customer packings - Fix zero division error when the quantity is zero on an invoice line - Fix duplicate timesheet line that have been invoiced - Fix invoice report for bad removeParentNode tag - Fix priority for product view - Fix tax line computation when encoding account lines manually - Fix refund supplier invoice to have the same journal - New chinese translation - Pass context to action_done on stock move - Add product_uom change on sale order line - Fix demo data for working time UOM - Fix _sheet function in timesheet_sheet when called with a list of non - unique id - Remove commit inside function validate on account move - Use one function to post account move - Fix computation of sale/purchase amount in segmentation module - Use standar uom converion in analytic lines - Add journal_id in context for account move line search in payment module - Fix wrong id used by pricelist based on partner form - Use partner reference from SO/PO for invoice name if there is one - Make analysis analytic module include child accounts - -4.2.0 - Summary: - Add new view graph - REPORT_INTRASTAT: new module - KERNEL: add netrpc (speed improvement) - REPORT_STOCK: add report on stock by stock location and production lots - HR_TIMESHEET_INVOICE: add final invoice - MULTI_COMPANY_ACCOUNT: new module - ADD modules publication tools - KERNEL: add timezone - KERNEL: add concurnecy check - BASE: allow to specify many view_id in act_window - BASE: add ir.rules (acces base on record fields) - KERNEL: add search_count on objects - KERNEL: add assert tools (unit test) - KERNEL: improve workflow speed - KERNEL: move some modules to extra_addons - Bugfixes: - Fix pooler for multi-db - REPORT_ANALYTIC: new reports - BOARD_ACCOUNT: new dashboard for accountants - PURCHASE: allow multiple pickings for the same purchase order - STOCK: When refunding picking: confirm & Assign the newly generated picking - PRODUCT: add average price - STOCK: Fix workflow for stock - TOOLS: Fix export translate for wizard - KERNEL: add id in import_data - BASE: add history rate to currency - ACCOUNT: partner_id is now required for an invoice - HR_TIMESHEET: add exception if employee haven't product - I18N: new fr_CH file - HR_EXPENSE: fix domain - ACCOUNT: Fix invoice with currency and payment term - ACCOUNT: Fix currency - KERNEL: add pidfile - ACCOUNT,PURCHASE,SALE: use partner lang for description - Model Acces: Unlink permission (delete) is now available - KERNEL: Remove set for python2.3 - HR: add id to Attendance menu - PRODUCT: add dimension to packaging - ACCOUNT: new cash_discount on payment term - KERNEL: Add price accuracy - BASE: Function to remove installed modules - REPORT_SALE: fix for sale without line - PURCHASE: remove use of currency - KERNEL: fix set without values - PURCHASE: fix domain pricelist - INVOICE: use date for currency rate - KERNEL: Fix import many2many by id - KERNEL: run the cron - ACCOUNT: bank statment line now have a ref t othe corresponding invoice - ACCOUNT: Add possibilitty to include tax amount in base amount for the computation of the next taxes - ACCOUNT: Add product in tax compute python code - KERNEL: use reportlab 2.0 - BASE: fix import the same lang - ACCOUNT: fix tax code - ACCOUNT: define tax account for invoice and refund - ACCOUNT: add supplier tax to product - ACCOUNT: don't overwrite tax_code on the creation for account line - PURCHASE: use partner code for report order - KERNEL: fix pooler netsvc for multi-db - TOOLS: add ref to function tag - PRODUCT: fix digits on volume and weight, add weight_net - ACCOUNT: split to new module account_cash_discount - ORM : error message on python constraints are now displayed correctly - ACCOUNT: add partner to tax compute context - KERNEL: improve logger - PROJECT: add check_recursion for project - HR_TIMESHEET_INVOICE: improve create invoice - ACCOUNT: add product_id to analytic line create by invoice - KERNEL: fix the inheritance mechanism - KERNEL: Fix use always basename for cvs file - BASE: fix IBAN len to 27 - INVOICE: fix invoice number for analytic - REPORT: add replace tag for custom header - ACCOUNT: add ref to analytic line - BASE: prevent exception in ir_cron - SALE: fix uos for tax_amount - MRP: fix dbname in _procure_confirm - HR_EXPENSE: add domain to analytic_account - KERNEL: use 0 instead of False for fix on _fnct_read - SUBSCRIPTION: add required to model - HR_TIMESHEET: add rounding on report - SALE: Fix cancel invoice and recreate invoice, now cancel also the order lines - STOCK-DELIVERY: add wizard invoice_onshipping from delivery to stock - STOCK: use tax from sale for invoice - BASE: improve copy of res.partner - ACCOUNT: pay only invoice if not in state draft - REPORT: fix rml translation, translate before eval - PRODUCT_EXTENDED: don't use seller price for bom price - ACCOUNT_TAX_INCLUDE: fix right amount in account move generate with tax_include - BASE: improve workflow print - SALE: fix workflow error when create invoice from wizard - MRP: Use company currency for Product Cost Structure - BASE: prevent recursion in company - KERNEL: Fix deleted property and many2one - KERNEL: allow directory for import csv - KERNEL: add store option to fields function - ACCOUNT: use property_account_tax on on_change_product - KERNEL: add right-click for translate label - KERNEL: fix log of backtrace - KERNEL: fix search on xxx2many - BASE: use tool to call popen.pipe2 - KERNEL: fix print workflow on win32 - BASE: fix US states - KERNEL: use python 2.3 format_exception - ACCOUNT: add multi-company into base accounting - KERNEL: check return code for exec_pg_command_pipe - KERNEL: fix search with active args - KERNEL: improve _sql_contsraints, now insert if doesn't exist - KERNEL: remove old inheritor and add _constraints and _sql_constraints to the fields inherited - CRM: bugfix mailgate - PURCHASE: fix the UOM for purchase line and improve update price unit - ACCOUNT: new invoice view - KERNEL,BASE: allow to create zip modules - BASE: add right-to-left - KERNEL: copy now ignore technical values ('create_date', 'create_uid', 'write_date' and 'write_uid') - ACCOUNT_TAX_INCLUDE: Now the module manage correctly the case when the taxes defined on the product differ from the taxes defined on the invoice line - ALL: fix colspan 3 -> 4 - KERNEL: use context for search - ACCOUNT: improve speed of analytic account - ACCOUNT: fix search debit/credit on partner - ACCOUNT: fix refund invoice if no product_id nor uos_id on lines - MRP: fix scheduler location of product to produce and method, date of automatic orderpoint - KERNEL: many2many : fix unlink and link action - MRP: add default product_uom from context and add link from product to bom - PROJECT: improve speed for function fields - ALL: remove bad act_window name - KERNEL: modification for compatibility with postgres 7.4 - KERNEL: fix size for selection field - KERNEL: fix compatibility for python2.5 - KERNEL: add new win32 build script - KERNEL: add test for duplicate report and wizard - ACCOUNT: force round amount fixed in payment term - KERNEL: fix print screen - CRM: Better ergonomy - SERVER: add sum tag on tree view that display sum of the selected lines - KERNEL: allow subfield query on one2many - KERNEL: fix create_date and write_date as there are timestamp now - SERVER: improve language - KERNEL: fix search on fields function of type one2many, many2many - ACCOUNT: fix pay invoice to use period - ACCOUNT: add check recursion in account.tax.code - MRP: fix compute cycle for workcenter - BASE: add constraint uniq module name - BASE: improve update module list - ACCOUNT: add round to last payment term - KERNEL: don't modify the args of the call - KERNEL: don't use mutable as default value in function defintion - KERNEL: fix orm for sql query with reserved words - -16/03/2007 -4.0.3 - Summary: - Improve the migration scripts - Some bugfixes - Print workflow on win32 (with ghostscript) - - Bugfixes: - BASE: Fix "set default value" - HR_TIMESHEET_INVOICE: Improve invoice on timesheet - ACCOUNT: Fix tax amount - KERNEL: correct the delete for property - PURCHASE: fix the journal for invoice created by PO - KERNEL: fix the migration for id removed - Add id to some menuitem - BASE: prevent exception in ir_cron when the DB is dropped - HR: Fix sign-in/sign-out, the user is now allowed to provide a date in - the future - SALE: fix uos for the tax amount - MRP: fix wrong dbname in _procure_confirm - HR_EXPENSE: add domain to analytic_account - ACCOUNT: fix debit_get - SUBSCRIPTION: model is required now - HR_TIMESHEET: add rounding value to report - SALE: Fix cancel and recreate invoice, now cancel also the order lines - STOCK: use the tax define in sale for the invoice - ACCOUNT: add test to pay only if invoice not in state draft - KERNEL: root have access to all records - REPORT: fix rml translation to translate before the eval - ACCOUNT_TAX_INCLUDE: Use the right amount in account mmove generate - with tax_include - BASE: Improve the workflow print - SALE: Fix workflow error when creating invoice from the wizard - PRODUCT_EXTENDED: don't use pricelist to compute standard price - MRP: Use company currency for product cost structure - KERNEL: fix where clause when deleting false items - ACCOUNT: product source account depend on the invoice type now - ACCOUNT: use the property account tax for the on_change_product - ACCOUNT: use the invoice date for the date of analytic line - ACCOUNT: Fix the pay invoice when multi-currency - HR_TIMESHEET_PROJECT: use the right product - STOCK: Fix to assign picking with product consumable and call the - workflow - STOCK: Fix the split lot production - PURCHASE: fix workflow for purchase with manual invoice to not set - invoice and paid - DELIVERY: can use any type of journal for invoice - KERNEL: fix search on xxx2many - ACCOUNT: add id to sequence record - KERNEL: set properly the demo flag for module installed - KERNEL: Fix print workflow on win32 - LETTER: fix print letter - - Migration: - Fix migration for postreSQL 7.4 - Fix the default value of demo in module - Fix migration of account_uos to product_uos - -Wed Jan 17 15:06:07 CET 2007 -4.0.2 - Summary: - Improve the migration - Some bugfixes - Improve tax - - Bugfixes: - Fix tax for invoice, refund, etc - SALE: fix view priority - PURCHASE: wizard may crash on some data - BASE: Fix import the same lang - BASE: start the cron - PURCHASE: fix domain for pricelist - KERNEL: fix object set without values - REPORT_SALE: fix for sale without line - KERNEL: add pidfile - BASE: remove 'set' for python2.3 compliant - Migration: - Migrate hr_timesheet user_id - -Fri Dec 22 12:01:26 CET 2006 -4.0.1 - Summary: - Improve the migration - Some bugfixes - - Bugfixes: - HR_EXPENSE: Fix domain - HR_TIMESHEET: Fix employee without product - TOOLS: Fix export translate - BASE: fix for concurrency of sequence number - MRP: fix report - CRM: fix graph report - KERNEL: fix instance of osv_pool - KERNEL: fix setup.py - - -Mon Dec 4 18:01:55 CET 2006 -4.0.0 - Summary: - Some bugfixes - -Tue Nov 28 14:44:20 CET 2006 -4.0.0-rc1 - Summary: - This is a stable version (RC1) with lots of new features. Main - Improvements were: - Accounting: more functions, new modules, more stable - Much more better ergonomy - Lots of simplification to allows non IT people to use and - configure Tiny ERP: manage database, step by step configuration - menu, auto-installers, better help, ... - - New: - Skill management module - ACCOUNT: - New and simpler bank statement form - New reports: - on Timesheets (analytic accounting) - Theorical revenue based on time spent - Global timesheet report by month - Chart of accounts - Different taxes methods supported - Gross (brut) - Net - Fixed amount - INVOICE: - invoice on shipping (manufacturing industry) - invoice on timesheet (services) - PURCHASE: - different invoicing control method (on order, on shipping, - manual) - Support of prices tax included /excluded in sales orders - New modules: - Sale_journal, stock_journal for bigger industries: - Divide works in different journals - New invoicing method from partner, to so, to picking - Daily, Monthly (grouped by partner or not) - New modules for prices with taxes included / excluded - New chart of accounts supported: - l10n_be/ l10n_chart_be_frnl/ - l10n_chart_id/ l10n_chart_uk/ - l10n_ca-qc/ l10n_chart_br/ - l10n_chart_it/ l10n_chart_us_general/ - l10n_ch/ l10n_chart_ca_en/ - l10n_chart_it_cc2424/ l10n_chart_us_manufacturing/ - l10n_ch_pcpbl_association/ l10n_chart_ca_fr/ - l10n_chart_la/ l10n_chart_us_service/ - l10n_ch_pcpbl_independant/ l10n_chart_ch_german/ - l10n_chart_nl/ l10n_chart_us_ucoa/ - l10n_ch_pcpbl_menage/ l10n_chart_cn/ - l10n_chart_nl_standard/ l10n_chart_us_ucoa_ez/ - l10n_ch_pcpbl_plangen/ l10n_chart_cn_traditional/ - l10n_chart_no/ l10n_chart_ve/ - l10n_ch_pcpbl_plangensimpl/ l10n_chart_co/ - l10n_chart_pa/ l10n_fr/ - l10n_ch_vat_brut/ l10n_chart_cz/ - l10n_chart_pl/ l10n_se/ - l10n_ch_vat_forfait/ l10n_chart_da/ - l10n_chart_sp/ l10n_simple/ - l10n_ch_vat_net/ l10n_chart_de_datev_skr03/ - l10n_chart_sw/ - l10n_chart_at/ l10n_chart_de_skr03/ - l10n_chart_sw_church/ - l10n_chart_au/ l10n_chart_hu/ - l10n_chart_sw_food/ - Step by step configuration menu - Setup wizard on first connection - Select a company profile, auto-install language, demo data, ... - - Imrovements: - KERNEL: Demo data improved - Better import / export system - KERNEL: Multi-database management system - Backup, Restore, Create, Drop from the client - PRODUCT/PRODUCT_EXTD: Eavily change the product form, use the new - object to compute the pricelist - REPORTS: - Better Sale order, purchase order, invocies and customers reports - ACCOUNT: Support of taxes in accounts - management of the VAT taxes for most european countries: - Support of VAT codes in invoices - Better computation of default values in accounting entries - Preferences in partners, override products - Bugfix when closing a fiscal year - Better ergonomy when writting entries - New Module Management System: - Install / Upgrade new modules directly from the client - Install new languages - KERNEL: - Ability to add select=True at the object level for postgresql indexes - Bugfix in search in some inherited objects - Added the ability to call methods from a browse object - KERNEL+BASE: changed the way the migration system works for menuitems: - now you can change a menuitem defined elsewhere. And this will work - whether that menuitem has an id or not (it use the name of the - menuitem to find it) - KERNEL: - Installing a module from the client - Better Windows Auto-Installer - DELIVERY: - Delivery and invoicing on picking list - KERNEL: - Distinction between active (by default) and installable - ACCOUNT/PROJECT: Added support for the type of invoicing - CRM: - eMAil gateway - Management of different departments and sections - Rule system - About 20 new statistics reporting - eCommerce interface: - Better Joomla (virtuemart, OSCommerce) support - Joomla is now fully functionnal - - Bugfixes: - ACCOUNT: tree view on reporting analytic account - KERNEL: Fix the bug that happened when mixing active and child_of - search - KERNEL: Check for the existance of active when computing child_of - PRODUCT: production computation with different UoM - ------------------------------------------------------------------------- - -Fri Oct 6 14:44:05 CEST 2006 -Server 3.4.2 - Improvements: - BASE: changed workflow print system so that it handles inexisting - workflows more gracefully (patch from Geoff Gardiner) - MRP: new view to take into account the orderpoint exceptions - MRP: made menu title more explicit - - Bugfixes: - ACCOUNT: fixed typo in invoice + changed sxw file so that it is in - sync with the rml file - DELIVERY: fixed taxes on delivery line (patch from Brice Vissière) - PROJECT: skip tasks without user in Gantt charts (it crashed the report) - PRODUCT: fixed bug when no active pricelist version was found - PRODUCT_EXTENDED: correct recursive computation of the price - SALE: get product price from price list even when quantity is set after - the product is set - STOCK: fixed partial picking - - Packaging: - Changed migration script so that it works on PostgreSQL 7.4 - ------------------------------------------------------------------------- - -Tue Sep 12 15:10:31 CEST 2006 -Server 3.4.1 - Bugfixes: - ACCOUNT: fixed a bug which prevented to reconcile posted moves. - ------------------------------------------------------------------------- - -Mon Sep 11 16:12:10 CEST 2006 -Server 3.4.0 (changes since 3.3.0) - New modules: - ESALE_JOOMLA: integration with Joomla CMS - HR_TIMESHEET_ICAL: import iCal to automatically complete timesheet - based on outlook meetings - PARTNER_LDAP: adds partner synchronization with an LDAP server - SALE_REBATE: adds rebates to sale orders - - 4 new modules for reporting using postgresql views: - REPORT_CRM: reporting on CRM cases: by month, user, ... - REPORT_PROJECT: reporting on projects: tasks closed by project, user, - month, ... - REPORT_PURCHASE: reporting on purchases - REPORT_SALE: reporting on sales by periods and by product, category of - product, ... - - New features: - KERNEL: Tiny ERP server and client may now communicate through HTTPS. - To launch the server with HTTPS, use the -S or --secure option - Note that if the server runs on HTTPS, the clients MUST connect - with the "secure" option checked. - KERNEL: the server can now run as a service on Windows - Printscreen function (Tree view print) - KERNEL: added a new --stop-after-init option which stops the server - just before it starts listening - KERNEL: added support for a new forcecreate attribute on XML record - fields: it is useful for records are in a data node marked as - "noupdate" but the record still needs to be added if it doesn't - exit yet. The typical use for that is when you add a new record - to a noupdate file/node. - KERNEL: manage SQL constraints with human-readable error message on the - client side, eg: Unique constraints - KERNEL: added a new system to be able to specify the tooltip for each - field in the definition of the field (by using the new help="" - attribute) - ACCOUNT: new report: aged trial balance system - ACCOUNT: added a wizard to pay an invoice from the invoice form - BASE: print on a module to print the reference guide using introspection - HR: added report on attendance errors - PRODUCT: products now support multi-Level variants - - Improvements: - KERNEL: speed improvement in many parts of the system thanks to some - optimizations and a new caching system - KERNEL: New property system which replace the, now deprecated, ir_set - system. This leads to better migration of properties, more - practical use of them (they can be used like normal fields), - they can be translated, they are "multi-company aware", and - you can specify access rights for them on a per field basis. - KERNEL: Under windows, the server looks for its configuration file in - the "etc" sub directory (relative to the installation path). - This was needed so that the server can be run as a windows - service (using the SYSTEM profile). - KERNEL: added ability to import CSV files from the __terp__.py file - KERNEL: force freeing cursor when closing them, so that they are - available again immediately and not when garbage collected. - KERNEL: automatically drop not null/required constraints from removed - fields (ie which are in the database but not in the object) - KERNEL: added a command-line option to specify which smtp server to use - to send emails. - KERNEL: made browse_record hashable - ALL: removed shortcuts for the demo user. - ACCOUNT: better invoice report - ACCOUNT: Modifs for account chart, removed old stock_income account type - ACCOUNT: made the test_paid method on invoices more tolerant to buggy - data (open invoices without move/movelines) - ACCOUNT: better bank statement reconciliation system - ACCOUNT: accounting entries encoding improved a lot (using journal) - ACCOUNT: Adding a date and max Qty field in analytic accounts for - support contract - ACCOUNT: Adding the View type to analytic account / cost account - ACCOUNT: changed test_paid so that the workflow works even if there is - no move line - ACCOUNT: Cleanup credit/debit and balance computation methods. Should - be faster too. - ACCOUNT: use the normal sequence (from the journal) for the name of - moves generated from invoices instead of the longer name. - ACCOUNT: print Payment delay in invoices - ACCOUNT: account chart show subtotals - ACCOUNT: Subtotal in view accounts - ACCOUNT: Replaced some Typo: moves-> entries, Transaction -> entry - ACCOUNT: added quantities in analytic accounts view, and modified - cost ledger report for partners/customers - ACCOUNT: added default value for the currency field in invoices - ACCOUNT: added the comment/notes field on the invoice report - BASE: added menuitem (and action) to access partner functions (in the - definitions menu) - BASE: better demo data - BASE: duplicating a menu item now duplicates its action and submenus - BASE: Bank Details on Partners - CRM: View on all actions made on cases (used by our ISO9002 customer - to manage corrections to actions) - CRM: fixed wizard to create a sale order from a case - CRM: search on non active case, not desactivated by default - CRM: Case ID in fields with search - HR_TIMESHEET: new "sign_in, sign_out" using projects. It fills - timesheets and attendance at the same time. - HR_TIMESHEET: added cost unit to employee demo data - MRP: improvement in the scheduler - MRP: purchase order lines' description generated from a procurement - defaults to the product name instead of procurement name - MRP: Better traceability - MRP: Better view for procurement in exception - MRP: Added production delay in product forms. Use this delay for - average production delay for one product - MRP: dates scheduler, better computation - MRP: added constraint for non 0 BoM lines - PRODUCT: Better pricelist system (on template or variant of product) - PRODUCT_EXTENDED: Compute the price only if there is a supplier - PROJECT: when a task is closed, use the task's customer to warn the - customer if it is set, otherwise use the project contact. - PROJECT: better system to automatically send an email to the customer - when a task is closed or reopened. - PURCHASE: date_planned <= current_time line in red - PURCHASE: better purchase order report - PURCHASE: better purchase order duplication: you can now duplicate non - draft purchase orders and the new one will become draft. - SALE: better sale order report - SALE: better demo data for sale orders - SALE: better view for buttons in sale.order - SALE: select product => description = product name instead of code - SALE: warehouse field in shop is now required - SCRUM: lots of improvements for better useability - STOCK: allows to confirm empty picking lists. - STOCK: speed up stock computation methods - - Bugfixes: - KERNEL: fix a huge bug in the search method for objects involving - "old-style" inheritance (inherits) which prevented some records - to be accessible in some cases. Most notable example was some - products were not accessible in the sale order lines if you had - more products in your database than the limit of your search - (80 by default). - KERNEL: fixed bug which caused OO (sxw) reports to behave badly (crash - on Windows and not print correctly on Linux) when data - contained XML entities (&, <, >) - KERNEL: reports are now fully concurrency compliant - KERNEL: fixed bug which caused menuitems without id to cause havoc on - update. The menuitems themselves were not created (which is - correct) but they created a bad "default" action for all - menuitems without action (such as all "menu folders"). - KERNEL: fix a small security issue: we should check the password of the - user when a user asks for the result of a report (in addition - to the user id and id of that report) - KERNEL: bugfix in view inheritancy - KERNEL: fixed duplicating resource with a state field whose selection - doesn't contain a 'draft' value (for example project tasks). It - now uses the default value of the resource for that field. - KERNEL: fixed updating many2many fields using the (4, id) syntax - KERNEL: load/save the --logfile option correctly in the config file - KERNEL: fixed duplicating a resource with many2many fields - ALL: all properties should be inside a data tag with "noupdate" and - should have a forcecreate attribute. - ACCOUNT: fixed rounding bug in tax computation method - ACCOUNT: bugfix in balance and aged balance reports - ACCOUNT: fixing precision in function fields methods - ACCOUNT: fixed creation of account move lines without using the client - interface - ACCOUNT: fixed duplicating invoices - ACCOUNT: fixed opening an invoices whose description contained non - ASCII chars at specific position - ACCOUNT: small bugfixes in all accounting reports - ACCOUNT: fixed crash when --without-demo due to missing payment.term - ACCOUNT: fixed bug in automatic reconciliation - ACCOUNT: pass the address to the tax computation method so that it is - available in the tax "python applicable code" - BASE: allows to delete a request which has a history (it now deletes the - history as well as the request) - BASE: override copy method for users so that we can duplicate them - BASE: fixed bug when the user search for a partner by hitting on an - empty many2one field (it searched for a partner with ref=='') - BASE: making ir.sequence call thread-safe. - CRM: fixed a bug which introduced an invalid case state when closing a - case (Thanks to Leigh Willard) - HR: added domain to category tree view so that they are not displayed - twice - HR_TIMESHEET: fixed print graph - HR_TIMESHEET: fixed printing timesheet report - HR_TIMESHEET: Remove a timesheet entry removes the analytic line - MRP: bugfix on "force reservation" - MRP: fixed bugs in some reports and MRP scheduler when a partner has - no address - MRP: fix Force production button if no product available - MRP: when computing lots of procurements, the scheduler could raise - locking error at the database level. Fixed. - PRODUCT: added missing context to compute product list price - PRODUCT: fixed field type of qty_available and virtual_available - (integer->float). This prevented these fields to be displayed - in forms. - PROJECT: fixed the view of unassigned task (form and list) instead of - form only. - PURCHASE: fixed merging orders that made inventory errors when coming - from a procurement (orderpoint). - PURCHASE: fix bug which prevented to make a purchase order with - "manual" lines (ie without product) - PURCHASE: fix wizard to group purchase orders in several ways: - - only group orders if they are to the same location - - only group lines if they are the same except for qty and unit - - fix the workflow redirect method so that procurement are not - canceled when we merge orders - SALE: fixed duplicating a confirmed sale order - SALE: fixed making sale orders with "manual" lines (without product) - STOCK: future stock prevision bugfix (for move when date_planned < now) - STOCK: better view for stock.move - STOCK: fixed partial pickings (waiting for a production) - Miscellaneous minor bugfixes - - Packaging: - Fixed bug in setup.py which didn't copy csv files nor some sub- - directories - Added a script to migrate a 3.3.0 server to 3.4.0 (you should read the - README file in doc/migrate/3.3.0-3.4.0) - Removed OsCommerce module - ------------------------------------------------------------------------- - -Fri May 19 10:16:18 CEST 2006 -Server 3.3.0 - New features: - NEW MODULE: hr_timesheet_project - Automatically maps projects and tasks to analytic account - So that hours spent closing tasks are automatically encoded - KERNEL: Added a logfile and a pidfile option (patch from Dan Horak) - STOCK: Added support for revisions of tracking numbers - STOCK: Added support for revision of production lots - STOCK: Added a "splitting and tracking lines" wizard - PRODUCT_EXTENDED: Added a method to compute the cost of a product - automatically from the cost of its parts - - Improvements: - ALL: Small improvements in wizards (order of buttons) - PRODUCT: Remove packaging info from supplierinfo - PROJECT: Better task view (moved unused fields to other tab) - SALE: Keep formating for sale order lines' notes in the sale order report - - Bugfixes: - KERNEL: Fixed bug which caused field names with non ascii chars didn't work - in list mode on Windows - KERNEL: Fix concurrency issue with UpdatableStr with the use of - threading.local - KERNEL: Removed browse_record __unicode__ method... It made the sale order - report crash when using product names with non ASCII characters - KERNEL: Fixed bug which caused the translation export to fail when the server - was not launched from the directory its source is. - BASE: Updating a menuitem now takes care its parent menus - BASE: Fixed a cursor locking issue with updates - BASE: Fixed viewing sequence types as a tree/list - HR: Month field needs to be required in the "hours spent" report - PURCHASE: fixed group purchase order wizard: - - if there were orders from several different suppliers, it created a purchase - order for only the first supplier but canceled other orders, even those which - weren't merged in the created order (closes bugzilla #236) - - doesn't trash "manual" lines (ie lines with no product) - - pay attentions to unit factors when adding several lines together - MRP: fixed workcenter load report (prints only the selected workcenters) and - does't crash if the user didn't select all workcenters - - Miscellaneous: - Removed pydot from required dependencies - ------------------------------------------------------------------------- - -Server 3.3.0-rc1 -================ - -Changelog for Users -------------------- - -New module: OS Commerce - Integration with Tiny ERP and OS Commerce - Synchronisation 100% automated with eSale; - Import of categories of products - Export of products (with photos support) - Import of Orders (with the eslae module) - Export of stock level - Import of OSCommerce Taxes - Multiple shop allowed with different rules/products - Simple Installation - -New Module: HR_TIMESHEET - Management by affair, timesheets creates analytic entries in the - accounting to get costs and revenue of each affairs. Affairs are - structured in trees. - -New Module: Account Follow Up - Multi-Level and configurable Follows ups for the accounting module - -New module; Productivity Analysis of users - A module to compare productivity of users of Tiny ERP - Generic module, you can compare everything (sales, products, partners, - ...) - -New Modules for localisations: - Accounting localisations for be, ca, fr, de, ch, sw - Fix: corrected encoding (latin1 to utf8) of Swedish account tree XML file - -New Module - Sandwich - Allows employees to order the lunch - Keeps employees preferences - -New Module TOOLS: - Email automatic importation/integration in the ERP - -New Module EDI: - Import of EDI sale orders - Export of shippings - -Multi-Company: - Tiny ERP is now fully multi-company ! - New Company and configuration can be made in the client side. - -ACCOUNTING: - Better Entries > Standard Entries (Editable Tree, like in Excel) - Automatic creation of lines - Journal centralised or not - Counterpart of lines in one line or one counterpart per entry - Analytic accounting recoded from scratch - 5 new reports - Completly integrated with: - production, - hr_timesheet > Management by affairs - sales & purchases, - Tasks. - Added unreconciliation functionnalities - Added account tree fast rendering - Better tax computation system supporting worldwide specific countries - Better subscription system - Wizard to close a period - Wizard to clase a fiscal year - Very powerfull, simple and complete multi-currency system - in pricelists, sale order, purchases, ... - Added required fields in currencies (currency code) - Added decimal support - Better search on accounts (on code, shortcut or name) - Added constraint; - on users - on group - on accounts in a journal - added menuitem for automatic reconciliation; Multi-Levels - added factor to analytic units - added form view for budget items dotations - made number of digits in quantity field of the budget spread wizard coherent with the object field - fixed journal on purchase invoices/refunds (SugarCRM #6) - Better bank statement reconciliation - Fixed some reports - -STOCK: - Better view for location (using localisation of locations; posx, posy, posz) - -MARKETING: - fixed small bug when a partner has no adress - state field of marketing partner set as readonly - fixed marketing steps form view - better history view - disabled completely send sms wizard - fixed send email wizard - good priority -> high priority - fixed 'call again later' button - -NETWORK: - added tree view for login/password - -HR: - added holiday_status (=type of ...) to expense claim form view - -BASE (partner): - fixed email_send and _email_send methods - removed partner without addresses from demo data - Added a date field in the partner form - -MRP: - New report: workcenter futur loads - Analytic entries when production done. - SCHEDULER: better error msg in the generated request - Allows services in BoMs (for eg, subcontracting) - -Project/Service Management: - create orders from tasks; bugfixes - Completly integrated with the rest of the ERP - Services can now be MTO/MTS, Buy (subcontracting), produce (task), ... - Services can be used anywhere (sale.order, bom, ...) - See this graph; - http://tiny.be/download/flux/flux_procurement.png - tasks sorted by ... AND id, so that the order is not random - within a priority - -Automatic translations of all wizards - -Scrum Project Management - Better Ergonomy; click on a sprint to view tasks - Planned, Effetive hours and progress in backlog, project and sprint - Better Burndown Chart computation - Better (simpler) view of tasks - -Better demo Data - In All modules, eth converted to english - -PRODUCT: - computing the weight of the packaging - Added last order date - Alternative suppliers (with delay, prefs, ...) for one product - -PRICELISTS: - much more powerfull system - views simplified - one pricelist per usage: sale, order, pvc - price_type on product_view - Multi-Currency pricelist (EUR pricelist can depend on a $ one) - -HR-TIMESHEET: fixed bugs in hours report: - sum all lines for the same day instead of displaying only the first one - it now uses the analytic unit factor, so that mixing hours and days has some sense - close cursor - -SALE: - invoices generated from a sale order are pre-computed (taxes are computed) - - new invoicing functionnality; - invoice on order quantities or, - invoice on shipped quantities - - Invoice on a sale.order or a sale.order.line - - added default value for uos_qty in sale order lines (default to 1) - - -Changelog for Developers ------------------------- - -New option --debug, that opens a python interpreter when an exception -occurs on the server side. - -Better wizard system. Arguements self, cr, uid, context are passed in all -functions of the wizard like normal objects. All wizards converted. - -Speed improvements in many views; partners, sale.order, ... - less requests from client to server when opening a form - -Better translation system, wizard terms are exported. - -Script to render module dependency graph - -KERNEL+ALL: pass context to methods computing a selection. - -Modification for actions and view definitions: - Actions Window: - New field: view_mode = 'tree,form' or 'form,tree' -> default='form,tree' - New role of view_type: tree (with shortcuts), form (others with switch button) - If you need a form that opens in list mode: - view_mode = 'tree,form' or 'tree' - view_type = form - You can define a view in a view (for example sale.order.line in - sale.order) - less requests on the client side, no need to define 2 views - -Better command-line option message - -Fixed bug which prevented to search for names using non ASCII -chars in many2one or many2many fields - -Report Engine: bugfix for concurrency - -Support of SQL constraints - Uniq, check, ... - Good error message in the client side (check an account entry with - credit and debit >0) - -Fixed: when an exception was raised, the cursor wasn't closed and this -could cause a freeze in some cases - -Sequence can contains code: %(year)s, ... for prefix, suffix - EX: ORDER %(year)/0005 - -Bugfixes for automatic migration system - -bugfix on default value with creation of inherits - -Improvement in report_sxw; you can redefine preprocess to do some -preprocessing before printing - -Barcode support enabled by default - -Fixed OpenOffice reports when the server is not launched from the -directory the code reside - -Print workflow use a pipe instead of using a temporary file (now workflows -works on Windows Servers) - -Inheritancy improved (multiple arguments: replace, inside, after, before) - -Lots of small bugfixes - diff --git a/setup.README b/setup.README new file mode 100644 index 00000000000..4432e5bd1a6 --- /dev/null +++ b/setup.README @@ -0,0 +1,27 @@ +Some instructions to use setup.py for a user-install. +This file should/will be moved on a proper documentation place later. + +- Possibly clean any left-over of the previous build. + > rm -rf dist openerp_server.egg-info + +- Possibly copy the addons in the server if we want them to be packaged + together: + > rsync -av --delete \ + --exclude .bzr/ \ + --exclude .bzrignore \ + --exclude /__init__.py \ + --exclude /base \ + --exclude /base_quality_interrogation.py \ + openerp/addons + +- Create the user-local directory where we want the package to be installed: + > mkdir -p /home/openerp/openerp-tmp/lib/python2.6/site-packages/ + +- Use --prefix to specify where the package is installed and include that + place in PYTHONPATH: + > PYTHONPATH=/home/openerp/openerp-tmp/lib/python2.6/site-packages/ \ + python setup.py install --prefix=/home/openerp/openerp-tmp + +- Run the main script, again specifying the PYTHONPATH: + > PYTHONPATH=/home/openerp/openerp-tmp/lib/python2.6/site-packages/ \ + bin/openerp-server.py diff --git a/setup.py b/setup.py index c9008920fa9..70c4893fac8 100755 --- a/setup.py +++ b/setup.py @@ -25,160 +25,44 @@ # taken from gnomolicious http://www.nongnu.org/gnomolicious/ # adapted by Nicolas Évrard # +# doc/migrate is not included since about 6.1-dev +# doc/tests is not included +# python25-compat/*py should be in the openerp (and imported appropriately) import sys import os -from os.path import join, isfile, basename +from os.path import join, isfile import glob -from pprint import pprint as pp - from setuptools import setup, find_packages -from distutils.sysconfig import get_python_lib -has_py2exe = False +py2exe_keywords = {} if os.name == 'nt': import py2exe - has_py2exe = True + py2exe_keywords['console'] = [ + { "script": join("bin", "openerp-server.py"), + "icon_resources": [(1, join("pixmaps","openerp-icon.ico"))], + }] + py2exe_keywords['options'] = { + "py2exe": { + "compressed": 1, + "optimize": 2, + "dist_dir": 'dist', + "packages": [ + "lxml", "lxml.builder", "lxml._elementpath", "lxml.etree", + "lxml.objectify", "decimal", "xml", "xml", "xml.dom", "xml.xpath", + "encodings", "dateutil", "wizard", "pychart", "PIL", "pyparsing", + "pydot", "asyncore","asynchat", "reportlab", "vobject", + "HTMLParser", "select", "mako", "poplib", + "imaplib", "smtplib", "email", "yaml", "DAV", + "uuid", + ], + "excludes" : ["Tkconstants","Tkinter","tcl"], + } + } execfile(join('openerp', 'release.py')) -if 'bdist_rpm' in sys.argv: - version = version.split('-')[0] - -# get python short version -py_short_version = '%s.%s' % sys.version_info[:2] - -# backports os.walk with followlinks from python 2.6 -def walk_followlinks(top, topdown=True, onerror=None, followlinks=False): - from os.path import join, isdir, islink - from os import listdir, error - - try: - names = listdir(top) - except error, err: - if onerror is not None: - onerror(err) - return - - dirs, nondirs = [], [] - for name in names: - if isdir(join(top, name)): - dirs.append(name) - else: - nondirs.append(name) - - if topdown: - yield top, dirs, nondirs - for name in dirs: - path = join(top, name) - if followlinks or not islink(path): - for x in walk_followlinks(path, topdown, onerror, followlinks): - yield x - if not topdown: - yield top, dirs, nondirs - -if sys.version_info < (2, 6): - os.walk = walk_followlinks - -def find_addons(): - for root, _, names in os.walk(join('openerp', 'addons'), followlinks=True): - if '__openerp__.py' in names or '__terp__.py' in names: - yield basename(root), root - #look for extra modules - try: - empath = os.getenv('EXTRA_MODULES_PATH', '../addons/') - for mname in open(join(empath, 'server_modules.list')): - mname = mname.strip() - if not mname: - continue - - terp = join(empath, mname, '__openerp__.py') - if not os.path.exists(terp): - terp = join(empath, mname, '__terp__.py') - - if os.path.exists(terp): - yield mname, join(empath, mname) - else: - print "Module %s specified, but no valid path." % mname - except Exception: - pass - -def data_files(): - '''Build list of data files to be installed''' - files = [] - if os.name == 'nt': - os.chdir('openerp') - for (dp, dn, names) in os.walk('addons'): - files.append((dp, map(lambda x: join('openerp', dp, x), names))) - os.chdir('..') - #for root, _, names in os.walk(join('bin','addons')): - # files.append((root, [join(root, name) for name in names])) - for root, _, names in os.walk('doc'): - files.append((root, [join(root, name) for name in names])) - #for root, _, names in os.walk('pixmaps'): - # files.append((root, [join(root, name) for name in names])) - files.append(('.', [join('openerp', 'import_xml.rng'),])) - else: - man_directory = join('share', 'man') - files.append((join(man_directory, 'man1'), ['man/openerp-server.1'])) - files.append((join(man_directory, 'man5'), ['man/openerp_serverrc.5'])) - - doc_directory = join('share', 'doc', 'openerp-server-%s' % version) - files.append((doc_directory, filter(isfile, glob.glob('doc/*')))) - files.append((join(doc_directory, 'migrate', '3.3.0-3.4.0'), - filter(isfile, glob.glob('doc/migrate/3.3.0-3.4.0/*')))) - files.append((join(doc_directory, 'migrate', '3.4.0-4.0.0'), - filter(isfile, glob.glob('doc/migrate/3.4.0-4.0.0/*')))) - - openerp_site_packages = join(get_python_lib(prefix=''), 'openerp') - - files.append((openerp_site_packages, [join('openerp', 'import_xml.rng'),])) - - if sys.version_info[0:2] == (2,5): - files.append((openerp_site_packages, [ join('python25-compat','BaseHTTPServer.py'), - join('python25-compat','SimpleXMLRPCServer.py'), - join('python25-compat','SocketServer.py')])) - - for addonname, add_path in find_addons(): - addon_path = join(get_python_lib(prefix=''), 'openerp','addons', addonname) - for root, dirs, innerfiles in os.walk(add_path): - innerfiles = filter(lambda fil: os.path.splitext(fil)[1] not in ('.pyc', '.pyd', '.pyo'), innerfiles) - if innerfiles: - res = os.path.normpath(join(addon_path, root.replace(join(add_path), '.'))) - files.extend(((res, map(lambda fil: join(root, fil), - innerfiles)),)) - - return files - -def find_package_dirs(): - package_dirs = {'openerp': 'openerp'} - for mod, path in find_addons(): - package_dirs['openerp.addons.' + mod] = path - return package_dirs - -options = { - "py2exe": { - "compressed": 1, - "optimize": 2, - "dist_dir": 'dist', - "packages": [ - "lxml", "lxml.builder", "lxml._elementpath", "lxml.etree", - "lxml.objectify", "decimal", "xml", "xml", "xml.dom", "xml.xpath", - "encodings", "dateutil", "wizard", "pychart", "PIL", "pyparsing", - "pydot", "asyncore","asynchat", "reportlab", "vobject", - "HTMLParser", "select", "mako", "poplib", - "imaplib", "smtplib", "email", "yaml", "DAV", - "uuid", - ], - "excludes" : ["Tkconstants","Tkinter","tcl"], - } -} - -#import pprint -#def setup(**args): -# pprint.pprint(args) - setup(name = name, version = version, description = description, @@ -188,21 +72,26 @@ setup(name = name, author_email = author_email, classifiers = filter(None, classifiers.split("\n")), license = license, - data_files = data_files(), + data_files = [ + (join('man', 'man1'), ['man/openerp-server.1']), + (join('man', 'man5'), ['man/openerp_serverrc.5']), + ('doc', filter(isfile, glob.glob('doc/*'))), + ], scripts = ['openerp-server.py'], packages = find_packages(), include_package_data = True, package_data = { '': ['*.yml', '*.xml', '*.po', '*.pot', '*.csv'], }, - package_dir = find_package_dirs(), - options = options, install_requires = [ - 'lxml==2.1.5', # we require the same version as caldav + # We require the same version as caldav for lxml. + 'lxml==2.1.5', 'mako', 'python-dateutil', 'psycopg2', - 'pychart', # if not available from pypi, an alternate site is http://home.gna.org/pychart/ + # We include pychart in our tree as it is difficult to get it via pypi. + # An alternate site is http://home.gna.org/pychart/. + # 'pychart', 'pydot', 'pytz', 'reportlab', @@ -211,8 +100,9 @@ setup(name = name, 'pywebdav', 'feedparser', ], - extras_require={ + extras_require = { 'SSL' : ['pyopenssl'], - } + }, + **py2exe_keywords ) From 185de3a01b8d593dab43f081f934d20837999c7e Mon Sep 17 00:00:00 2001 From: "ron@tinyerp.com" <> Date: Mon, 7 Mar 2011 18:20:08 +0530 Subject: [PATCH 06/47] [FIX]product:Purchase Order price calculation wrong lp bug: https://launchpad.net/bugs/728092 fixed bzr revid: ron@tinyerp.com-20110307125008-pan2v3m9w7ea2t1r --- addons/product/pricelist.py | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/product/pricelist.py b/addons/product/pricelist.py index de8fd701492..0e1b2bfa2dd 100644 --- a/addons/product/pricelist.py +++ b/addons/product/pricelist.py @@ -259,6 +259,7 @@ class product_pricelist(osv.osv): price = res2['price'] else: price_type = price_type_obj.browse(cr, uid, int(res['base'])) + uom_price_already_computed = True price = currency_obj.compute(cr, uid, price_type.currency_id.id, res['currency_id'], product_obj.price_get(cr, uid, [product_id], From 66ca9a91f04fe482b3a3067220e1eacee0a62bb9 Mon Sep 17 00:00:00 2001 From: "ksa (Open ERP)" Date: Tue, 8 Mar 2011 12:29:44 +0530 Subject: [PATCH 07/47] [IMP]: improvement for set in order by data bzr revid: ksa@tinyerp.co.in-20110308065944-rdaw3maa69gv8sbd --- addons/stock/wizard/stock_fill_inventory.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/addons/stock/wizard/stock_fill_inventory.py b/addons/stock/wizard/stock_fill_inventory.py index 754554f375e..ae06bce394c 100644 --- a/addons/stock/wizard/stock_fill_inventory.py +++ b/addons/stock/wizard/stock_fill_inventory.py @@ -74,18 +74,23 @@ class stock_fill_inventory(osv.osv_memory): if fill_inventory.recursive : location_ids = location_obj.search(cr, uid, [('location_id', 'child_of', fill_inventory.location_id.id)]) + for location in location_ids : res = location_obj._product_get(cr, uid, location) res_location[location] = res + data = res_location.keys() + data.sort() else: context.update({'compute_child': False}) res = location_obj._product_get(cr, uid, fill_inventory.location_id.id, context=context) res_location[fill_inventory.location_id.id] = res + data = res_location.keys() + data.sort() product_ids = [] res = {} - for location in res_location.keys(): + for location in data: datas = {} res[location] = {} if fill_inventory.recursive : From 6026d3348d03f69523e91fa43bdd60aef63de9f1 Mon Sep 17 00:00:00 2001 From: "ksa (Open ERP)" Date: Tue, 8 Mar 2011 19:02:36 +0530 Subject: [PATCH 08/47] [IMP]: Improve code for all child locations bzr revid: ksa@tinyerp.co.in-20110308133236-yx7dtifwi5sxn7n3 --- addons/stock/wizard/stock_fill_inventory.py | 67 +++++++-------------- 1 file changed, 23 insertions(+), 44 deletions(-) diff --git a/addons/stock/wizard/stock_fill_inventory.py b/addons/stock/wizard/stock_fill_inventory.py index ae06bce394c..b4c0a2ad0be 100644 --- a/addons/stock/wizard/stock_fill_inventory.py +++ b/addons/stock/wizard/stock_fill_inventory.py @@ -73,32 +73,16 @@ class stock_fill_inventory(osv.osv_memory): res_location = {} if fill_inventory.recursive : location_ids = location_obj.search(cr, uid, [('location_id', - 'child_of', fill_inventory.location_id.id)]) - - for location in location_ids : - res = location_obj._product_get(cr, uid, location) - res_location[location] = res - data = res_location.keys() - data.sort() + 'child_of', fill_inventory.location_id.id)], order="id") else: - context.update({'compute_child': False}) - res = location_obj._product_get(cr, uid, - fill_inventory.location_id.id, context=context) - res_location[fill_inventory.location_id.id] = res - data = res_location.keys() - data.sort() + location_ids = [fill_inventory.location_id.id] - product_ids = [] res = {} - for location in data: + flag = False + for location in location_ids: datas = {} res[location] = {} - if fill_inventory.recursive : - move_ids = move_obj.search(cr, uid, [('location_dest_id','child_of',location),('state','=','done')], context=context) - else: - move_ids = move_obj.search(cr, uid, [('location_dest_id','=',location),('state','=','done')], context=context) - if not move_ids: - raise osv.except_osv(_('Message !'), _('No product in this location.')) + move_ids = move_obj.search(cr, uid, [('location_dest_id','=',location),('state','=','done')], context=context) for move in move_obj.browse(cr, uid, move_ids, context=context): lot_id = move.prodlot_id.id @@ -107,34 +91,29 @@ class stock_fill_inventory(osv.osv_memory): location_dest_id = move.location_dest_id.id if datas.get((prod_id, lot_id)): qty = datas[(prod_id, lot_id)]['product_qty'] + qty - datas[(prod_id, lot_id)] = {'product_id': prod_id, 'location_dest_id': location_dest_id, 'product_qty': qty, 'product_uom': move.product_id.uom_id.id, 'prodlot_id': lot_id} - res[location] = datas + datas[(prod_id, lot_id)] = {'product_id': prod_id, 'location_id': location_dest_id, 'product_qty': qty, 'product_uom': move.product_id.uom_id.id, 'prod_lot_id': lot_id} + if datas: + flag = True + res[location] = datas - for i in datas.items(): - if(i[1]['product_qty']): + if not flag: + raise osv.except_osv(_('Message !'), _('No product in this location.')) + + for i in res.values(): + if i.values(): + for mydata in i.values(): + mydata.update({'inventory_id': context['active_ids'][0]}) + domain = [] if fill_inventory.set_stock_zero: - i[1]['product_qty'] = 0 + mydata.update({'product_qty': 0}) + for k, v in mydata.items(): + domain.append((k, '=', v)) + line_ids = inventory_line_obj.search(cr, uid, domain) - line_ids = inventory_line_obj.search(cr, uid, - [('inventory_id','=', context['active_ids']), - ('location_id','=', i[1]['location_dest_id']), - ('product_id','=', i[1]['product_id']), - ('product_uom','=', i[1]['product_uom']), - ('product_qty','=', i[1]['product_qty']), - ('prod_lot_id','=', i[1]['prodlot_id']) - ]) if not len(line_ids): - inventory_line = { - 'inventory_id': context['active_ids'][0], - 'location_id': i[1]['location_dest_id'], - 'product_id': i[1]['product_id'], - 'product_uom': i[1]['product_uom'], - 'product_qty': i[1]['product_qty'], - 'prod_lot_id': i[1]['prodlot_id'] - } - inventory_line_obj.create(cr, uid, inventory_line) + inventory_line_obj.create(cr, uid, mydata) - return {'type': 'ir.actions.act_window_close'} + return {'type': 'ir.actions.act_window_close'} stock_fill_inventory() From b45b35d22437673879355d8dcc1f16233528a6d9 Mon Sep 17 00:00:00 2001 From: "ARA (OpenERP)" Date: Wed, 9 Mar 2011 10:40:47 +0530 Subject: [PATCH 09/47] [FIX] account: [6.0] invoice - must check if product is to_sell, to_purchase lp bug: https://launchpad.net/bugs/729602 fixed bzr revid: ara@tinyerp.com-20110309051047-y52k8fez7hs2tvle --- addons/account/account_invoice_view.xml | 4 ++-- addons/account/invoice.py | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/addons/account/account_invoice_view.xml b/addons/account/account_invoice_view.xml index 6fa3b8c09d2..b41c4db08e9 100644 --- a/addons/account/account_invoice_view.xml +++ b/addons/account/account_invoice_view.xml @@ -172,7 +172,7 @@ - + @@ -280,7 +280,7 @@ - + diff --git a/addons/account/invoice.py b/addons/account/invoice.py index 8de48514387..290be952cee 100644 --- a/addons/account/invoice.py +++ b/addons/account/invoice.py @@ -1290,6 +1290,20 @@ class account_invoice_line(osv.osv): 'price_unit': _price_unit_default, } + def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False): + if context is None: + context = {} + res = super(account_invoice_line,self).fields_view_get(cr, uid, view_id=view_id, view_type=view_type, context=context, toolbar=toolbar, submenu=submenu) + if context.get('type', False): + doc = etree.XML(res['arch']) + for node in doc.xpath("//field[@name='product_id']"): + if context['type'] in ('in_invoice','in_refund'): + node.set('domain', "[('purchase_ok', '=', True)]") + else: + node.set('domain', "[('sale_ok', '=', True)]") + res['arch'] = etree.tostring(doc) + return res + def product_id_change(self, cr, uid, ids, product, uom, qty=0, name='', type='out_invoice', partner_id=False, fposition_id=False, price_unit=False, address_invoice_id=False, currency_id=False, context=None): if context is None: context = {} From 25ee7aff549a86ffd1190c476ccbf0d66284f0c3 Mon Sep 17 00:00:00 2001 From: "ARA (OpenERP)" Date: Wed, 9 Mar 2011 11:19:13 +0530 Subject: [PATCH 10/47] [FIX] account: [6.0] invoice - must check if product is to_sell, to_purchase bzr revid: ara@tinyerp.com-20110309054913-ohllm2ppeyprk8n1 --- addons/account/account_invoice_view.xml | 4 ++-- addons/account/invoice.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/account/account_invoice_view.xml b/addons/account/account_invoice_view.xml index b41c4db08e9..2ef71e5014f 100644 --- a/addons/account/account_invoice_view.xml +++ b/addons/account/account_invoice_view.xml @@ -172,7 +172,7 @@ - + @@ -280,7 +280,7 @@ - + diff --git a/addons/account/invoice.py b/addons/account/invoice.py index 290be952cee..9cda94efeea 100644 --- a/addons/account/invoice.py +++ b/addons/account/invoice.py @@ -1297,7 +1297,7 @@ class account_invoice_line(osv.osv): if context.get('type', False): doc = etree.XML(res['arch']) for node in doc.xpath("//field[@name='product_id']"): - if context['type'] in ('in_invoice','in_refund'): + if context['type'] in ('in_invoice', 'in_refund'): node.set('domain', "[('purchase_ok', '=', True)]") else: node.set('domain', "[('sale_ok', '=', True)]") From 4db9a2533c2b8466e0ee089b36a0840c646a1e6d Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Wed, 9 Mar 2011 11:19:39 +0100 Subject: [PATCH 11/47] [FIX] setup.py: modification so py2exe works. - still needs some testing, sdist should be tested again. bzr revid: vmt@openerp.com-20110309101939-zo19v7gxd1bqryrb --- setup.py | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 53 insertions(+), 5 deletions(-) diff --git a/setup.py b/setup.py index 70c4893fac8..d8d872dfde8 100755 --- a/setup.py +++ b/setup.py @@ -36,30 +36,78 @@ import glob from setuptools import setup, find_packages +# Backports os.walk with followlinks from python 2.6. +# Needed to add all addons files to data_files for Windows packaging. +def walk_followlinks(top, topdown=True, onerror=None, followlinks=False): + from os.path import join, isdir, islink + from os import listdir, error + + try: + names = listdir(top) + except error, err: + if onerror is not None: + onerror(err) + return + + dirs, nondirs = [], [] + for name in names: + if isdir(join(top, name)): + dirs.append(name) + else: + nondirs.append(name) + + if topdown: + yield top, dirs, nondirs + for name in dirs: + path = join(top, name) + if followlinks or not islink(path): + for x in walk_followlinks(path, topdown, onerror, followlinks): + yield x + if not topdown: + yield top, dirs, nondirs + +if sys.version_info < (2, 6): + os.walk = walk_followlinks + py2exe_keywords = {} +py2exe_data_files = [] if os.name == 'nt': import py2exe py2exe_keywords['console'] = [ - { "script": join("bin", "openerp-server.py"), + { "script": "openerp-server.py", "icon_resources": [(1, join("pixmaps","openerp-icon.ico"))], }] py2exe_keywords['options'] = { "py2exe": { - "compressed": 1, + "skip_archive": 1, "optimize": 2, "dist_dir": 'dist', "packages": [ "lxml", "lxml.builder", "lxml._elementpath", "lxml.etree", "lxml.objectify", "decimal", "xml", "xml", "xml.dom", "xml.xpath", - "encodings", "dateutil", "wizard", "pychart", "PIL", "pyparsing", + "encodings", "dateutil", "pychart", "PIL", "pyparsing", # Why is wizard listed here? "pydot", "asyncore","asynchat", "reportlab", "vobject", "HTMLParser", "select", "mako", "poplib", "imaplib", "smtplib", "email", "yaml", "DAV", - "uuid", + "uuid", "openerp", ], "excludes" : ["Tkconstants","Tkinter","tcl"], } } + # TODO is it still necessary now that we don't use the library.zip file? + def data_files(): + '''For Windows, we consider all the addons as data files. + It seems also that package_data below isn't honored by py2exe.''' + files = [] + os.chdir('openerp') + for (dp, dn, names) in os.walk('addons'): + files.append((join('openerp',dp), map(lambda x: join('openerp', dp, x), names))) + os.chdir('..') + files.append(('openerp', [join('openerp', 'import_xml.rng'),])) + return files + py2exe_data_files = data_files() + +#sys.path.append(join(os.path.abspath(os.path.dirname(__file__)), "openerp")) # Is it just for wizard, or something else? execfile(join('openerp', 'release.py')) @@ -76,7 +124,7 @@ setup(name = name, (join('man', 'man1'), ['man/openerp-server.1']), (join('man', 'man5'), ['man/openerp_serverrc.5']), ('doc', filter(isfile, glob.glob('doc/*'))), - ], + ] + py2exe_data_files, scripts = ['openerp-server.py'], packages = find_packages(), include_package_data = True, From 27e35593268242647363a5192617911464c84525 Mon Sep 17 00:00:00 2001 From: "ksa (Open ERP)" Date: Wed, 9 Mar 2011 18:05:38 +0530 Subject: [PATCH 12/47] [FIX]:product_margin purchases values in sales lp bug: https://launchpad.net/bugs/723448 fixed bzr revid: ksa@tinyerp.co.in-20110309123538-45ufsyjrtkhj7cj1 --- addons/product_margin/product_margin.py | 53 ++++++++++++------------- 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/addons/product_margin/product_margin.py b/addons/product_margin/product_margin.py index d396501b8c0..37639c3b223 100644 --- a/addons/product_margin/product_margin.py +++ b/addons/product_margin/product_margin.py @@ -52,44 +52,43 @@ class product_product(osv.osv): elif invoice_state == 'draft_open_paid': states = ('draft', 'open', 'paid') - if 'sale_avg_price' in field_names or 'sale_num_invoiced' in field_names or 'turnover' in field_names or 'sale_expected' in field_names: - invoice_types = ('out_invoice', 'in_refund') - if 'purchase_avg_price' in field_names or 'purchase_num_invoiced' in field_names or 'total_cost' in field_names or 'normal_cost' in field_names: - invoice_types = ('in_invoice', 'out_refund') - if len(invoice_types): - cr.execute("""select - avg(l.price_unit) as avg_unit_price, + sqlstr="""select + sum(l.price_unit * l.quantity)/sum(l.quantity) as avg_unit_price, sum(l.quantity) as num_qty, - sum(l.quantity * l.price_unit) as total, + sum(l.quantity * (l.price_subtotal/l.quantity)) as total, sum(l.quantity * product.list_price) as sale_expected, sum(l.quantity * product.standard_price) as normal_cost from account_invoice_line l left join account_invoice i on (l.invoice_id = i.id) left join product_template product on (product.id=l.product_id) - where l.product_id = %s and i.state in %s and i.type IN %s and i.date_invoice>=%s and i.date_invoice<=%s - """, (val.id, states, invoice_types, date_from, date_to)) - result = cr.fetchall()[0] - if 'sale_avg_price' in field_names or 'sale_num_invoiced' in field_names or 'turnover' in field_names or 'sale_expected' in field_names: - res[val.id]['sale_avg_price'] = result[0] and result[0] or 0.0 - res[val.id]['sale_num_invoiced'] = result[1] and result[1] or 0.0 - res[val.id]['turnover'] = result[2] and result[2] or 0.0 - res[val.id]['sale_expected'] = result[3] and result[3] or 0.0 - res[val.id]['sales_gap'] = res[val.id]['sale_expected']-res[val.id]['turnover'] - if 'purchase_avg_price' in field_names or 'purchase_num_invoiced' in field_names or 'total_cost' in field_names or 'normal_cost' in field_names: - res[val.id]['purchase_avg_price'] = result[0] and result[0] or 0.0 - res[val.id]['purchase_num_invoiced'] = result[1] and result[1] or 0.0 - res[val.id]['total_cost'] = result[2] and result[2] or 0.0 - res[val.id]['normal_cost'] = result[4] and result[4] or 0.0 - res[val.id]['purchase_gap'] = res[val.id]['normal_cost']-res[val.id]['total_cost'] + where l.product_id = %s and i.state in %s and i.type IN %s and (i.date_invoice IS NULL or (i.date_invoice>=%s and i.date_invoice<=%s)) + """ + invoice_types = ('out_invoice', 'in_refund') + cr.execute(sqlstr, (val.id, states, invoice_types, date_from, date_to)) + result = cr.fetchall()[0] + res[val.id]['sale_avg_price'] = result[0] and result[0] or 0.0 + res[val.id]['sale_num_invoiced'] = result[1] and result[1] or 0.0 + res[val.id]['turnover'] = result[2] and result[2] or 0.0 + res[val.id]['sale_expected'] = result[3] and result[3] or 0.0 + res[val.id]['sales_gap'] = res[val.id]['sale_expected']-res[val.id]['turnover'] + + invoice_types = ('in_invoice', 'out_refund') + cr.execute(sqlstr, (val.id, states, invoice_types, date_from, date_to)) + result = cr.fetchall()[0] + res[val.id]['purchase_avg_price'] = result[0] and result[0] or 0.0 + res[val.id]['purchase_num_invoiced'] = result[1] and result[1] or 0.0 + res[val.id]['total_cost'] = result[2] and result[2] or 0.0 + res[val.id]['normal_cost'] = result[4] and result[4] or 0.0 + res[val.id]['purchase_gap'] = res[val.id]['normal_cost']-res[val.id]['total_cost'] if 'total_margin' in field_names: - res[val.id]['total_margin'] = res[val.id].get('turnover', val.turnover) - res[val.id].get('total_cost', val.standard_price) + res[val.id]['total_margin'] = res[val.id]['turnover'] - res[val.id]['total_cost'] if 'expected_margin' in field_names: - res[val.id]['expected_margin'] = res[val.id].get('sale_expected',val.sale_expected) - res[val.id].get('normal_cost',val.normal_cost) + res[val.id]['expected_margin'] = res[val.id]['sale_expected'] - res[val.id]['normal_cost'] if 'total_margin_rate' in field_names: - res[val.id]['total_margin_rate'] = res[val.id].get('turnover', val.turnover) and res[val.id]['total_margin'] * 100 / res[val.id].get('turnover', val.turnover) or 0.0 + res[val.id]['total_margin_rate'] = res[val.id]['turnover'] and res[val.id]['total_margin'] * 100 / res[val.id]['turnover'] or 0.0 if 'expected_margin_rate' in field_names: - res[val.id]['expected_margin_rate'] = res[val.id].get('sale_expected',val.sale_expected) and res[val.id]['expected_margin'] * 100 / res[val.id].get('sale_expected',val.sale_expected) or 0.0 + res[val.id]['expected_margin_rate'] = res[val.id]['sale_expected'] and res[val.id]['expected_margin'] * 100 / res[val.id]['sale_expected'] or 0.0 return res _columns = { From 4c45313a04bb030de0a2a548866d4dcfbbec84bb Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Fri, 11 Mar 2011 12:09:05 +0100 Subject: [PATCH 13/47] [FIX] setup.py: py2exe, sdist, and install seem good. - added commands to the list of modules - provide an explicit dependency link for pychart (which will be used by easy_install) bzr revid: vmt@openerp.com-20110311110905-y8s85a24naq5zxdy --- setup.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/setup.py b/setup.py index d8d872dfde8..f90e52da3f3 100755 --- a/setup.py +++ b/setup.py @@ -85,11 +85,11 @@ if os.name == 'nt': "packages": [ "lxml", "lxml.builder", "lxml._elementpath", "lxml.etree", "lxml.objectify", "decimal", "xml", "xml", "xml.dom", "xml.xpath", - "encodings", "dateutil", "pychart", "PIL", "pyparsing", # Why is wizard listed here? + "encodings", "dateutil", "pychart", "PIL", "pyparsing", "pydot", "asyncore","asynchat", "reportlab", "vobject", "HTMLParser", "select", "mako", "poplib", "imaplib", "smtplib", "email", "yaml", "DAV", - "uuid", "openerp", + "uuid", "commands", "openerp", ], "excludes" : ["Tkconstants","Tkinter","tcl"], } @@ -107,8 +107,6 @@ if os.name == 'nt': return files py2exe_data_files = data_files() -#sys.path.append(join(os.path.abspath(os.path.dirname(__file__)), "openerp")) # Is it just for wizard, or something else? - execfile(join('openerp', 'release.py')) setup(name = name, @@ -131,15 +129,19 @@ setup(name = name, package_data = { '': ['*.yml', '*.xml', '*.po', '*.pot', '*.csv'], }, + dependency_links = ['http://download.gna.org/pychart/'], install_requires = [ # We require the same version as caldav for lxml. 'lxml==2.1.5', 'mako', 'python-dateutil', 'psycopg2', - # We include pychart in our tree as it is difficult to get it via pypi. - # An alternate site is http://home.gna.org/pychart/. - # 'pychart', + # TODO the pychart package we include in openerp corresponds to PyChart 1.37. + # It seems there is a single difference, which is a spurious print in generate_docs.py. + # It is probably safe to move to PyChart 1.39 (the latest one). + # (Let setup.py choose the latest one, and we should check we can remove pychart from + # our tree.) + 'pychart', 'pydot', 'pytz', 'reportlab', From aad6253cf3b1d9104dd74d7dce4d7bcfc99971b5 Mon Sep 17 00:00:00 2001 From: "ARA (OpenERP)" Date: Fri, 11 Mar 2011 17:07:10 +0530 Subject: [PATCH 14/47] [FIX] Account: [6.0]changing company currency breaks analytic account lp bug: https://launchpad.net/bugs/728560 fixed bzr revid: ara@tinyerp.com-20110311113710-wnsy77iv8rlgivj8 --- addons/analytic/analytic.py | 51 +++++++++++++++++++++++++++++++------ 1 file changed, 43 insertions(+), 8 deletions(-) diff --git a/addons/analytic/analytic.py b/addons/analytic/analytic.py index 50a73b3f7d4..bc16dd19348 100644 --- a/addons/analytic/analytic.py +++ b/addons/analytic/analytic.py @@ -22,6 +22,7 @@ import time from osv import fields, osv +from tools.translate import _ import decimal_precision as dp class account_analytic_account(osv.osv): @@ -120,6 +121,36 @@ class account_analytic_account(osv.osv): return result + def _get_company_currency(self, cr, uid, ids, context=None): + company_obj = self.pool.get('res.company') + analytic_obj = self.pool.get('account.analytic.account') + accounts = [] + for company in company_obj.browse(cr, uid, ids, context=context): + accounts += analytic_obj.search(cr, uid, [('company_id', '=', company.id)]) + return accounts + + def _set_company_currency(self, cr, uid, ids, name, value, arg, context=None): + if type(ids) != type([]): + ids=[ids] + for account in self.browse(cr, uid, ids, context=context): + if not value: + cr.execute("""update account_analytic_account set + currency_id=NULL where id=%s""", (account.id, )) + elif account.company_id.currency_id.id == value: + cr.execute("""update account_analytic_account set + currency_id=%s where id=%s""", (value, account.id, )) + else: + raise osv.except_osv(_('Error !'), _('The currency has to be the same as the currency of the selected company.')) + return True + + def _currency(self, cr, uid, ids, field_name, arg, context=None): + result = {} + for rec in self.browse(cr, uid, ids, context=context): + if not rec.currency_id.id: + result[rec.id] = False + else: + result[rec.id] = rec.company_id.currency_id.id + return result _columns = { 'name': fields.char('Account Name', size=128, required=True), @@ -149,7 +180,11 @@ class account_analytic_account(osv.osv): \n* And finally when all the transactions are over, it can be in \'Close\' state. \ \n* The project can be in either if the states \'Template\' and \'Running\'.\n If it is template then we can make projects based on the template projects. If its in \'Running\' state it is a normal project.\ \n If it is to be reviewed then the state is \'Pending\'.\n When the project is completed the state is set to \'Done\'.'), - 'currency_id': fields.many2one('res.currency', 'Account currency', required=True), + #'currency_id': fields.many2one('res.currency', 'Account currency', required=True), + 'currency_id': fields.function(_currency, fnct_inv=_set_company_currency, method=True, + store = { + 'res.company': (_get_company_currency, ['currency_id'], 10), + }, string='Currency', type='many2one', relation='res.currency'), } def _default_company(self, cr, uid, context=None): @@ -173,12 +208,12 @@ class account_analytic_account(osv.osv): 'currency_id': _get_default_currency, } - def check_currency(self, cr, uid, ids, context=None): - obj = self.browse(cr, uid, ids[0], context=context) - if obj.company_id: - if obj.currency_id.id != self.pool.get('res.company').browse(cr, uid, obj.company_id.id, context=context).currency_id.id: - return False - return True +# def check_currency(self, cr, uid, ids, context=None): +# obj = self.browse(cr, uid, ids[0], context=context) +# if obj.company_id: +# if obj.currency_id.id != self.pool.get('res.company').browse(cr, uid, obj.company_id.id, context=context).currency_id.id: +# return False +# return True def check_recursion(self, cr, uid, ids, parent=None): return super(account_analytic_account, self)._check_recursion(cr, uid, ids, parent=parent) @@ -186,7 +221,7 @@ class account_analytic_account(osv.osv): _order = 'date_start desc,parent_id desc,code' _constraints = [ (check_recursion, 'Error! You can not create recursive analytic accounts.', ['parent_id']), - (check_currency, 'Error! The currency has to be the same as the currency of the selected company', ['currency_id', 'company_id']), +# (check_currency, 'Error! The currency has to be the same as the currency of the selected company', ['currency_id', 'company_id']), ] def copy(self, cr, uid, id, default=None, context=None): From 27981af3377a9b62b2d31e20212c79fe6ec08c6a Mon Sep 17 00:00:00 2001 From: "ARA (OpenERP)" Date: Fri, 11 Mar 2011 17:33:35 +0530 Subject: [PATCH 15/47] [FIX] Account: [6.0]changing company currency breaks analytic account bzr revid: ara@tinyerp.com-20110311120335-l1one4lu0fxg8die --- addons/analytic/analytic.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/addons/analytic/analytic.py b/addons/analytic/analytic.py index bc16dd19348..b76071eed7b 100644 --- a/addons/analytic/analytic.py +++ b/addons/analytic/analytic.py @@ -180,7 +180,6 @@ class account_analytic_account(osv.osv): \n* And finally when all the transactions are over, it can be in \'Close\' state. \ \n* The project can be in either if the states \'Template\' and \'Running\'.\n If it is template then we can make projects based on the template projects. If its in \'Running\' state it is a normal project.\ \n If it is to be reviewed then the state is \'Pending\'.\n When the project is completed the state is set to \'Done\'.'), - #'currency_id': fields.many2one('res.currency', 'Account currency', required=True), 'currency_id': fields.function(_currency, fnct_inv=_set_company_currency, method=True, store = { 'res.company': (_get_company_currency, ['currency_id'], 10), @@ -208,20 +207,12 @@ class account_analytic_account(osv.osv): 'currency_id': _get_default_currency, } -# def check_currency(self, cr, uid, ids, context=None): -# obj = self.browse(cr, uid, ids[0], context=context) -# if obj.company_id: -# if obj.currency_id.id != self.pool.get('res.company').browse(cr, uid, obj.company_id.id, context=context).currency_id.id: -# return False -# return True - def check_recursion(self, cr, uid, ids, parent=None): return super(account_analytic_account, self)._check_recursion(cr, uid, ids, parent=parent) _order = 'date_start desc,parent_id desc,code' _constraints = [ (check_recursion, 'Error! You can not create recursive analytic accounts.', ['parent_id']), -# (check_currency, 'Error! The currency has to be the same as the currency of the selected company', ['currency_id', 'company_id']), ] def copy(self, cr, uid, id, default=None, context=None): From 0cb81b94189f012be8dbe3445fa54dcf70407769 Mon Sep 17 00:00:00 2001 From: "ARA (OpenERP)" Date: Fri, 11 Mar 2011 18:33:40 +0530 Subject: [PATCH 16/47] [IMP] Account: changing company currency breaks analytic account bzr revid: ara@tinyerp.com-20110311130340-ur7dilhk4mmsrk5a --- addons/analytic/analytic.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/analytic/analytic.py b/addons/analytic/analytic.py index b76071eed7b..77ec4c153c0 100644 --- a/addons/analytic/analytic.py +++ b/addons/analytic/analytic.py @@ -121,7 +121,7 @@ class account_analytic_account(osv.osv): return result - def _get_company_currency(self, cr, uid, ids, context=None): + def _get_analytic_account(self, cr, uid, ids, context=None): company_obj = self.pool.get('res.company') analytic_obj = self.pool.get('account.analytic.account') accounts = [] @@ -140,7 +140,7 @@ class account_analytic_account(osv.osv): cr.execute("""update account_analytic_account set currency_id=%s where id=%s""", (value, account.id, )) else: - raise osv.except_osv(_('Error !'), _('The currency has to be the same as the currency of the selected company.')) + raise osv.except_osv(_('Error !'), _("The currency has to be the same as the currency of the analytic account's company or empty.")) return True def _currency(self, cr, uid, ids, field_name, arg, context=None): @@ -182,7 +182,7 @@ class account_analytic_account(osv.osv): \n If it is to be reviewed then the state is \'Pending\'.\n When the project is completed the state is set to \'Done\'.'), 'currency_id': fields.function(_currency, fnct_inv=_set_company_currency, method=True, store = { - 'res.company': (_get_company_currency, ['currency_id'], 10), + 'res.company': (_get_analytic_account, ['currency_id'], 10), }, string='Currency', type='many2one', relation='res.currency'), } From 708c8a1ccab2175cbd85e3354bd6ddb43132bc9a Mon Sep 17 00:00:00 2001 From: "ARA (OpenERP)" Date: Mon, 14 Mar 2011 14:40:03 +0530 Subject: [PATCH 17/47] [FIX] hr_timesheet_sheet: Cannot use the timesheet program because of a warning message Please Enter A Value lp bug: https://launchpad.net/bugs/724201 fixed bzr revid: ara@tinyerp.com-20110314091003-v8zxjg9l56wcussd --- addons/hr_timesheet_sheet/hr_timesheet_sheet.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py index 34134942e0a..bf93700fc6a 100644 --- a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py +++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py @@ -177,6 +177,10 @@ class hr_timesheet_sheet(osv.osv): if 'employee_id' in vals: if not self.pool.get('hr.employee').browse(cr, uid, vals['employee_id']).user_id: raise osv.except_osv(_('Error !'), _('You cannot create a timesheet for an employee that does not have any user defined !')) + if not self.pool.get('hr.employee').browse(cr, uid, vals['employee_id']).product_id: + raise osv.except_osv(_('Error !'), _('You cannot create a timesheet for an employee that does not have any product defined !')) + if not self.pool.get('hr.employee').browse(cr, uid, vals['employee_id']).journal_id: + raise osv.except_osv(_('Error !'), _('You cannot create a timesheet for an employee that does not have any analytic journal defined !')) return super(hr_timesheet_sheet, self).create(cr, uid, vals, *args, **argv) def write(self, cr, uid, ids, vals, *args, **argv): From 96311d7923ebc4e786a9dcf195d164bc4f7a5172 Mon Sep 17 00:00:00 2001 From: "ARA (OpenERP)" Date: Mon, 14 Mar 2011 15:08:54 +0530 Subject: [PATCH 18/47] [FIX] hr_timesheet_sheet: Cannot use the timesheet program because of a warning message Please Enter A Value bzr revid: ara@tinyerp.com-20110314093854-sei5y7g03h36cvk3 --- addons/hr_timesheet_sheet/hr_timesheet_sheet.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py index bf93700fc6a..23ab63247e5 100644 --- a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py +++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py @@ -190,6 +190,10 @@ class hr_timesheet_sheet(osv.osv): raise osv.except_osv(_('Error !'), _('You cannot create a timesheet for an employee that does not have any user defined !')) if not self._sheet_date(cr, uid, ids, forced_user_id=new_user_id): raise osv.except_osv(_('Error !'), _('You can not have 2 timesheets that overlaps !\nPlease use the menu \'My Current Timesheet\' to avoid this problem.')) + if not self.pool.get('hr.employee').browse(cr, uid, vals['employee_id']).product_id: + raise osv.except_osv(_('Error !'), _('You cannot create a timesheet for an employee that does not have any product defined !')) + if not self.pool.get('hr.employee').browse(cr, uid, vals['employee_id']).journal_id: + raise osv.except_osv(_('Error !'), _('You cannot create a timesheet for an employee that does not have any analytic journal defined !')) return super(hr_timesheet_sheet, self).write(cr, uid, ids, vals, *args, **argv) def button_confirm(self, cr, uid, ids, context=None): From 95e9d3f00933e9ac25f7a30a817219647a020b55 Mon Sep 17 00:00:00 2001 From: "Rucha (Open ERP)" Date: Mon, 14 Mar 2011 18:41:51 +0530 Subject: [PATCH 19/47] [FIX]: Passed correct item_id in price_get() lp bug: https://launchpad.net/bugs/733143 fixed bzr revid: rpa@tinyerp.com-20110314131151-9boylr4mb0dde141 --- addons/product/pricelist.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/product/pricelist.py b/addons/product/pricelist.py index f71bb9edb27..99ce543a207 100644 --- a/addons/product/pricelist.py +++ b/addons/product/pricelist.py @@ -284,6 +284,7 @@ class product_pricelist(osv.osv): price = False if price: + results['item_id'] = res['id'] if 'uom' in context and not uom_price_already_computed: product = products_dict[product_id] uom = product.uos_id or product.uom_id @@ -299,7 +300,7 @@ class product_pricelist(osv.osv): def price_get(self, cr, uid, ids, prod_id, qty, partner=None, context=None): res_multi = self.price_get_multi(cr, uid, pricelist_ids=ids, products_by_qty_by_partner=[(prod_id, qty, partner)], context=context) res = res_multi[prod_id] - res.update({'item_id': {ids[-1]: ids[-1]}}) + res.update({'item_id': {ids[-1]: res_multi['item_id']}}) return res def price_get_old(self, cr, uid, ids, prod_id, qty, partner=None, context=None): From 07f7a971716773b850efdc01125be7a9159d3a10 Mon Sep 17 00:00:00 2001 From: "Rucha (Open ERP)" Date: Tue, 15 Mar 2011 14:20:08 +0530 Subject: [PATCH 20/47] [FIX]: product: Fixed problem when there is no item_id bzr revid: rpa@tinyerp.com-20110315085008-wfhbzyq7nqp7epti --- addons/product/pricelist.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/product/pricelist.py b/addons/product/pricelist.py index 99ce543a207..72dc7187bd8 100644 --- a/addons/product/pricelist.py +++ b/addons/product/pricelist.py @@ -300,7 +300,7 @@ class product_pricelist(osv.osv): def price_get(self, cr, uid, ids, prod_id, qty, partner=None, context=None): res_multi = self.price_get_multi(cr, uid, pricelist_ids=ids, products_by_qty_by_partner=[(prod_id, qty, partner)], context=context) res = res_multi[prod_id] - res.update({'item_id': {ids[-1]: res_multi['item_id']}}) + res.update({'item_id': {ids[-1]: res_multi.get('item_id', ids[-1])}}) return res def price_get_old(self, cr, uid, ids, prod_id, qty, partner=None, context=None): From a9f0d92036fc517c92045f7159bab6c173defa17 Mon Sep 17 00:00:00 2001 From: "aag (OpenERP)" Date: Tue, 15 Mar 2011 17:00:55 +0530 Subject: [PATCH 21/47] [IMP] Account: Now we can restrict the deletion of account.invoice if it has a number bzr revid: aag@tinyerp.co.in-20110315113055-wjskqh82rafug9zg --- addons/account/invoice.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/account/invoice.py b/addons/account/invoice.py index 5f1beca0d32..27a45b90f27 100644 --- a/addons/account/invoice.py +++ b/addons/account/invoice.py @@ -362,13 +362,13 @@ class account_invoice(osv.osv): def unlink(self, cr, uid, ids, context=None): if context is None: context = {} - invoices = self.read(cr, uid, ids, ['state'], context=context) + invoices = self.read(cr, uid, ids, ['state','internal_number'], context=context) unlink_ids = [] for t in invoices: - if t['state'] in ('draft', 'cancel'): + if t['state'] in ('draft', 'cancel') and t['internal_number']== False: unlink_ids.append(t['id']) else: - raise osv.except_osv(_('Invalid action !'), _('Cannot delete invoice(s) that are already opened or paid !')) + raise osv.except_osv(_('Invalid action !'), _('Cannot delete invoice(s) that are already opened(or been in opened state ever) or paid!')) osv.osv.unlink(self, cr, uid, unlink_ids, context=context) return True From e726345eeef6f6460385e8971e8687613b28101d Mon Sep 17 00:00:00 2001 From: "Rucha (Open ERP)" Date: Fri, 18 Mar 2011 14:46:07 +0530 Subject: [PATCH 22/47] [FIX]: stock: Fixed error when return products bzr revid: rpa@tinyerp.com-20110318091607-9990e4hzbhekhz3n --- addons/stock/wizard/stock_return_picking.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/stock/wizard/stock_return_picking.py b/addons/stock/wizard/stock_return_picking.py index 47832c1a30f..b7c8aa28354 100644 --- a/addons/stock/wizard/stock_return_picking.py +++ b/addons/stock/wizard/stock_return_picking.py @@ -163,11 +163,11 @@ class stock_return_picking(osv.osv_memory): val_id = data['product_return_moves'] for v in val_id: - data_get = data_obj.read(cr, uid, v) - mov_id = data_get['move_id'] - new_qty = data_get['quantity'] + data_get = data_obj.browse(cr, uid, v, context=context) + mov_id = data_get.move_id.id + new_qty = data_get.quantity move = move_obj.browse(cr, uid, mov_id, context=context) - new_location=move.location_dest_id.id + new_location = move.location_dest_id.id returned_qty = move.product_qty for rec in move.move_history_ids2: returned_qty -= rec.product_qty From bed3bce5dfc31dc5528948322dbfe10af0d25cd3 Mon Sep 17 00:00:00 2001 From: OpenERP OpenERP Date: Fri, 18 Mar 2011 15:57:59 +0530 Subject: [PATCH 23/47] [FIX] Added url(favicon) icon. bzr revid: vda@tinyerp.com-20110318102759-g1ua245oc62jwu22 --- addons/base/static/openerp/base.html | 2 +- addons/base/static/openerp/img/favicon.ico | Bin 0 -> 1150 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 addons/base/static/openerp/img/favicon.ico diff --git a/addons/base/static/openerp/base.html b/addons/base/static/openerp/base.html index 9298560e2ae..ce04ae2bf5c 100644 --- a/addons/base/static/openerp/base.html +++ b/addons/base/static/openerp/base.html @@ -3,7 +3,7 @@ OpenERP - + diff --git a/addons/base/static/openerp/img/favicon.ico b/addons/base/static/openerp/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..b8f178faa9cf7febc27cfd3348c0f7bc9dab94e6 GIT binary patch literal 1150 zcmbVMOKTHh6dggbaZ_Aanq($3nMWowdAYH=kWxexT!;%7F5C+$zMuNL%xX&!B*t_syI)P>ch3q?1DNFmro{R7wYeWCsUC)|ABJ@=e*@0~yd;Rrq>BLco< z;l@!xI3Wmvi2wv-h~wbT@neF(;_#8f8INLRl0H4P=hc!V8Yv2xSrS7j8Vk;mSDhoj z{({G-GE08c<#2jWv9d|o%6WWhYR0dpNjB5uQbM(aQtS$R9C|+Yk#nzHTZ1?AtkBi#8yw5e?@+*Uz;%F^NkU)AtY8kd zyMy=einiYU;9M={Vy`kV2ek!`ZEgQVj|I|VRm@Sr%ntlq+#Ql_@J*K(hwaU930$8J z--yex*KfYz{krgQNkl&uioJ-al98yxw?>bj4d=i8;4S$>E`A4xZr6!)p;b z7qtcWLmR1~_b?QDiK62z>i^ou``@QKQ`_|D=?8viSPV7B4MywyRAUXyS;HPRcvdlM z6?vUbPp(pJ`RhO3+QxS}cWE87*Dz}x(Ihq2B0bK|Wz5lpzCl{Ng?So$CYFn4odPz? zo8Sz422p1ke+WL&WzrL!ffDJEWWg`70xo7mFn&=ZN73W^Xbb!v=Ds zGc&BU(W^sRq6dDD)OZ&G-*6jw2YanR--dUG2g8h$y%{Oo^#GsN;=R5S?LxnX`YN<* fsIT)}vbxa2!|oxv%)hV2SEu#Fy65nJ;D67*s^=N1 literal 0 HcmV?d00001 From 2d347b1734fa611ac6ce734704c4636143a6f594 Mon Sep 17 00:00:00 2001 From: Mustufa Rangwala Date: Fri, 18 Mar 2011 18:20:17 +0530 Subject: [PATCH 24/47] [FIX] Account: [trunk] Account: Can not reconcile entries lp bug: https://launchpad.net/bugs/737489 fixed bzr revid: mra@mra-laptop-20110318125017-es4ti58sgxpbepga --- addons/account/wizard/account_reconcile.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/account/wizard/account_reconcile.py b/addons/account/wizard/account_reconcile.py index 8131f6a9668..30bac2ae1fd 100644 --- a/addons/account/wizard/account_reconcile.py +++ b/addons/account/wizard/account_reconcile.py @@ -153,9 +153,9 @@ class account_move_line_reconcile_writeoff(osv.osv_memory): if context is None: context = {} data = self.read(cr, uid, ids,context=context)[0] - account_id = data['writeoff_acc_id'] + account_id = data['writeoff_acc_id'][0] context['date_p'] = data['date_p'] - journal_id = data['journal_id'] + journal_id = data['journal_id'][0] context['comment'] = data['comment'] if data['analytic_id']: context['analytic_id'] = data['analytic_id'] From f611508bfe48a8723cc09f8dab9d271fe94f5c8c Mon Sep 17 00:00:00 2001 From: "aag (OpenERP)" Date: Mon, 21 Mar 2011 14:57:55 +0530 Subject: [PATCH 25/47] [FIX] WIKI: Wiki Pages Application error after clicking on Create Index lp bug: https://launchpad.net/bugs/736102 fixed bzr revid: aag@tinyerp.co.in-20110321092755-p2yx10ijm36rmevp --- addons/wiki/wizard/wiki_make_index.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/addons/wiki/wizard/wiki_make_index.py b/addons/wiki/wizard/wiki_make_index.py index 1e2dae8f92d..6cf26f663b7 100644 --- a/addons/wiki/wizard/wiki_make_index.py +++ b/addons/wiki/wizard/wiki_make_index.py @@ -38,7 +38,10 @@ class wiki_make_index(osv.osv_memory): if context is None: context = {} data = context and context.get('active_ids', []) or [] - + + if not data: + return {'type': 'ir.actions.act_window_close'} + for index_obj in self.browse(cr, uid, ids, context=context): wiki_pool = self.pool.get('wiki.wiki') cr.execute("Select id, section from wiki_wiki where id IN %s \ From d83939845b2724ca03e0ed8cbac5c4f35d283097 Mon Sep 17 00:00:00 2001 From: Mustufa Rangwala Date: Mon, 21 Mar 2011 18:47:28 +0530 Subject: [PATCH 26/47] [FIX] account: The Account Charts can not be visible in create Account Chart Wizard : Selection Field except Default Account Chart. lp bug: https://launchpad.net/bugs/739342 fixed bzr revid: mra@mra-laptop-20110321131728-mu8aba9rm17f6wym --- addons/account/installer.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/account/installer.py b/addons/account/installer.py index e4229f0124c..f46b1b0f7e8 100644 --- a/addons/account/installer.py +++ b/addons/account/installer.py @@ -36,7 +36,8 @@ class account_installer(osv.osv_memory): def _get_charts(self, cr, uid, context=None): modules = self.pool.get('ir.module.module') - ids = modules.search(cr, uid, [('category_id', '=', 'Account Charts')], context=context) + cr.execute("SELECT id FROM ir_module_module WHERE name like 'l10n_%'") + ids = [r[0] for r in cr.fetchall()] charts = list( sorted(((m.name, m.shortdesc) for m in modules.browse(cr, uid, ids, context=context)), From f6b912e60cda5cc13aef45bdf7806dfd2218e283 Mon Sep 17 00:00:00 2001 From: Mustufa Rangwala Date: Mon, 21 Mar 2011 19:06:57 +0530 Subject: [PATCH 27/47] [FIX] account: replace query by search bzr revid: mra@mra-laptop-20110321133657-o5uidd2kzj5hse1c --- addons/account/installer.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/addons/account/installer.py b/addons/account/installer.py index f46b1b0f7e8..e2f21b44bd8 100644 --- a/addons/account/installer.py +++ b/addons/account/installer.py @@ -36,8 +36,7 @@ class account_installer(osv.osv_memory): def _get_charts(self, cr, uid, context=None): modules = self.pool.get('ir.module.module') - cr.execute("SELECT id FROM ir_module_module WHERE name like 'l10n_%'") - ids = [r[0] for r in cr.fetchall()] + ids = modules.search(cr, uid, [('name', 'like', 'l10n_%')], context=context) charts = list( sorted(((m.name, m.shortdesc) for m in modules.browse(cr, uid, ids, context=context)), From 8add2fc461093d53f1417079f21235b58942031c Mon Sep 17 00:00:00 2001 From: "ksa (Open ERP)" Date: Tue, 22 Mar 2011 15:48:03 +0530 Subject: [PATCH 28/47] [FIX]:different behavior with and without production lot in physical inventory lp bug: https://launchpad.net/bugs/725921 fixed bzr revid: ksa@tinyerp.co.in-20110322101803-mp2wpjuyak59uix6 --- addons/stock/stock.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/addons/stock/stock.py b/addons/stock/stock.py index db5b3f677d3..ee4c9e4b621 100644 --- a/addons/stock/stock.py +++ b/addons/stock/stock.py @@ -2589,11 +2589,6 @@ class stock_inventory(osv.osv): 'location_id': line.location_id.id, 'location_dest_id': location_id, }) - if lot_id: - value.update({ - 'prodlot_id': lot_id, - 'product_qty': line.product_qty - }) move_ids.append(self._inventory_line_hook(cr, uid, line, value)) message = _("Inventory '%s' is done.") %(inv.name) self.log(cr, uid, inv.id, message) From db2df372eed50fdf549cfb8ae771722223ba7ed5 Mon Sep 17 00:00:00 2001 From: "aag (OpenERP)" Date: Tue, 22 Mar 2011 17:35:29 +0530 Subject: [PATCH 29/47] [FIX] WIKI: Wiki Pages Application Now got warning if Section is not Define- Create Index lp bug: https://launchpad.net/bugs/736102 fixed bzr revid: aag@tinyerp.co.in-20110322120529-we7lgl23t7fvrnw0 --- addons/wiki/wizard/wiki_make_index.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/addons/wiki/wizard/wiki_make_index.py b/addons/wiki/wizard/wiki_make_index.py index 6cf26f663b7..7deb674c35c 100644 --- a/addons/wiki/wizard/wiki_make_index.py +++ b/addons/wiki/wizard/wiki_make_index.py @@ -20,6 +20,7 @@ ############################################################################## from osv import fields, osv +from tools.translate import _ class wiki_make_index(osv.osv_memory): """ Create Index For Selected Page """ @@ -47,6 +48,8 @@ class wiki_make_index(osv.osv_memory): cr.execute("Select id, section from wiki_wiki where id IN %s \ order by section ", (tuple(data),)) lst0 = cr.fetchall() + if not lst0[0][1]: + raise osv.except_osv(_('Warning !'), _('There is no section in this Page')) lst = [] s_ids = {} From 2b6d4c6c28e8a0249a99dcafa2f11d4b7ea9dae9 Mon Sep 17 00:00:00 2001 From: "aag (OpenERP)" Date: Wed, 23 Mar 2011 15:17:15 +0530 Subject: [PATCH 30/47] [FIX] WIKI: Wiki Pages Application Now got warning if in Section charecter avalable- Create Index lp bug: https://launchpad.net/bugs/736102 fixed bzr revid: aag@tinyerp.co.in-20110323094715-cvsypmap2yssqf1o --- addons/wiki/wizard/wiki_make_index.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/addons/wiki/wizard/wiki_make_index.py b/addons/wiki/wizard/wiki_make_index.py index 7deb674c35c..9048e9423bb 100644 --- a/addons/wiki/wizard/wiki_make_index.py +++ b/addons/wiki/wizard/wiki_make_index.py @@ -21,6 +21,7 @@ from osv import fields, osv from tools.translate import _ +import re class wiki_make_index(osv.osv_memory): """ Create Index For Selected Page """ @@ -50,6 +51,14 @@ class wiki_make_index(osv.osv_memory): lst0 = cr.fetchall() if not lst0[0][1]: raise osv.except_osv(_('Warning !'), _('There is no section in this Page')) + + check = map(lambda x: x.split('.'), lst0[0][1]) + + if check: + for i in check: + match = re.match('[a-zA-Z]', i[0]) + if match: + raise osv.except_osv(_('Warning !'), _('The section values must be like 1/1.1/1.3.4')) lst = [] s_ids = {} @@ -81,7 +90,6 @@ class wiki_make_index(osv.osv_memory): current = current[:pos + 1] if pos == len(l) - 1: break - key = ('.'.join([str(x) for x in l])) id = s_ids[key] val = ('.'.join([str(x) for x in current[:]]), id) From 4f4bf7d34fe5c689c175993bbebc71b2bd038160 Mon Sep 17 00:00:00 2001 From: "aag (OpenERP)" Date: Wed, 23 Mar 2011 15:24:56 +0530 Subject: [PATCH 31/47] [FIX] WIKI: Wiki Pages Application Now got warning if in Section charecter avalable22- Create Index lp bug: https://launchpad.net/bugs/736102 fixed bzr revid: aag@tinyerp.co.in-20110323095456-ciclodma2ws7pdr6 --- addons/wiki/wizard/wiki_make_index.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wiki/wizard/wiki_make_index.py b/addons/wiki/wizard/wiki_make_index.py index 9048e9423bb..90528652587 100644 --- a/addons/wiki/wizard/wiki_make_index.py +++ b/addons/wiki/wizard/wiki_make_index.py @@ -56,7 +56,7 @@ class wiki_make_index(osv.osv_memory): if check: for i in check: - match = re.match('[a-zA-Z]', i[0]) + match = re.match('[a-zA-Z_%-+$*&^#@!]', i[0]) if match: raise osv.except_osv(_('Warning !'), _('The section values must be like 1/1.1/1.3.4')) lst = [] From 68748879d13fe4b9ea0838934bf40112068ab9e7 Mon Sep 17 00:00:00 2001 From: "ksa (Open ERP)" Date: Wed, 23 Mar 2011 17:25:17 +0530 Subject: [PATCH 32/47] [FIX]:stock_move done date not recorded lp bug: https://launchpad.net/bugs/740762 fixed bzr revid: ksa@tinyerp.co.in-20110323115517-vqrzwbqaca1gk4ck --- addons/stock/stock.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/stock/stock.py b/addons/stock/stock.py index db5b3f677d3..0a8f66fc77d 100644 --- a/addons/stock/stock.py +++ b/addons/stock/stock.py @@ -2145,7 +2145,7 @@ class stock_move(osv.osv): if todo: self.action_confirm(cr, uid, todo, context=context) - self.write(cr, uid, move_ids, {'state': 'done', 'date_planned': time.strftime('%Y-%m-%d %H:%M:%S')}, context=context) + self.write(cr, uid, move_ids, {'state': 'done', 'date': time.strftime('%Y-%m-%d %H:%M:%S')}, context=context) for id in move_ids: wf_service.trg_trigger(uid, 'stock.move', id, cr) From 1b466d4a9de28eb81ede0c28b526266ab1eb53ea Mon Sep 17 00:00:00 2001 From: "aag (OpenERP)" Date: Wed, 23 Mar 2011 18:18:33 +0530 Subject: [PATCH 33/47] [FIX] WIKI: Wiki Pages Application Now got warning if in Section charecter avalable33- Create Index lp bug: https://launchpad.net/bugs/736102 fixed bzr revid: aag@tinyerp.co.in-20110323124833-bo7gurieys58jzmk --- addons/wiki/wizard/wiki_make_index.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/wiki/wizard/wiki_make_index.py b/addons/wiki/wizard/wiki_make_index.py index 90528652587..effb9023b4a 100644 --- a/addons/wiki/wizard/wiki_make_index.py +++ b/addons/wiki/wizard/wiki_make_index.py @@ -56,8 +56,8 @@ class wiki_make_index(osv.osv_memory): if check: for i in check: - match = re.match('[a-zA-Z_%-+$*&^#@!]', i[0]) - if match: + match = re.match('[0-9]', i[0]) + if not match: raise osv.except_osv(_('Warning !'), _('The section values must be like 1/1.1/1.3.4')) lst = [] s_ids = {} From 9e6718db9eb09db6d21e3db985dcc6c7a612e8b0 Mon Sep 17 00:00:00 2001 From: "aag (OpenERP)" Date: Wed, 23 Mar 2011 18:43:52 +0530 Subject: [PATCH 34/47] [FIX] WIKI: Wiki Pages Application Now get warning id not proper formate lp bug: https://launchpad.net/bugs/736102 fixed bzr revid: aag@tinyerp.co.in-20110323131352-wv3chvlt0w7aquj8 --- addons/wiki/wizard/wiki_make_index.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/addons/wiki/wizard/wiki_make_index.py b/addons/wiki/wizard/wiki_make_index.py index effb9023b4a..95dc2a7e9cd 100644 --- a/addons/wiki/wizard/wiki_make_index.py +++ b/addons/wiki/wizard/wiki_make_index.py @@ -52,13 +52,10 @@ class wiki_make_index(osv.osv_memory): if not lst0[0][1]: raise osv.except_osv(_('Warning !'), _('There is no section in this Page')) - check = map(lambda x: x.split('.'), lst0[0][1]) - - if check: - for i in check: - match = re.match('[0-9]', i[0]) - if not match: - raise osv.except_osv(_('Warning !'), _('The section values must be like 1/1.1/1.3.4')) + for i in lst0[0][1]: + match = re.match('[0-9\.]', i) + if not match: + raise osv.except_osv(_('Warning !'), _('The section values must be like 1/1.1/1.3.4')) lst = [] s_ids = {} From ff20865adf0a7c0fe105d1fed037dd10c3ae6d7c Mon Sep 17 00:00:00 2001 From: Launchpad Translations on behalf of openerp <> Date: Thu, 24 Mar 2011 04:50:30 +0000 Subject: [PATCH 35/47] Launchpad automatic translations update. bzr revid: launchpad_translations_on_behalf_of_openerp-20110324045030-dnid31oi7qb2oql6 --- addons/account_sequence/i18n/de.po | 236 +++++++++++++++++++++++++++ addons/anonymization/i18n/de.po | 230 ++++++++++++++++++++++++++ addons/crm/i18n/ru.po | 145 ++++++++-------- addons/crm_partner_assign/i18n/ru.po | 16 +- addons/mrp/i18n/ro.po | 12 +- addons/sale/i18n/ru.po | 12 +- addons/sale_crm/i18n/ru.po | 16 +- addons/sale_order_dates/i18n/ru.po | 8 +- 8 files changed, 579 insertions(+), 96 deletions(-) create mode 100644 addons/account_sequence/i18n/de.po create mode 100644 addons/anonymization/i18n/de.po diff --git a/addons/account_sequence/i18n/de.po b/addons/account_sequence/i18n/de.po new file mode 100644 index 00000000000..44799f6bce9 --- /dev/null +++ b/addons/account_sequence/i18n/de.po @@ -0,0 +1,236 @@ +# German translation for openobject-addons +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2011-01-11 11:14+0000\n" +"PO-Revision-Date: 2011-03-23 12:34+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: German \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2011-03-24 04:50+0000\n" +"X-Generator: Launchpad (build 12559)\n" + +#. module: account_sequence +#: view:account.sequence.installer:0 +#: model:ir.actions.act_window,name:account_sequence.action_account_seq_installer +msgid "Account Sequence Application Configuration" +msgstr "Konfiguration Konto Sequenz Anwendung" + +#. module: account_sequence +#: constraint:account.move:0 +msgid "" +"You cannot create entries on different periods/journals in the same move" +msgstr "" +"Sie können keine Buchung in verschiedenen Perioden/Journalen durch einen " +"Buchungssatz erstellen" + +#. module: account_sequence +#: help:account.move,internal_sequence_number:0 +#: help:account.move.line,internal_sequence_number:0 +msgid "Internal Sequence Number" +msgstr "Interne Sequenznummer" + +#. module: account_sequence +#: help:account.sequence.installer,number_next:0 +msgid "Next number of this sequence" +msgstr "Nächste Nummer dieser Sequenz" + +#. module: account_sequence +#: field:account.sequence.installer,number_next:0 +msgid "Next Number" +msgstr "Nächste Nummer zuweisen" + +#. module: account_sequence +#: field:account.sequence.installer,number_increment:0 +msgid "Increment Number" +msgstr "Schrittweise Erhöhung" + +#. module: account_sequence +#: model:ir.module.module,description:account_sequence.module_meta_information +msgid "" +"\n" +" This module maintains internal sequence number for accounting entries.\n" +" " +msgstr "" +"\n" +" Dieses Modul verwaltet interne Sequenznummern für Buchungszeilen.\n" +" " + +#. module: account_sequence +#: model:ir.module.module,shortdesc:account_sequence.module_meta_information +msgid "Entries Sequence Numbering" +msgstr "Buchungszeilen Sequenznummern" + +#. module: account_sequence +#: help:account.sequence.installer,number_increment:0 +msgid "The next number of the sequence will be incremented by this number" +msgstr "Die nächste Nummer dieser Sequenz wir um diese Zahl erhöht." + +#. module: account_sequence +#: view:account.sequence.installer:0 +msgid "Configure Your Account Sequence Application" +msgstr "Konfiguration der Sequenzen für Buchungungszeilen" + +#. module: account_sequence +#: field:account.sequence.installer,progress:0 +msgid "Configuration Progress" +msgstr "Konfigurationsprozeß" + +#. module: account_sequence +#: help:account.sequence.installer,suffix:0 +msgid "Suffix value of the record for the sequence" +msgstr "Endung (Suffix) einer Sequenz" + +#. module: account_sequence +#: field:account.sequence.installer,company_id:0 +msgid "Company" +msgstr "Unternehmen" + +#. module: account_sequence +#: help:account.journal,internal_sequence_id:0 +msgid "" +"This sequence will be used to maintain the internal number for the journal " +"entries related to this journal." +msgstr "" +"Diese Sequenz wird für die Numerierung der Buchungszeilen dieses Journals " +"verwendet" + +#. module: account_sequence +#: field:account.sequence.installer,padding:0 +msgid "Number padding" +msgstr "Vorlaufende Stellen" + +#. module: account_sequence +#: model:ir.model,name:account_sequence.model_account_move_line +msgid "Journal Items" +msgstr "Journaleinträge" + +#. module: account_sequence +#: field:account.move,internal_sequence_number:0 +#: field:account.move.line,internal_sequence_number:0 +msgid "Internal Number" +msgstr "Interne Nummer" + +#. module: account_sequence +#: constraint:account.move.line:0 +msgid "Company must be same for its related account and period." +msgstr "Die Firma muss für zugehörige Konten und Perioden identisch sein." + +#. module: account_sequence +#: help:account.sequence.installer,padding:0 +msgid "" +"OpenERP will automatically adds some '0' on the left of the 'Next Number' to " +"get the required padding size." +msgstr "" +"OpenERP wird automatisch '0' vor die \"Nächste Nummer\" stellen um die " +"gewünschte Länge zu erzeugen" + +#. module: account_sequence +#: field:account.sequence.installer,name:0 +msgid "Name" +msgstr "Bezeichnung" + +#. module: account_sequence +#: constraint:account.move.line:0 +msgid "You can not create move line on closed account." +msgstr "Sie können keine Buchung auf einem geschlossenen Konto erzeugen." + +#. module: account_sequence +#: constraint:account.move:0 +msgid "" +"You cannot create more than one move per period on centralized journal" +msgstr "" +"Sie können nicht mehr als eine Buchung pro Periode und Konto bei Anwendung " +"eines zentralen Gegenkontos erstellen." + +#. module: account_sequence +#: sql_constraint:account.move.line:0 +msgid "Wrong credit or debit value in accounting entry !" +msgstr "Falscher Debit oder Kreditwert im Buchungseintrag!" + +#. module: account_sequence +#: field:account.journal,internal_sequence_id:0 +msgid "Internal Sequence" +msgstr "Interne Sequenz" + +#. module: account_sequence +#: model:ir.model,name:account_sequence.model_account_sequence_installer +msgid "account.sequence.installer" +msgstr "account.sequence.installer" + +#. module: account_sequence +#: view:account.sequence.installer:0 +msgid "Configure" +msgstr "Konfigurieren" + +#. module: account_sequence +#: help:account.sequence.installer,prefix:0 +msgid "Prefix value of the record for the sequence" +msgstr "Vorlauf (Prefix) einer Sequenz" + +#. module: account_sequence +#: model:ir.model,name:account_sequence.model_account_move +msgid "Account Entry" +msgstr "Buchungssatz" + +#. module: account_sequence +#: field:account.sequence.installer,suffix:0 +msgid "Suffix" +msgstr "Endung" + +#. module: account_sequence +#: field:account.sequence.installer,config_logo:0 +msgid "Image" +msgstr "Bild" + +#. module: account_sequence +#: view:account.sequence.installer:0 +msgid "title" +msgstr "Titel" + +#. module: account_sequence +#: sql_constraint:account.journal:0 +msgid "The name of the journal must be unique per company !" +msgstr "Die Journalbezeichnung sollte pro Unternehmen eindeutig sein." + +#. module: account_sequence +#: field:account.sequence.installer,prefix:0 +msgid "Prefix" +msgstr "Prefix" + +#. module: account_sequence +#: sql_constraint:account.journal:0 +msgid "The code of the journal must be unique per company !" +msgstr "" +"Die Journalkurzbezeichnung sollte innerhalb eines Unternehmens eindeutig " +"sein !" + +#. module: account_sequence +#: constraint:account.move.line:0 +msgid "" +"You can not create move line on receivable/payable account without partner" +msgstr "" +"Sie können keine Buchung auf Forderungs- oder Verbindlichkeitskonten ohne " +"einen vorher vorhandenen Partner erstellen." + +#. module: account_sequence +#: model:ir.model,name:account_sequence.model_account_journal +msgid "Journal" +msgstr "Journal" + +#. module: account_sequence +#: view:account.sequence.installer:0 +msgid "You can enhance the Account Sequence Application by installing ." +msgstr "" + +#. module: account_sequence +#: constraint:account.move.line:0 +msgid "You can not create move line on view account." +msgstr "Sie können keine Buchungen auf Konten des Typs Ansicht erstellen." diff --git a/addons/anonymization/i18n/de.po b/addons/anonymization/i18n/de.po new file mode 100644 index 00000000000..abefff7fe8d --- /dev/null +++ b/addons/anonymization/i18n/de.po @@ -0,0 +1,230 @@ +# German translation for openobject-addons +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2011-01-11 11:14+0000\n" +"PO-Revision-Date: 2011-03-23 12:46+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: German \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2011-03-24 04:50+0000\n" +"X-Generator: Launchpad (build 12559)\n" + +#. module: anonymization +#: model:ir.model,name:anonymization.model_ir_model_fields_anonymize_wizard +msgid "ir.model.fields.anonymize.wizard" +msgstr "ir.model.fields.anonymize.wizard" + +#. module: anonymization +#: field:ir.model.fields.anonymization,field_name:0 +msgid "Field Name" +msgstr "Feldname" + +#. module: anonymization +#: field:ir.model.fields.anonymization,field_id:0 +msgid "Field" +msgstr "Feld" + +#. module: anonymization +#: field:ir.model.fields.anonymization.history,state:0 +#: field:ir.model.fields.anonymize.wizard,state:0 +msgid "State" +msgstr "Status" + +#. module: anonymization +#: field:ir.model.fields.anonymize.wizard,file_import:0 +msgid "Import" +msgstr "Import" + +#. module: anonymization +#: model:ir.model,name:anonymization.model_ir_model_fields_anonymization +msgid "ir.model.fields.anonymization" +msgstr "ir.model.fields.anonymization" + +#. module: anonymization +#: model:ir.module.module,shortdesc:anonymization.module_meta_information +msgid "Database anonymization module" +msgstr "Datenbank Anonymisierungsmodul" + +#. module: anonymization +#: field:ir.model.fields.anonymization.history,direction:0 +msgid "Direction" +msgstr "Richtung" + +#. module: anonymization +#: model:ir.actions.act_window,name:anonymization.action_ir_model_fields_anonymization_tree +#: view:ir.model.fields.anonymization:0 +#: model:ir.ui.menu,name:anonymization.menu_administration_anonymization_fields +msgid "Anonymized Fields" +msgstr "Anonymisierte Felder" + +#. module: anonymization +#: model:ir.ui.menu,name:anonymization.menu_administration_anonymization +msgid "Database anonymization" +msgstr "Datenbank Anonymisierung" + +#. module: anonymization +#: code:addons/anonymization/anonymization.py:55 +#: sql_constraint:ir.model.fields.anonymization:0 +#, python-format +msgid "You cannot have two records having the same model and the same field" +msgstr "" +"2 Datensätze können nicht das gleiche Model und gleiche Datenfeld haben" + +#. module: anonymization +#: selection:ir.model.fields.anonymization,state:0 +#: selection:ir.model.fields.anonymize.wizard,state:0 +msgid "Anonymized" +msgstr "Anonymisiert" + +#. module: anonymization +#: field:ir.model.fields.anonymization,state:0 +msgid "unknown" +msgstr "unbekannt" + +#. module: anonymization +#: field:ir.model.fields.anonymization,model_id:0 +msgid "Object" +msgstr "Objekt" + +#. module: anonymization +#: field:ir.model.fields.anonymization.history,filepath:0 +msgid "File path" +msgstr "Dateipfad" + +#. module: anonymization +#: field:ir.model.fields.anonymization.history,date:0 +msgid "Date" +msgstr "Datum" + +#. module: anonymization +#: field:ir.model.fields.anonymize.wizard,file_export:0 +msgid "Export" +msgstr "Export" + +#. module: anonymization +#: view:ir.model.fields.anonymize.wizard:0 +msgid "Reverse the Database Anonymization" +msgstr "Mache Datenbankanonymiserung rückgängig" + +#. module: anonymization +#: view:ir.model.fields.anonymize.wizard:0 +msgid "Database Anonymization" +msgstr "Datenbankanonymisierung" + +#. module: anonymization +#: model:ir.ui.menu,name:anonymization.menu_administration_anonymization_wizard +msgid "Anonymize database" +msgstr "Anonymisiere Datenbank" + +#. module: anonymization +#: view:ir.model.fields.anonymization.history:0 +#: field:ir.model.fields.anonymization.history,field_ids:0 +msgid "Fields" +msgstr "Felder" + +#. module: anonymization +#: selection:ir.model.fields.anonymization,state:0 +#: selection:ir.model.fields.anonymize.wizard,state:0 +msgid "Clear" +msgstr "Leeren" + +#. module: anonymization +#: selection:ir.model.fields.anonymization.history,direction:0 +msgid "clear -> anonymized" +msgstr "leer -> anonymisiert" + +#. module: anonymization +#: view:ir.model.fields.anonymize.wizard:0 +#: field:ir.model.fields.anonymize.wizard,summary:0 +msgid "Summary" +msgstr "Zusammenfassung" + +#. module: anonymization +#: view:ir.model.fields.anonymization:0 +msgid "Anonymized Field" +msgstr "Anonymisiertes Feld" + +#. module: anonymization +#: model:ir.module.module,description:anonymization.module_meta_information +msgid "" +"\n" +"This module allows you to anonymize a database.\n" +" " +msgstr "" +"\n" +"Dieses Module anonymisiert die Datenbank (für Migration durch OpenERP)\n" +" " + +#. module: anonymization +#: selection:ir.model.fields.anonymize.wizard,state:0 +msgid "Unstable" +msgstr "Instabil" + +#. module: anonymization +#: selection:ir.model.fields.anonymization.history,state:0 +msgid "Exception occured" +msgstr "Ausnahme aufgetreten" + +#. module: anonymization +#: selection:ir.model.fields.anonymization,state:0 +#: selection:ir.model.fields.anonymize.wizard,state:0 +msgid "Not Existing" +msgstr "Existiert nicht" + +#. module: anonymization +#: field:ir.model.fields.anonymization,model_name:0 +msgid "Object Name" +msgstr "Objekt Bezeichnung" + +#. module: anonymization +#: model:ir.actions.act_window,name:anonymization.action_ir_model_fields_anonymization_history_tree +#: view:ir.model.fields.anonymization.history:0 +#: model:ir.ui.menu,name:anonymization.menu_administration_anonymization_history +msgid "Anonymization History" +msgstr "Anonymisierungs Verlauf" + +#. module: anonymization +#: model:ir.model,name:anonymization.model_ir_model_fields_anonymization_history +msgid "ir.model.fields.anonymization.history" +msgstr "ir.model.fields.anonymization.history" + +#. module: anonymization +#: model:ir.actions.act_window,name:anonymization.action_ir_model_fields_anonymize_wizard +#: view:ir.model.fields.anonymize.wizard:0 +msgid "Anonymize Database" +msgstr "Anonymisiere Datenbank" + +#. module: anonymization +#: field:ir.model.fields.anonymize.wizard,name:0 +msgid "File Name" +msgstr "Dateiname" + +#. module: anonymization +#: selection:ir.model.fields.anonymization.history,direction:0 +msgid "anonymized -> clear" +msgstr "anonymisiert -> leer" + +#. module: anonymization +#: selection:ir.model.fields.anonymization.history,state:0 +msgid "Started" +msgstr "Begonnen" + +#. module: anonymization +#: selection:ir.model.fields.anonymization.history,state:0 +msgid "Done" +msgstr "Erledigt" + +#. module: anonymization +#: view:ir.model.fields.anonymization.history:0 +#: field:ir.model.fields.anonymization.history,msg:0 +#: field:ir.model.fields.anonymize.wizard,msg:0 +msgid "Message" +msgstr "Nachricht" diff --git a/addons/crm/i18n/ru.po b/addons/crm/i18n/ru.po index e34ba6e139e..b98eec055c8 100644 --- a/addons/crm/i18n/ru.po +++ b/addons/crm/i18n/ru.po @@ -7,13 +7,13 @@ msgstr "" "Project-Id-Version: OpenERP Server 6.0dev\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2011-01-11 11:15+0000\n" -"PO-Revision-Date: 2011-03-22 14:25+0000\n" -"Last-Translator: Sergei Kostigoff \n" +"PO-Revision-Date: 2011-03-23 13:45+0000\n" +"Last-Translator: Chertykov Denis \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-03-23 04:35+0000\n" +"X-Launchpad-Export-Date: 2011-03-24 04:50+0000\n" "X-Generator: Launchpad (build 12559)\n" #. module: crm @@ -78,7 +78,7 @@ msgstr "Сегодня" #. module: crm #: view:crm.merge.opportunity:0 msgid "Select Opportunities" -msgstr "Выберите сделки" +msgstr "Выберите предложения" #. module: crm #: view:crm.meeting:0 @@ -127,7 +127,7 @@ msgstr "Код отдела продаж должен быть уникальн #: code:addons/crm/wizard/crm_lead_to_opportunity.py:93 #, python-format msgid "Lead '%s' has been converted to an opportunity." -msgstr "Кандидат '%s' был преобразован в сделку." +msgstr "Кандидат '%s' был преобразован в предложение." #. module: crm #: code:addons/crm/crm_lead.py:228 @@ -177,14 +177,15 @@ msgstr "Не создавать партнера" #. module: crm #: view:crm.lead:0 msgid "Search Opportunities" -msgstr "Искать сделки" +msgstr "Искать предложения" #. module: crm #: code:addons/crm/wizard/crm_merge_opportunities.py:46 #, python-format msgid "" "Opportunity must have Partner assigned before merging with other Opportunity." -msgstr "Сделка должна иметь партнера перед объединением с другой сделкой." +msgstr "" +"Предложение должно иметь партнера перед объединением с другим предложением." #. module: crm #: code:addons/crm/wizard/crm_merge_opportunities.py:46 @@ -198,7 +199,7 @@ msgstr "Внимание!" #: model:ir.actions.act_window,name:crm.action_report_crm_opportunity #: model:ir.ui.menu,name:crm.menu_report_crm_opportunities_tree msgid "Opportunities Analysis" -msgstr "Анализ сделок" +msgstr "Анализ предложений" #. module: crm #: field:crm.lead,partner_id:0 @@ -260,7 +261,7 @@ msgstr "Отказ" #: code:addons/crm/crm_opportunity.py:108 #, python-format msgid "The opportunity '%s' has been marked as lost." -msgstr "Сделка '%s' была отмечена как проигранная." +msgstr "Предложение '%s' было отмечено как проигранное." #. module: crm #: model:ir.actions.act_window,help:crm.action_report_crm_lead @@ -310,9 +311,9 @@ msgid "" "communication history) will be merged with existing Opportunity of Selected " "partner." msgstr "" -"При выборе объединения с существующей сделкой, реквизиты кандидата (вместе с " -"историей общения) будут объединены с существующей сделкой выбранного " -"партнера." +"При выборе объединения с существующим предложением, реквизиты кандидата " +"(вместе с историей общения) будут объединены с существующим предложением " +"выбранного партнера." #. module: crm #: selection:crm.meeting,class:0 @@ -394,7 +395,7 @@ msgstr "Кандидат '%s' был открыт" #. module: crm #: model:process.transition,name:crm.process_transition_opportunitymeeting0 msgid "Opportunity Meeting" -msgstr "Встреча по сделке" +msgstr "Встреча по предложению" #. module: crm #: help:crm.lead.report,delay_close:0 @@ -405,7 +406,7 @@ msgstr "Количество дней, чтобы закрыть вопрос" #. module: crm #: model:process.node,note:crm.process_node_opportunities0 msgid "When a real project/opportunity is detected" -msgstr "При обнаружении реального проекта/сделки" +msgstr "При обнаружении реального проекта/предложения" #. module: crm #: field:crm.installer,crm_fundraising:0 @@ -416,7 +417,7 @@ msgstr "Фандрайзинг" #: view:res.partner:0 #: field:res.partner,opportunity_ids:0 msgid "Leads and Opportunities" -msgstr "Кандидаты и сделки" +msgstr "Кандидаты и предложения" #. module: crm #: view:crm.send.mail:0 @@ -451,7 +452,7 @@ msgstr "" #. module: crm #: model:ir.model,name:crm.model_crm_lead2opportunity_action msgid "Convert/Merge Opportunity" -msgstr "Преобразовать/Объединить сделку" +msgstr "Преобразовать/Объединить предложение" #. module: crm #: field:crm.lead,write_date:0 @@ -480,7 +481,7 @@ msgstr "Категория" #. module: crm #: view:crm.lead.report:0 msgid "#Opportunities" -msgstr "#Сделок" +msgstr "# Предложений" #. module: crm #: model:crm.case.resource.type,name:crm.type_oppor2 @@ -500,7 +501,7 @@ msgstr "Конфиденциальность" #. module: crm #: view:crm.lead.report:0 msgid "Opportunity Analysis" -msgstr "Анализ сделок" +msgstr "Анализ предложений" #. module: crm #: help:crm.meeting,location:0 @@ -530,7 +531,7 @@ msgstr "Позволяет получать эл. почту с POP/IMAP сер #. module: crm #: model:process.transition,note:crm.process_transition_opportunitymeeting0 msgid "Normal or phone meeting for opportunity" -msgstr "Обычная встреча или звонок по сделке" +msgstr "Обычная встреча или звонок по предложению" #. module: crm #: model:process.node,note:crm.process_node_leads0 @@ -549,7 +550,7 @@ msgstr "Самый первый перспективный контакт" #: model:ir.actions.act_window,name:crm.crm_partner2opportunity #, python-format msgid "Create Opportunity" -msgstr "Создать сделку" +msgstr "Создать предложение" #. module: crm #: view:crm.installer:0 @@ -832,7 +833,7 @@ msgstr "Панель статистики" #: field:crm.phonecall,opportunity_id:0 #, python-format msgid "Opportunity" -msgstr "Сделка" +msgstr "Предложение" #. module: crm #: model:crm.case.resource.type,name:crm.type_lead7 @@ -896,7 +897,7 @@ msgstr "Эксклюзивный" #: code:addons/crm/crm_opportunity.py:91 #, python-format msgid "The opportunity '%s' has been won." -msgstr "Сделка '%s' выиграна." +msgstr "Предложение '%s' выиграно." #. module: crm #: help:crm.meeting,alarm_id:0 @@ -972,7 +973,7 @@ msgstr "" #. module: crm #: view:crm.phonecall2opportunity:0 msgid "Convert To Opportunity " -msgstr "Преобразовать в сделку " +msgstr "Преобразовать в предложение " #. module: crm #: help:crm.case.stage,sequence:0 @@ -986,7 +987,7 @@ msgstr "Дает последовательность при отображен #: model:ir.ui.menu,name:crm.menu_crm_case_opp #: model:process.node,name:crm.process_node_opportunities0 msgid "Opportunities" -msgstr "Сделки" +msgstr "Предложения" #. module: crm #: field:crm.segmentation,categ_id:0 @@ -1035,7 +1036,7 @@ msgstr "Март" #: code:addons/crm/crm_lead.py:230 #, python-format msgid "The opportunity '%s' has been closed." -msgstr "Сделка '%s' закрыта." +msgstr "Предложение '%s' закрыто." #. module: crm #: field:crm.lead,day_open:0 @@ -1076,7 +1077,8 @@ msgstr "Способ прекращения повторения" msgid "" "There are no other 'Open' or 'Pending' Opportunities for the partner '%s'." msgstr "" -"Нет других сделок в стадии \"Открыто\" или \"В ожидании\" для партнера '%s'." +"Нет других предложений в стадии \"Открыто\" или \"В ожидании\" для партнера " +"'%s'." #. module: crm #: view:crm.lead:0 @@ -1150,7 +1152,7 @@ msgstr "" #: code:addons/crm/wizard/crm_phonecall_to_opportunity.py:57 #, python-format msgid "Closed/Cancelled Phone Call Could not convert into Opportunity" -msgstr "Закрытый/отмененный звонок нельзя преобразовать в сделку" +msgstr "Закрытый/отмененный звонок нельзя преобразовать в предложение" #. module: crm #: view:crm.segmentation:0 @@ -1397,7 +1399,7 @@ msgstr "Управление техподдержкой" #. module: crm #: field:crm.partner2opportunity,name:0 msgid "Opportunity Name" -msgstr "Название сделки" +msgstr "Название предложения" #. module: crm #: help:crm.case.section,active:0 @@ -1496,7 +1498,7 @@ msgstr "Идентификатор" #. module: crm #: model:ir.model,name:crm.model_crm_partner2opportunity msgid "Partner To Opportunity" -msgstr "Партнер в Сделку" +msgstr "Партнер в Предложение" #. module: crm #: view:crm.meeting:0 @@ -1520,7 +1522,7 @@ msgstr "Расширенные фильтры..." #. module: crm #: field:crm.phonecall2opportunity,name:0 msgid "Opportunity Summary" -msgstr "Кратко о сделке" +msgstr "Кратко о предложении" #. module: crm #: view:crm.phonecall.report:0 @@ -1530,7 +1532,7 @@ msgstr "Искать" #. module: crm #: view:board.board:0 msgid "Opportunities by Categories" -msgstr "Сделки по категориям" +msgstr "Предложения по категориям" #. module: crm #: view:crm.meeting:0 @@ -1615,7 +1617,7 @@ msgstr "res.users" #. module: crm #: model:ir.model,name:crm.model_crm_merge_opportunity msgid "Merge two Opportunities" -msgstr "Объединить две сделки" +msgstr "Объединить два предложения" #. module: crm #: selection:crm.meeting,end_type:0 @@ -1690,6 +1692,11 @@ msgid "" "mainly used by the sales manager in order to do the periodic review with the " "teams of the sales pipeline." msgstr "" +"Анализ предложений дает вам мгновенный доступ к такой информации, как " +"ожидаемый доход, плановая себестоимость, пропущенные сроки или количество " +"взаимодействий в предложении. Этот отчет в основном используется менеджером " +"по продажам, с тем чтобы сделать периодический обзор по отделам продаж в " +"процессе продаж." #. module: crm #: field:crm.case.categ,name:0 @@ -1713,9 +1720,9 @@ msgid "" "organise their sales pipeline. Stages will allow them to easily track how a " "specific lead or opportunity is positioned in the sales cycle." msgstr "" -"Добавление специальных этапов к кандидатам и сделкам позволяет лучше " +"Добавление специальных этапов к кандидатам и предложениям позволяет лучше " "организовать процесс продаж. Этапы позволяют легче отслеживать нахождение " -"кандидатов и сделок в процессе продаж." +"кандидатов и предложений в процессе продаж." #. module: crm #: view:crm.lead.report:0 @@ -1960,7 +1967,7 @@ msgstr "Значение" #: view:crm.lead:0 #: view:crm.lead.report:0 msgid "Opportunity by Categories" -msgstr "Сделки по категориям" +msgstr "Предложения по категориям" #. module: crm #: view:crm.lead:0 @@ -1980,7 +1987,7 @@ msgstr "" #. module: crm #: model:ir.model,name:crm.model_crm_phonecall2opportunity msgid "Phonecall To Opportunity" -msgstr "Звонок в Сделку" +msgstr "Звонок в Предложение" #. module: crm #: field:crm.case.section,reply_to:0 @@ -1995,7 +2002,7 @@ msgstr "Выберите этапы для этого отдела продаж" #. module: crm #: view:board.board:0 msgid "Opportunities by Stage" -msgstr "Сделки по этапам" +msgstr "Предложения по этапам" #. module: crm #: view:crm.meeting:0 @@ -2012,7 +2019,7 @@ msgstr "Перспектива преобразуется в бизнес-пар #: view:crm.partner2opportunity:0 #: model:ir.actions.act_window,name:crm.phonecall2opportunity_act msgid "Convert To Opportunity" -msgstr "Преобразовать в сделку" +msgstr "Преобразовать в предложение" #. module: crm #: view:crm.phonecall:0 @@ -2038,7 +2045,7 @@ msgstr "Доп. информация" #: model:ir.actions.act_window,name:crm.action_merge_opportunities #: model:ir.actions.act_window,name:crm.merge_opportunity_act msgid "Merge Opportunities" -msgstr "Объединить сделки" +msgstr "Объединить предложения" #. module: crm #: model:crm.case.resource.type,name:crm.type_lead5 @@ -2090,7 +2097,7 @@ msgstr "Использовать правила продаж покупок" #. module: crm #: model:ir.model,name:crm.model_crm_lead2opportunity_partner msgid "Lead To Opportunity Partner" -msgstr "Кандидат в партнера сделки" +msgstr "Кандидат в партнера предложения" #. module: crm #: field:crm.meeting,location:0 @@ -2157,7 +2164,7 @@ msgstr "Google Adwords 2" #: help:crm.lead,type:0 #: help:crm.lead.report,type:0 msgid "Type is used to separate Leads and Opportunities" -msgstr "Тип используется для разделения кандидатов и сделок" +msgstr "Тип используется для разделения кандидатов и предложений" #. module: crm #: view:crm.phonecall2partner:0 @@ -2182,8 +2189,8 @@ msgid "" msgstr "" "Определение отдела продаж для организации различных продавцов или отделов " "продаж в отдельные команды. Каждая команда будет работать со своим списком " -"сделок, заказов и т.д. Каждый пользователь может установить команду по " -"умолчанию в своих настройках. Выводимые сделки и заказы, будут " +"предложений, заказов и т.д. Каждый пользователь может установить команду по " +"умолчанию в своих настройках. Выводимые предложения и заказы, будут " "автоматически фильтроваться в соответствии с отделом продаж пользователя." #. module: crm @@ -2265,7 +2272,7 @@ msgstr "" "Кандидаты позволяют управлять и отслеживать все первоначальные контакты с " "предполагаемыми клиентами или партнерами проявившими интерес к вашей " "продукции или услугам. Кандидат - обычно первый шаг в процессе продажи. " -"После оценки, кандидат может быть преобразован в сделку с созданием " +"После оценки, кандидат может быть преобразован в предложение с созданием " "соответствующего партнера для будущего отслеживания связанной с ним " "деятельности. Вы можете импортировать базу данных предполагаемых клиентов, " "работать с визитными карточками или интегрировать запросы с вашего сайта с " @@ -2415,7 +2422,7 @@ msgstr "Активен" #: code:addons/crm/crm_lead.py:306 #, python-format msgid "The stage of opportunity '%s' has been changed to '%s'." -msgstr "Этап сделки '%s' изменен на '%s'." +msgstr "Этап предложения '%s' изменен на '%s'." #. module: crm #: code:addons/crm/crm_lead.py:282 @@ -2591,7 +2598,7 @@ msgstr "Вопрос '%s' отменен." #. module: crm #: field:crm.installer,sale_crm:0 msgid "Opportunity to Quotation" -msgstr "Сделка в Запрос цен" +msgstr "Предложение в Заказ на продажу" #. module: crm #: model:ir.model,name:crm.model_crm_send_mail @@ -2602,7 +2609,7 @@ msgstr "Послать новое эл. письмо" #: view:board.board:0 #: model:ir.actions.act_window,name:crm.act_my_oppor msgid "My Open Opportunities" -msgstr "Мои открытые сделки" +msgstr "Мои открытые предложения" #. module: crm #: model:ir.actions.act_window,name:crm.open_board_statistical_dash @@ -2646,7 +2653,7 @@ msgstr "Тип встречи" #: code:addons/crm/wizard/crm_lead_to_opportunity.py:312 #, python-format msgid "Merge with Existing Opportunity" -msgstr "Объединить с существующей сделкой" +msgstr "Объединить с существующим предложением" #. module: crm #: help:crm.lead,state:0 @@ -2730,7 +2737,7 @@ msgstr "Указатель" #. module: crm #: model:ir.model,name:crm.model_crm_lead2opportunity msgid "Lead To Opportunity" -msgstr "Кандидат в Сделку" +msgstr "Кандидат в Предложение" #. module: crm #: model:ir.model,name:crm.model_calendar_attendee @@ -2763,7 +2770,8 @@ msgid "" "The name of the future partner that will be created while converting the " "into opportunity" msgstr "" -"Название будущего партнера, который будет создан при преобразовании в сделку" +"Название будущего партнера, который будет создан при преобразовании в " +"предложение" #. module: crm #: field:crm.opportunity2phonecall,user_id:0 @@ -2864,15 +2872,16 @@ msgid "" "opportunities, convert them into quotations, manage related documents, track " "all customer related activities, and much more." msgstr "" -"Со сделками вы можете управлять и отслеживать процесс продаж с помощью " +"С предложениями вы можете управлять и отслеживать процесс продаж с помощью " "создания специфичных для заказчика или предполагаемого клиента документов " "для продаж. Может быть сохранена такая информация: ожидаемый доход, этап " -"сделки, ожидаемая дата закрытия, история общения и многое другое. Сделки " -"могут быть связаны с почтовым шлюзом: новые сообщения могут создавать " -"сделки, каждая из них автоматически получает историю общения с клиентом.\n" +"предложения, ожидаемая дата закрытия, история общения и многое другое. " +"Предложения могут быть связаны с почтовым шлюзом: новые сообщения могут " +"создавать предложения, каждое из них автоматически получает историю общения " +"с клиентом.\n" "\n" "Вы и ваш отдел будете иметь возможность планировать встречи и телефонные " -"звонки по сделкам, превращать их в запросы цен, управлять связанными " +"звонки по предложениям, превращать их в запросы цен, управлять связанными " "документами, отслеживать деятельность связанную с заказчиком, и многое " "другое." @@ -3020,8 +3029,8 @@ msgid "" msgstr "" "Создавать специальные категории, которые подходят к деятельности вашей " "компании, чтобы лучше классифицировать и анализировать ваших кандидатов и " -"сделки. Такие категории, могут, например, отражать вашу структуру продукции " -"или различные типы продаж." +"предложения. Такие категории, могут, например, отражать вашу структуру " +"продукции или различные типы продаж." #. module: crm #: help:crm.segmentation,som_interval_decrease:0 @@ -3190,7 +3199,7 @@ msgstr "Запланировать звонок" #: code:addons/crm/wizard/crm_lead_to_opportunity.py:258 #, python-format msgid "Closed/Cancelled Leads Could not convert into Opportunity" -msgstr "Закрытого/отмененного кандидата нельзя преобразовать в сделку" +msgstr "Закрытого/отмененного кандидата нельзя преобразовать в предложение" #. module: crm #: view:crm.segmentation:0 @@ -3233,7 +3242,7 @@ msgstr "Штат" #. module: crm #: model:process.transition,note:crm.process_transition_leadopportunity0 msgid "Creating business opportunities from Leads" -msgstr "Создание сделок из кандидатов" +msgstr "Создание предложений из кандидатов" #. module: crm #: help:crm.send.mail,html:0 @@ -3248,7 +3257,7 @@ msgstr "Нужна информация" #. module: crm #: model:process.transition,name:crm.process_transition_leadopportunity0 msgid "Prospect Opportunity" -msgstr "Перспективы сделки" +msgstr "Перспективы предложения" #. module: crm #: view:crm.installer:0 @@ -3388,7 +3397,7 @@ msgstr "Ожидаемое закрытие" #. module: crm #: model:ir.model,name:crm.model_crm_opportunity2phonecall msgid "Opportunity to Phonecall" -msgstr "Сделка в звонок" +msgstr "Предложение в звонок" #. module: crm #: help:crm.case.section,allow_unlink:0 @@ -3584,7 +3593,7 @@ msgstr "Нет ID эл. почты в адресе вашей компании!" #. module: crm #: view:crm.lead.report:0 msgid "Opportunities By Stage" -msgstr "Сделки по этапам" +msgstr "Предложения по этапам" #. module: crm #: model:ir.actions.act_window,name:crm.crm_case_categ_phone_create_partner @@ -3607,7 +3616,7 @@ msgid "" "cycle." msgstr "" "Добавление специальных этапов, которые будут помогать лучше организовывать " -"процесс продаж. Этапы позволяют легче отслеживать положение сделок в " +"процесс продаж. Этапы позволяют легче отслеживать положение предложений в " "процессе продаж." #. module: crm @@ -3671,7 +3680,7 @@ msgstr "Вы не можете иметь двух одинаковых поль #: code:addons/crm/wizard/crm_merge_opportunities.py:100 #, python-format msgid "Merged into Opportunity: %s" -msgstr "Объединено со сделкой: %s" +msgstr "Объединено с предложением: %s" #. module: crm #: code:addons/crm/crm.py:347 @@ -3781,7 +3790,7 @@ msgstr "Интерес к аксессуарам" #: code:addons/crm/crm_lead.py:211 #, python-format msgid "The opportunity '%s' has been opened." -msgstr "Сделка '%s' была открыта." +msgstr "Предложение '%s' было открыто." #. module: crm #: field:crm.lead.report,email:0 @@ -3796,7 +3805,7 @@ msgstr "Улица" #. module: crm #: view:crm.lead.report:0 msgid "Opportunities by User and Team" -msgstr "Сделки по пользователям и отделам" +msgstr "Предложения по пользователям и отделам" #. module: crm #: field:crm.case.section,working_hours:0 @@ -3843,7 +3852,7 @@ msgstr "Страна" #: view:crm.phonecall:0 #: view:res.partner:0 msgid "Convert to Opportunity" -msgstr "Преобразовать в сделку" +msgstr "Преобразовать в предложение" #. module: crm #: selection:crm.meeting,week_list:0 @@ -3870,7 +3879,7 @@ msgstr "Звонки по пользователям и секциям" #. module: crm #: selection:crm.lead2opportunity.action,name:0 msgid "Merge with existing Opportunity" -msgstr "Объединить с существующей сделкой" +msgstr "Объединить с существующим предложением" #. module: crm #: field:crm.meeting,select1:0 diff --git a/addons/crm_partner_assign/i18n/ru.po b/addons/crm_partner_assign/i18n/ru.po index 159ca6d6dd8..2f0f0b950ae 100644 --- a/addons/crm_partner_assign/i18n/ru.po +++ b/addons/crm_partner_assign/i18n/ru.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2011-01-11 11:15+0000\n" -"PO-Revision-Date: 2011-03-14 19:21+0000\n" +"PO-Revision-Date: 2011-03-23 13:46+0000\n" "Last-Translator: Chertykov Denis \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-03-15 04:55+0000\n" +"X-Launchpad-Export-Date: 2011-03-24 04:50+0000\n" "X-Generator: Launchpad (build 12559)\n" #. module: crm_partner_assign @@ -281,7 +281,7 @@ msgstr "Назначение партнера" #. module: crm_partner_assign #: help:crm.lead.report.assign,type:0 msgid "Type is used to separate Leads and Opportunities" -msgstr "Тип используется для разделения кандидатов и сделок" +msgstr "Тип используется для разделения кандидатов и предложений" #. module: crm_partner_assign #: selection:crm.lead.report.assign,month:0 @@ -308,7 +308,7 @@ msgstr "" #. module: crm_partner_assign #: view:crm.lead.report.assign:0 msgid "Opportunities Assignment Analysis" -msgstr "Анализ распределения сделок" +msgstr "Анализ распределения предложений" #. module: crm_partner_assign #: view:res.partner:0 @@ -397,7 +397,7 @@ msgstr "Категория" #. module: crm_partner_assign #: view:crm.lead.report.assign:0 msgid "#Opportunities" -msgstr "# Сделок" +msgstr "# Предложений" #. module: crm_partner_assign #: model:ir.module.module,shortdesc:crm_partner_assign.module_meta_information @@ -431,7 +431,7 @@ msgstr "Закрыто" #: view:res.partner:0 #: field:res.partner,opportunity_assigned_ids:0 msgid "Assigned Opportunities" -msgstr "Назначенные сделки" +msgstr "Назначенные предложения" #. module: crm_partner_assign #: field:crm.lead,date_assign:0 @@ -622,7 +622,7 @@ msgstr "Адрес" #. module: crm_partner_assign #: selection:crm.lead.report.assign,type:0 msgid "Opportunity" -msgstr "Сделка" +msgstr "Предложение" #. module: crm_partner_assign #: field:crm.lead.report.assign,partner_id:0 @@ -648,7 +648,7 @@ msgstr "Страна" #. module: crm_partner_assign #: view:res.partner:0 msgid "Convert to Opportunity" -msgstr "Преобразовать в сделку" +msgstr "Преобразовать в предложение" #. module: crm_partner_assign #: view:crm.lead:0 diff --git a/addons/mrp/i18n/ro.po b/addons/mrp/i18n/ro.po index 5f81dd55fcd..3bdf42116e0 100644 --- a/addons/mrp/i18n/ro.po +++ b/addons/mrp/i18n/ro.po @@ -7,13 +7,13 @@ msgstr "" "Project-Id-Version: OpenERP Server 6.0dev\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2011-01-11 11:15+0000\n" -"PO-Revision-Date: 2011-03-09 21:08+0000\n" +"PO-Revision-Date: 2011-03-23 12:20+0000\n" "Last-Translator: Dorin \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-03-12 05:01+0000\n" +"X-Launchpad-Export-Date: 2011-03-24 04:49+0000\n" "X-Generator: Launchpad (build 12559)\n" #. module: mrp @@ -80,7 +80,7 @@ msgstr "" #: field:mrp.production,picking_id:0 #: field:mrp.production.order,picking_id:0 msgid "Picking list" -msgstr "Lista de preluare" +msgstr "Listă de preluare" #. module: mrp #: code:addons/mrp/report/price.py:121 @@ -365,7 +365,7 @@ msgstr "Octombrie" #: code:addons/mrp/report/price.py:177 #, python-format msgid "Components Cost of " -msgstr "" +msgstr "Costul componentelor " #. module: mrp #: model:process.transition,name:mrp.process_transition_procurestockableproduct0 @@ -843,7 +843,7 @@ msgstr "Urgent" #. module: mrp #: model:ir.model,name:mrp.model_mrp_routing_workcenter msgid "Work Center Usage" -msgstr "" +msgstr "Utilizare post de lucru" #. module: mrp #: model:ir.model,name:mrp.model_mrp_production @@ -1722,7 +1722,7 @@ msgstr "Produse fabricate" #: field:mrp.production,date_finished:0 #: field:mrp.production.order,date_finished:0 msgid "End Date" -msgstr "Data de sfîrșit" +msgstr "Dată de sfârșit" #. module: mrp #: field:mrp.workcenter,resource_id:0 diff --git a/addons/sale/i18n/ru.po b/addons/sale/i18n/ru.po index 44c96226c3d..81c1b81fac3 100644 --- a/addons/sale/i18n/ru.po +++ b/addons/sale/i18n/ru.po @@ -7,13 +7,13 @@ msgstr "" "Project-Id-Version: OpenERP Server 6.0dev\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2011-01-11 11:16+0000\n" -"PO-Revision-Date: 2011-03-20 10:02+0000\n" +"PO-Revision-Date: 2011-03-23 14:07+0000\n" "Last-Translator: Chertykov Denis \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-03-21 04:46+0000\n" +"X-Launchpad-Export-Date: 2011-03-24 04:50+0000\n" "X-Generator: Launchpad (build 12559)\n" #. module: sale @@ -144,6 +144,14 @@ msgid "" "configuration of the sales order, a draft invoice will be generated so that " "you just have to confirm it when you want to bill your customer." msgstr "" +"Заказы на продажу помогают вам управлять запросами/предложениями цен и " +"заказами от клиентов. OpenERP предполагает, что вы начинаете с создания " +"запроса/предложения цен. Как только это подтверждается, запрос/предложение " +"цен будет преобразован в заказ на продажу. OpenERP может обрабатывать " +"множество видов ТМЦ так, что заказ может вызвать выполнение задач, доставку " +"заказов, заказы на производство, закупки и так далее. В зависимости от вида " +"заказа на продажу, черновик счета будет создан и вы просто должны " +"подтвердить его в случае выставления счета заказчику." #. module: sale #: help:sale.order,invoice_quantity:0 diff --git a/addons/sale_crm/i18n/ru.po b/addons/sale_crm/i18n/ru.po index 472a50ccddf..44d6a930a7d 100644 --- a/addons/sale_crm/i18n/ru.po +++ b/addons/sale_crm/i18n/ru.po @@ -7,13 +7,13 @@ msgstr "" "Project-Id-Version: OpenERP Server 6.0dev\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2011-01-11 11:16+0000\n" -"PO-Revision-Date: 2011-03-20 14:00+0000\n" +"PO-Revision-Date: 2011-03-23 13:50+0000\n" "Last-Translator: Chertykov Denis \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-03-21 04:46+0000\n" +"X-Launchpad-Export-Date: 2011-03-24 04:50+0000\n" "X-Generator: Launchpad (build 12559)\n" #. module: sale_crm @@ -30,7 +30,7 @@ msgstr "Преобразовать в предложение" #: code:addons/sale_crm/wizard/crm_make_sale.py:108 #, python-format msgid "Opportunity '%s' is converted to Quotation." -msgstr "Сделка '%s' преобразована в запрос цен." +msgstr "Gредложение '%s' преобразовано в заказ на продажу." #. module: sale_crm #: code:addons/sale_crm/wizard/crm_make_sale.py:89 @@ -67,7 +67,7 @@ msgid "" msgstr "" "\n" "Этот модуль добавляет действие к одному или нескольким вопросам в CRM.\n" -"Этот действие позволяет создавать заказ на продажу из выбранного вопроса.\n" +"Это действие позволяет создавать заказ на продажу из выбранного вопроса.\n" "Если открыто несколько вопросов, то создается один заказ на один вопрос.\n" "Затем, вопрос закрывается и связывается с созданным заказом на продажу.\n" "Мы советуем вам установить этот модуль, если вы установили модуль CRM и " @@ -111,12 +111,12 @@ msgstr "Преобразовано в коммерческое предложе #: code:addons/sale_crm/wizard/crm_make_sale.py:92 #, python-format msgid "Opportunity: %s" -msgstr "Сделка: %s" +msgstr "Предложение: %s" #. module: sale_crm #: model:ir.module.module,shortdesc:sale_crm.module_meta_information msgid "Creates Sales order from Opportunity" -msgstr "Создает заказ на продажу из сделки" +msgstr "Создает заказ на продажу из предложения" #. module: sale_crm #: model:ir.actions.act_window,name:sale_crm.action_quotation_for_sale_crm @@ -131,7 +131,7 @@ msgstr "Магазин" #. module: sale_crm #: view:board.board:0 msgid "Opportunities by Stage" -msgstr "Сделки по этапам" +msgstr "Предложения по этапам" #. module: sale_crm #: view:board.board:0 @@ -141,7 +141,7 @@ msgstr "Мои предложения" #. module: sale_crm #: field:crm.make.sale,close:0 msgid "Close Opportunity" -msgstr "Закрыть сделку" +msgstr "Закрыть предложение" #. module: sale_crm #: view:sale.order:0 diff --git a/addons/sale_order_dates/i18n/ru.po b/addons/sale_order_dates/i18n/ru.po index 99bcc5e1eb6..8c78824cb26 100644 --- a/addons/sale_order_dates/i18n/ru.po +++ b/addons/sale_order_dates/i18n/ru.po @@ -8,19 +8,19 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2011-01-11 11:16+0000\n" -"PO-Revision-Date: 2011-01-20 08:51+0000\n" +"PO-Revision-Date: 2011-03-23 13:53+0000\n" "Last-Translator: Chertykov Denis \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-01-21 04:41+0000\n" -"X-Generator: Launchpad (build 12177)\n" +"X-Launchpad-Export-Date: 2011-03-24 04:50+0000\n" +"X-Generator: Launchpad (build 12559)\n" #. module: sale_order_dates #: sql_constraint:sale.order:0 msgid "Order Reference must be unique !" -msgstr "Ссылка на заказ должна быть уникальной !" +msgstr "Номер заказа должен быть уникальным!" #. module: sale_order_dates #: help:sale.order,requested_date:0 From a51d1c0c4960faa3fd0ab1103230aa13dee227e2 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 24 Mar 2011 08:16:52 +0100 Subject: [PATCH 36/47] [FIX] trailing comma bzr revid: xmo@openerp.com-20110324071652-8i6rnyb9drkmsbb5 --- addons/base/static/openerp/js/base_views.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/base/static/openerp/js/base_views.js b/addons/base/static/openerp/js/base_views.js index b9ee746f081..9fb79ca962d 100644 --- a/addons/base/static/openerp/js/base_views.js +++ b/addons/base/static/openerp/js/base_views.js @@ -99,7 +99,7 @@ openerp.base.Action = openerp.base.Controller.extend({ on_remove: function() { }, on_edit: function() { - }, + } }); // Extends view manager From 7766fcca6215e7bf27bf436ee484c8beb0d0eaad Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Thu, 24 Mar 2011 10:50:12 +0100 Subject: [PATCH 37/47] [REF] renamed openerp-server.py to openerp-server. bzr revid: vmt@openerp.com-20110324095012-a5joofz60zrhbit5 --- bin/openerp-server.py | 2 +- openerp-server.py => openerp-server | 0 openerp/addons/base_quality_interrogation.py | 2 +- openerp/osv/orm.py | 2 +- setup.README | 2 +- setup.py | 4 ++-- 6 files changed, 6 insertions(+), 6 deletions(-) rename openerp-server.py => openerp-server (100%) diff --git a/bin/openerp-server.py b/bin/openerp-server.py index b31dbd1e6a5..c61a22858c0 100755 --- a/bin/openerp-server.py +++ b/bin/openerp-server.py @@ -14,6 +14,6 @@ if __name__ == "__main__": os.chdir(os.path.normpath(os.path.dirname(__file__))) os.chdir('..') # ... and execute the new executable. - os.execv('openerp-server.py', sys.argv) + os.execv('openerp-server', sys.argv) # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/openerp-server.py b/openerp-server similarity index 100% rename from openerp-server.py rename to openerp-server diff --git a/openerp/addons/base_quality_interrogation.py b/openerp/addons/base_quality_interrogation.py index fe5bc27811b..ae49996ec95 100755 --- a/openerp/addons/base_quality_interrogation.py +++ b/openerp/addons/base_quality_interrogation.py @@ -49,7 +49,7 @@ def to_decode(s): return s def start_server(root_path, port, netport, addons_path): - os.system('python2.5 %sopenerp-server.py --pidfile=openerp.pid --no-xmlrpcs --xmlrpc-port=%s --netrpc-port=%s --addons-path=%s' %(root_path, str(port),str(netport),addons_path)) + os.system('python2.5 %sopenerp-server --pidfile=openerp.pid --no-xmlrpcs --xmlrpc-port=%s --netrpc-port=%s --addons-path=%s' %(root_path, str(port),str(netport),addons_path)) def clean(): if os.path.isfile('openerp.pid'): ps = open('openerp.pid') diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index c2e5743099b..9ecf547969f 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -2690,7 +2690,7 @@ class orm(orm_template): self._table, k) except Exception: msg = "WARNING: unable to set column %s of table %s not null !\n"\ - "Try to re-run: openerp-server.py --update=module\n"\ + "Try to re-run: openerp-server --update=module\n"\ "If it doesn't work, update records and execute manually:\n"\ "ALTER TABLE %s ALTER COLUMN %s SET NOT NULL" self.__logger.warn(msg, k, self._table, self._table, k) diff --git a/setup.README b/setup.README index 4432e5bd1a6..5ee564ecfb4 100644 --- a/setup.README +++ b/setup.README @@ -24,4 +24,4 @@ This file should/will be moved on a proper documentation place later. - Run the main script, again specifying the PYTHONPATH: > PYTHONPATH=/home/openerp/openerp-tmp/lib/python2.6/site-packages/ \ - bin/openerp-server.py + /home/openerp/openerp-tmp/bin/openerp-server diff --git a/setup.py b/setup.py index f90e52da3f3..76c59126e73 100755 --- a/setup.py +++ b/setup.py @@ -74,7 +74,7 @@ py2exe_data_files = [] if os.name == 'nt': import py2exe py2exe_keywords['console'] = [ - { "script": "openerp-server.py", + { "script": "openerp-server", "icon_resources": [(1, join("pixmaps","openerp-icon.ico"))], }] py2exe_keywords['options'] = { @@ -123,7 +123,7 @@ setup(name = name, (join('man', 'man5'), ['man/openerp_serverrc.5']), ('doc', filter(isfile, glob.glob('doc/*'))), ] + py2exe_data_files, - scripts = ['openerp-server.py'], + scripts = ['openerp-server'], packages = find_packages(), include_package_data = True, package_data = { From cee122bcfbc2f5c42cfad57304f92c35c401105d Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Thu, 24 Mar 2011 12:12:12 +0100 Subject: [PATCH 38/47] [FIX] analytic: fixed the constraint on currencies on analytic accounts in order to be compliant with analytic accounts that doesn't belong to a company and for which we should be able to set any currency (no constraint in that case, otherwise it has to be the same as company) bzr revid: qdp-launchpad@openerp.com-20110324111212-bal82qcrdhc0pyzh --- addons/analytic/analytic.py | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/addons/analytic/analytic.py b/addons/analytic/analytic.py index 77ec4c153c0..ee458ca0076 100644 --- a/addons/analytic/analytic.py +++ b/addons/analytic/analytic.py @@ -133,23 +133,18 @@ class account_analytic_account(osv.osv): if type(ids) != type([]): ids=[ids] for account in self.browse(cr, uid, ids, context=context): - if not value: - cr.execute("""update account_analytic_account set - currency_id=NULL where id=%s""", (account.id, )) - elif account.company_id.currency_id.id == value: - cr.execute("""update account_analytic_account set - currency_id=%s where id=%s""", (value, account.id, )) - else: - raise osv.except_osv(_('Error !'), _("The currency has to be the same as the currency of the analytic account's company or empty.")) - return True + if account.company_id: + if account.company_id.currency_id.id != value: + raise osv.except_osv(_('Error !'), _("If you set a company, the currency selected has to be the same as it's currency. \nYou can remove the company belonging, and thus change the currency, only on analytic account of type 'view'. This can be really usefull for consolidation purposes of several companies charts with different currencies, for example.")) + return cr.execute("""update account_analytic_account set currency_id=%s where id=%s""", (value, account.id, )) def _currency(self, cr, uid, ids, field_name, arg, context=None): result = {} for rec in self.browse(cr, uid, ids, context=context): - if not rec.currency_id.id: - result[rec.id] = False - else: + if rec.company_id: result[rec.id] = rec.company_id.currency_id.id + else: + result[rec.id] = rec.currency_id.id return result _columns = { From 506a85c80e4de6ccd71bf33e71e086b5ee10d26b Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Thu, 24 Mar 2011 17:31:14 +0100 Subject: [PATCH 39/47] viewmanager part1 bzr revid: al@openerp.com-20110324163114-dvoi8l3nzmut5y63 --- addons/base/controllers/main.py | 2 + addons/base/static/openerp/base.xml | 25 +++-- addons/base/static/openerp/js/base_chrome.js | 2 +- addons/base/static/openerp/js/base_views.js | 111 +++++++++---------- 4 files changed, 70 insertions(+), 70 deletions(-) diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index 11db3d3a5c2..af790ad1357 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -156,8 +156,10 @@ class Menu(openerpweb.Controller): @openerpweb.jsonrequest def action(self, req, menu_id): + print "QUERY" m = req.session.model('ir.values') r = m.get('action', 'tree_but_open', [('ir.ui.menu', menu_id)], False, {}) + print r res = {"action": r} return res diff --git a/addons/base/static/openerp/base.xml b/addons/base/static/openerp/base.xml index c416d9cf093..094b732a928 100644 --- a/addons/base/static/openerp/base.xml +++ b/addons/base/static/openerp/base.xml @@ -124,6 +124,21 @@ + + +
+ + + + +
+
+ +
+
+
-
- - -
- -
-
-
diff --git a/addons/base/static/openerp/js/base_chrome.js b/addons/base/static/openerp/js/base_chrome.js index 08b69db7e6f..dedcdd0e61a 100644 --- a/addons/base/static/openerp/js/base_chrome.js +++ b/addons/base/static/openerp/js/base_chrome.js @@ -542,7 +542,7 @@ openerp.base.WebClient = openerp.base.Controller.extend({ this.menu.start(); }, on_loggued: function() { - this.action = new openerp.base.Action(this.session, "oe_application"); + this.action = new openerp.base.ActionManager(this.session, "oe_application"); this.action.start(); }, on_menu_action: function(action) { diff --git a/addons/base/static/openerp/js/base_views.js b/addons/base/static/openerp/js/base_views.js index 9fb79ca962d..913456053d3 100644 --- a/addons/base/static/openerp/js/base_views.js +++ b/addons/base/static/openerp/js/base_views.js @@ -6,12 +6,28 @@ openerp.base$views = function(openerp) { // process all kind of actions openerp.base.ActionManager = openerp.base.Controller.extend({ -// This controller should be used for one2many also or not ? -// to replace Action + init: function(session, element_id) { + this._super(session, element_id); + this.action = null; + this.viewmanager = null; + }, + /** + * Process an action + * Supported actions: act_window + */ + do_action: function(action) { + // instantiate the right controllers by understanding the action + this.action = action; + if(action.type == "ir.actions.act_window") { + this.viewmanager = new openerp.base.ViewManager(this.session,this.element_id); + this.viewmanager.do_action_window(action); + this.viewmanager.start(); + } + }, }); // This will be ViewManager Abstract/Common -openerp.base.Action = openerp.base.Controller.extend({ +openerp.base.ViewManager = openerp.base.Controller.extend({ init: function(session, element_id) { this._super(session, element_id); this.action = null; @@ -19,79 +35,56 @@ openerp.base.Action = openerp.base.Controller.extend({ this.searchview_id = false; this.searchview = null; this.search_visible = true; - - // this will be changed into // this.views = { "list": { "view_id":1234, "controller": instance} } - this.listview_id = false; - this.listview = null; - this.formview_id = false; - this.formview = null; + this.views = {}; }, start: function() { - this.$element.html(QWeb.render("Action", {"prefix":this.element_id})); - this.$element.find("#mode_list").bind('click',this.on_mode_list); - this.$element.find("#mode_form").bind('click',this.on_mode_form); - this.on_mode_list(); }, - // this will be changed into on_view_switch(kind_of_view) - on_mode_list: function() { - $("#oe_action_form").hide(); - $("#oe_action_search").show(); - $("#oe_action_list").show(); - }, - on_mode_form: function() { - $("#oe_action_form").show(); - $("#oe_action_search").hide(); - $("#oe_action_list").hide(); - }, - // This will move to actionmanager - do_action: function(action) { - // instantiate the right controllers by understanding the action - this.action = action; - this.log(action); -// debugger; - //this.log(action); - if(action.type == "ir.actions.act_window") { - this.do_action_window(action); + on_mode_switch: function(view_type) { + for (var i in this.views) { + if(i == view_type) { + this.views.i.controller.$element.show(); + } else { + this.views.i.controller.$element.hide(); + } } }, - // this will be renamed setup_view_manager_from_an_actwindow and will setup this.views do_action_window: function(action) { - // this will move into set_dataset() + var self = this; + var prefix_id = "#" + this.element_id; + this.action = action; this.dataset = new openerp.base.DataSet(this.session, action.res_model); this.dataset.start(); + this.$element.html(QWeb.render("ViewManager", {"prefix": this.element_id, views: action.views})); + this.searchview_id = false; - if(this.listview && action.search_view_id) { + if(this.search_visible && action.search_view_id) { this.searchview_id = action.search_view_id[0]; + this.searchview = new openerp.base.SearchView(this.session, this.element_id + "_search", this.dataset, this.searchview_id); + this.searchview.start(); } - this.searchview = new openerp.base.SearchView(this.session, "oe_action_search", this.dataset, this.searchview_id); - this.searchview.start(); - - // Those two will be a foreach kind of view - - // Locate first tree view - this.listview_id = false; for(var i = 0; i < action.views.length; i++) { + var view_id, controller; + view_id = action.views[i][0]; if(action.views[i][1] == "tree") { - this.listview_id = action.views[i][0]; - break; + controller = new openerp.base.ListView(this.session, this.element_id + "_view_tree", this.dataset, view_id); + controller.start(); + this.views.tree = { view_id: view_id, controller: controller }; + this.$element.find(prefix_id + "_button_tree").bind('click',function(){ + this.on_mode_switch("tree"); + }); + } else if(action.views[i][1] == "form") { + controller = new openerp.base.FormView(this.session, this.element_id + "_view_form", this.dataset, view_id); + controller.start(); + this.views.form = { view_id: view_id, controller: controller }; + this.$element.find(prefix_id + "_button_form").bind('click',function(){ + this.on_mode_switch("form"); + }); } } - this.listview = new openerp.base.ListView(this.session, "oe_action_list", this.dataset, this.listview_id); - this.listview.start(); - - // Locate first form view - this.formview_id = false; - for(var j = 0; j < action.views.length; j++) { - if(action.views[j][1] == "form") { - this.formview_id = action.views[j][0]; - break; - } - } - this.formview = new openerp.base.FormView(this.session, "oe_action_form", this.dataset, this.formview_id); - this.formview.start(); - + // switch to the first one in sequence + this.on_mode_switch("tree"); }, // create when root, also add to parent when o2m on_create: function() { From cce35c01e1529f73e4584ea2444d544f6396fe16 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Thu, 24 Mar 2011 17:34:49 +0100 Subject: [PATCH 40/47] viewmanager typo bzr revid: al@openerp.com-20110324163449-26amfxhsx03h72jg --- addons/base/static/openerp/js/base_views.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/base/static/openerp/js/base_views.js b/addons/base/static/openerp/js/base_views.js index 913456053d3..5032967c3c7 100644 --- a/addons/base/static/openerp/js/base_views.js +++ b/addons/base/static/openerp/js/base_views.js @@ -43,9 +43,9 @@ openerp.base.ViewManager = openerp.base.Controller.extend({ on_mode_switch: function(view_type) { for (var i in this.views) { if(i == view_type) { - this.views.i.controller.$element.show(); + this.views[i].controller.$element.show(); } else { - this.views.i.controller.$element.hide(); + this.views[i].controller.$element.hide(); } } }, @@ -72,14 +72,14 @@ openerp.base.ViewManager = openerp.base.Controller.extend({ controller.start(); this.views.tree = { view_id: view_id, controller: controller }; this.$element.find(prefix_id + "_button_tree").bind('click',function(){ - this.on_mode_switch("tree"); + self.on_mode_switch("tree"); }); } else if(action.views[i][1] == "form") { controller = new openerp.base.FormView(this.session, this.element_id + "_view_form", this.dataset, view_id); controller.start(); this.views.form = { view_id: view_id, controller: controller }; this.$element.find(prefix_id + "_button_form").bind('click',function(){ - this.on_mode_switch("form"); + self.on_mode_switch("form"); }); } } From 196f6f6ec8f0319ddccc4aff1580a272e2179525 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 24 Mar 2011 21:08:58 +0100 Subject: [PATCH 41/47] [FIX] Using js keywords for object keys is a bad idea (of fme) bzr revid: fme@openerp.com-20110324200858-36lh8ioqdd2m6su1 --- addons/base/static/openerp/base.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/base/static/openerp/base.xml b/addons/base/static/openerp/base.xml index 094b732a928..4ea928f26a3 100644 --- a/addons/base/static/openerp/base.xml +++ b/addons/base/static/openerp/base.xml @@ -206,9 +206,9 @@ - -