diff --git a/.bzrignore b/.bzrignore index ba5258506be..8531ad42bbb 100644 --- a/.bzrignore +++ b/.bzrignore @@ -1,14 +1,19 @@ -.* -*.egg-info -*.orig -*.vim +.*.swp +.bzrignore +.idea +.project +.pydevproject +.ropeproject +.settings +.DS_Store +openerp/addons/* +openerp/filestore* +.Python +*.pyc +*.pyo +bin/* build/ -RE:^bin/ -RE:^dist/ -RE:^include/ - -RE:^share/ -RE:^man/ -RE:^lib/ - -RE:^doc/_build/ +include/ +lib/ +share/ +doc/_build/* diff --git a/README b/README index e7639e08fed..9449819d766 100644 --- a/README +++ b/README @@ -6,17 +6,9 @@ Customer Relationship Management software. More info at: http://www.openerp.com -Installation on Debian Ubuntu +Installation on Debian/Ubuntu ----------------------------- -Download the deb file and type: - - $ sudo dpkg -i - $ sudo apt-get install install -f - -Installation on Debian Ubuntu from nightly build ------------------------------------------------- - Add the the apt repository deb http://nightly.openerp.com/6.1/deb/ ./ @@ -26,6 +18,11 @@ in your source.list and type: $ sudo apt-get update $ sudo apt-get install openerp +Or download the deb file and type: + + $ sudo dpkg -i + $ sudo apt-get install install -f + Installation on RedHat, Fedora, CentOS -------------------------------------- @@ -42,6 +39,8 @@ Install the openerp rpm Installation on Windows ----------------------- + Check the notes in setup.py + Installation on MacOSX ----------------------- @@ -54,14 +53,7 @@ default master password is "admin". Detailed System Requirements ---------------------------- -You need the following software installed: - - postgresql-client, python-dateutil, python-feedparser, python-gdata, - python-ldap, python-libxslt1, python-lxml, python-mako, python-openid, - python-psycopg2, python-pybabel, python-pychart, python-pydot, - python-pyparsing, python-reportlab, python-simplejson, python-tz, - python-vatnumber, python-vobject, python-webdav, python-werkzeug, python-xlwt, - python-yaml, python-zsi +The dependencies are listed in setup.py For Luxembourg localization, you also need: diff --git a/debian/control b/debian/control index ce0d3df55e1..7a1bfb62bb8 100644 --- a/debian/control +++ b/debian/control @@ -16,6 +16,7 @@ Depends: python, postgresql-client, python-dateutil, + python-docutils, python-feedparser, python-gdata, python-ldap, @@ -23,6 +24,7 @@ Depends: python-lxml, python-mako, python-openid, + python-psutil, python-psycopg2, python-pybabel, python-pychart, diff --git a/doc/api/field_level_acl.rst b/doc/api/field_level_acl.rst new file mode 100644 index 00000000000..53a304a1faf --- /dev/null +++ b/doc/api/field_level_acl.rst @@ -0,0 +1,45 @@ +Field-level access control +========================== + +.. versionadded:: 7.0 + +OpenERP now supports real access control at the field level, not just on the view side. +Previously it was already possible to set a ``groups`` attribute on a ```` element +(or in fact most view elements), but with cosmetics effects only: the element was made +invisible on the client side, while still perfectly available for read/write access at +the RPC level. + +As of OpenERP 7.0 the existing behavior is preserved on the view level, but a new ``groups`` +attribute is available on all model fields, introducing a model-level access control on +each field. The syntax is the same as for the view-level attribute:: + + _columns = { + 'secret_key': fields.char('Secret Key', groups="base.group_erp_manager,base.group_system") + } + +There is a major difference with the view-level ``groups`` attribute: restricting +the access at the model level really means that the field will be completely unavailable +for users who do not belong to the authorized groups: + +* Restricted fields will be **completely removed** from all related views, not just + hidden. This is important to keep in mind because it means the field value will not be + available at all on the client side, and thus unavailable e.g. for ``on_change`` calls. +* Restricted fields will not be returned as part of a call to + :meth:`~openerp.osv.orm.fields_get` or :meth:`~openerp.osv.orm.fields_view_get` + This is in order to avoid them appearing in the list of fields available for + advanced search filters, for example. This does not prevent getting the list of + a model's fields by querying ``ir.model.fields`` directly, which is fine. +* Any attempt to read or write directly the value of the restricted fields will result + in an ``AccessError`` exception. +* As a consequence of the previous item, restricted fields will not be available for + use within search filters (domains) or anything that would require read or write access. +* It is quite possible to set ``groups`` attributes for the same field both at the model + and view level, even with different values. Both will carry their effect, with the + model-level restriction taking precedence and removing the field completely in case of + restriction. + +.. note:: The tests related to this feature are in ``openerp/tests/test_acl.py``. + +.. warning:: At the time of writing the implementation of this feature is partial + and does not yet restrict read/write RPC access to the field. + The corresponding test is written already but currently disabled. \ No newline at end of file diff --git a/doc/api/startup.rst b/doc/api/startup.rst index 5e6b0704a1e..0cc83cf48be 100644 --- a/doc/api/startup.rst +++ b/doc/api/startup.rst @@ -2,6 +2,8 @@ Start-up script --------------- +.. versionadded:: 6.1 + To run the OpenERP server, the conventional approach is to use the `openerp-server` script. It loads the :ref:`openerp library`, sets a few configuration variables corresponding to command-line arguments, and starts to @@ -11,9 +13,6 @@ Depending on your deployment needs, you can write such a start-up script very easily. We also recommend you take a look at an alternative tool called `openerp-command` that can, among other things, launch the server. -.. versionadded:: 6.1 - Yet another alternative is to use a WSGI-compatible HTTP server and let it call into one of the WSGI entry points of the server. -.. versionadded:: 6.1 diff --git a/doc/conf.py b/doc/conf.py index 69e49d0e5a7..ac5b8907e0e 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -16,9 +16,10 @@ import sys, os # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) sys.path.append(os.path.abspath('_themes')) -sys.path.insert(0, os.path.abspath('../addons')) -sys.path.insert(0, os.path.abspath('..')) +sys.path.append(os.path.abspath('..')) +sys.path.append(os.path.abspath('../openerp')) # -- General configuration ----------------------------------------------------- @@ -42,7 +43,7 @@ source_suffix = '.rst' master_doc = 'index' # General information about the project. -project = u'OpenERP Web Developers Documentation' +project = u'OpenERP Server Developers Documentation' copyright = u'2012, OpenERP s.a.' # The version info for the project you're documenting, acts as replacement for @@ -50,9 +51,9 @@ copyright = u'2012, OpenERP s.a.' # built documents. # # The short X.Y version. -version = '6.1' +version = '7.0' # The full version, including alpha/beta/rc tags. -release = '6.1' +release = '7.0b' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. @@ -170,7 +171,7 @@ html_sidebars = { #html_file_suffix = None # Output file base name for HTML help builder. -htmlhelp_basename = 'openerp-web-doc' +htmlhelp_basename = 'openerp-server-doc' # -- Options for LaTeX output -------------------------------------------------- @@ -189,7 +190,7 @@ latex_elements = { # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ - ('index', 'openerp-web-doc.tex', u'OpenERP Web Developers Documentation', + ('index', 'openerp-server-doc.tex', u'OpenERP Server Developers Documentation', u'OpenERP s.a.', 'manual'), ] @@ -219,7 +220,7 @@ latex_documents = [ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - ('index', 'openerp-web-doc', u'OpenERP Web Developers Documentation', + ('index', 'openerp-server-doc', u'OpenERP Server Developers Documentation', [u'OpenERP s.a.'], 1) ] @@ -233,8 +234,8 @@ man_pages = [ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - ('index', 'OpenERPWebDocumentation', u'OpenERP Web Developers Documentation', - u'OpenERP s.a.', 'OpenERPWebDocumentation', 'Developers documentation for the openerp-web project.', + ('index', 'OpenERPServerDocumentation', u'OpenERP Server Developers Documentation', + u'OpenERP s.a.', 'OpenERPServerDocumentation', 'Developers documentation for the openobject-server project.', 'Miscellaneous'), ] @@ -251,6 +252,6 @@ texinfo_documents = [ # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = { 'python': ('http://docs.python.org/', None), - 'openerpserver': ('http://doc.openerp.com/trunk/developers/server', None), + 'openerpweb': ('http://doc.openerp.com/trunk/developers/web', None), 'openerpdev': ('http://doc.openerp.com/trunk/developers', None), } diff --git a/doc/import.rst b/doc/import.rst new file mode 100644 index 00000000000..bffb1af334b --- /dev/null +++ b/doc/import.rst @@ -0,0 +1,263 @@ +.. _bulk-import: + +Bulk Import +=========== + +OpenERP has included a bulk import facility for CSV-ish files for a +long time. With 7.0, both the interface and internal implementation +have been redone, resulting in +:meth:`~openerp.osv.orm.BaseModel.load`. + +.. note:: + + the previous bulk-loading method, + :meth:`~openerp.osv.orm.BaseModel.import_data`, remains for + backwards compatibility but was re-implemented on top of + :meth:`~openerp.osv.orm.BaseModel.load`, while its interface is + unchanged its precise behavior has likely been altered for some + cases (it shouldn't throw exceptions anymore in many cases where + it previously did) + +This document attempts to explain the behavior and limitations of +:meth:`~openerp.osv.orm.BaseModel.load`. + +Data +---- + +The input ``data`` is a regular row-major matrix of strings (in Python +datatype terms, a ``list`` of rows, each row being a ``list`` of +``str``, all rows must be of equal length). Each row must be the same +length as the ``fields`` list preceding it in the argslist. + +Each field of ``fields`` maps to a (potentially relational and nested) +field of the model under import, and the corresponding column of the +``data`` matrix provides a value for the field for each record. + +Generally speaking each row of the input yields a record of output, +and each cell of a row yields a value for the corresponding field of +the row's record. There is currently one exception for this rule: + +One to Many fields +++++++++++++++++++ + +Because O2M fields contain multiple records "embedded" in the main +one, and these sub-records are fully dependent on the main record (are +no other references to the sub-records in the system), they have to be +spliced into the matrix somehow. This is done by adding lines composed +*only* of o2m record fields below the main record: + +.. literalinclude:: o2m.txt + +the sections in double-lines represent the span of two o2m +fields. During parsing, they are extracted into their own ``data`` +matrix for the o2m field they correspond to. + +Import process +-------------- + +Here are the phases of import. Note that the concept of "phases" is +fuzzy as it's currently more of a pipeline, each record moves through +the entire pipeline before the next one is processed. + +Extraction +++++++++++ + +The first phase of the import is the extraction of the current row +(and potentially a section of rows following it if it has One to Many +fields) into a record dictionary. The keys are the ``fields`` +originally passed to :meth:`~openerp.osv.orm.BaseModel.load`, and the +values are either the string value at the corresponding cell (for +non-relational fields) or a list of sub-records (for all relational +fields). + +This phase also generates the ``rows`` indexes for any +:ref:`import-message` produced thereafter. + +Conversion +++++++++++ + +This second phase takes the record dicts, extracts the :ref:`dbid` and +:ref:`xid` if present and attempts to convert each field to a type +matching what OpenERP expects to write. + +* Empty fields (empty strings) are replaced with the ``False`` value + +* Non-empty fields are converted through + :class:`~openerp.addons.base.ir.ir_fields.ir_fields_converter` + +.. note:: if a field is specified in the import, its default will *never* be + used. If some records need to have a value and others need to use + the model's default, either specify that default explicitly or do + the import in two phases. + +Char, text and binary fields +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Are returned as-is, without any alteration. + +Boolean fields +~~~~~~~~~~~~~~ + +The string value is compared (in a case-insensitive manner) to ``0``, +``false`` and ``no`` as well of any translation thereof loaded in the +database. If the value matches one of these, the field is set to +``False``. + +Otherwise the field is compared to ``1``, ``true`` and ``yes`` (and +any translation of these in the database). The field is always set to +``True``, but if the value does not match one of these a warning will +also be output. + +Integers and float fields +~~~~~~~~~~~~~~~~~~~~~~~~~ + +The field is parsed with Python's built-in conversion routines +(``int`` and ``float`` respectively), if the conversion fails an error +is generated. + +Selection fields +~~~~~~~~~~~~~~~~ + +The field is compared to 1. the values of the selection (first part of +each selection tuple) and 2. all translations of the selection label +found in the database. + +If one of these is matched, the corresponding value is set on the +field. + +Otherwise an error is generated. + +The same process applies to both list-type and function-type selection +fields. + +Many to One field +~~~~~~~~~~~~~~~~~ + +If the specified field is the relational field itself (``m2o``), the +value is used in a ``name_search``. The first record returned by +``name_search`` is used as the field's value. + +If ``name_search`` finds no value, an error is generated. If +``name_search`` finds multiple value, a warning is generated to warn +the user of ``name_search`` collisions. + +If the specified field is a :ref:`xid` (``m2o/id``), the +corresponding record it looked up in the database and used as the +field's value. If no record is found matching the provided external +ID, an error is generated. + +If the specified field is a :ref:`dbid` (``m2o/.id``), the process is +the same as for external ids (on database identifiers instead of +external ones). + +Many to Many field +~~~~~~~~~~~~~~~~~~ + +The field's value is interpreted as a comma-separated list of names, +external ids or database ids. For each one, the process previously +used for the many to one field is applied. + +One to Many field +~~~~~~~~~~~~~~~~~ + +For each o2m record extracted, if the record has a ``name``, +:ref:`xid` or :ref:`dbid` the :ref:`dbid` is looked up and checked +through the same process as for m2o fields. + +If a :ref:`dbid` was found, a LINK_TO command is emmitted, followed by +an UPDATE with the non-db values for the relational field. + +Otherwise a CREATE command is emmitted. + +Date fields +~~~~~~~~~~~ + +The value's format is checked against +:data:`~openerp.tools.misc.DEFAULT_SERVER_DATE_FORMAT`, an error is +generated if it does not match the specified format. + +Datetime fields +~~~~~~~~~~~~~~~ + +The value's format is checked against +:data:`~openerp.tools.misc.DEFAULT_SERVER_DATETIME_FORMAT`, an error +is generated if it does not match. + +The value is then interpreted as a datetime in the user's +timezone. The timezone is specified thus: + +* If the import ``context`` contains a ``tz`` key with a valid + timezone name, this is the timezone of the datetime. + +* Otherwise if the user performing the import has a ``tz`` attribute + set to a valid timezone name, this is the timezone of the datetime. + +* Otherwise interpret the datetime as being in the ``UTC`` timezone. + +Create/Write +++++++++++++ + +If the conversion was successful, the converted record is then saved +to the database via ``(ir.model.data)._update``. + +Error handling +++++++++++++++ + +The import process will only catch 2 types of exceptions to convert +them to error messages: ``ValueError`` during the conversion process, +and sub-exceptions of ``psycopg2.Error`` during the create/write +process. + +The import process uses savepoint to: + +* protect the overall transaction from the failure of each ``_update`` + call, if an ``_update`` call fails the savepoint is rolled back and + the import process keeps going in order to obtain as many error + messages as possible during each run. + +* protect the import as a whole, a savepoint is created before + starting and if any error is generated that savepoint is rolled + back. The rest of the transaction (anything not within the import + process) will be left untouched. + +.. _import-message: +.. _import-messages: + +Messages +-------- + +A message is a dictionary with 5 mandatory keys and one optional key: + +``type`` + the type of message, either ``warning`` or ``error``. Any + ``error`` message indicates the import failed and was rolled back. + +``message`` + the message's actual text, which should be translated and can be + shown to the user directly + +``rows`` + a dict with 2 keys ``from`` and ``to``, indicates the range of + rows in ``data`` which generated the message + +``record`` + a single integer, for warnings the index of the record which + generated the message (can be obtained from a non-false ``ids`` + result) + +``field`` + the name of the (logical) OpenERP field for which the error or + warning was generated + +``moreinfo`` (optional) + A string, a list or a dict, leading to more information about the + warning. + + * If ``moreinfo`` is a string, it is a supplementary warnings + message which should be hidden by default + * If ``moreinfo`` is a list, it provides a number of possible or + alternative values for the string + * If ``moreinfo`` is a dict, it is an OpenERP action descriptor + which can be executed to get more information about the issues + with the field. If present, the ``help`` key serves as a label + for the action (e.g. the text of the link). diff --git a/doc/index.rst.inc b/doc/index.rst.inc index 663871af0ca..535ecb5809d 100644 --- a/doc/index.rst.inc +++ b/doc/index.rst.inc @@ -1,6 +1,5 @@ - -OpenERP Server Documentation -'''''''''''''''''''''''''''' +OpenERP Server +'''''''''''''' .. toctree:: :maxdepth: 2 @@ -31,3 +30,26 @@ Main revisions and new features revisions/user_img_specs revisions/need_action_specs revisions/font_style + + +OpenERP Server +'''''''''''''' + +.. toctree:: + :maxdepth: 1 + + import + module-versioning + on_change_tips + test-framework + +Changed in 7.0 +++++++++++++++ + +.. toctree:: + :maxdepth: 1 + + api/user_img_specs + api/need_action_specs + api/font_style + api/field_level_acl diff --git a/doc/module-versioning.rst b/doc/module-versioning.rst new file mode 100644 index 00000000000..7a4c127d6d8 --- /dev/null +++ b/doc/module-versioning.rst @@ -0,0 +1,69 @@ +.. _module_versioning: + +Module versioning +================= + +OpenERP has been developed with modularity in mind: OpenERP should be flexible +enough so it can be adopted by any enterprise, of any size and in any market. +By using modules one can adapt OpenERP in many different ways: from completely +different business to smaller, company-specific changes. + +As modules (and the core framework itself) evolve, it is necessary to identify +modules by their version so a sensible set of modules can be chosen for a +particular deployment. + +There are two trends re-inforcing each others. Firstly OpenERP s.a. will work +on a smaller number of official modules and let the community handles more and +more development. Secondly all those modules will receive greater exposure on +`OpenERP Apps`_ where each module will be owned by a single author. + +The solution advocated by OpenERP is straightforward and aims to avoid the +`dependency hell`_. In particular we don't want to deal with versioned +dependencies (i.e. a module depends on a specific version of another module). + +For each stable release (e.g. OpenERP 6.1, or OpenERP 7.0) or, said in other +words, for each major version, there is only one (major) version of each +module. The minor version is bumped for bug fixes but is otherwise not +important here. + +Making variations on some business needs must be done by creating new modules, +possibly depending on previously written modules. If depending on a module +proves too difficult, you can write a new module (not a new _version_). But +generally Python is flexible enough that depending on the existing module +should work. + +For the next major version, refactoring modules can be done and similar +functionalities can be brought together in a better module. + +.. _`OpenERP Apps`: http://apps.openerp.com/ + +.. _`dependency hell`: http://en.wikipedia.org/wiki/Dependency_hell + +Example +------- + +Whenever a new module is developed or must evolve, the above versioning policy +should be respected. + +A particular concern one can face when deploying OpenERP to multiple customers +is now detailed as an example to provide a few guidelines. The hypotethical +situation is as follow. A partner needs to create a new module, called ``M``, for a +customer. Shortly after (but still within a typical OpenERP release cycle, so +there is no chance to bump the version number except for bug fixes), ``M`` must be +adapted for another customer. + +The correct way to handle it is to leave ``M`` as it is and create a new module, +say called ``X``, that depends on ``M`` for the second customer. Both modules have the +same version (i.e. 6.1 or 7.0, targeting the corresponding OpenERP version). + +If leaving ``M`` as it is is not possible (which should be very rare as Python +is incredibly flexible), the ``X`` module for the new customer can depend on a +new module ``N``, derived from ``M``. At this point, ``N`` is a new, +differently named module. It is not a ``M`` module with a increased version +number. Your goal should be to make ``N`` as close as possible to ``M``, so +that at the next version of OpenERP, the first customer can switch to ``N`` +instead of ``M`` (or include the changes in a new version of ``M``). At that +point you are in the ideal situation: you have a module ``N`` for one customer, +and a module ``X`` depending on N to account for the differences between those +two customers. + diff --git a/doc/o2m.txt b/doc/o2m.txt new file mode 100644 index 00000000000..32218e5ac85 --- /dev/null +++ b/doc/o2m.txt @@ -0,0 +1,13 @@ ++-------+-------+===========+===========+-------+-------+ +|value01|value02‖o2m/value01|o2m/value02‖value03|value04| ++-------+-------+-----------+-----------+-------+-------+ +| | ‖o2m/value11|o2m/value12‖ | | ++-------+-------+-----------+-----------+-------+-------+ +| | ‖o2m/value21|o2m/value22‖ | | ++-------+-------+===========+===========+-------+-------+ +|value11|value12‖o2m/value01|o2m/value02‖value13|value14| ++-------+-------+-----------+-----------+-------+-------+ +| | ‖o2m/value11|o2m/value12‖ | | ++-------+-------+===========+===========+-------+-------+ +|value21|value22| | |value23|value24| ++-------+-------+-----------+-----------+-------+-------+ diff --git a/doc/on_change_tips.rst b/doc/on_change_tips.rst new file mode 100644 index 00000000000..05186d09740 --- /dev/null +++ b/doc/on_change_tips.rst @@ -0,0 +1,51 @@ +.. _on_change_tips: + +On Change Methods +================= + +Definition of on change methods in a view looks like this: + +:: + + + +And here is the corresponding method in the model: + +:: + + def name_change(self, cr, uid, ids, name, address, city, context=None): + ... + return { + 'value': { + 'address': ... + 'city': ... + } + } + +On change methods can be confusing when people use them, here are a list of clarifications to avoid any misconception: + +- On change methods can be executed during the creation of a row, long before it is effectively saved into the database. +- Fields are *not* validated before going through a on change methods. As an example, a field marqued as required can be False. +- On change methods can read data in the database but should *never* attempt to write anything, this is always a strong conception + problem. +- The format of the values passed to an on change method is exactly the same than the one passed to the write() method. So + the on change method must be able to handle any format used for all the fields it process. The following list describe some fields + that can have an unusual format. + + - *float*: Due to the way JSON represents numbers and the way the JSON library of Python handles it, a float field will not always + be represented as a python float type. When the number can be represented as an integer it will appear as a python integer type. + This can be a problem when using some mathematical operations (example: price / 2), so it is a good practice to always cast any number + to float when you want to handle floats in on change methods. + - *one2many and many2many*: There are plenty of misconception about x2many fields in on change methods. The reality is, in fact, quite + complex. x2many are defined by a list of operations, each operation was given a number (0 -> create, 1 -> write, ect...) and has + its own semantic. To be able to use one2many and many2many in on change methods, you are strongly encourage to use the + resolve_2many_commands() method. Here is a sample usage: + + :: + + values = self.resolve_2many_commands(cr, uid, 'my_o2m', my_o2m_values, ['price', 'tax'], context) + + This code will convert the complex list of operations that makes the o2m value into a simple list of dictionaries containing the fields + 'price' and 'tax', which is way simpler to handle in most on change methods. Please note that you can also return a list of + dictionaries as the new value of a one2many, it will replace the actual rows contained in that one2many (but it will also remove the + previous ones). \ No newline at end of file diff --git a/gunicorn.conf.py b/gunicorn.conf.py deleted file mode 100644 index 0f1d93a8638..00000000000 --- a/gunicorn.conf.py +++ /dev/null @@ -1,63 +0,0 @@ -# Gunicorn sample configuration file. -# See http://gunicorn.org/configure.html for more details. -# -# To run the OpenERP server via Gunicorn, change the appropriate -# settings below, in order to provide the parameters that -# would normally be passed in the command-line, -# (at least `bind` and `conf['addons_path']`), then execute: -# $ gunicorn openerp:wsgi.core.application -c gunicorn.conf.py -# or if you want to run it behind a reverse proxy, add the line -# import openerp.wsgi.proxied -# in this file and execute: -# $ gunicorn openerp:wsgi.proxied.application -c gunicorn.conf.py - -import openerp - -# Standard OpenERP XML-RPC port is 8069 -bind = '127.0.0.1:8069' - -pidfile = '.gunicorn.pid' - -# Gunicorn recommends 2-4 x number_of_cpu_cores, but -# you'll want to vary this a bit to find the best for your -# particular work load. -workers = 4 - -# Some application-wide initialization is needed. -on_starting = openerp.wsgi.core.on_starting -when_ready = openerp.wsgi.core.when_ready -pre_request = openerp.wsgi.core.pre_request -post_request = openerp.wsgi.core.post_request - -# openerp request-response cycle can be quite long for -# big reports for example -timeout = 240 - -max_requests = 2000 - -# Equivalent of --load command-line option -openerp.conf.server_wide_modules = ['web'] - -# internal TODO: use openerp.conf.xxx when available -conf = openerp.tools.config - -# Path to the OpenERP Addons repository (comma-separated for -# multiple locations) -conf['addons_path'] = '/home/openerp/addons/trunk,/home/openerp/web/trunk/addons' - -# Optional database config if not using local socket -#conf['db_name'] = 'mycompany' -#conf['db_host'] = 'localhost' -#conf['db_user'] = 'foo' -#conf['db_port'] = 5432 -#conf['db_password'] = 'secret' - -# OpenERP Log Level -# DEBUG=10, DEBUG_RPC=8, DEBUG_RPC_ANSWER=6, DEBUG_SQL=5, INFO=20, -# WARNING=30, ERROR=40, CRITICAL=50 -# conf['log_level'] = 20 - -# If --static-http-enable is used, path for the static web directory -#conf['static_http_document_root'] = '/var/www' - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/history/xml2yml.py b/history/xml2yml.py old mode 100755 new mode 100644 diff --git a/openerp-server b/openerp-server index 12b6962e4e6..5501eba2159 100755 --- a/openerp-server +++ b/openerp-server @@ -30,7 +30,6 @@ GNU Public Licence. (c) 2003-TODAY, Fabien Pinckaers - OpenERP SA """ -import imp import logging import os import signal @@ -92,7 +91,7 @@ def setup_pid_file(): def preload_registry(dbname): """ Preload a registry, and start the cron.""" try: - db, registry = openerp.pooler.get_db_and_pool(dbname, update_module=config['init'] or config['update'], pooljobs=False) + db, registry = openerp.pooler.get_db_and_pool(dbname, update_module=openerp.tools.config['init'] or openerp.tools.config['update'], pooljobs=False) # jobs will start to be processed later, when openerp.cron.start_master_thread() is called by openerp.service.start_services() registry.schedule_cron_jobs() @@ -102,16 +101,16 @@ def preload_registry(dbname): def run_test_file(dbname, test_file): """ Preload a registry, possibly run a test file, and start the cron.""" try: + config = openerp.tools.config db, registry = openerp.pooler.get_db_and_pool(dbname, update_module=config['init'] or config['update'], pooljobs=False) cr = db.cursor() _logger.info('loading test file %s', test_file) - openerp.tools.convert_yaml_import(cr, 'base', file(test_file), {}, 'test', True) + openerp.tools.convert_yaml_import(cr, 'base', file(test_file), 'test', {}, 'test', True) cr.rollback() cr.close() except Exception: _logger.exception('Failed to initialize database `%s` and run test file `%s`.', dbname, test_file) - def export_translation(): config = openerp.tools.config dbname = config['db_name'] @@ -203,9 +202,10 @@ def quit_on_signals(): try: while quit_signals_received == 0: time.sleep(60) - except KeyboardInterrupt, e: + except KeyboardInterrupt: pass + config = openerp.tools.config if config['pidfile']: os.unlink(config['pidfile']) @@ -218,8 +218,7 @@ def configure_babel_localedata_path(): import babel babel.localedata._dirname = os.path.join(os.path.dirname(sys.executable), 'localedata') -if __name__ == "__main__": - +def main(): os.environ["TZ"] = "UTC" check_root_user() @@ -248,20 +247,13 @@ if __name__ == "__main__": sys.exit(0) if not config["stop_after_init"]: + setup_pid_file() # Some module register themselves when they are loaded so we need the # services to be running before loading any registry. - openerp.service.start_services() - - for m in openerp.conf.server_wide_modules: - try: - openerp.modules.module.load_openerp_module(m) - except Exception: - msg = '' - if m == 'web': - msg = """ -The `web` module is provided by the addons found in the `openerp-web` project. -Maybe you forgot to add those addons in your addons_path configuration.""" - _logger.exception('Failed to load server-wide module `%s`.%s', m, msg) + if config['workers']: + openerp.service.start_services_workers() + else: + openerp.service.start_services() if config['db_name']: for dbname in config['db_name'].split(','): @@ -270,8 +262,10 @@ Maybe you forgot to add those addons in your addons_path configuration.""" if config["stop_after_init"]: sys.exit(0) - setup_pid_file() _logger.info('OpenERP server is running, waiting for connections...') quit_on_signals() +if __name__ == "__main__": + main() + # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/openerp-wsgi.py b/openerp-wsgi.py new file mode 100644 index 00000000000..9ae18ffc69e --- /dev/null +++ b/openerp-wsgi.py @@ -0,0 +1,54 @@ +#!/usr/bin/python +# WSGI Handler sample configuration file. +# +# Change the appropriate settings below, in order to provide the parameters +# that would normally be passed in the command-line. +# (at least conf['addons_path']) +# +# For generic wsgi handlers a global application is defined. +# For uwsgi this should work: +# $ uwsgi_python --http :9090 --pythonpath . --wsgi-file openerp-wsgi.py +# +# For gunicorn additional globals need to be defined in the Gunicorn section. +# Then the following command should run: +# $ gunicorn openerp:service.wsgi_server.application -c openerp-wsgi.py + +import openerp + +#---------------------------------------------------------- +# Common +#---------------------------------------------------------- +openerp.multi_process = True # Nah! + +# Equivalent of --load command-line option +openerp.conf.server_wide_modules = ['web'] +conf = openerp.tools.config + +# Path to the OpenERP Addons repository (comma-separated for +# multiple locations) + +conf['addons_path'] = '../../addons/trunk,../../web/trunk/addons' + +# Optional database config if not using local socket +#conf['db_name'] = 'mycompany' +#conf['db_host'] = 'localhost' +#conf['db_user'] = 'foo' +#conf['db_port'] = 5432 +#conf['db_password'] = 'secret' + +#---------------------------------------------------------- +# Generic WSGI handlers application +#---------------------------------------------------------- +application = openerp.service.wsgi_server.application + +#---------------------------------------------------------- +# Gunicorn +#---------------------------------------------------------- +# Standard OpenERP XML-RPC port is 8069 +bind = '127.0.0.1:8069' +pidfile = '.gunicorn.pid' +workers = 4 +timeout = 240 +max_requests = 2000 + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/openerp/__init__.py b/openerp/__init__.py index 7e723c41f9d..3a8f5f86f26 100644 --- a/openerp/__init__.py +++ b/openerp/__init__.py @@ -32,18 +32,25 @@ import modules import netsvc import osv import pooler -import pychart import release import report import run_tests import service import sql_db import test -import tiny_socket import tools import wizard import workflow -import wsgi +# backward compatilbility +# TODO: This is for the web addons, can be removed later. +wsgi = service +wsgi.register_wsgi_handler = wsgi.wsgi_server.register_wsgi_handler +# Is the server running in multi-process mode (e.g. behind Gunicorn). +# If this is True, the processes have to communicate some events, +# e.g. database update or cache invalidation. Each process has also +# its own copy of the data structure and we don't need to care about +# locks between threads. +multi_process = False # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/openerp/addons/base/__init__.py b/openerp/addons/base/__init__.py index 16a61521fb4..d666a6abbf7 100644 --- a/openerp/addons/base/__init__.py +++ b/openerp/addons/base/__init__.py @@ -22,7 +22,6 @@ import ir import module import res -import publisher_warranty import report import test diff --git a/openerp/addons/base/__openerp__.py b/openerp/addons/base/__openerp__.py index 393e7651bda..257f3efdc66 100644 --- a/openerp/addons/base/__openerp__.py +++ b/openerp/addons/base/__openerp__.py @@ -25,26 +25,40 @@ 'name': 'Base', 'version': '1.3', 'category': 'Hidden', - 'description': """The kernel of OpenERP, needed for all installation.""", + 'description': """ +The kernel of OpenERP, needed for all installation. +=================================================== +""", 'author': 'OpenERP SA', 'maintainer': 'OpenERP SA', 'website': 'http://www.openerp.com', 'depends': [], - 'init_xml': [ + 'data': [ 'base_data.xml', + 'currency_data.xml', + 'res/res_country_data.xml', 'security/base_security.xml', 'base_menu.xml', 'res/res_security.xml', 'res/res_config.xml', - 'data/res.country.state.csv' - ], - 'update_xml': [ - 'base_update.xml', + 'data/res.country.state.csv', 'ir/wizard/wizard_menu_view.xml', - 'ir/ir.xml', + 'ir/ir_actions.xml', + 'ir/ir_attachment_view.xml', 'ir/ir_config_parameter_view.xml', - 'ir/workflow/workflow_view.xml', + 'ir/ir_cron_view.xml', + 'ir/ir_filters.xml', + 'ir/ir_mail_server_view.xml', + 'ir/ir_model_view.xml', + 'ir/ir_rule_view.xml', + 'ir/ir_sequence_view.xml', + 'ir/ir_translation_view.xml', + 'ir/ir_ui_menu_view.xml', + 'ir/ir_ui_view_view.xml', + 'ir/ir_values_view.xml', + 'ir/osv_memory_autovacuum.xml', 'ir/report/ir_report.xml', + 'ir/workflow/workflow_view.xml', 'module/module_view.xml', 'module/module_data.xml', 'module/module_report.xml', @@ -56,6 +70,8 @@ 'module/wizard/base_module_configuration_view.xml', 'module/wizard/base_export_language_view.xml', 'module/wizard/base_update_translations_view.xml', + 'module/wizard/base_module_immediate_install.xml', + 'res/res_company_view.xml', 'res/res_request_view.xml', 'res/res_lang_view.xml', 'res/res_partner_report.xml', @@ -64,25 +80,18 @@ 'res/res_bank_view.xml', 'res/res_country_view.xml', 'res/res_currency_view.xml', - 'res/res_partner_event_view.xml', - 'res/wizard/partner_sms_send_view.xml', - 'res/wizard/partner_wizard_massmail_view.xml', - 'res/wizard/partner_clear_ids_view.xml', - 'res/wizard/partner_wizard_ean_check_view.xml', + 'res/res_users_view.xml', 'res/res_partner_data.xml', 'res/ir_property_view.xml', 'security/base_security.xml', - 'publisher_warranty/publisher_warranty_view.xml', 'security/ir.model.access.csv', 'security/ir.model.access-1.csv', # res.partner.address is deprecated; it is still there for backward compability only and will be removed in next version - 'res/res_widget_view.xml', - 'res/res_widget_data.xml', - 'publisher_warranty/publisher_warranty_data.xml', ], - 'demo_xml': [ + 'demo': [ 'base_demo.xml', 'res/res_partner_demo.xml', - 'res/res_widget_demo.xml', + 'res/res_partner_demo.yml', + 'res/res_partner_image_demo.xml', ], 'test': [ 'test/base_test.xml', @@ -98,7 +107,6 @@ ], 'installable': True, 'auto_install': True, - 'certificate': '0076807797149', - "css": [ 'static/src/css/modules.css' ], + 'css': ['static/src/css/modules.css'], } # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/openerp/addons/base/base.sql b/openerp/addons/base/base.sql index eb9966bddcd..c490df32294 100644 --- a/openerp/addons/base/base.sql +++ b/openerp/addons/base/base.sql @@ -146,17 +146,15 @@ select setval('ir_ui_menu_id_seq', 2); CREATE TABLE res_users ( id serial NOT NULL, - name varchar(64) not null, active boolean default True, login varchar(64) NOT NULL UNIQUE, password varchar(64) default null, - email varchar(64) default null, - context_tz varchar(64) default null, - signature text, - context_lang varchar(64) default '', + tz varchar(64) default null, + lang varchar(64) default '', -- No FK references below, will be added later by ORM -- (when the destination rows exist) company_id int, + partner_id int, primary key(id) ); alter table res_users add constraint res_users_login_uniq unique (login); @@ -286,6 +284,7 @@ CREATE TABLE ir_module_module ( write_date timestamp without time zone, write_uid integer references res_users on delete set null, website character varying(256), + summary character varying(256), name character varying(128) NOT NULL, author character varying(128), url character varying(128), @@ -295,7 +294,6 @@ CREATE TABLE ir_module_module ( shortdesc character varying(256), complexity character varying(32), category_id integer REFERENCES ir_module_category ON DELETE SET NULL, - certificate character varying(64), description text, application boolean default False, demo boolean default False, @@ -347,11 +345,44 @@ CREATE TABLE ir_model_data ( res_id integer, primary key(id) ); +-- Records foreign keys and constraints installed by a module (so they can be +-- removed when the module is uninstalled): +-- - for a foreign key: type is 'f', +-- - for a constraint: type is 'u' (this is the convention PostgreSQL uses). +CREATE TABLE ir_model_constraint ( + id serial NOT NULL, + create_uid integer, + create_date timestamp without time zone, + write_date timestamp without time zone, + write_uid integer, + date_init timestamp without time zone, + date_update timestamp without time zone, + module integer NOT NULL references ir_module_module on delete restrict, + model integer NOT NULL references ir_model on delete restrict, + type character varying(1) NOT NULL, + name character varying(128) NOT NULL +); + +-- Records relation tables (i.e. implementing many2many) installed by a module +-- (so they can be removed when the module is uninstalled). +CREATE TABLE ir_model_relation ( + id serial NOT NULL, + create_uid integer, + create_date timestamp without time zone, + write_date timestamp without time zone, + write_uid integer, + date_init timestamp without time zone, + date_update timestamp without time zone, + module integer NOT NULL references ir_module_module on delete restrict, + model integer NOT NULL references ir_model on delete restrict, + name character varying(128) NOT NULL +); + --------------------------------- -- Users --------------------------------- -insert into res_users (id,login,password,name,active,company_id,context_lang) values (1,'admin','admin','Administrator',True,1,'en_US'); +insert into res_users (id,login,password,active,company_id,partner_id,lang) values (1,'admin','admin',True,1,1,'en_US'); insert into ir_model_data (name,module,model,noupdate,res_id) values ('user_root','base','res.users',True,1); -- Compatibility purpose, to remove V6.0 diff --git a/openerp/addons/base/base_data.xml b/openerp/addons/base/base_data.xml index 7f5b4dec109..071d4cd0618 100644 --- a/openerp/addons/base/base_data.xml +++ b/openerp/addons/base/base_data.xml @@ -4,7 +4,6 @@ ir.ui.menu.tree ir.ui.menu - tree @@ -30,1037 +29,17 @@ - - - United Arab Emirates - ae - - - Afghanistan, Islamic State of - af - - - Antigua and Barbuda - ag - - - Anguilla - ai - - - Albania - al - - - Armenia - am - - - Netherlands Antilles - an - - - Angola - ao - - - Antarctica - aq - - - Argentina - ar - - - American Samoa - as - - - Austria - at - - - Australia - au - - - - Aruba - aw - - - Åland Islands - ax - - - Azerbaijan - az - - - Bosnia-Herzegovina - ba - - - Barbados - bb - - - Bangladesh - bd - - - Belgium - be - - - - Burkina Faso - bf - - - Bulgaria - bg - - - Bahrain - bh - - - Burundi - bi - - - Benin - bj - - - Saint Barthélémy - bl - - - Bermuda - bm - - - Brunei Darussalam - bn - - - Bolivia - bo - - - Bonaire, Sint Eustatius and Saba - bq - - - Brazil - br - - - - Bahamas - bs - - - Bhutan - bt - - - Bouvet Island - bv - - - Botswana - bw - - - Belarus - by - - - Belize - bz - - - Canada - ca - - - - Cocos (Keeling) Islands - cc - - - Central African Republic - cf - - - Congo, Democratic Republic of the - cd - - - Congo - cg - - - Switzerland - ch - - - Ivory Coast (Cote D'Ivoire) - ci - - - Cook Islands - ck - - - Chile - cl - - - Cameroon - cm - - - China - cn - - - Colombia - co - - - Costa Rica - cr - - - Cuba - cu - - - Cape Verde - cv - - - Curaçao - cw - - - Christmas Island - cx - - - Cyprus - cy - - - Czech Republic - cz - - - Germany - de - - - - Djibouti - dj - - - Denmark - dk - - - Dominica - dm - - - Dominican Republic - do - - - Algeria - dz - - - Ecuador - ec - - - Estonia - ee - - - Egypt - eg - - - Western Sahara - eh - - - Eritrea - er - - - Spain - es - - - - Ethiopia - et - - - Finland - fi - - - Fiji - fj - - - Falkland Islands - fk - - - Micronesia - fm - - - Faroe Islands - fo - - - France - fr - - - - Gabon - ga - - - Grenada - gd - - - Georgia - ge - - - French Guyana - gf - - - Ghana - gh - - - Gibraltar - gi - - - Guernsey - gg - - - Greenland - gl - - - Gambia - gm - - - Guinea - gn - - - Guadeloupe (French) - gp - - - Equatorial Guinea - gq - - - Greece - gr - - - South Georgia and the South Sandwich Islands - gs - - - Guatemala - gt - - - Guam (USA) - gu - - - Guinea Bissau - gw - - - Guyana - gy - - - Hong Kong - hk - - - Heard and McDonald Islands - hm - - - Honduras - hn - - - Croatia - hr - - - Haiti - ht - - - Hungary - hu - - - Indonesia - id - - - Ireland - ie - - - Israel - il - - - Isle of Man - im - - - India - in - - - - British Indian Ocean Territory - io - - - Iraq - iq - - - Iran - ir - - - Iceland - is - - - Italy - it - - - Jersey - je - - - Jamaica - jm - - - Jordan - jo - - - Japan - jp - - - Kenya - ke - - - Kyrgyz Republic (Kyrgyzstan) - kg - - - Cambodia, Kingdom of - kh - - - Kiribati - ki - - - Comoros - km - - - Saint Kitts & Nevis Anguilla - kn - - - North Korea - kp - - - South Korea - kr - - - Kuwait - kw - - - Cayman Islands - ky - - - Kazakhstan - kz - - - Laos - la - - - Lebanon - lb - - - Saint Lucia - lc - - - Liechtenstein - li - - - Sri Lanka - lk - - - Liberia - lr - - - Lesotho - ls - - - Lithuania - lt - - - Luxembourg - lu - - - Latvia - lv - - - Libya - ly - - - Morocco - ma - - - Monaco - mc - - - Moldavia - md - - - Montenegro - me - - - Saint Martin (French part) - mf - - - Madagascar - mg - - - Marshall Islands - mh - - - Macedonia, the former Yugoslav Republic of - mk - - - Mali - ml - - - Myanmar - mm - - - Mongolia - mn - - - Macau - mo - - - Northern Mariana Islands - mp - - - Martinique (French) - mq - - - Mauritania - mr - - - Montserrat - ms - - - Malta - mt - - - Mauritius - mu - - - Maldives - mv - - - Malawi - mw - - - Mexico - mx - - - Malaysia - my - - - Mozambique - mz - - - Namibia - na - - - New Caledonia (French) - nc - - - Niger - ne - - - Norfolk Island - nf - - - Nigeria - ng - - - Nicaragua - ni - - - Netherlands - nl - - - - Norway - no - - - Nepal - np - - - Nauru - nr - - - Neutral Zone - nt - - - Niue - nu - - - New Zealand - nz - - - Oman - om - - - Panama - pa - - - Peru - pe - - - Polynesia (French) - pf - - - Papua New Guinea - pg - - - Philippines - ph - - - Pakistan - pk - - - Poland - pl - - - Saint Pierre and Miquelon - pm - - - Pitcairn Island - pn - - - Puerto Rico - pr - - - Palestinian Territory, Occupied - ps - - - Portugal - pt - - - Palau - pw - - - Paraguay - py - - - Qatar - qa - - - Reunion (French) - re - - - Romania - ro - - - Serbia - rs - - - Russian Federation - ru - - - Rwanda - rw - - - Saudi Arabia - sa - - - Solomon Islands - sb - - - Seychelles - sc - - - Sudan - sd - - - Sweden - se - - - Singapore - sg - - - Saint Helena - sh - - - Slovenia - si - - - Svalbard and Jan Mayen Islands - sj - - - Slovakia - sk - - - Sierra Leone - sl - - - San Marino - sm - - - Senegal - sn - - - Somalia - so - - - Suriname - sr - - - South Sudan - ss - - - Saint Tome (Sao Tome) and Principe - st - - - El Salvador - sv - - - Sint Maarten (Dutch part) - sx - - - Syria - sy - - - Swaziland - sz - - - Turks and Caicos Islands - tc - - - Chad - td - - - French Southern Territories - tf - - - Togo - tg - - - Thailand - th - - - Tajikistan - tj - - - Tokelau - tk - - - Turkmenistan - tm - - - Tunisia - tn - - - Tonga - to - - - East Timor - tp - - - Turkey - tr - - - Trinidad and Tobago - tt - - - Tuvalu - tv - - - Taiwan - tw - - - Tanzania - tz - - - Ukraine - ua - - - Uganda - ug - - - United Kingdom - - gb - - - USA Minor Outlying Islands - um - - - United States - us - - - - Uruguay - uy - - - Uzbekistan - uz - - - Holy See (Vatican City State) - va - - - Saint Vincent & Grenadines - vc - - - Venezuela - ve - - - Virgin Islands (British) - vg - - - Virgin Islands (USA) - vi - - - Vietnam - vn - - - Vanuatu - vu - - - Wallis and Futuna Islands - wf - - - Samoa - ws - - - Yemen - ye - - - Mayotte - yt - - - Yugoslavia - yu - - - South Africa - za - - - Zambia - zm - - - - Zaire - zr - - - Zimbabwe - zw - - - + Your Company - + + + + + info@yourcompany.com + www.yourcompany.com @@ -1082,663 +61,32 @@ Your Company - Web: www.companyname.com - Tel: +1-212-555-12345 - IBAN: XX12 3456 7890 1234 5678 - SWIFT: SWIFTCODE - VAT: Company vat number + Your Company Slogan - - Administrator + + Administrator + + + admin@example.com + + + + - + + Administrator + - - - - - - - - USD - $ - 0.01 - 4 - - - - 1.2834 - - - - - - - VEF - Bs.F - 0.0001 - 4 - - - - 5.864 - - - - - - CAD - $ - 0.01 - 4 - - - - 1.3388 - - - - - - - CHF - CHF - 0.01 - 4 - - - - 1.3086 - - - - - - BRL - R$ - 0.01 - 4 - - - - 2.2344 - - - - - - CNY - ¥ - 0.01 - 4 - - - - 8.7556 - - - - - - - COP - $ - 0.01 - 4 - - - - 2933.8378 - - - - - - CZK - - 0.01 - 4 - - - - 26.5634 - - - - - - DKK - kr - 0.01 - 4 - - - - 7.4445 - - - - - - - HUF - Ft - 0.01 - 4 - - - - 271.5621 - - - - - - IDR - Rp - 0.01 - 4 - - - - 14352.00 - - - - - 11796.39 - - - - - - LVL - Ls - 0.01 - 4 - - - - 0.7086 - - - - - - - NOK - kr - 0.01 - 4 - - - - 7.8668 - - - - - - XPF - XPF - 1.00 - 4 - - - - 119.331742 - - - - - - PAB - B/. - 0.01 - 4 - - - - 1.2676 - - - - - - PLN - - 0.01 - 4 - - - - 4.1005 - - - - - - SEK - kr - 0.01 - 4 - - - - 10.3004 - - - - - - GBP - £ - 0.01 - 4 - - - - 0.8333 - - - - - - ARS - $ - 0.01 - 4 - - - - 5.0881 - - - - - - INR - - 0.01 - 4 - - - - 59.9739 - - - - - - AUD - $ - 0.01 - 4 - - - - 1.4070 - - - - - - UAH - - 0.01 - 4 - - - - 10.1969 - - - - - - VND - - 0.01 - 4 - - - - 26330.01 - - - - - - HKD - $ - 0.01 - 4 - - - - 11.1608 - - - - - - JPY - ¥ - 0.01 - 4 - - - - 133.62 - - - - - - BGN - лв - 0.01 - 4 - - - - 1.9558 - - - - - - LTL - Lt - 0.01 - 4 - - - - 3.4528 - - - - - - RON - lei - 0.01 - 4 - - - - 4.2253 - - - - - - HRK - kn - 0.01 - 4 - - - - 7.2936 - - - - - - RUB - руб - 0.01 - 4 - - - - 43.16 - - - - - - TRY - TL - 0.01 - 4 - - - - 2.1411 - - - - - - KRW - - 0.01 - 4 - - - - 1662.37 - - - - - - MXN - $ - 0.01 - 4 - - - - 18.6664 - - - - - - MYR - RM - 0.01 - 4 - - - - 4.8887 - - - - - - NZD - $ - 0.01 - 4 - - - - 1.9764 - - - - - - PHP - Php - 0.01 - 4 - - - - 66.1 - - - - - - SGD - $ - 0.01 - 4 - - - - 2.0126 - - - - - - THB - ฿ - 0.01 - 4 - - - - 47.779 - - - - - - ZAR - R - 0.01 - 4 - - - - 10.5618 - - - - - - Reserve - - - - CRC - 0.01 - 4 - ¢ - - - - 691.3153 - - - - - - localhost - localhost - - - - - - MUR - Rs - 0.01 - 4 - - - - 40.28 - - - - - - XOF - CFA - 1 - 4 - - - - 655.957 - - - - - - XAF - FCFA - 1 - 4 - - - - 655.957 - - - - - - UGX - USh - 1 - 4 - - - - 3401.91388 - - - - - - HNL - L - 0.01 - 4 - - - - 25 - - - - - - - CLP - $ - 0.01 - 4 - - - - 710 - - - - - - - UYU - $ - 0.01 - 4 - - - - - - 28.36 - - + diff --git a/openerp/addons/base/base_demo.xml b/openerp/addons/base/base_demo.xml index a0149096902..cb9c836e0a6 100644 --- a/openerp/addons/base/base_demo.xml +++ b/openerp/addons/base/base_demo.xml @@ -1,26 +1,30 @@ - - - Fabien D'souza - Chaussee de Namur - 1367 - Gerompont - (+32).81.81.37.00 - default - - - + + Demo User + + + demo@example.com - + demo demo - Demo User Mr Demo + + + admin@example.com + + + + + 1.5289 + + + diff --git a/openerp/addons/base/base_menu.xml b/openerp/addons/base/base_menu.xml index 797b94429b4..2e6a6d3a27f 100644 --- a/openerp/addons/base/base_menu.xml +++ b/openerp/addons/base/base_menu.xml @@ -1,22 +1,45 @@ - - + + + + - + + + - - - - - - - + + + + + + + + + + + Open Settings Menu + reload + + + + + automatic + 100 + done + + diff --git a/openerp/addons/base/base_update.xml b/openerp/addons/base/base_update.xml deleted file mode 100644 index fc3efe6f1d0..00000000000 --- a/openerp/addons/base/base_update.xml +++ /dev/null @@ -1,299 +0,0 @@ - - - - - - res.groups.form - res.groups - form - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - res.users.preferences.form - res.users - form - - -
- - - - - - - - - - - - - - - - - - - - - - - -
- - - res.users.form - res.users - form - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- - - res.users.groups - res.users - - - - - - - - - res.users.tree - res.users - tree - - - - - - - - - - - - res.users.search - res.users - search - - - - - - - - - - - - - - - Company Bank Accounts - res.partner.bank - form - tree,form - - Configure your company's bank accounts and select those that must appear on the report footer. You can reorder bank accounts from the list view. If you use the accounting application of OpenERP, journals and accounts will be created automatically based on these data. - - - - - res.company.form - res.company - form - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -