[MERGE] trunk
authorAntony Lesuisse <al@openerp.com>
Wed, 24 Aug 2011 16:09:36 +0000 (18:09 +0200)
committerAntony Lesuisse <al@openerp.com>
Wed, 24 Aug 2011 16:09:36 +0000 (18:09 +0200)
bzr revid: al@openerp.com-20110824160936-ej26wcvgvku3lkm7

1  2 
openerp/addons/base/ir/ir_model.py
openerp/addons/base/ir/ir_rule.py
openerp/addons/base/res/res_company.py
openerp/addons/base/res/res_lang.py
openerp/addons/base/res/res_user.py
openerp/osv/orm.py
openerp/tools/misc.py
setup.py

@@@ -450,7 -449,23 +449,24 @@@ class ir_model_access(osv.osv)
          # pass no groups -> no access
          return False
  
+     def group_names_with_access(self, cr, model_name, access_mode):
+         """Returns the names of visible groups which have been granted ``access_mode`` on
+            the model ``model_name``.
+            :rtype: list
+         """
+         assert access_mode in ['read','write','create','unlink'], 'Invalid access mode: %s' % access_mode
+         cr.execute('''SELECT
+                         g.name
+                       FROM
+                         ir_model_access a
+                         JOIN ir_model m ON (a.model_id=m.id)
+                         JOIN res_groups g ON (a.group_id=g.id)
+                       WHERE
+                         m.model=%s AND
+                         a.perm_''' + access_mode, (model_name,))
+         return [x[0] for x in cr.fetchall()]
 +    @tools.ormcache()
      def check(self, cr, uid, model, mode='read', raise_exception=True, context=None):
          if uid==1:
              # User root have all accesses
@@@ -83,18 -99,7 +99,7 @@@ class ir_rule(osv.osv)
          (_check_model_obj, 'Rules are not supported for osv_memory objects !', ['model_id'])
      ]
  
-     def domain_create(self, cr, uid, rule_ids):
-         count = 0
-         dom = []
-         for rule in self.browse(cr, uid, rule_ids):
-             if rule.domain:
-                 dom += rule.domain
-                 count += 1
-         if count:
-             return ['&'] * (count-1) + dom
-         return []
 -    @tools.cache()
 +    @tools.ormcache()
      def _compute_domain(self, cr, uid, model_name, mode="read"):
          if mode not in self._MODES:
              raise ValueError('Invalid mode: %r' % (mode,))
@@@ -127,12 -189,7 +189,7 @@@ class res_company(osv.osv)
                  return rule.company_dest_id.id
          return user.company_id.id
  
-     def _get_child_ids(self, cr, uid, uid2, context={}):
-         company = self.pool.get('res.users').company_get(cr, uid, uid2)
-         ids = self._get_company_children(cr, uid, company)
-         return ids
 -    @tools.cache()
 +    @tools.ormcache()
      def _get_company_children(self, cr, uid=None, company=None):
          if not company:
              return []
Simple merge
Simple merge
Simple merge
@@@ -622,8 -628,14 +628,13 @@@ class UpdateableDict(local)
      def __ne__(self, y):
          return self.dict.__ne__(y)
  
- # Don't use ! Use res.currency.round()
 -
  class currency(float):
+     """ Deprecate
+     
+     .. warning::
+     
+     Don't use ! Use res.currency.round()
+     """
  
      def __init__(self, value, accuracy=2, rounding=None):
          if rounding is None:
diff --cc setup.py
index 1255bf8,91248a0..e36662b
mode 100644,100644..100755
+++ b/setup.py
++#!/usr/bin/env python
++# -*- coding: utf-8 -*-
++##############################################################################
++#
++#    OpenERP, Open Source Management Solution
++#    Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
++#
++#    This program is free software: you can redistribute it and/or modify
++#    it under the terms of the GNU Affero 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 Affero General Public License for more details.
++#
++#    You should have received a copy of the GNU Affero General Public License
++#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
++#
++##############################################################################
++
++# setup from TinERP
++#   taken from straw http://www.nongnu.org/straw/index.html
++#   taken from gnomolicious http://www.nongnu.org/gnomolicious/
++#   adapted by Nicolas Évrard <nicoe@altern.org>
++#
++# 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 os
--import re
  import sys
--from setuptools import setup
++import os
++from os.path import join, isfile
++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
  
--name = 'openerp-web-proto'
--version = '6.0.1'
--description = "Web Client of OpenERP, the Enterprise Management Software"
--long_description = "OpenERP Web is the web client of the OpenERP, a free enterprise management software"
--author = "OpenERP S.A."
--author_email = "info@openerp.com"
--support_email = 'support@openerp.com'
--url = "http://www.openerp.com/"
--download_url = ''
--license = "OEPL"
++    dirs, nondirs = [], []
++    for name in names:
++        if isdir(join(top, name)):
++            dirs.append(name)
++        else:
++            nondirs.append(name)
  
