diff --git a/bin/addons/base/ir/ir_model.py b/bin/addons/base/ir/ir_model.py
index b5d4fa20875..69729317471 100644
--- a/bin/addons/base/ir/ir_model.py
+++ b/bin/addons/base/ir/ir_model.py
@@ -40,10 +40,10 @@ class ir_model(osv.osv):
_rec_name = 'name'
_columns = {
'name': fields.char('Object Name', size=64, translate=True, required=True),
- 'model': fields.char('Object Name', size=64, required=True, search=1),
+ 'model': fields.char('Object Name', size=64, required=True, select=1),
'info': fields.text('Information'),
'field_id': fields.one2many('ir.model.fields', 'model_id', 'Fields', required=True),
- 'state': fields.selection([('manual','Custom Object'),('base','Base Object')],'Manualy Created',readonly=1),
+ 'state': fields.selection([('manual','Custom Object'),('base','Base Object')],'Manualy Created',readonly=True),
'access_ids': fields.one2many('ir.model.access', 'model_id', 'Access'),
}
_defaults = {
@@ -94,18 +94,19 @@ ir_model()
class ir_model_grid(osv.osv):
_name = 'ir.model.grid'
_table = 'ir_model'
+ _inherit = 'ir.model'
_description = "Objects Security Grid"
- _rec_name = 'name'
- _columns = {
- 'name': fields.char('Object', size=64),
- 'model': fields.char('Object Name', size=64),
- }
+ #_rec_name = 'name'
+ #_columns = {
+ # 'name': fields.char('Object', size=64),
+ # 'model': fields.char('Object Name', size=64),
+ #}
def create(self, cr, uid, vals, context=None):
raise osv.except_osv('Error !', 'You cannot add an entry to this view !')
def unlink(self, *args, **argv):
- raise osv.except_osv('Error !', 'You cannot add an entry to this view !')
+ raise osv.except_osv('Error !', 'You cannot delete an entry of this view !')
def read(self, cr, uid, ids, fields=None, context=None, load='_classic_read'):
result = super(osv.osv, self).read(cr, uid, ids, fields, context, load)
diff --git a/bin/addons/base/module/module_wizard.xml b/bin/addons/base/module/module_wizard.xml
index 2b993f13dd4..7f86447201c 100644
--- a/bin/addons/base/module/module_wizard.xml
+++ b/bin/addons/base/module/module_wizard.xml
@@ -22,6 +22,12 @@
+
+ Create RST Technical Guide
+ tech.guide.rst
+
+
+
Export a Translation File
wizard.module.lang.export
diff --git a/bin/addons/base/module/wizard/__init__.py b/bin/addons/base/module/wizard/__init__.py
index 63c49313c66..8c799d1bc61 100644
--- a/bin/addons/base/module/wizard/__init__.py
+++ b/bin/addons/base/module/wizard/__init__.py
@@ -28,6 +28,7 @@ import wizard_export_lang
import wizard_import_lang
import wizard_module_import
import wizard_update_translations
+import wizard_tech_guide_rst
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/bin/addons/base/module/wizard/wizard_tech_guide_rst.py b/bin/addons/base/module/wizard/wizard_tech_guide_rst.py
new file mode 100644
index 00000000000..e2a12cf113a
--- /dev/null
+++ b/bin/addons/base/module/wizard/wizard_tech_guide_rst.py
@@ -0,0 +1,241 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2009 Tiny SPRL (). All Rights Reserved
+# $Id$
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+import wizard
+import osv
+import pooler
+import os
+import tools
+
+import zipfile
+from StringIO import StringIO
+import base64
+
+choose_file_form ='''
+
+'''
+
+choose_file_fields = {
+ 'rst_file': {'string': 'file', 'type': 'binary', 'required': True, 'readonly': True},
+ 'name': {'string': 'filename', 'type': 'char', 'required': True, 'readonly': True},
+}
+
+
+class RstDoc(object):
+ def __init__(self, module, objects):
+ self.dico = {
+ 'name': module.name,
+ 'shortdesc': module.shortdesc,
+ 'latest_version': module.latest_version,
+ 'website': module.website,
+ 'description': self._handle_text(module.description),
+ 'report_list': self._handle_list_items(module.reports_by_module),
+ 'menu_list': self._handle_list_items(module.menus_by_module),
+ 'view_list': self._handle_list_items(module.views_by_module),
+ 'depends': module.dependencies_id,
+ }
+ self.objects = objects
+
+ def _handle_list_items(self, list_item_as_string):
+ return [item.replace('*', '\*') for item in list_item_as_string.split('\n')]
+
+ def _handle_text(self, txt):
+ lst = [' %s' % line for line in txt.split('\n')]
+ return '\n'.join(lst)
+
+ def _write_header(self):
+ sl = [
+ "",
+ "Introspection report on objects",
+ "===============================",
+ "",
+ ":Module: %(name)s",
+ ":Name: %(shortdesc)s",
+ ":Version: %(latest_version)s",
+ ":Directory: %(name)s",
+ ":Web: %(website)s",
+ "",
+ "Description",
+ "-----------",
+ "",
+ "::",
+ " ",
+ " %(description)s",
+ ""]
+ return '\n'.join(sl) % (self.dico)
+
+ def _write_reports(self):
+ sl = ["",
+ "Reports",
+ "-------"]
+ for report in self.dico['report_list']:
+ if report:
+ sl.append("")
+ sl.append(" * %s" % report)
+ sl.append("")
+ return '\n'.join(sl)
+
+ def _write_menus(self):
+ sl = ["",
+ "Menus",
+ "-------"]
+ for menu in self.dico['menu_list']:
+ if menu:
+ sl.append("")
+ sl.append(" * %s" % menu)
+
+ sl.append("")
+ return '\n'.join(sl)
+
+ def _write_views(self):
+ sl = ["",
+ "Views",
+ "-----"]
+ for view in self.dico['view_list']:
+ if view:
+ sl.append("")
+ sl.append(" * %s" % view)
+ sl.append("")
+ return '\n'.join(sl)
+
+ def _write_depends(self):
+ sl = ["",
+ "Dependencies",
+ "------------"]
+ for dependency in self.dico['depends']:
+ sl.append("")
+ sl.append(" * %s - %s" % (dependency.name, dependency.state))
+ return '\n'.join(sl)
+
+ def _write_objects(self):
+ # {'fields': [('name', {'translate': True, 'required': True, 'type': 'char', 'string': 'Name', 'size': 64})], 'object': browse_record(ir.model, 87)}
+ def write_field(field_def):
+ field_name = field[0]
+ field_dict = field[1]
+ field_required = field_dict.get('required', '') and ', required'
+ field_readonly = field_dict.get('readonly', '') and ', readonly'
+ s = ""
+ s += ":%s: " % (field_name)
+ s += field_dict.get('string', 'Unknown')
+ s += ", " + field_dict['type']
+ s += field_required
+ s += field_readonly
+ s += " " + field_dict.get('help', '')
+ return s
+
+ sl = ["",
+ "Objects",
+ "-------"]
+ for obj in self.objects:
+ title = obj['object'].name
+ sl.append("")
+ sl.append(title)
+ sl.append('#' * len(title))
+ sl.append("")
+
+ for field in obj['fields']:
+ sl.append("")
+ sl.append(write_field(field))
+ sl.append("")
+
+ return '\n'.join(sl)
+
+ def write(self):
+ s = ''
+ s += self._write_header()
+ s += self._write_reports()
+ s += self._write_menus()
+ s += self._write_views()
+ s += self._write_depends()
+ s += self._write_objects()
+
+ return s
+
+
+class wizard_tech_guide_rst(wizard.interface):
+
+ def _generate(self, cr, uid, data, context):
+ pool = pooler.get_pool(cr.dbname)
+ module_model = pool.get('ir.module.module')
+ module = module_model.browse(cr, uid, data['id'])
+
+ objects = self._get_objects(cr, uid, module)
+ rstdoc = RstDoc(module, objects)
+ out = rstdoc.write()
+
+ return {
+ 'rst_file': base64.encodestring(out),
+ 'name': '%s_technical_guide.rst' % module.name.replace('.', '_')
+ }
+
+## def _object_doc(self, cr, uid, obj):
+## pool = pooler.get_pool(cr.dbname)
+## modobj = pool.get(obj)
+## return modobj.__doc__
+
+ def _get_objects(self, cr, uid, module):
+ res = []
+ objects = self._object_find(cr, uid, module)
+ for obj in objects:
+ dico = {
+ 'object': obj,
+ 'fields': self._fields_find(cr, uid, obj.model)
+ }
+ res.append(dico)
+ return res
+
+ def _object_find(self, cr, uid, module):
+ pool = pooler.get_pool(cr.dbname)
+ ids2 = pool.get('ir.model.data').search(cr, uid, [('module','=',module.name), ('model','=','ir.model')])
+ ids = []
+ for mod in pool.get('ir.model.data').browse(cr, uid, ids2):
+ ids.append(mod.res_id)
+ modobj = pool.get('ir.model')
+ return modobj.browse(cr, uid, ids)
+
+ def _fields_find(self, cr, uid, obj):
+ pool = pooler.get_pool(cr.dbname)
+ modobj = pool.get(obj)
+ res = modobj.fields_get(cr, uid).items()
+ return res
+
+ states = {
+ 'init': {
+ 'actions': [_generate],
+ 'result': {
+ 'type': 'form',
+ 'arch': choose_file_form,
+ 'fields': choose_file_fields,
+ 'state': [
+ ('end', 'Close', 'gtk-close'),
+ ]
+ }
+ },
+ }
+
+wizard_tech_guide_rst('tech.guide.rst')
+
diff --git a/bin/addons/base/res/partner/partner.py b/bin/addons/base/res/partner/partner.py
index 34bc285b6f7..bd5e4234f41 100644
--- a/bin/addons/base/res/partner/partner.py
+++ b/bin/addons/base/res/partner/partner.py
@@ -47,10 +47,10 @@ class res_payterm(osv.osv):
res_payterm()
class res_partner_category(osv.osv):
- def name_get(self, cr, uid, ids, context={}):
+ def name_get(self, cr, uid, ids, context=None):
if not len(ids):
return []
- reads = self.read(cr, uid, ids, ['name','parent_id'], context)
+ reads = self.read(cr, uid, ids, ['name','parent_id'], context=context)
res = []
for record in reads:
name = record['name']
@@ -59,9 +59,10 @@ class res_partner_category(osv.osv):
res.append((record['id'], name))
return res
- def _name_get_fnc(self, cr, uid, ids, prop, unknow_none, unknow_dict):
- res = self.name_get(cr, uid, ids)
+ def _name_get_fnc(self, cr, uid, ids, prop, unknow_none, context=None):
+ res = self.name_get(cr, uid, ids, context=context)
return dict(res)
+
def _check_recursion(self, cr, uid, ids):
level = 100
while len(ids):
diff --git a/bin/release.py b/bin/release.py
index 9c96c3fad75..5fb882d2663 100644
--- a/bin/release.py
+++ b/bin/release.py
@@ -22,7 +22,8 @@
##############################################################################
name = 'openerp-server'
-version = '5.0.0_rc3'
+version = '5.0.0'
+release = '0_rc3'
major_version = '5.0'
description = 'OpenERP Server'
long_desc = '''\
diff --git a/bin/wizard/__init__.py b/bin/wizard/__init__.py
index 84395f06914..495e2344762 100644
--- a/bin/wizard/__init__.py
+++ b/bin/wizard/__init__.py
@@ -64,6 +64,7 @@ class interface(netsvc.Service):
res = {}
try:
state_def = self.states[state]
+
result_def = state_def.get('result', {})
actions_res = {}
diff --git a/rpminstall_sh.txt b/rpminstall_sh.txt
index 0d88cc1dcf1..c184585e94f 100644
--- a/rpminstall_sh.txt
+++ b/rpminstall_sh.txt
@@ -7,8 +7,7 @@
# Need to overwrite the install-part of the RPM to append the
# compression-suffix onto the filenames for the man-pages.
#
-python setup.py install --root=$RPM_BUILD_ROOT --record=INSTALLED_FILES
+python setup.py install --optimize 1 --root=$RPM_BUILD_ROOT --record=INSTALLED_FILES
SUFFIX=gz
-mv INSTALLED_FILES INSTALLED_FILES.orig
-sed "s!\(/share/man/.*\)!\1.$SUFFIX!" INSTALLED_FILES.orig > INSTALLED_FILES
+sed "s!\(/share/man/.*\)!\1.$SUFFIX!" -i INSTALLED_FILES
diff --git a/setup.cfg b/setup.cfg
index caf187e4c33..7770708d9b9 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -5,7 +5,8 @@ formats=gztar
formats=rpm
[bdist_rpm]
-release=1
+# release must exactly match 'release' as set in bin/release.py
+release=0_rc3
requires=python >= 2.3
#build-requires=python-devel >= 2.3
diff --git a/setup.py b/setup.py
index 7c55dd4e2e6..a7c6ecb5f0e 100755
--- a/setup.py
+++ b/setup.py
@@ -44,6 +44,9 @@ opj = os.path.join
execfile(opj('bin', 'release.py'))
+if sys.argv[1] != 'bdist_rpm':
+ version = version + '-' + release
+
# get python short version
py_short_version = '%s.%s' % sys.version_info[:2]