--version_dash_incompatible = False
--if 'bdist_rpm' in sys.argv:
--    version_dash_incompatible = True
--try:
++    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
--    from py2exe_utils import opts
--    version_dash_incompatible = True
--except ImportError:
--    opts = {}
--if version_dash_incompatible:
--    version = version.split('-')[0]
++    py2exe_keywords['console'] = [
++        { "script": "openerp-server",
++          "icon_resources": [(1, join("pixmaps","openerp-icon.ico"))],
++        }]
++    py2exe_keywords['options'] = {
++        "py2exe": {
++            "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", "pychart", "PIL", "pyparsing",
++                "pydot", "asyncore","asynchat", "reportlab", "vobject",
++                "HTMLParser", "select", "mako", "poplib",
++                "imaplib", "smtplib", "email", "yaml", "DAV",
++                "uuid", "commands", "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'),]))
++
++        # copy pytz/timzeone
++        # TODO check if we have to also copy dateutil's timezone data.
++        import pytz
++        # Make sure the layout of pytz hasn't changed
++        assert (pytz.__file__.endswith('__init__.pyc') or
++                pytz.__file__.endswith('__init__.py')), pytz.__file__
++        pytz_dir = os.path.dirname(pytz.__file__)
  
--FILE_PATTERNS = \
--    r'.+\.(py|cfg|po|pot|mo|txt|rst|gif|png|jpg|ico|mako|html|js|css|htc|swf)$'
--def find_data_files(source, patterns=FILE_PATTERNS):
--    file_matcher = re.compile(patterns, re.I)
--    out = []
--    for base, _, files in os.walk(source):
--        cur_files = []
--        for f in files:
--            if file_matcher.match(f):
--                cur_files.append(os.path.join(base, f))
--        if cur_files:
--            out.append(
--                (base, cur_files))
++        saved_dir = os.getcwd()
++        os.chdir(pytz_dir)
++        for dp, dn, names in os.walk('zoneinfo'):
++            files.append((join('pytz',dp), map(lambda x: join(pytz_dir, dp, x), names)))
++        os.chdir(saved_dir)
  
--    return out
++        return files
++    py2exe_data_files = data_files()
  
--setup(
--    name=name,
--    version=version,
--    description=description,
--    long_description=long_description,
--    author=author,
--    author_email=author_email,
--    url=url,
--    download_url=download_url,
--    license=license,
--    install_requires=[
--        "CherryPy >= 3.1.2",
-         "Babel >= 0.9.4",
-         "simplejson >= 2.0.9",
-         "python-dateutil >= 1.4.1",
-         "pytz",
-     ],
-     tests_require=[
-         'unittest2',
-         'mock',
-     ],
-     test_suite = 'unittest2.collector',
-     zip_safe=False,
-     packages=[
-         'addons',
-         'addons.base',
-         'addons.base.controllers',
-         'addons.base_calendar',
-         'addons.base_hello',
-         'openerpweb',
-     ],
-     classifiers=[
-         'Development Status :: 6 - Production/Stable',
-         'Operating System :: OS Independent',
-         'Programming Language :: Python',
-         'Environment :: Web Environment',
-         'Topic :: Office/Business :: Financial',
-         ],
-     scripts=['scripts/openerp-web'],
-     data_files=(find_data_files('addons')
-               + opts.pop('data_files', [])
-     ),
-     **opts
 -        "Babel >= 0.9.6",
 -        "simplejson >= 2.0.9",
 -        "python-dateutil >= 1.4.1",
 -        "pytz",
 -    ],
 -    tests_require=[
 -        'unittest2',
 -        'mock',
 -    ],
 -    test_suite = 'unittest2.collector',
 -    zip_safe=False,
 -    packages=[
 -        'addons',
 -        'addons.base',
 -        'addons.base.controllers',
 -        'addons.base_calendar',
 -        'addons.base_hello',
 -        'openerpweb',
 -    ],
 -    classifiers=[
 -        'Development Status :: 6 - Production/Stable',
 -        'Operating System :: OS Independent',
 -        'Programming Language :: Python',
 -        'Environment :: Web Environment',
 -        'Topic :: Office/Business :: Financial',
 -        ],
 -    scripts=['scripts/openerp-web'],
 -    data_files=(find_data_files('addons')
 -              + opts.pop('data_files', [])
 -    ),
 -    **opts
++execfile(join('openerp', 'release.py'))
++
++setup(name             = name,
++      version          = version,
++      description      = description,
++      long_description = long_desc,
++      url              = url,
++      author           = author,
++      author_email     = author_email,
++      classifiers      = filter(None, classifiers.split("\n")),
++      license          = license,
++      data_files       = [
++        (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'],
++      packages = find_packages(),
++      include_package_data = True,
++      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',
++        # 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',
++          'caldav',
++          'pyyaml',
++          'pywebdav',
++          'feedparser',
++          'simplejson >= 2.0',
++      ],
++      extras_require = {
++          'SSL' : ['pyopenssl'],
++      },
++      **py2exe_keywords
  )
++