Merge pull request #269 from sve-odoo/patch-1
authorFabien Pinckaers <fp@openerp.com>
Fri, 30 May 2014 19:26:13 +0000 (21:26 +0200)
committerFabien Pinckaers <fp@openerp.com>
Fri, 30 May 2014 19:26:13 +0000 (21:26 +0200)
[ADD] "Model" Column in base_action_rule tree view.

293 files changed:
CONTRIBUTING.md [new file with mode: 0644]
MANIFEST.in [deleted file]
README.md
addons/account/product_view.xml
addons/account_analytic_analysis/account_analytic_analysis.py
addons/account_analytic_analysis/account_analytic_analysis_view.xml
addons/account_anglo_saxon/product_view.xml
addons/event/email_template.xml
addons/event/event.py
addons/event/event_view.xml
addons/event_sale/event_sale_view.xml
addons/hr_expense/hr_expense.py
addons/hr_expense/hr_expense_view.xml
addons/mass_mailing/__openerp__.py
addons/mass_mailing/data/mass_mailing_data.xml
addons/mass_mailing/data/mass_mailing_demo.xml
addons/mass_mailing/static/src/img/blocks/button_newsletter.png [new file with mode: 0644]
addons/mass_mailing/static/src/js/website_mass_mailing.editor.js [new file with mode: 0644]
addons/mass_mailing/static/src/js/website_mass_mailing.js [new file with mode: 0644]
addons/mass_mailing/views/snippets.xml [new file with mode: 0644]
addons/mass_mailing/views/website_mass_mailing.xml [new file with mode: 0644]
addons/membership/membership.py
addons/membership/membership_view.xml
addons/mrp/mrp.py
addons/mrp/mrp_demo.xml
addons/mrp/mrp_view.xml
addons/mrp/procurement.py
addons/mrp/product.py
addons/mrp/report/price.py
addons/mrp/security/ir.model.access.csv
addons/mrp/stock.py
addons/mrp/test/bom_with_service_type_product.yml
addons/mrp/test/order_demo.yml
addons/mrp/views/report_mrpbomstructure.xml
addons/mrp/wizard/change_production_qty.py
addons/mrp_byproduct/test/mrp_byproduct.yml
addons/point_of_sale/point_of_sale.py
addons/point_of_sale/point_of_sale_demo.xml
addons/point_of_sale/point_of_sale_view.xml
addons/point_of_sale/security/ir.model.access.csv
addons/point_of_sale/static/src/js/db.js
addons/point_of_sale/static/src/js/models.js
addons/point_of_sale/static/src/js/widgets.js
addons/procurement/procurement.py
addons/product/pricelist.py
addons/product/product.py
addons/product/product_data.xml
addons/product/product_demo.xml
addons/product/product_view.xml
addons/product/report/product_label.xml
addons/product/security/ir.model.access.csv
addons/product/security/product_security.xml
addons/product/test/product_pricelist.yml
addons/product_email_template/views/product_view.xml
addons/product_expiry/product_expiry.py
addons/product_expiry/product_expiry_view.xml
addons/product_extended/product_extended.py
addons/product_manufacturer/__init__.py [deleted file]
addons/product_manufacturer/__openerp__.py [deleted file]
addons/product_manufacturer/i18n/ar.po [deleted file]
addons/product_manufacturer/i18n/bg.po [deleted file]
addons/product_manufacturer/i18n/bs.po [deleted file]
addons/product_manufacturer/i18n/ca.po [deleted file]
addons/product_manufacturer/i18n/cs.po [deleted file]
addons/product_manufacturer/i18n/da.po [deleted file]
addons/product_manufacturer/i18n/de.po [deleted file]
addons/product_manufacturer/i18n/el.po [deleted file]
addons/product_manufacturer/i18n/es.po [deleted file]
addons/product_manufacturer/i18n/es_CR.po [deleted file]
addons/product_manufacturer/i18n/es_EC.po [deleted file]
addons/product_manufacturer/i18n/es_MX.po [deleted file]
addons/product_manufacturer/i18n/es_VE.po [deleted file]
addons/product_manufacturer/i18n/et.po [deleted file]
addons/product_manufacturer/i18n/fi.po [deleted file]
addons/product_manufacturer/i18n/fr.po [deleted file]
addons/product_manufacturer/i18n/gl.po [deleted file]
addons/product_manufacturer/i18n/hr.po [deleted file]
addons/product_manufacturer/i18n/hu.po [deleted file]
addons/product_manufacturer/i18n/it.po [deleted file]
addons/product_manufacturer/i18n/ja.po [deleted file]
addons/product_manufacturer/i18n/lt.po [deleted file]
addons/product_manufacturer/i18n/lv.po [deleted file]
addons/product_manufacturer/i18n/mk.po [deleted file]
addons/product_manufacturer/i18n/mn.po [deleted file]
addons/product_manufacturer/i18n/nb.po [deleted file]
addons/product_manufacturer/i18n/nl.po [deleted file]
addons/product_manufacturer/i18n/pl.po [deleted file]
addons/product_manufacturer/i18n/product_manufacturer.pot [deleted file]
addons/product_manufacturer/i18n/pt.po [deleted file]
addons/product_manufacturer/i18n/pt_BR.po [deleted file]
addons/product_manufacturer/i18n/ro.po [deleted file]
addons/product_manufacturer/i18n/ru.po [deleted file]
addons/product_manufacturer/i18n/sl.po [deleted file]
addons/product_manufacturer/i18n/sr.po [deleted file]
addons/product_manufacturer/i18n/sr@latin.po [deleted file]
addons/product_manufacturer/i18n/sv.po [deleted file]
addons/product_manufacturer/i18n/tr.po [deleted file]
addons/product_manufacturer/i18n/zh_CN.po [deleted file]
addons/product_manufacturer/i18n/zh_TW.po [deleted file]
addons/product_manufacturer/product_manufacturer.py [deleted file]
addons/product_manufacturer/product_manufacturer_view.xml [deleted file]
addons/product_manufacturer/security/ir.model.access.csv [deleted file]
addons/project_mrp/project_mrp.py
addons/project_mrp/project_mrp_view.xml
addons/purchase/purchase.py
addons/purchase/purchase_view.xml
addons/purchase_requisition/purchase_requisition.py
addons/purchase_requisition/purchase_requisition_view.xml
addons/report_intrastat/report_intrastat_view.xml
addons/sale/res_config.py
addons/sale/res_config_view.xml
addons/sale/sale.py
addons/sale_mrp/test/cancellation_propagated.yml
addons/sale_mrp/test/sale_mrp.yml
addons/sale_mrp/tests/test_move_explode.py
addons/stock/__openerp__.py
addons/stock/procurement.py
addons/stock/product.py
addons/stock/product_view.xml
addons/stock/security/stock_security.xml
addons/stock/stock.py
addons/stock/stock_report.xml
addons/stock/stock_view.xml
addons/stock/views/report_location_barcode.xml [new file with mode: 0644]
addons/stock/views/report_lot_barcode.xml [new file with mode: 0644]
addons/stock/views/report_package_barcode.xml
addons/stock/views/report_stockpicking.xml
addons/stock_account/product_view.xml
addons/stock_account/security/stock_account_security.xml
addons/stock_account/stock_account.py
addons/stock_landed_costs/product.py
addons/stock_landed_costs/product_view.xml
addons/stock_landed_costs/stock_landed_costs_view.xml
addons/warning/warning.py
addons/warning/warning_view.xml
addons/web/static/src/css/base.css
addons/web/static/src/css/base.sass
addons/web/static/src/img/favicon.ico
addons/web/static/src/img/logo.png
addons/web/static/src/img/logo2.png
addons/web/static/src/img/nologo.png
addons/web/static/src/xml/base.xml
addons/website/controllers/main.py
addons/website/models/ir_ui_view.py
addons/website_event/controllers/main.py
addons/website_forum/data/badges_moderation.xml
addons/website_mail/data/mail_groups.xml
addons/website_mail/static/src/img/blocks/button_group_subscribe.png [new file with mode: 0644]
addons/website_mail_group/static/src/js/website_mail_group.editor.js
addons/website_quote/data/website_quotation_demo.xml
addons/website_sale/controllers/main.py
addons/website_sale/data/data.xml
addons/website_sale/data/demo.xml
addons/website_sale/models/__init__.py
addons/website_sale/models/product.py
addons/website_sale/models/res_config.py [deleted file]
addons/website_sale/security/ir.model.access.csv
addons/website_sale/static/src/css/website_sale.css
addons/website_sale/static/src/css/website_sale.sass
addons/website_sale/static/src/js/website.tour.sale.js
addons/website_sale/static/src/js/website_sale.js
addons/website_sale/tests/test_sale_process.py
addons/website_sale/views/templates.xml
addons/website_sale/views/views.xml
addons/website_sale_delivery/controllers/main.py
checkout.sh [deleted file]
contributing.md [deleted file]
debian/changelog [deleted file]
debian/compat [deleted file]
debian/control [deleted file]
debian/copyright [deleted file]
debian/openerp.init [deleted file]
debian/openerp.install [deleted file]
debian/openerp.postinst [deleted file]
debian/openerp.postrm [deleted file]
debian/rules [deleted file]
doc/adding-command.rst [deleted file]
doc/commands.rst [deleted file]
doc/git.rst
doc/index.rst
doc/openerp-command.rst [deleted file]
history/Changelog [deleted file]
history/Changelog-4.x [deleted file]
history/Changelog-6.x [deleted file]
history/INSTALL [deleted file]
history/README.urpmi [deleted file]
history/README.userchange [deleted file]
history/change-loglevel.sh [deleted file]
history/check_profile_l10n_all.py [deleted file]
history/clean-model.sql [deleted file]
history/gen_graph.sh [deleted file]
history/get-srvstats.sh [deleted file]
history/list-services.sh [deleted file]
history/migrate/3.3.0-3.4.0/README [deleted file]
history/migrate/3.3.0-3.4.0/post.py [deleted file]
history/migrate/3.3.0-3.4.0/pre.py [deleted file]
history/migrate/3.4.0-4.0.0/README [deleted file]
history/migrate/3.4.0-4.0.0/post-tiny.py [deleted file]
history/migrate/3.4.0-4.0.0/post.py [deleted file]
history/migrate/3.4.0-4.0.0/pre-tiny.py [deleted file]
history/migrate/3.4.0-4.0.0/pre.py [deleted file]
history/migrate/4.0.0-4.2.0/pre.py [deleted file]
history/migrate/4.0.0-4.2.0/tiny/README [deleted file]
history/migrate/4.0.0-4.2.0/tiny/pre-tiny.py [deleted file]
history/migrate/4.2.0-4.4.0/pre.py [deleted file]
history/module_graph.py [deleted file]
history/run_all_with_tests.sh [deleted file]
history/xml2yml.py [deleted file]
install/openerp-header.bmp [deleted file]
install/openerp-header.png [deleted file]
install/openerp-icon.ico [deleted file]
install/openerp-icon.png [deleted file]
install/openerp-intro.bmp [deleted file]
install/openerp-server.1 [deleted file]
install/openerp-server.conf [deleted file]
install/openerp-server.init [deleted file]
install/openerp-server.logrotate [deleted file]
install/openerp-slogan.bmp [deleted file]
install/openerp.ico [deleted file]
install/openerp.png [deleted file]
install/openerp_serverrc.5 [deleted file]
install/setup.nsi [deleted file]
install/ssl-cert.cfg [deleted file]
install/win32/OpenERPServerService.py [deleted file]
install/win32/setup.py [deleted file]
odoo.py [new file with mode: 0755]
oe [deleted file]
openerp/addons/base/static/img/main_partner-image.png
openerpcommand/__init__.py [deleted file]
openerpcommand/addons/bench_sale_mrp/__init__.py [deleted file]
openerpcommand/addons/bench_sale_mrp/__openerp__.py [deleted file]
openerpcommand/addons/bench_sale_mrp/data.yml [deleted file]
openerpcommand/bench_sale_mrp.py [deleted file]
openerpcommand/benchmarks.py [deleted file]
openerpcommand/call.py [deleted file]
openerpcommand/client.py [deleted file]
openerpcommand/common.py [deleted file]
openerpcommand/conf.py [deleted file]
openerpcommand/cron.py [deleted file]
openerpcommand/drop.py [deleted file]
openerpcommand/grunt_tests.py [deleted file]
openerpcommand/initialize.py [deleted file]
openerpcommand/main.py [deleted file]
openerpcommand/model.py [deleted file]
openerpcommand/module.py [deleted file]
openerpcommand/oe-bash-completion [deleted file]
openerpcommand/read.py [deleted file]
openerpcommand/scaffold.py [deleted file]
openerpcommand/templates/__init__.jinja2 [deleted file]
openerpcommand/templates/__openerp__.jinja2 [deleted file]
openerpcommand/templates/controllers.jinja2 [deleted file]
openerpcommand/templates/ir.model.access.jinja2 [deleted file]
openerpcommand/templates/models.jinja2 [deleted file]
openerpcommand/uninstall.py [deleted file]
openerpcommand/update.py [deleted file]
openerpcommand/web.py [deleted file]
setup.cfg [deleted file]
setup.py [deleted file]
setup/MANIFEST.in [new file with mode: 0644]
setup/README.urpmi [new file with mode: 0644]
setup/debian/changelog [new file with mode: 0644]
setup/debian/compat [new file with mode: 0644]
setup/debian/control [new file with mode: 0644]
setup/debian/copyright [new file with mode: 0644]
setup/debian/openerp-server.conf [new file with mode: 0644]
setup/debian/openerp.init [new file with mode: 0644]
setup/debian/openerp.install [new file with mode: 0644]
setup/debian/openerp.logrotate [new file with mode: 0644]
setup/debian/openerp.postinst [new file with mode: 0644]
setup/debian/openerp.postrm [new file with mode: 0644]
setup/debian/rules [new file with mode: 0755]
setup/debian/run_all_with_tests.sh [new file with mode: 0755]
setup/package.py [new file with mode: 0755]
setup/setup.cfg [new file with mode: 0644]
setup/setup.py [new file with mode: 0644]
setup/setup_rpm.sh [new file with mode: 0644]
setup/win32/OpenERPServerService.py [new file with mode: 0644]
setup/win32/setup.py [new file with mode: 0644]
setup/windows/LICENSE [new file with mode: 0644]
setup/windows/License.rtf [new file with mode: 0644]
setup/windows/Makefile [new file with mode: 0644]
setup/windows/openerp-header.bmp [new file with mode: 0644]
setup/windows/openerp-header.png [new file with mode: 0644]
setup/windows/openerp-icon.ico [new file with mode: 0644]
setup/windows/openerp-icon.png [new file with mode: 0644]
setup/windows/openerp-intro.bmp [new file with mode: 0644]
setup/windows/openerp-slogan.bmp [new file with mode: 0644]
setup/windows/openerp.ico [new file with mode: 0644]
setup/windows/openerp.png [new file with mode: 0644]
setup/windows/pg_hba.conf [new file with mode: 0644]
setup/windows/postgresql.conf [new file with mode: 0644]
setup/windows/setup.nsi [new file with mode: 0755]
setup_rpm.sh [deleted file]

diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644 (file)
index 0000000..0575beb
--- /dev/null
@@ -0,0 +1,68 @@
+Contributing to Odoo
+====================
+
+Reporting Issues
+----------------
+If possible, always attach a pull request when creating an issue (GitHub will automatically create an issue when submitting the changes). The issues not linked to a pull request or an internal request on odoo.com will be handled with a lower priority.
+
+If later on you create a pull request solving an opened issue, do not forget to reference to it in your pull request (e.g.: "This patch fixes issue #42").
+
+When reporting an issue or creating a pull request, use the following structure:
+
+> **Quantity field is ignored in a sale order**
+>
+> Impacted versions:
+> 
+>  - 7.0 and above
+> 
+> Steps to reproduce:
+> 
+>  1. create a new sale order
+>  2. add a line with product 'Service', quantity 2, unit price 10.0
+>  3. validate the sale order
+> 
+> Current behavior:
+> 
+>  - Total price of 10.0
+> 
+> Expected behavior:
+> 
+>  - Total price of 20.0 (2 * 10 = 20)
+
+For web or rendering issues, do not forget to specify the operating system and browser you are using.
+
+Against which version should I submit a patch?
+----------------------------------------------
+Periodically, we forward port the fixes realized in the latest stable version to master and intermediate saas repositories. This means that you should submit your pull request against the lowest supported version. If applying, you should always submit your code against `odoo/7.0`. The `saas-x` versions are intermediate versions between stable versions.
+
+![Submiting against the right version](/doc/_static/pull-request-version.png)
+
+However your change **must** be submitted against `odoo/master` if
+
+* it modifies the database structure (e.g.: adding a new field)
+* it adds a new feature
+
+Why was my fix labeled as blocked?
+----------------------------------
+The label *blocked* is used when an action is required from the submitter. The typical reasons are:
+
+* the fix is incomplete/incorrect and a change is required
+* more information is required
+
+Pull requests with the blocked label will not be processed as long as the label remains. Once the correction done, we will review it and eventually remove the label.
+
+Why was my issue closed without merging?
+----------------------------------------
+A pull request is closed when it will not be merged into odoo. This will typically happens if the fix/issue:
+
+* is not relevant to odoo development (label *invalid*)
+* is not considered as a bug or we have no plan to change the current behavior (label *wontfix*)
+* is a duplicated of another opened issue (label *duplicate*)
+* the pull request should be resubmitted against another version
+
+What is this odoo-dev repository? Should I use it?
+--------------------------------------------------
+
+The `odoo-dev/odoo` repository is an internal repository used by the R&D of Odoo to keep the main repository clean. If you are coming from Launchpad, this is the equivalent of the `~openerp-dev` repository.
+
+When forking odoo to submit a patch, always use the `github.com/odoo/odoo` repository. Be also careful of the version you are branching as it will determine the history once the pull request will be realized (e.g.: `git checkout -b 7.0-my-branch odoo/7.0`).
diff --git a/MANIFEST.in b/MANIFEST.in
deleted file mode 100644 (file)
index af66a5a..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-graft debian
-graft doc
-graft install
-graft openerp
-graft win32
-include README
-include LICENSE
-include MANIFEST.in
-include openerp-*
-include oe*
-include setup*
-global-exclude *pyc *~    # Exclude possible garbage from previous graft.
index 7b38960..c400772 100644 (file)
--- a/README.md
+++ b/README.md
@@ -1,73 +1,52 @@
-About Odoo
-==========
+Odoo
+----
 
-Odoo is a suite of open source Business apps. More info at http://www.odoo.com
+Odoo is a suite of web based open source business apps.  More info at http://www.odoo.com
 
-Installation
-============
+The easiest way to play with it is the <a href="https://www.odoo.com/page/start">Odoo free trial</a>, email registration is NOT required, use the "skip this step" link on the registration page to skip it.
 
-[Setup/migration guide for employees](https://github.com/odoo/odoo/blob/master/doc/git.rst)
 
+Getting started with Odoo developement
+--------------------------------------
 
-Migration from bazaar
-=====================
+If you are a developer type the following command at your terminal [1]:
 
-If you have existing bazaar branches and want to move them to a git repository,
-there are several options:
+    wget -O- https://raw.githubusercontent.com/odoo/odoo/master/odoo.py | python
 
-* download http://nightly.openerp.com/move-branch.zip and run it with
-  `python move-branch.zip -h` (for the help). It should be able to convert
-  simple-enough branches for you (even if they have merge commits &al)
-* Extract the branch contents as patches and use `git apply` or `git am` to
-  rebuild a branch from them
-* Replay the branch by hand
+Then follow <a href="https://doc.openerp.com/trunk/server/howto/howto_website/">the developer tutorial</a>
 
+[1] You may want to check the content of the <a href="https://raw.githubusercontent.com/odoo/odoo/master/odoo.py">odoo.py file</a> before executing it.
 
-System Requirements
--------------------
 
-The dependencies are listed in setup.py
+Packages, tarballs and installers
+---------------------------------
 
+* Debian packages
 
-Debian/Ubuntu
--------------
+    Add this apt repository to your /etc/apt/sources.list file
 
-Add the apt repository
+        deb http://nightly.openerp.com/8.0/deb/ ./
 
-    deb http://nightly.openerp.com/7.0/deb/ ./
+    Then type:
 
-in your source.list and type:
+        $ sudo apt-get update
+        $ sudo apt-get install odoo
 
-    $ sudo apt-get update
-    $ sudo apt-get install openerp
+* <a href="http://nightly.openerp.com/">Source tarballs</a>
 
-Or download the deb file and type:
+* <a href="http://nightly.openerp.com/">Windows installer</a>
 
-    $ sudo dpkg -i <openerp-deb-filename>
-    $ sudo apt-get install -f
+* <a href="http://nightly.openerp.com/">RPM package</a>
 
-RedHat, Fedora, CentOS
-----------------------
 
-Install the required dependencies:
+For Odoo employees
+------------------
 
-    $ yum install python
-    $ easy_install pip
-    $ pip install .....
+To add the odoo-dev remote use this command:
 
-Install the openerp rpm
+    $ ./odoo.py setup_git_dev
 
-    $ rpm -i openerp-VERSION.rpm
+To fetch odoo merge pull requests refs use this command:
 
-Windows
--------
-
-Check the notes in setup.py
-
-
-Setting up your database
-------------------------
-
-Point your browser to http://localhost:8069/ and click "Manage Databases", the
-default master password is "admin".
+    $ ./odoo.py setup_git_review
 
index 73b31bb..9c1b0ee 100644 (file)
@@ -1,57 +1,52 @@
 <?xml version="1.0" encoding="utf-8"?>
 <openerp>
     <data>
-        <record id="product_normal_form_view" model="ir.ui.view">
-            <field name="name">product.normal.form.inherit</field>
-            <field name="model">product.product</field>
+        <record id="product_template_form_view" model="ir.ui.view">
+            <field name="name">product.template.form.inherit</field>
+            <field name="model">product.template</field>
             <field name="priority">5</field>
-            <field name="inherit_id" ref="product.product_normal_form_view"/>
+            <field name="inherit_id" ref="product.product_template_form_view"/>
             <field name="arch" type="xml">
-                <notebook position="inside">
+                <page string="Sales" position="after">
                     <page string="Accounting" groups="account.group_account_invoice">
+                        <group>
+                            <label for="categ_id" string="Internal Category"/>
+                            <div><field name="categ_id" colspan="3" nolabel="1"/></div>
+                        </group>
                         <group name="properties">
                             <group>
                                 <field name="property_account_income" domain="[('type','=','other')]" groups="account.group_account_user"
-                                    attrs="{'readonly': [('is_only_child', '=', False)]}"/>
+                                    attrs="{'readonly': [('is_product_variant', '=', True)]}"/>
                                 <field name="taxes_id" colspan="2" widget="many2many_tags"
-                                    attrs="{'readonly':[ '|', ('sale_ok','=',0), ('is_only_child', '=', False)]}"/>
+                                    attrs="{'readonly':[ '|', ('sale_ok','=',0), ('is_product_variant', '=', True)]}"/>
                             </group>
                             <group>
                                 <field name="property_account_expense" domain="[('type','=','other')]" groups="account.group_account_user"
-                                    attrs="{'readonly': [('is_only_child', '=', False)]}"/>
+                                    attrs="{'readonly': [('is_product_variant', '=', True)]}"/>
                                 <field name="supplier_taxes_id" colspan="2" widget="many2many_tags"
-                                    attrs="{'readonly': [('is_only_child', '=', False)]}"/>
+                                    attrs="{'readonly': [('is_product_variant', '=', True)]}"/>
                             </group>
                         </group>
                     </page>
-                </notebook>
+                </page>
             </field>
         </record>
 
-        <record id="product_template_form_view" model="ir.ui.view">
-            <field name="name">product.template.product.form.inherit</field>
+        <record id="product_template_search_view" model="ir.ui.view">
+            <field name="name">product.template.search</field>
             <field name="model">product.template</field>
-            <field name="inherit_id" ref="product.product_template_form_view"/>
+            <field name="mode">primary</field>
+            <field name="inherit_id" ref="product.product_template_search_view"/>
             <field name="arch" type="xml">
-                <notebook position="inside">
-                    <page string="Accounting">
-                        <group name="properties">
-                            <group>
-                                <field name="property_account_income" domain="[('type','&lt;&gt;','view'),('type','&lt;&gt;','consolidation')]"/>
-                                <field name="taxes_id" colspan="2" widget="many2many_tags"/>
-                            </group>
-                            <group>
-                                <field name="property_account_expense" domain="[('type','&lt;&gt;','view'),('type','&lt;&gt;','consolidation')]"/>
-                                <field name="supplier_taxes_id" colspan="2" widget="many2many_tags"/>
-                            </group>
-                        </group>
-                    </page>
-                </notebook>
-             </field>
+                <field name="product_variant_ids" position="after">
+                    <field name="categ_id"/>
+                </field>
+                <xpath expr="//group[@string='Group by...']" position="inside">
+                    <filter string='Category' icon="terp-stock_symbol-selection" domain="[]" context="{'group_by' : 'categ_id'}"/>
+                </xpath>
+            </field>
         </record>
 
-
-
         <record id="view_category_property_form" model="ir.ui.view">
             <field name="name">product.category.property.form.inherit</field>
             <field name="model">product.category</field>
index 4b2352b..6c710dc 100644 (file)
@@ -553,18 +553,17 @@ class account_analytic_account(osv.osv):
             'nodestroy': True,
         }
 
-    def on_change_template(self, cr, uid, ids, template_id, date_start=False, fix_price_invoices=False, invoice_on_timesheets=False, recurring_invoices=False, context=None):
+    def on_change_template(self, cr, uid, ids, template_id, date_start=False, context=None):
         if not template_id:
             return {}
-        obj_analytic_line = self.pool.get('account.analytic.invoice.line')
         res = super(account_analytic_account, self).on_change_template(cr, uid, ids, template_id, date_start=date_start, context=context)
 
         template = self.browse(cr, uid, template_id, context=context)
         
-        if not fix_price_invoices:
+        if not ids:
             res['value']['fix_price_invoices'] = template.fix_price_invoices
             res['value']['amount_max'] = template.amount_max
-        if not invoice_on_timesheets:
+        if not ids:
             res['value']['invoice_on_timesheets'] = template.invoice_on_timesheets
             res['value']['hours_qtt_est'] = template.hours_qtt_est
         
@@ -572,7 +571,7 @@ class account_analytic_account(osv.osv):
             res['value']['to_invoice'] = template.to_invoice.id
         if template.pricelist_id.id:
             res['value']['pricelist_id'] = template.pricelist_id.id
-        if not recurring_invoices:
+        if not ids:
             invoice_line_ids = []
             for x in template.recurring_invoice_line_ids:
                 invoice_line_ids.append((0, 0, {
index af6eb47..af4caae 100644 (file)
@@ -38,9 +38,6 @@
                 <field name="partner_id" position="attributes">
                     <attribute name="attrs">{'required': [('type','=','contract'),'|','|',('fix_price_invoices','=',True), ('invoice_on_timesheets', '=', True), ('recurring_invoices', '=', True)]}</attribute>
                 </field>
-                <field name="template_id" position="attributes">
-                    <attribute name="on_change">on_change_template(template_id, date_start, fix_price_invoices, invoice_on_timesheets, recurring_invoices)</attribute>
-                </field>
                 <xpath expr='//group[@name="invoice_on_timesheets"]' position="replace">
                 </xpath>
                 <xpath expr='//separator[@name="description"]' position='before'>
index c06decf..5a58913 100644 (file)
@@ -1,29 +1,18 @@
 <?xml version="1.0"?>
 <openerp>
     <data>
-        <record id="product_normal_form_view" model="ir.ui.view">
-            <field name="name">product.normal.form.inherit.stock</field>
-            <field name="model">product.product</field>
-            <field name="inherit_id" ref="account.product_normal_form_view"/>
-            <field name="arch" type="xml">
-                <field name="property_account_expense" position="after">
-                    <label string="" colspan="2"/>
-                    <field name="property_account_creditor_price_difference" domain="[('type','&lt;&gt;','view'),('type','&lt;&gt;','consolidation')]" attrs="{'readonly':[('purchase_ok','=',0)]}" />
-                    <newline/>
-                </field>
-            </field>
-        </record>
-
         <record id="product_template_form_view" model="ir.ui.view">
-            <field name="name">product.template.product.form.inherit</field>
+            <field name="name">product.normal.form.inherit.stock</field>
             <field name="model">product.template</field>
             <field name="inherit_id" ref="account.product_template_form_view"/>
             <field name="arch" type="xml">
                 <field name="property_account_expense" position="after">
+                    <label string="" colspan="2"/>
+                    <field name="purchase_ok" invisible="1"/>
                     <field name="property_account_creditor_price_difference" domain="[('type','&lt;&gt;','view'),('type','&lt;&gt;','consolidation')]" attrs="{'readonly':[('purchase_ok','=',0)]}" />
                     <newline/>
                 </field>
-             </field>
+            </field>
         </record>
 
         <record id="view_category_property_form" model="ir.ui.view">
index d99774a..d4479bc 100644 (file)
@@ -9,7 +9,7 @@
         <field name="subject">Your registration at ${object.event_id.name}</field>
         <field name="body_html"><![CDATA[
         <p>Hello ${object.name},</p>
-        <p>The event ${object.event_id.name} that you registered for is confirmed and will be held from ${object.event_id.date_begin} to ${object.event_id.date_end}.
+        <p>The event ${object.event_id.name} that you registered for is confirmed and will be held from ${object.event_id.date_begin_located.strftime('%Y-%m-%d %H:%M:%S (%Z)')} to ${object.event_id.date_end_located.strftime('%Y-%m-%d %H:%M:%S (%Z)')}.
         For any further information please contact our event department.</p>
         <p>Thank you for your participation!</p>
         <p>Best regards</p>]]></field>
index 5e5d120..a31ec00 100644 (file)
@@ -18,7 +18,8 @@
 #    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #
 ##############################################################################
-
+import pytz
+from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT
 from datetime import datetime, timedelta
 from openerp.osv import fields, osv
 from openerp.tools.translate import _
@@ -156,6 +157,22 @@ class event_event(osv.osv):
             for event in self.browse(cr, uid, ids, context=context)
         }
 
+    def _compute_date_tz(self, cr, uid, ids, fld, arg, context=None):
+        if context is None:
+            context = {}
+        res = {}
+        for event in self.browse(cr, uid, ids, context=context):
+            ctx = dict(context, tz=(event.date_tz or 'UTC'))
+            if fld == 'date_begin_located':
+                date_to_convert = event.date_begin
+            elif fld == 'date_end_located':
+                date_to_convert = event.date_end
+            res[event.id] = fields.datetime.context_timestamp(cr, uid, datetime.strptime(date_to_convert, DEFAULT_SERVER_DATETIME_FORMAT), context=ctx)
+        return res
+
+    def _tz_get(self, cr, uid, context=None):
+        return [(x, x) for x in pytz.all_timezones]
+
     _columns = {
         'name': fields.char('Event Name', size=64, required=True, translate=True, readonly=False, states={'done': [('readonly', True)]}),
         'user_id': fields.many2one('res.users', 'Responsible User', readonly=False, states={'done': [('readonly', True)]}),
@@ -175,8 +192,11 @@ class event_event(osv.osv):
             store={'event.registration': (_get_events_from_registrations, ['state'], 10),
                    'event.event': (lambda  self, cr, uid, ids, c = {}: ids, ['seats_max', 'registration_ids'], 20)}),
         'registration_ids': fields.one2many('event.registration', 'event_id', 'Registrations', readonly=False, states={'done': [('readonly', True)]}),
+        'date_tz': fields.selection(_tz_get, string='Timezone'),
         'date_begin': fields.datetime('Start Date', required=True, readonly=True, states={'draft': [('readonly', False)]}),
         'date_end': fields.datetime('End Date', required=True, readonly=True, states={'draft': [('readonly', False)]}),
+        'date_begin_located': fields.function(_compute_date_tz, string='Start Date Located', type="datetime"),
+        'date_end_located': fields.function(_compute_date_tz, string='End Date Located', type="datetime"),
         'state': fields.selection([
             ('draft', 'Unconfirmed'),
             ('cancel', 'Cancelled'),
@@ -204,7 +224,8 @@ class event_event(osv.osv):
         'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'event.event', context=c),
         'user_id': lambda obj, cr, uid, context: uid,
         'organizer_id': lambda self, cr, uid, c: self.pool.get('res.users').browse(cr, uid, uid, context=c).company_id.partner_id.id,
-        'address_id': lambda self, cr, uid, c: self.pool.get('res.users').browse(cr, uid, uid, context=c).company_id.partner_id.id
+        'address_id': lambda self, cr, uid, c: self.pool.get('res.users').browse(cr, uid, uid, context=c).company_id.partner_id.id,
+        'date_tz': lambda self, cr, uid, ctx: ctx.get('tz', "UTC"),
     }
 
     def _check_seats_limit(self, cr, uid, ids, context=None):
index cc6edfb..baa553b 100644 (file)
@@ -89,6 +89,7 @@
                                 <field name="type" on_change="onchange_event_type(type,context)" />
                                 <field name="date_begin" on_change="onchange_start_date(date_begin,date_end)"/>
                                 <field name="date_end"/>
+                                <field name="date_tz" />
                             </group>
                         </group>
                         <notebook>
index 8987354..a049565 100644 (file)
@@ -1,18 +1,19 @@
 <?xml version="1.0"?>
 <openerp>
     <data>
-        <record model="ir.ui.view" id="event_sale_product_form">
-             <field name="model">product.product</field>
-             <field name="inherit_id" ref="product.product_normal_form_view" />
+
+        <record model="ir.ui.view" id="event_sale_product_template_form">
+             <field name="model">product.template</field>
+             <field name="inherit_id" ref="product.product_template_form_view" />
              <field name="arch" type="xml">
-                <div name="options" position="after">
-                    <field name="event_ok" on_change="onchange_event_ok(type, event_ok, context)"
-                           attrs="{'readonly': [('is_only_child', '=', False)]}"/>
-                    <label for="event_ok"/>
+                <div name="options" position="inside">
+                    <div>
+                        <field name="event_ok" on_change="onchange_event_ok(type, event_ok, context)"/>
+                        <label for="event_ok"/>
+                    </div>
                 </div>
                 <field name='type' position="after">
-                    <field name="event_type_id" attrs="{'invisible': [('event_ok', '=', False)],
-                                                        'readonly': [('is_only_child', '=', False)]}"/>
+                    <field name="event_type_id" attrs="{'invisible': [('event_ok', '=', False)]}"/>
                 </field>
              </field>
         </record>
             </field>
         </record>
 
-        <record model="ir.ui.view" id="event_sale_product_template_form">
-             <field name="model">product.template</field>
-             <field name="inherit_id" ref="product.product_template_form_view" />
-             <field name="arch" type="xml">
-                <div name="options" position="inside">
-                    <field name="event_ok" on_change="onchange_event_ok(type, event_ok, context)"/>
-                    <label for="event_ok"/>
-                </div>
-                <field name='company_id' position="after">
-                    <field name="event_type_id" attrs="{'invisible': [('event_ok', '=', False)]}"/>
-                </field>
-             </field>
-        </record>
-
         <record model="ir.ui.view" id="event_order_line">
              <field name="name">event.sale.order</field>
              <field name="model">sale.order</field>
index f57b142..0129e5d 100644 (file)
@@ -392,8 +392,8 @@ class hr_expense_expense(osv.osv):
         return result
 
 
-class product_product(osv.osv):
-    _inherit = "product.product"
+class product_template(osv.osv):
+    _inherit = "product.template"
     _columns = {
         'hr_expense_ok': fields.boolean('Can be Expensed', help="Specify if the product can be selected in an HR expense line."),
     }
index 457d8f3..9756e6a 100644 (file)
 
 
         <record id="view_product_hr_expense_form" model="ir.ui.view">
-            <field name="name">product.product.expense.form</field>
-            <field name="model">product.product</field>
-            <field name="inherit_id" ref="product.product_normal_form_view"/>
+            <field name="name">product.template.expense.form</field>
+            <field name="model">product.template</field>
+            <field name="inherit_id" ref="product.product_template_form_view"/>
             <field name="arch" type="xml">
                 <div name="options" position="inside">
-                    <field name="hr_expense_ok"/>
-                    <label for="hr_expense_ok"/>
+                    <div>
+                        <field name="hr_expense_ok"/>
+                        <label for="hr_expense_ok"/>
+                    </div>
                 </div>
             </field>
         </record>
index e96cc91..e0a8ab0 100644 (file)
@@ -48,6 +48,8 @@ professional emails and reuse templates in a few clicks.
         'views/res_config.xml',
         'views/res_partner.xml',
         'views/email_template.xml',
+        'views/website_mass_mailing.xml',
+        'views/snippets.xml',
         'security/ir.model.access.csv',
         'views/mass_mailing.xml',
     ],
index 6bd1df7..7137bfc 100644 (file)
             <field name="sequence">30</field>
         </record>
 
+        <!-- Create mailing lists -->
+        <record id="mass_mail_list_1" model="mail.mass_mailing.list">
+            <field name="name">Newsletter</field>
+        </record>
+
     </data>
 </openerp>
\ No newline at end of file
index 569feec..d5a8441 100644 (file)
@@ -9,7 +9,7 @@
         </record>
 
         <!-- Create mailing lists -->
-        <record id="mass_mail_list_1" model="mail.mass_mailing.list">
+        <record id="mass_mail_list_2" model="mail.mass_mailing.list">
             <field name="name">Imported Contacts</field>
         </record>
 
         <record id="mass_mail_contact_1" model="mail.mass_mailing.contact">
             <field name="name">Aristide Antario</field>
             <field name="email">aa@example.com</field>
-            <field name="list_id" ref="mass_mailing.mass_mail_list_1"/>
+            <field name="list_id" ref="mass_mailing.mass_mail_list_2"/>
         </record>
         <record id="mass_mail_contact_2" model="mail.mass_mailing.contact">
             <field name="name">Beverly Bridge</field>
             <field name="email">bb@example.com</field>
-            <field name="list_id" ref="mass_mailing.mass_mail_list_1"/>
+            <field name="list_id" ref="mass_mailing.mass_mail_list_2"/>
         </record>
         <record id="mass_mail_contact_3" model="mail.mass_mailing.contact">
             <field name="name">Carol Cartridge</field>
             <field name="email">cc@example.com</field>
-            <field name="list_id" ref="mass_mailing.mass_mail_list_1"/>
+            <field name="list_id" ref="mass_mailing.mass_mail_list_2"/>
             <field name="opt_out" eval="True"/>
         </record>
 
diff --git a/addons/mass_mailing/static/src/img/blocks/button_newsletter.png b/addons/mass_mailing/static/src/img/blocks/button_newsletter.png
new file mode 100644 (file)
index 0000000..46a63ef
Binary files /dev/null and b/addons/mass_mailing/static/src/img/blocks/button_newsletter.png differ
diff --git a/addons/mass_mailing/static/src/js/website_mass_mailing.editor.js b/addons/mass_mailing/static/src/js/website_mass_mailing.editor.js
new file mode 100644 (file)
index 0000000..4caba1d
--- /dev/null
@@ -0,0 +1,40 @@
+(function () {
+    'use strict';
+
+    var website = openerp.website;
+    var _t = openerp._t;
+
+    website.snippet.options.mailing_list_subscribe = website.snippet.Option.extend({
+        on_prompt: function () {
+            var self = this;
+            return website.prompt({
+                id: "editor_new_mailing_list_subscribe_button",
+                window_title: _t("Add a Newsletter Subscribe Button"),
+                select: _t("Newsletter"),
+                init: function (field) {
+                    return website.session.model('mail.mass_mailing.list')
+                            .call('name_search', ['', []], { context: website.get_context() });
+                },
+            }).then(function (mailing_list_id) {
+                self.$target.attr("data-list-id", mailing_list_id);
+            });
+        },
+        drop_and_build_snippet: function() {
+            var self = this;
+            this._super();
+            this.on_prompt().fail(function () {
+                self.editor.on_remove();
+            });
+        },
+        start : function () {
+            var self = this;
+            this.$el.find(".js_mailing_list").on("click", _.bind(this.on_prompt, this));
+            this._super();
+        },
+        clean_for_save: function () {
+            this.$target.addClass("hidden");
+        },
+    });
+})();
+
+
diff --git a/addons/mass_mailing/static/src/js/website_mass_mailing.js b/addons/mass_mailing/static/src/js/website_mass_mailing.js
new file mode 100644 (file)
index 0000000..5776fad
--- /dev/null
@@ -0,0 +1,57 @@
+(function () {
+    'use strict';
+
+    var website = openerp.website;
+
+    website.snippet.animationRegistry.subscribe = website.snippet.Animation.extend({
+        selector: ".js_subscribe",
+        start: function (editable_mode) {
+            var self = this;
+
+            // set value and display button
+            self.$target.find("input").removeClass("hidden");
+            openerp.jsonRpc('/website_mass_mailing/is_subscriber', 'call', {
+                list_id: this.$target.data('list-id'),
+            }).always(function (data) {
+                self.$target.find('input.js_subscribe_email')
+                    .val(data.email ? data.email : "")
+                    .attr("disabled", data.is_subscriber && data.email.length ? "disabled" : false);
+                self.$target.attr("data-subscribe", data.is_subscriber ? 'on' : 'off');
+                self.$target.find('a.js_subscribe_btn')
+                    .val(data.email ? data.email : "")
+                    .attr("disabled", data.is_subscriber && data.email.length ? "disabled" : false);
+                self.$target.removeClass("hidden");
+            });
+
+            // not if editable mode to allow designer to edit alert field
+            if (!editable_mode) {
+                $('.js_subscribe > .alert').addClass("hidden");
+                $('.js_subscribe > .input-group-btn.hidden').removeClass("hidden");
+                this.$target.find('.js_subscribe_btn').on('click', function (event) {
+                    event.preventDefault();
+                    self.on_click();
+                });
+            }
+        },
+        on_click: function () {
+            var self = this;
+            var $email = this.$target.find(".js_subscribe_email:visible");
+
+            if ($email.length && !$email.val().match(/.+@.+/)) {
+                this.$target.addClass('has-error');
+                return false;
+            }
+            this.$target.removeClass('has-error');
+
+            openerp.jsonRpc('/website_mass_mailing/subscribe', 'call', {
+                'list_id': this.$target.data('list-id'),
+                'email': $email.length ? $email.val() : false,
+            }).then(function (subscribe) {
+                self.$target.find(".js_subscribe_email, .input-group-btn").addClass("hidden");
+                self.$target.find(".alert").removeClass("hidden");
+                self.$target.find('input.js_subscribe_email').attr("disabled", subscribe ? "disabled" : false);
+                self.$target.attr("data-subscribe", subscribe ? 'on' : 'off');
+            });
+        },
+    });
+})();
diff --git a/addons/mass_mailing/views/snippets.xml b/addons/mass_mailing/views/snippets.xml
new file mode 100644 (file)
index 0000000..cefe2e7
--- /dev/null
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+<data>
+
+<template id="mailing_list_subscribe" inherit_id="website.snippets" name="Subscribe to Newsletter">
+
+    <xpath expr="//div[@id='snippet_content']" position="inside">
+        <div>
+            <div class="oe_snippet_thumbnail">
+                <img class="oe_snippet_thumbnail_img" src="/mass_mailing/static/src/img/blocks/button_newsletter.png"/>
+                <span class="oe_snippet_thumbnail_title">Newsletter</span>
+            </div>
+
+            <div class="oe_snippet_body input-group js_subscribe"
+                      data-list-id="0">
+                <input
+                      type="email"
+                      name="email"
+                      class="js_subscribe_email form-control"
+                      placeholder="your email..."/>
+                <span class="input-group-btn">
+                    <a href="#" class="btn btn-primary js_subscribe_btn">Subscribe</a>
+                </span>
+                <div class="alert alert-success hidden">Thanks for your subscription!</div>
+            </div>
+
+        </div>
+    </xpath>
+
+    <xpath expr="//div[@id='snippet_options']" position="inside">
+        <div data-snippet-option-id='mailing_list_subscribe'
+            data-selector=".js_subscribe"
+            data-selector-siblings="p, h1, h2, h3, blockquote, .well, .panel"
+           >
+            <li>
+                <a href="#" class="button js_mailing_list">Change Newsletter</a>
+            </li>
+        </div>
+    </xpath>
+
+</template>
+
+</data>
+</openerp>
diff --git a/addons/mass_mailing/views/website_mass_mailing.xml b/addons/mass_mailing/views/website_mass_mailing.xml
new file mode 100644 (file)
index 0000000..bc55f61
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+<data>
+
+<template id="head" inherit_id="website.layout" name="Mail customization">
+    <xpath expr="//head" position="inside">
+        <script type="text/javascript" src="/mass_mailing/static/src/js/website_mass_mailing.editor.js" groups="base.group_website_publisher"></script>
+        <script type="text/javascript" src="/mass_mailing/static/src/js/website_mass_mailing.js"></script>
+        <link rel='stylesheet' href='/website_mail/static/src/css/website_mail.css'/>
+    </xpath>
+</template>
+
+</data>
+</openerp>
index 98e47f8..6cc1f0e 100644 (file)
@@ -462,7 +462,7 @@ class Product(osv.osv):
         return super(Product,self).fields_view_get(cr, user, view_id, view_type, context, toolbar, submenu)
 
     '''Product'''
-    _inherit = 'product.product'
+    _inherit = 'product.template'
     _columns = {
         'membership': fields.boolean('Membership', help='Check if the product is eligible for membership.'),
         'membership_date_from': fields.date('Membership Start Date', help='Date from which membership becomes active.'),
index 3964b8b..c157eaf 100644 (file)
@@ -8,7 +8,7 @@
 
         <record model="ir.ui.view" id="membership_product_search_form_view">
             <field name="name">membership.product.search.form</field>
-            <field name="model">product.product</field>
+            <field name="model">product.template</field>
             <field name="arch" type="xml">
                 <search string="Membership Products">
                     <field name="name" filter_domain="['|',('name','ilike',self),('code','ilike',self)]" string="Membership Product"/>
 
         <record model="ir.ui.view" id="membership_products_tree">
             <field name="name">Membership products</field>
-            <field name="model">product.product</field>
+            <field name="model">product.template</field>
+            <field name="priority">50</field>
             <field name="arch" type="xml">
                 <tree string="Membership products">
-                    <field name="code"/>
                     <field name="name"/>
                     <field name="membership_date_from"/>
                     <field name="membership_date_to"/>
@@ -41,7 +41,8 @@
 
         <record model="ir.ui.view" id="membership_products_form">
             <field name="name">Membership Products</field>
-            <field name="model">product.product</field>
+            <field name="model">product.template</field>
+            <field name="priority">50</field>
             <field name="arch" type="xml">
                 <form string="Membership products" version="7.0">
                     <sheet>
             </field>
         </record>
 
-        <record model="ir.ui.view" id="product_normal_form_view">
+        <record model="ir.ui.view" id="product_template_form_view">
             <field name="name">Membership Products</field>
-            <field name="model">product.product</field>
+            <field name="model">product.template</field>
             <field name="priority">6</field>
-            <field name="inherit_id" ref="product.product_normal_form_view"/>
+            <field name="inherit_id" ref="product.product_template_form_view"/>
             <field name="arch" type="xml">
-                <page string="Accounting" position="after">
-                    <page string="Membership">
-                        <group col="1">
-                            <group>
-                                <field name="membership" readonly="0"/>
-                            </group>
-                            <group attrs="{'invisible':[('membership','=',False)]}">
-                                <field name="membership_date_from" readonly="0" attrs="{'required':[('membership','=',True)]}"/>
-                                <field name="membership_date_to" readonly="0" attrs="{'required':[('membership','=',True)]}"/>
-                            </group>
-                        </group>
-                    </page>
-                </page>
+                <field name="type" position="after">
+                    <field name="membership" readonly="0" attrs="{'invisible': [('type', '!=', 'service')]}"/>
+                </field>
+                <field name="description" position="before">
+                    <group attrs="{'invisible':[('membership','=',False)]}">
+                        <field name="membership_date_from" readonly="0" attrs="{'required':[('membership','=',True)]}"/>
+                        <field name="membership_date_to" readonly="0" attrs="{'required':[('membership','=',True)]}"/>
+                    </group>
+                </field>
             </field>
         </record>
 
         <record model="ir.actions.act_window" id="action_membership_products">
             <field name="name">Membership Products</field>
-            <field name="res_model">product.product</field>
+            <field name="res_model">product.template</field>
             <field name="domain">[('membership','=',True), ('type', '=', 'service')]</field>
             <field name="context">{'membership':True, 'type':'service', 'default_membership': True, 'default_type': 'service'}</field>
             <field name="search_view_id" ref="membership_product_search_form_view"/>
index 3578557..23033fa 100644 (file)
@@ -178,207 +178,266 @@ class mrp_bom(osv.osv):
         bom_parent = bom_obj.browse(cr, uid, bom_id, context=context)
         for bom in self.browse(cr, uid, ids, context=context):
             if (bom_parent) or (bom.id == bom_id):
-                result[bom.id] = map(lambda x: x.id, bom.bom_lines)
+                result[bom.id] = map(lambda x: x.id, bom.bom_line_ids)
             else:
                 result[bom.id] = []
-            if bom.bom_lines:
+            if bom.bom_line_ids:
                 continue
             ok = ((name=='child_complete_ids'))
             if (bom.type=='phantom' or ok):
-                sids = bom_obj.search(cr, uid, [('bom_id','=',False),('product_id','=',bom.product_id.id)])
+                sids = bom_obj.search(cr, uid, [('product_tmpl_id','=',bom.product_tmpl_id.id)])
                 if sids:
                     bom2 = bom_obj.browse(cr, uid, sids[0], context=context)
-                    result[bom.id] += map(lambda x: x.id, bom2.bom_lines)
-
+                    result[bom.id] += map(lambda x: x.id, bom2.bom_line_ids)
         return result
 
     _columns = {
         'name': fields.char('Name', size=64),
         'code': fields.char('Reference', size=16),
         'active': fields.boolean('Active', help="If the active field is set to False, it will allow you to hide the bills of material without removing it."),
-        'type': fields.selection([('normal', 'Normal BoM'), ('phantom', 'Sets / Phantom')], 'BoM Type', required=True,
-                                 help= "If a by-product is used in several products, it can be useful to create its own BoM. "\
-                                 "Though if you don't want separated production orders for this by-product, select Set/Phantom as BoM type. "\
-                                 "If a Phantom BoM is used for a root product, it will be sold and shipped as a set of components, instead of being produced."),
-        'date_start': fields.date('Valid From', help="Validity of this BoM or component. Keep empty if it's always valid."),
-        'date_stop': fields.date('Valid Until', help="Validity of this BoM or component. Keep empty if it's always valid."),
-        'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of bills of material."),
+        'type': fields.selection([('normal', 'Normal'), ('phantom', 'Set')], 'BoM Type', required=True,
+                help= "Set: When processing a sales order for this product, the delivery order will contain the raw materials, instead of the finished product."),
         'position': fields.char('Internal Reference', size=64, help="Reference to a position in an external plan."),
-        'product_id': fields.many2one('product.product', 'Product', required=True),
-        'product_uos_qty': fields.float('Product UOS Qty'),
-        'product_uos': fields.many2one('product.uom', 'Product UOS', help="Product UOS (Unit of Sale) is the unit of measurement for the invoicing and promotion of stock."),
+        'product_tmpl_id': fields.many2one('product.template', 'Product', required=True),
+        'product_id': fields.many2one('product.product', 'Product Variant',
+            domain="[('product_tmpl_id','=',product_tmpl_id)]",
+            help="If a product variant is defined the BOM is available only for this product."),
+        'bom_line_ids': fields.one2many('mrp.bom.line', 'bom_id', 'BoM Lines'),
+        
         'product_qty': fields.float('Product Quantity', required=True, digits_compute=dp.get_precision('Product Unit of Measure')),
         'product_uom': fields.many2one('product.uom', 'Product Unit of Measure', required=True, help="Unit of Measure (Unit of Measure) is the unit of measurement for the inventory control"),
+        'date_start': fields.date('Valid From', help="Validity of this BoM. Keep empty if it's always valid."),
+        'date_stop': fields.date('Valid Until', help="Validity of this BoM. Keep empty if it's always valid."),
+        'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of bills of material."),
+        'routing_id': fields.many2one('mrp.routing', 'Routing', help="The list of operations (list of work centers) to produce the finished product. "\
+                "The routing is mainly used to compute work center costs during operations and to plan future loads on work centers based on production planning."),
         'product_rounding': fields.float('Product Rounding', help="Rounding applied on the product quantity."),
-        'product_efficiency': fields.float('Manufacturing Efficiency', required=True, help="A factor of 0.9 means a loss of 10% within the production process."),
-        'bom_lines': fields.one2many('mrp.bom', 'bom_id', 'BoM Lines'),
-        'bom_id': fields.many2one('mrp.bom', 'Parent BoM', ondelete='cascade', select=True),
-        'routing_id': fields.many2one('mrp.routing', 'Routing', help="The list of operations (list of work centers) to produce the finished product. The routing is mainly used to compute work center costs during operations and to plan future loads on work centers based on production planning."),
-        'property_ids': fields.many2many('mrp.property', 'mrp_bom_property_rel', 'bom_id', 'property_id', 'Properties'),
+        'product_efficiency': fields.float('Manufacturing Efficiency', required=True, help="A factor of 0.9 means a loss of 10% during the production process."),
+        'property_ids': fields.many2many('mrp.property', string='Properties'),
         'child_complete_ids': fields.function(_child_compute, relation='mrp.bom', string="BoM Hierarchy", type='many2many'),
         'company_id': fields.many2one('res.company', 'Company', required=True),
     }
+
+    def _get_uom_id(self, cr, uid, *args):
+        return self.pool["product.uom"].search(cr, uid, [], limit=1, order='id')[0]
     _defaults = {
         'active': lambda *a: 1,
-        'product_efficiency': lambda *a: 1.0,
         'product_qty': lambda *a: 1.0,
+        'product_efficiency': lambda *a: 1.0,
         'product_rounding': lambda *a: 0.0,
         'type': lambda *a: 'normal',
+        'product_uom': _get_uom_id,
         'company_id': lambda self, cr, uid, c: self.pool.get('res.company')._company_default_get(cr, uid, 'mrp.bom', context=c),
     }
     _order = "sequence"
-    _parent_name = "bom_id"
-    _sql_constraints = [
-        ('bom_qty_zero', 'CHECK (product_qty>0)', 'All product quantities must be greater than 0.\n' \
-            'You should install the mrp_byproduct module if you want to manage extra products on BoMs !'),
-    ]
-
-    def _check_recursion(self, cr, uid, ids, context=None):
-        level = 100
-        while len(ids):
-            cr.execute('select distinct bom_id from mrp_bom where id IN %s', (tuple(ids),))
-            ids = filter(None, map(lambda x: x[0], cr.fetchall()))
-            if not level:
-                return False
-            level -= 1
-        return True
-
-    def _check_product(self, cr, uid, ids, context=None):
-        all_prod = []
-        boms = self.browse(cr, uid, ids, context=context)
-        def check_bom(boms):
-            res = True
-            for bom in boms:
-                if bom.product_id.id in all_prod:
-                    res = res and False
-                all_prod.append(bom.product_id.id)
-                lines = bom.bom_lines
-                if lines:
-                    res = res and check_bom([bom_id for bom_id in lines if bom_id not in boms])
-            return res
-        return check_bom(boms)
 
-    _constraints = [
-        (_check_recursion, 'Error ! You cannot create recursive BoM.', ['parent_id']),
-        (_check_product, 'BoM line product should not be same as BoM product.', ['product_id']),
-    ]
-
-    def onchange_product_id(self, cr, uid, ids, product_id, name, product_qty=0, context=None):
-        """ Changes UoM and name if product_id changes.
-        @param name: Name of the field
-        @param product_id: Changed product_id
-        @return:  Dictionary of changed values
-        """
-        res = {}
-        if product_id:
-            prod = self.pool.get('product.product').browse(cr, uid, product_id, context=context)
-            res['value'] = {'name': prod.name, 'product_uom': prod.uom_id.id, 'product_uos_qty': 0, 'product_uos': False}
-            if prod.uos_id.id:
-                res['value']['product_uos_qty'] = product_qty * prod.uos_coeff
-                res['value']['product_uos'] = prod.uos_id.id
-        return res
-
-    def onchange_uom(self, cr, uid, ids, product_id, product_uom, context=None):
-        res = {'value': {}}
-        if not product_uom or not product_id:
-            return res
-        product = self.pool.get('product.product').browse(cr, uid, product_id, context=context)
-        uom = self.pool.get('product.uom').browse(cr, uid, product_uom, context=context)
-        if uom.category_id.id != product.uom_id.category_id.id:
-            res['warning'] = {'title': _('Warning'), 'message': _('The Product Unit of Measure you chose has a different category than in the product form.')}
-            res['value'].update({'product_uom': product.uom_id.id})
-        return res
-
-    def _bom_find(self, cr, uid, product_id, product_uom, properties=None):
+    def _bom_find(self, cr, uid, product_uom, product_tmpl_id=None, product_id=None, properties=None):
         """ Finds BoM for particular product and product uom.
-        @param product_id: Selected product.
+        @param product_tmpl_id: Selected product.
         @param product_uom: Unit of measure of a product.
         @param properties: List of related properties.
         @return: False or BoM id.
         """
         if properties is None:
             properties = []
-        domain = [('product_id', '=', product_id), ('bom_id', '=', False),
-            '|', ('date_start', '=', False), ('date_start', '<=', time.strftime(DEFAULT_SERVER_DATETIME_FORMAT)),
-            '|', ('date_stop', '=', False), ('date_stop', '>=', time.strftime(DEFAULT_SERVER_DATETIME_FORMAT))]
+        domain = None
+        if product_id:
+            domain = ['|',('product_id', '=', product_id),('product_tmpl_id.product_variant_ids', '=', product_id)]
+        else:
+            domain = [('product_id', '=', False), ('product_tmpl_id', '=', product_tmpl_id)]
+        if product_uom:
+            domain +=  [('product_uom','=',product_uom)]
+        domain = domain + [ '|', ('date_start', '=', False), ('date_start', '<=', time.strftime(DEFAULT_SERVER_DATETIME_FORMAT)),
+                            '|', ('date_stop', '=', False), ('date_stop', '>=', time.strftime(DEFAULT_SERVER_DATETIME_FORMAT))]
         ids = self.search(cr, uid, domain)
-        max_prop = 0
-        result = False
         for bom in self.pool.get('mrp.bom').browse(cr, uid, ids):
-            prop = 0
-            for prop_id in bom.property_ids:
-                if prop_id.id in properties:
-                    prop += 1
-            if (prop > max_prop) or ((max_prop == 0) and not result):
-                result = bom.id
-                max_prop = prop
-        return result
+            if not set(map(int,bom.property_ids or [])) - set(properties or []):
+                return bom.id
+        return False
 
-    def _bom_explode(self, cr, uid, bom, factor, properties=None, addthis=False, level=0, routing_id=False):
+    def _bom_explode(self, cr, uid, bom, product, factor, properties=None, level=0, routing_id=False, previous_products=None, master_bom=None):
         """ Finds Products and Work Centers for related BoM for manufacturing order.
-        @param bom: BoM of particular product.
+        @param bom: BoM of particular product template.
+        @param product: Select a particular variant of the BoM. If False use BoM without variants.
         @param factor: Factor of product UoM.
         @param properties: A List of properties Ids.
-        @param addthis: If BoM found then True else False.
         @param level: Depth level to find BoM lines starts from 10.
+        @param previous_products: List of product previously use by bom explore to avoid recursion
+        @param master_bom: When recursion, used to display the name of the master bom
         @return: result: List of dictionaries containing product details.
                  result2: List of dictionaries containing Work Center details.
         """
         routing_obj = self.pool.get('mrp.routing')
-        factor = factor / (bom.product_efficiency or 1.0)
-        factor = _common.ceiling(factor, bom.product_rounding)
-        if factor < bom.product_rounding:
-            factor = bom.product_rounding
+        all_prod = [] + (previous_products or [])
+        master_bom = master_bom or bom
+
+        def _factor(factor, product_efficiency, product_rounding):
+            factor = factor / (product_efficiency or 1.0)
+            factor = _common.ceiling(factor, product_rounding)
+            if factor < product_rounding:
+                factor = product_rounding
+            return factor
+
+        factor = _factor(factor, bom.product_efficiency, bom.product_rounding)
+
         result = []
         result2 = []
-        phantom = False
-        if bom.type == 'phantom' and not bom.bom_lines:
-            newbom = self._bom_find(cr, uid, bom.product_id.id, bom.product_uom.id, properties)
-
-            if newbom:
-                res = self._bom_explode(cr, uid, self.browse(cr, uid, [newbom])[0], factor * bom.product_qty, properties, addthis=True, level=level + 10)
-                result = result + res[0]
-                result2 = result2 + res[1]
-                phantom = True
-            else:
-                phantom = False
-        if not phantom:
-            if addthis and not bom.bom_lines:
+
+        routing = (routing_id and routing_obj.browse(cr, uid, routing_id)) or bom.routing_id or False
+        if routing:
+            for wc_use in routing.workcenter_lines:
+                wc = wc_use.workcenter_id
+                d, m = divmod(factor, wc_use.workcenter_id.capacity_per_cycle)
+                mult = (d + (m and 1.0 or 0.0))
+                cycle = mult * wc_use.cycle_nbr
+                result2.append({
+                    'name': tools.ustr(wc_use.name) + ' - ' + tools.ustr(bom.product_tmpl_id.name_get()[0][1]),
+                    'workcenter_id': wc.id,
+                    'sequence': level + (wc_use.sequence or 0),
+                    'cycle': cycle,
+                    'hour': float(wc_use.hour_nbr * mult + ((wc.time_start or 0.0) + (wc.time_stop or 0.0) + cycle * (wc.time_cycle or 0.0)) * (wc.time_efficiency or 1.0)),
+                })
+
+        for bom_line_id in bom.bom_line_ids:
+            if bom_line_id.date_start and bom_line_id.date_start > time.strftime(DEFAULT_SERVER_DATETIME_FORMAT) or \
+                bom_line_id.date_stop and bom_line_id.date_stop > time.strftime(DEFAULT_SERVER_DATETIME_FORMAT):
+                    continue
+            # check properties
+            if set(map(int,bom_line_id.property_ids or [])) - set(properties or []):
+                continue
+            # all bom_line_id variant values must be in the product
+            if bom_line_id.attribute_value_ids:
+                if not product or (set(map(int,bom_line_id.attribute_value_ids or [])) - set(map(int,product.attribute_value_ids))):
+                    continue
+
+            if bom_line_id.product_id.id in all_prod:
+                raise osv.except_osv(_('Invalid Action!'), _('BoM "%s" contains a BoM line with a product recursion: "%s".') % (master_bom.name,bom_line_id.product_id.name_get()[0][1]))
+            all_prod.append(bom_line_id.product_id.id)
+            
+            if bom_line_id.type != "phantom":
                 result.append({
-                    'name': bom.product_id.name,
-                    'product_id': bom.product_id.id,
-                    'product_qty': bom.product_qty * factor,
-                    'product_uom': bom.product_uom.id,
-                    'product_uos_qty': bom.product_uos and bom.product_uos_qty * factor or False,
-                    'product_uos': bom.product_uos and bom.product_uos.id or False,
+                    'name': bom_line_id.product_id.name,
+                    'product_id': bom_line_id.product_id.id,
+                    'product_qty': _factor(bom_line_id.product_qty * factor, bom_line_id.product_efficiency, bom_line_id.product_rounding),
+                    'product_uom': bom_line_id.product_uom.id,
+                    'product_uos_qty': bom_line_id.product_uos and bom_line_id.product_uos_qty * factor or False,
+                    'product_uos': bom_line_id.product_uos and bom_line_id.product_uos.id or False,
                 })
-            routing = (routing_id and routing_obj.browse(cr, uid, routing_id)) or bom.routing_id or False
-            if routing:
-                for wc_use in routing.workcenter_lines:
-                    wc = wc_use.workcenter_id
-                    d, m = divmod(factor, wc_use.workcenter_id.capacity_per_cycle)
-                    mult = (d + (m and 1.0 or 0.0))
-                    cycle = mult * wc_use.cycle_nbr
-                    result2.append({
-                        'name': tools.ustr(wc_use.name) + ' - ' + tools.ustr(bom.product_id.name),
-                        'workcenter_id': wc.id,
-                        'sequence': level + (wc_use.sequence or 0),
-                        'cycle': cycle,
-                        'hour': float(wc_use.hour_nbr * mult + ((wc.time_start or 0.0) + (wc.time_stop or 0.0) + cycle * (wc.time_cycle or 0.0)) * (wc.time_efficiency or 1.0)),
-                    })
-            for bom2 in bom.bom_lines:
-                res = self._bom_explode(cr, uid, bom2, factor, properties, addthis=True, level=level + 10)
-                result = result + res[0]
-                result2 = result2 + res[1]
+            else:
+                bom_id = self._bom_find(cr, uid, bom_line_id.product_uom.id, product_id=bom_line_id.product_id.id, properties=properties)
+                bom2 = self.browse(cr, uid, bom_id)  
+                if bom2:
+                    res = self._bom_explode(cr, uid, bom2, bom_line_id.product_id, factor,
+                        properties=properties, level=level + 10, previous_products=all_prod, master_bom=master_bom)
+                    result = result + res[0]
+                    result2 = result2 + res[1]
+                else:
+                    raise osv.except_osv(_('Invalid Action!'), _('BoM "%s" contains a phantom BoM line but the product "%s" don\'t have any BoM defined.') % (master_bom.name,bom_line_id.product_id.name_get()[0][1]))
+
         return result, result2
 
     def copy_data(self, cr, uid, id, default=None, context=None):
         if default is None:
             default = {}
         bom_data = self.read(cr, uid, id, [], context=context)
-        default.update(name=_("%s (copy)") % (bom_data['name']), bom_id=False)
+        default.update(name=_("%s (copy)") % (bom_data['name']))
         return super(mrp_bom, self).copy_data(cr, uid, id, default, context=context)
 
+    def onchange_uom(self, cr, uid, ids, product_tmpl_id, product_uom, context=None):
+        res = {'value': {}}
+        if not product_uom or not product_tmpl_id:
+            return res
+        product = self.pool.get('product.template').browse(cr, uid, product_tmpl_id, context=context)
+        uom = self.pool.get('product.uom').browse(cr, uid, product_uom, context=context)
+        if uom.category_id.id != product.uom_id.category_id.id:
+            res['warning'] = {'title': _('Warning'), 'message': _('The Product Unit of Measure you chose has a different category than in the product form.')}
+            res['value'].update({'product_uom': product.uom_id.id})
+        return res
+
+    def onchange_product_tmpl_id(self, cr, uid, ids, product_tmpl_id, product_qty=0, context=None):
+        """ Changes UoM and name if product_id changes.
+        @param product_id: Changed product_id
+        @return:  Dictionary of changed values
+        """
+        res = {}
+        if product_tmpl_id:
+            prod = self.pool.get('product.template').browse(cr, uid, product_tmpl_id, context=context)
+            res['value'] = {
+                'name': prod.name,
+                'product_uom': prod.uom_id.id,
+            }
+        return res
+
+class mrp_bom_line(osv.osv):
+    _name = 'mrp.bom.line'
+    _order = "sequence"
+
+    _columns = {
+        'type': fields.selection([('normal', 'Normal'), ('phantom', 'Phantom')], 'BoM Line Type', required=True,
+                help="Phantom: this product line will not appear in the raw materials of manufacturing orders,"
+                     "it will be directly replaced by the raw materials of its own BoM, without triggering"
+                     "an extra manufacturing order."),
+        'product_id': fields.many2one('product.product', 'Product', required=True),
+        'product_uos_qty': fields.float('Product UOS Qty'),
+        'product_uos': fields.many2one('product.uom', 'Product UOS', help="Product UOS (Unit of Sale) is the unit of measurement for the invoicing and promotion of stock."),
+        'product_qty': fields.float('Product Quantity', required=True, digits_compute=dp.get_precision('Product Unit of Measure')),
+        'product_uom': fields.many2one('product.uom', 'Product Unit of Measure', required=True,
+            help="Unit of Measure (Unit of Measure) is the unit of measurement for the inventory control"),
+        
+        'date_start': fields.date('Valid From', help="Validity of component. Keep empty if it's always valid."),
+        'date_stop': fields.date('Valid Until', help="Validity of component. Keep empty if it's always valid."),
+        'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying."),
+        'routing_id': fields.many2one('mrp.routing', 'Routing', help="The list of operations (list of work centers) to produce the finished product. The routing is mainly used to compute work center costs during operations and to plan future loads on work centers based on production planning."),
+        'product_rounding': fields.float('Product Rounding', help="Rounding applied on the product quantity."),
+        'product_efficiency': fields.float('Manufacturing Efficiency', required=True, help="A factor of 0.9 means a loss of 10% within the production process."),
+        'property_ids': fields.many2many('mrp.property', string='Properties'),
+
+        'bom_id': fields.many2one('mrp.bom', 'Parent BoM', ondelete='cascade', select=True, required=True),
+        'attribute_value_ids': fields.many2many('product.attribute.value', string='Variants', help="BOM Product Variants needed form apply this line."),
+    }
+
+    def _get_uom_id(self, cr, uid, *args):
+        return self.pool["product.uom"].search(cr, uid, [], limit=1, order='id')[0]
+    _defaults = {
+        'product_qty': lambda *a: 1.0,
+        'product_efficiency': lambda *a: 1.0,
+        'product_rounding': lambda *a: 0.0,
+        'type': lambda *a: 'normal',
+        'product_uom': _get_uom_id,
+    }
+    _sql_constraints = [
+        ('bom_qty_zero', 'CHECK (product_qty>0)', 'All product quantities must be greater than 0.\n' \
+            'You should install the mrp_byproduct module if you want to manage extra products on BoMs !'),
+    ]
+
+    def onchange_uom(self, cr, uid, ids, product_id, product_uom, context=None):
+        res = {'value': {}}
+        if not product_uom or not product_id:
+            return res
+        product = self.pool.get('product.product').browse(cr, uid, product_id, context=context)
+        uom = self.pool.get('product.uom').browse(cr, uid, product_uom, context=context)
+        if uom.category_id.id != product.uom_id.category_id.id:
+            res['warning'] = {'title': _('Warning'), 'message': _('The Product Unit of Measure you chose has a different category than in the product form.')}
+            res['value'].update({'product_uom': product.uom_id.id})
+        return res
+
+    def onchange_product_id(self, cr, uid, ids, product_id, product_qty=0, context=None):
+        """ Changes UoM if product_id changes.
+        @param product_id: Changed product_id
+        @return:  Dictionary of changed values
+        """
+        res = {}
+        if product_id:
+            prod = self.pool.get('product.product').browse(cr, uid, product_id, context=context)
+            res['value'] = {
+                'product_uom': prod.uom_id.id,
+                'product_uos_qty': 0,
+                'product_uos': False
+            }
+            if prod.uos_id.id:
+                res['value']['product_uos_qty'] = product_qty * prod.uos_coeff
+                res['value']['product_uos'] = prod.uos_id.id
+        return res
 
 class mrp_production(osv.osv):
     """
@@ -475,7 +534,7 @@ class mrp_production(osv.osv):
         'date_planned': fields.datetime('Scheduled Date', required=True, select=1, readonly=True, states={'draft': [('readonly', False)]}),
         'date_start': fields.datetime('Start Date', select=True, readonly=True),
         'date_finished': fields.datetime('End Date', select=True, readonly=True),
-        'bom_id': fields.many2one('mrp.bom', 'Bill of Material', domain=[('bom_id', '=', False)], readonly=True, states={'draft': [('readonly', False)]},
+        'bom_id': fields.many2one('mrp.bom', 'Bill of Material', readonly=True, states={'draft': [('readonly', False)]},
             help="Bill of Materials allow you to define the list of required raw materials to make a finished product."),
         'routing_id': fields.many2one('mrp.routing', string='Routing', on_delete='set null', readonly=True, states={'draft': [('readonly', False)]},
             help="The list of operations (list of work centers) to produce the finished product. The routing is mainly used to compute work center costs during operations and to plan future loads on work centers based on production plannification."),
@@ -586,7 +645,7 @@ class mrp_production(osv.osv):
             }}
         bom_obj = self.pool.get('mrp.bom')
         product = self.pool.get('product.product').browse(cr, uid, product_id, context=context)
-        bom_id = bom_obj._bom_find(cr, uid, product.id, product.uom_id and product.uom_id.id, [])
+        bom_id = bom_obj._bom_find(cr, uid, product.uom_id and product.uom_id.id, product_id=product.id, properties=[])
         routing_id = False
         if bom_id:
             bom_point = bom_obj.browse(cr, uid, bom_id, context=context)
@@ -635,7 +694,7 @@ class mrp_production(osv.osv):
             bom_point = production.bom_id
             bom_id = production.bom_id.id
             if not bom_point:
-                bom_id = bom_obj._bom_find(cr, uid, production.product_id.id, production.product_uom.id, properties)
+                bom_id = bom_obj._bom_find(cr, uid, production.product_uom.id, product_id=production.product_id.id, properties=properties)
                 if bom_id:
                     bom_point = bom_obj.browse(cr, uid, bom_id)
                     routing_id = bom_point.routing_id.id or False
@@ -646,9 +705,8 @@ class mrp_production(osv.osv):
 
             # get components and workcenter_lines from BoM structure
             factor = uom_obj._compute_qty(cr, uid, production.product_uom.id, production.product_qty, bom_point.product_uom.id)
-            res = bom_obj._bom_explode(cr, uid, bom_point, factor / bom_point.product_qty, properties, routing_id=production.routing_id.id)
-            results = res[0]  # product_lines
-            results2 = res[1]  # workcenter_lines
+            # product_lines, workcenter_lines
+            results, results2 = bom_obj._bom_explode(cr, uid, bom_point, production.product_id, factor / bom_point.product_qty, properties, routing_id=production.routing_id.id)
             # reset product_lines in production order
             for line in results:
                 line['production_id'] = production.id
@@ -777,15 +835,18 @@ class mrp_production(osv.osv):
         dicts = {}
         # Find product qty to be consumed and consume it
         for scheduled in production.product_lines:
-            consumed_qty = consumed_data.get(scheduled.product_id.id, 0.0)
+            product_id = scheduled.product_id.id
+
+            consumed_qty = consumed_data.get(product_id, 0.0)
+            
             # qty available for consume and produce
             qty_avail = scheduled.product_qty - consumed_qty
             if qty_avail <= 0.0:
                 # there will be nothing to consume for this raw material
                 continue
 
-            if not dicts.get(scheduled.product_id.id):
-                dicts[scheduled.product_id.id] = {}
+            if not dicts.get(product_id):
+                dicts[product_id] = {}
 
             # total qty of consumed product we need after this consumption
             total_consume = ((product_qty + produced_qty) * scheduled.product_qty / production.product_qty)
@@ -795,9 +856,8 @@ class mrp_production(osv.osv):
             for move in production.move_lines:
                 if qty <= 0.0:
                     break
-                if move.product_id.id != scheduled.product_id.id:
+                if move.product_id.id != product_id:
                     continue
-                product_id = scheduled.product_id.id
 
                 q = min(move.product_qty, qty)
                 quants = quant_obj.quants_get_prefered_domain(cr, uid, move.location_id, scheduled.product_id, q, domain=[('qty', '>', 0.0)],
@@ -895,7 +955,8 @@ class mrp_production(osv.osv):
                     #consumed more in wizard than previously planned
                     product = self.pool.get('product.product').browse(cr, uid, consume['product_id'], context=context)
                     extra_move_id = self._make_consume_line_from_data(cr, uid, production, product, product.uom_id.id, remaining_qty, False, 0, context=context)
-                    stock_mov_obj.action_done(cr, uid, [extra_move_id], context=context)
+                    if extra_move_id:
+                        stock_mov_obj.action_done(cr, uid, [extra_move_id], context=context)
 
         self.message_post(cr, uid, production_id, body=_("%s produced") % self._description, context=context)
         self.signal_button_produce_done(cr, uid, [production_id])
@@ -1111,24 +1172,4 @@ class mrp_production_product_line(osv.osv):
         'production_id': fields.many2one('mrp.production', 'Production Order', select=True),
     }
 
-class product_product(osv.osv):
-    _inherit = "product.product"
-    def _bom_orders_count(self, cr, uid, ids, field_name, arg, context=None):
-        Bom = self.pool('mrp.bom')
-        Production = self.pool('mrp.production')
-        return {
-            product_id: {
-                'bom_count': Bom.search_count(cr, uid, [('product_id', '=', product_id), ('bom_id', '=', False)], context=context),
-                'mo_count': Production.search_count(cr,uid, [('product_id', '=', product_id)], context=context),
-                'bom_strct': Bom.search_count(cr, uid, [('product_id', '=', product_id), ('bom_id', '=', False)], context=context),
-            }
-            for product_id in ids
-        }
-    _columns = {
-        'bom_ids': fields.one2many('mrp.bom', 'product_id', 'Bill of Materials'),
-        'bom_count': fields.function(_bom_orders_count, string='# Bill of Material', type='integer', multi="_bom_order_count"),
-        'bom_strct': fields.function(_bom_orders_count, string='# Bill of Material Structure', type='integer', multi="_bom_order_count"),
-        'mo_count': fields.function(_bom_orders_count, string='# Manufacturing Orders', type='integer', multi="_bom_order_count"),
-    }
-
 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
index 160e92c..863f19e 100644 (file)
 
         <record id="mrp_bom_1" model="mrp.bom">
             <field name="name">HDD 500GB</field>
-            <field name="product_id" ref="product.product_product_18"/>
-            <field name="product_qty">1</field>
+            <field name="product_tmpl_id" ref="product.product_product_18_product_template"/>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">5</field>            
             <field name="routing_id" ref="mrp_routing_0"/>
             <field name="type">normal</field>
         </record>
 
-        <record id="mrp_bom_2" model="mrp.bom">
-            <field name="name">320GB HDD</field>
+        <record id="mrp_bom_line_1" model="mrp.bom.line">
             <field name="product_id" ref="product.product_product_17"/>
             <field name="product_qty">2</field>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="bom_id" ref="mrp_bom_1"/>
         </record>
 
-        <record id="mrp_bom_3" model="mrp.bom">
+        <record id="mrp_bom_2" model="mrp.bom">
             <field name="name">HDD 2TB on Demand</field>
-            <field name="product_id" ref="product.product_product_19"/>
-            <field name="product_qty">1</field>
+            <field name="product_tmpl_id" ref="product.product_product_19_product_template"/>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">5</field>            
             <field name="routing_id" ref="mrp_routing_1"/>
             <field name="type">normal</field>
         </record>
 
-        <record id="mrp_bom_4" model="mrp.bom">
-            <field name="name">HDD 500GB</field>
+        <record id="mrp_bom_line_2" model="mrp.bom.line">
             <field name="product_id" ref="product.product_product_18"/>
             <field name="product_qty">4</field>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">5</field>            
             <field name="type">normal</field>
-            <field name="bom_id" ref="mrp_bom_3"/>
+            <field name="bom_id" ref="mrp_bom_2"/>
         </record>
 
-        <record id="mrp_bom_5" model="mrp.bom">
+        <record id="mrp_bom_3" model="mrp.bom">
             <field name="name">HDD on Demand</field>
-            <field name="product_id" ref="product.product_product_19"/>
-            <field name="product_qty">1</field>
+            <field name="product_tmpl_id" ref="product.product_product_19_product_template"/>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">10</field>            
             <field name="type">normal</field>
         </record>
 
-        <record id="mrp_bom_6" model="mrp.bom">
-            <field name="name">320GB HDD</field>
+        <record id="mrp_bom_line_3" model="mrp.bom.line">
             <field name="product_id" ref="product.product_product_17"/>
             <field name="product_qty">1</field>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">5</field>            
             <field name="type">normal</field>
-            <field name="bom_id" ref="mrp_bom_5"/>
+            <field name="bom_id" ref="mrp_bom_3"/>
         </record>
 
-        <record id="mrp_bom_7" model="mrp.bom">
+        <record id="mrp_bom_4" model="mrp.bom">
             <field name="name">Laptop Customized</field>
-            <field name="product_id" ref="product.product_product_27"/>
-            <field name="product_qty">1</field>
+            <field name="product_tmpl_id" ref="product.product_product_27_product_template"/>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">5</field>            
             <field name="routing_id" ref="mrp_routing_1"/>
             <field name="type">normal</field>
         </record>
 
-        <record id="mrp_bom_8" model="mrp.bom">
-            <field name="name">Windows 7 Professional</field>
+        <record id="mrp_bom_line_4" model="mrp.bom.line">
             <field name="product_id" ref="product.product_product_40"/>
             <field name="product_qty">1</field>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">2</field>            
             <field name="type">normal</field>
-            <field name="bom_id" ref="mrp_bom_7"/>
+            <field name="bom_id" ref="mrp_bom_4"/>
         </record>
 
-        <record id="mrp_bom_9" model="mrp.bom">
-            <field name="name">USB Keyboard, QWERTY</field>
+        <record id="mrp_bom_line_5" model="mrp.bom.line">
             <field name="product_id" ref="product.product_product_8"/>
             <field name="product_qty">1</field>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">4</field>            
             <field name="type">normal</field>
-            <field name="bom_id" ref="mrp_bom_7"/>
+            <field name="bom_id" ref="mrp_bom_4"/>
         </record>
 
-        <record id="mrp_bom_10" model="mrp.bom">
-            <field name="name">Mouse, Wireless</field>
+        <record id="mrp_bom_line_6" model="mrp.bom.line">
             <field name="product_id" ref="product.product_product_12"/>
             <field name="product_qty">1</field>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">6</field>            
             <field name="type">normal</field>
-            <field name="bom_id" ref="mrp_bom_7"/>
+            <field name="bom_id" ref="mrp_bom_4"/>
         </record>
 
-        <record id="mrp_bom_11" model="mrp.bom">
+        <record id="mrp_bom_5" model="mrp.bom">
             <field name="name">Laptop Customized + Azerty</field>
-            <field name="product_id" ref="product.product_product_27"/>
-            <field name="product_qty">1</field>
+            <field name="product_tmpl_id" ref="product.product_product_27_product_template"/>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">10</field>            
             <field name="type">normal</field>
         </record>
 
-        <record id="mrp_bom_12" model="mrp.bom">
-            <field name="name">Windows 7 Professional</field>
+        <record id="mrp_bom_line_7" model="mrp.bom.line">
             <field name="product_id" ref="product.product_product_40"/>
             <field name="product_qty">1</field>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">2</field>            
             <field name="type">normal</field>
-            <field name="bom_id" ref="mrp_bom_11"/>
+            <field name="bom_id" ref="mrp_bom_5"/>
         </record>
 
-        <record id="mrp_bom_13" model="mrp.bom">
-            <field name="name">USB Keyboard, AZERTY</field>
+        <record id="mrp_bom_line_8" model="mrp.bom.line">
             <field name="product_id" ref="product.product_product_9"/>
             <field name="product_qty">1</field>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">4</field>            
             <field name="type">normal</field>
-            <field name="bom_id" ref="mrp_bom_11"/>
+            <field name="bom_id" ref="mrp_bom_5"/>
         </record>
 
-        <record id="mrp_bom_14" model="mrp.bom">
-            <field name="name">Mouse, Laser</field>
+        <record id="mrp_bom_line_9" model="mrp.bom.line">
             <field name="product_id" ref="product.product_product_11"/>
             <field name="product_qty">1</field>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">6</field>            
             <field name="type">normal</field>
-            <field name="bom_id" ref="mrp_bom_11"/>
+            <field name="bom_id" ref="mrp_bom_5"/>
         </record>
 
-        <record id="mrp_bom_15" model="mrp.bom">
+        <record id="mrp_bom_6" model="mrp.bom">
             <field name="name">Computer Case-1</field>
-            <field name="product_id" ref="product.product_product_16"/>
-            <field name="product_qty">1</field>
+            <field name="product_tmpl_id" ref="product.product_product_16_product_template"/>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">5</field>            
             <field name="type">normal</field>
         </record>
 
-        <record id="mrp_bom_16" model="mrp.bom">
-            <field name="name">Processesor AMD 8-Core</field>
+        <record id="mrp_bom_line_10" model="mrp.bom.line">
             <field name="product_id" ref="product.product_product_23"/>
             <field name="product_qty">1</field>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">4</field>            
             <field name="type">normal</field>
-            <field name="bom_id" ref="mrp_bom_15"/>
+            <field name="bom_id" ref="mrp_bom_6"/>
         </record>
 
-        <record id="mrp_bom_17" model="mrp.bom">
-            <field name="name">Motherboard I9P57</field>
+        <record id="mrp_bom_line_11" model="mrp.bom.line">
             <field name="product_id" ref="product.product_product_20"/>
             <field name="product_qty">1</field>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">6</field>            
             <field name="type">normal</field>
-            <field name="bom_id" ref="mrp_bom_15"/>
+            <field name="bom_id" ref="mrp_bom_6"/>
         </record>
 
-        <record id="mrp_bom_18" model="mrp.bom">
-            <field name="name">HDD 320GB</field>
+        <record id="mrp_bom_line_12" model="mrp.bom.line">
             <field name="product_id" ref="product.product_product_17"/>
             <field name="product_qty">1</field>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">8</field>            
             <field name="type">normal</field>
-            <field name="bom_id" ref="mrp_bom_15"/>
+            <field name="bom_id" ref="mrp_bom_6"/>
         </record>
 
-        <record id="mrp_bom_19" model="mrp.bom">
+        <record id="mrp_bom_7" model="mrp.bom">
             <field name="name">Computer Case-2</field>
-            <field name="product_id" ref="product.product_product_16"/>
-            <field name="product_qty">1</field>
+            <field name="product_tmpl_id" ref="product.product_product_16_product_template"/>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">10</field>            
             <field name="type">normal</field>
         </record>
 
-        <record id="mrp_bom_20" model="mrp.bom">
-            <field name="name">Processor Core i5 2.70 Ghz</field>
+        <record id="mrp_bom_line_13" model="mrp.bom.line">
             <field name="product_id" ref="product.product_product_22"/>
             <field name="product_qty">1</field>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">2</field>            
             <field name="type">normal</field>
-            <field name="bom_id" ref="mrp_bom_19"/>
+            <field name="bom_id" ref="mrp_bom_7"/>
         </record>
 
-        <record id="mrp_bom_21" model="mrp.bom">
-            <field name="name">Motherboard A20Z7</field>
+        <record id="mrp_bom_line_14" model="mrp.bom.line">
             <field name="product_id" ref="product.product_product_21"/>
             <field name="product_qty">1</field>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">4</field>            
             <field name="type">normal</field>
-            <field name="bom_id" ref="mrp_bom_19"/>
+            <field name="bom_id" ref="mrp_bom_7"/>
         </record>
 
-        <record id="mrp_bom_22" model="mrp.bom">
-            <field name="name">HDD 500GB</field>
+        <record id="mrp_bom_line_15" model="mrp.bom.line">
             <field name="product_id" ref="product.product_product_18"/>
             <field name="product_qty">1</field>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">6</field>            
             <field name="type">normal</field>
-            <field name="bom_id" ref="mrp_bom_19"/>
+            <field name="bom_id" ref="mrp_bom_7"/>
         </record>
 
-        <record id="mrp_bom_23" model="mrp.bom">
-            <field name="name">Graphics Card</field>
+        <record id="mrp_bom_line_16" model="mrp.bom.line">
             <field name="product_id" ref="product.product_product_24"/>
             <field name="product_qty">1</field>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">10</field>            
             <field name="type">normal</field>
-            <field name="bom_id" ref="mrp_bom_19"/>
+            <field name="bom_id" ref="mrp_bom_7"/>
         </record>
 
-        <record id="mrp_bom_24" model="mrp.bom">
+        <record id="mrp_bom_8" model="mrp.bom">
             <field name="name">PC Assemble + 2GB RAM</field>
-            <field name="product_id" ref="product.product_product_4"/>
-            <field name="product_qty">1</field>
+            <field name="product_tmpl_id" ref="product.product_product_3_product_template"/>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">5</field>            
             <field name="type">phantom</field>
         </record>
 
-        <record id="mrp_bom_25" model="mrp.bom">
-            <field name="name">15" LCD Monitor </field>
+        <record id="mrp_bom_line_17" model="mrp.bom.line">
             <field name="product_id" ref="product.product_product_6"/>
             <field name="product_qty">1</field>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">2</field>            
             <field name="type">normal</field>
-            <field name="bom_id" ref="mrp_bom_24"/>
+            <field name="bom_id" ref="mrp_bom_8"/>
         </record>
 
-        <record id="mrp_bom_26" model="mrp.bom">
-            <field name="name">Computer Case-1</field>
+        <record id="mrp_bom_line_18" model="mrp.bom.line">
             <field name="product_id" ref="product.product_product_16"/>
             <field name="product_qty">1</field>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">4</field>            
             <field name="type">normal</field>
-            <field name="bom_id" ref="mrp_bom_24"/>
+            <field name="bom_id" ref="mrp_bom_8"/>
         </record>
 
-        <record id="mrp_bom_27" model="mrp.bom">
-            <field name="name">Mouse, Laser</field>
+        <record id="mrp_bom_line_19" model="mrp.bom.line">
             <field name="product_id" ref="product.product_product_11"/>
             <field name="product_qty">1</field>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">6</field>            
             <field name="type">normal</field>
-            <field name="bom_id" ref="mrp_bom_24"/>
+            <field name="bom_id" ref="mrp_bom_8"/>
         </record>
 
-        <record id="mrp_bom_28" model="mrp.bom">
-            <field name="name">USB Keyboard, QWERTY</field>
+        <record id="mrp_bom_line_20" model="mrp.bom.line">
             <field name="product_id" ref="product.product_product_8"/>
             <field name="product_qty">1</field>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">8</field>            
             <field name="type">normal</field>
-            <field name="bom_id" ref="mrp_bom_24"/>
+            <field name="bom_id" ref="mrp_bom_8"/>
         </record>
 
-        <record id="mrp_bom_29" model="mrp.bom">
-            <field name="name">RAM DDR2 1GB</field>
+        <record id="mrp_bom_line_21" model="mrp.bom.line">
             <field name="product_id" ref="product.product_product_15"/>
             <field name="product_qty">2</field>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">10</field>            
             <field name="type">normal</field>
-            <field name="bom_id" ref="mrp_bom_24"/>
+            <field name="bom_id" ref="mrp_bom_8"/>
         </record>
 
-        <record id="mrp_bom_30" model="mrp.bom">
+        <record id="mrp_bom_9" model="mrp.bom">
             <field name="name">PC Assemble + 512MB RAM</field>
-            <field name="product_id" ref="product.product_product_3"/>
-            <field name="product_qty">1</field>
+            <field name="product_tmpl_id" ref="product.product_product_3_product_template"/>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">5</field>            
             <field name="routing_id" ref="mrp_routing_2"/>
             <field name="type">phantom</field>
         </record>
 
-        <record id="mrp_bom_31" model="mrp.bom">
-            <field name="name">17" LCD Monitor</field>
+        <record id="mrp_bom_line_22" model="mrp.bom.line">
             <field name="product_id" ref="product.product_product_7"/>
             <field name="product_qty">1</field>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">2</field>            
             <field name="type">normal</field>
-            <field name="bom_id" ref="mrp_bom_30"/>
+            <field name="bom_id" ref="mrp_bom_9"/>
         </record>
 
-        <record id="mrp_bom_32" model="mrp.bom">
-            <field name="name">Computer Case-2</field>
+        <record id="mrp_bom_line_23" model="mrp.bom.line">
             <field name="product_id" ref="product.product_product_16"/>
             <field name="product_qty">1</field>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">4</field>            
             <field name="type">normal</field>
-            <field name="bom_id" ref="mrp_bom_30"/>
+            <field name="bom_id" ref="mrp_bom_9"/>
         </record>
 
-        <record id="mrp_bom_33" model="mrp.bom">
-            <field name="name">Mouse, Laser</field>
+        <record id="mrp_bom_line_24" model="mrp.bom.line">
             <field name="product_id" ref="product.product_product_11"/>
             <field name="product_qty">1</field>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">6</field>            
             <field name="type">normal</field>
-            <field name="bom_id" ref="mrp_bom_30"/>
+            <field name="bom_id" ref="mrp_bom_9"/>
         </record>
 
-        <record id="mrp_bom_34" model="mrp.bom">
-            <field name="name">USB Keyboard, QWERTY</field>
+        <record id="mrp_bom_line_25" model="mrp.bom.line">
             <field name="product_id" ref="product.product_product_8"/>
             <field name="product_qty">1</field>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">8</field>            
             <field name="type">normal</field>
-            <field name="bom_id" ref="mrp_bom_30"/>
+            <field name="bom_id" ref="mrp_bom_9"/>
         </record>
 
-        <record id="mrp_bom_35" model="mrp.bom">
-            <field name="name">RAM DDR 512MB</field>
+        <record id="mrp_bom_line_26" model="mrp.bom.line">
             <field name="product_id" ref="product.product_product_13"/>
             <field name="product_qty">1</field>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">10</field>            
             <field name="type">normal</field>
-            <field name="bom_id" ref="mrp_bom_30"/>
+            <field name="bom_id" ref="mrp_bom_9"/>
         </record>
 
-        <record id="mrp_bom_36" model="mrp.bom">
+        <record id="mrp_bom_10" model="mrp.bom">
             <field name="name">PC Assemble + Custom RAM (PC on Demand)</field>
-            <field name="product_id" ref="product.product_product_5"/>
-            <field name="product_qty">1</field>
+            <field name="product_tmpl_id" ref="product.product_product_5_product_template"/>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">5</field>            
             <field name="routing_id" ref="mrp_routing_2"/>
             <field name="type">phantom</field>
         </record>
 
-        <record id="mrp_bom_37" model="mrp.bom">
-            <field name="name">15" LCD Monitor </field>
+        <record id="mrp_bom_line_27" model="mrp.bom.line">
             <field name="product_id" ref="product.product_product_6"/>
             <field name="product_qty">1</field>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">2</field>            
             <field name="type">normal</field>
-            <field name="bom_id" ref="mrp_bom_36"/>
+            <field name="bom_id" ref="mrp_bom_10"/>
         </record>
 
-        <record id="mrp_bom_38" model="mrp.bom">
-            <field name="name">Computer Case-1</field>
+        <record id="mrp_bom_line_28" model="mrp.bom.line">
             <field name="product_id" ref="product.product_product_16"/>
             <field name="product_qty">1</field>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">4</field>            
             <field name="type">normal</field>
-            <field name="bom_id" ref="mrp_bom_36"/>
+            <field name="bom_id" ref="mrp_bom_10"/>
         </record>
 
-        <record id="mrp_bom_39" model="mrp.bom">
-            <field name="name">RAM DDR 512MB</field>
+        <record id="mrp_bom_line_29" model="mrp.bom.line">
             <field name="product_id" ref="product.product_product_13"/>
             <field name="product_qty">1</field>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">6</field>            
             <field name="type">normal</field>
-            <field name="bom_id" ref="mrp_bom_36"/>
+            <field name="bom_id" ref="mrp_bom_10"/>
         </record>
 
-        <record id="mrp_bom_40" model="mrp.bom">
-            <field name="name">Mouse, Laser</field>
+        <record id="mrp_bom_line_30" model="mrp.bom.line">
             <field name="product_id" ref="product.product_product_11"/>
             <field name="product_qty">1</field>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">8</field>            
             <field name="type">normal</field>
-            <field name="bom_id" ref="mrp_bom_36"/>
+            <field name="bom_id" ref="mrp_bom_10"/>
         </record>
 
-        <record id="mrp_bom_41" model="mrp.bom">
-            <field name="name">USB Keyboard, QWERTY</field>
+        <record id="mrp_bom_line_31" model="mrp.bom.line">
             <field name="product_id" ref="product.product_product_8"/>
             <field name="product_qty">1</field>
             <field name="product_uom" ref="product.product_uom_unit"/>
             <field name="sequence">10</field>            
             <field name="type">normal</field>
-            <field name="bom_id" ref="mrp_bom_36"/>
+            <field name="bom_id" ref="mrp_bom_10"/>
+        </record>
+
+        <record id="mrp_bom_11" model="mrp.bom">
+            <field name="name">iPad Retina Display</field>
+            <field name="product_tmpl_id" ref="product.product_product_4_product_template"/>
+            <field name="product_uom" ref="product.product_uom_unit"/>
+            <field name="sequence">1</field>            
+            <field name="type">normal</field>
         </record>
+        <record id="mrp_bom_line_32" model="mrp.bom.line">
+            <field name="product_id" ref="product.product_product_14"/>
+            <field name="product_qty">1</field>
+            <field name="product_uom" ref="product.product_uom_unit"/>
+            <field name="sequence">1</field>            
+            <field name="type">normal</field>
+            <field name="attribute_value_ids" eval="[(6,0,[ref('product.product_attribute_value_1')])]"/>
+            <field name="bom_id" ref="mrp_bom_11"/>
+        </record>
+        <record id="mrp_bom_line_33" model="mrp.bom.line">
+            <field name="product_id" ref="product.product_product_15"/>
+            <field name="product_qty">1</field>
+            <field name="product_uom" ref="product.product_uom_unit"/>
+            <field name="sequence">2</field>            
+            <field name="type">normal</field>
+            <field name="attribute_value_ids" eval="[(6,0,[ref('product.product_attribute_value_2')])]"/>
+            <field name="bom_id" ref="mrp_bom_11"/>
+        </record>
+        <record id="mrp_bom_line_34" model="mrp.bom.line">
+            <field name="product_id" ref="product.product_product_23"/>
+            <field name="product_qty">1</field>
+            <field name="product_uom" ref="product.product_uom_unit"/>
+            <field name="sequence">3</field>            
+            <field name="type">normal</field>
+            <field name="bom_id" ref="mrp_bom_11"/>
+        </record>
+
 
     <record id="mrp_production_1" model="mrp.production">
-        <field name="product_id" ref="product.product_product_4"/>
+        <field name="product_id" ref="product.product_product_3"/>
         <field name="product_uom" ref="product.product_uom_unit"/>
         <field name="product_qty">3</field>
         <field name="location_src_id" ref="stock.stock_location_stock"/>
         <field name="location_dest_id" ref="stock.stock_location_output"/>
-        <field name="bom_id" ref="mrp_bom_24"/>
+        <field name="bom_id" ref="mrp_bom_8"/>
         <field name="routing_id" ref="mrp.mrp_routing_2"/>
     </record>
 
         <field name="product_uom" ref="product.product_uom_unit"/>
         <field name="location_src_id" ref="stock.stock_location_stock"/>
         <field name="location_dest_id" ref="stock.stock_location_output"/>
-        <field name="bom_id" ref="mrp.mrp_bom_7"/>
+        <field name="bom_id" ref="mrp.mrp_bom_4"/>
         <field name="routing_id" ref="mrp.mrp_routing_1"/>
     </record>
     <workflow action="button_confirm" model="mrp.production" ref="mrp_production_1"/>
index aaffc6f..464a703 100644 (file)
                 <form string="Bill of Material" version="7.0">
                     <group>
                         <group>
-                            <field name="product_id" on_change="onchange_product_id(product_id, name, product_qty, context)" class="oe_inline"/>
+                            <field name="product_tmpl_id" on_change="onchange_product_tmpl_id(product_tmpl_id, product_qty, context)"/>
+                            <field name="product_id"/>
+                            <field name="product_uom" class="oe_inline" on_change="onchange_uom(product_tmpl_id, product_uom)" groups="product.group_uom"/>
                             <label for="product_qty" string="Quantity"/>
                             <div>
-                                <field name="product_qty" class="oe_inline" on_change="onchange_product_id(product_id, name, product_qty, context)"/>
-                                <field name="product_uom" class="oe_inline" on_change="onchange_uom(product_id, product_uom)" groups="product.group_uom"/>
-                            </div>
-                            <label for="product_uos_qty" groups="product.group_uos"/>
-                            <div groups="product.group_uos" >
-                                <field name="product_uos_qty"
-                                    class="oe_inline"/>
-                                <label string="-" attrs="{'invisible':[('product_uos','=',False)]}" class="oe_inline"/>
-                                <field name="product_uos" class="oe_inline"/>
+                                <field name="product_qty" class="oe_inline" on_change="onchange_product_tmpl_id(product_tmpl_id, product_qty, context)"/>
+                                <field name="product_uom" class="oe_inline" on_change="onchange_uom(product_tmpl_id, product_uom)" groups="product.group_uom"/>
                             </div>
                             <label for="routing_id" class="oe_inline" groups="mrp.group_mrp_routings"/>
                             <div groups="mrp.group_mrp_routings">
-                               <field name="routing_id" class="oe_inline"/>
+                                <field name="routing_id" class="oe_inline"/>
                             </div>
                         </group>
                         <group>
                     </group>
                     <notebook>
                         <page string="Components">
-                            <field name="bom_lines" widget="one2many_list">
+                            <field name="bom_line_ids" widget="one2many_list">
                                 <tree string="Components" editable="bottom">
-                                    <field name="product_id" on_change="onchange_product_id(product_id, name)"/>
+                                    <field name="sequence" widget="handle"/>
+                                    <field name="product_id" on_change="onchange_product_id(product_id, product_qty)"/>
+                                    <field name="type"/>
                                     <field name="product_qty"/>
+                                    <field name="product_rounding"/>
+                                    <field name="product_efficiency"/>
                                     <field name="product_uom" on_change="onchange_uom(product_id, product_uom)" groups="product.group_uom"/>
-                                    <field name="name" invisible="1"/>
                                     <field name="date_start"/>
                                     <field name="date_stop"/>
+                                    <field name="routing_id"/>
+                                    <field name="attribute_value_ids" widget="many2many_tags"/>
                                 </tree>
                             </field>
                         </page>
                             <group>
                                 <group>
                                     <field name="position"/>
-                                    <field name="bom_id"/>
                                     <field name="sequence"/>
                                     <field name="active"/>
                                 </group>
             <field name="arch" type="xml">
                 <search string="Search Bill Of Material">
                     <field name="name" string="Bill Of Material" filter_domain="['|',('name','ilike',self),('code','ilike',self)]"/>
-                    <field name="bom_lines" string="Components"/>
-                    <field name="product_id"/>
+                    <field name="bom_line_ids" string="Components"/>
+                    <field name="product_tmpl_id"/>
                     <field name="company_id" groups="base.group_multi_company"/>
                     <group expand="0" string="Group By...">
-                        <filter string="Product" icon="terp-accessories-archiver" domain="[]" context="{'group_by':'product_id'}"/>
+                        <filter string="Product" icon="terp-accessories-archiver" domain="[]" context="{'group_by':'product_tmpl_id'}"/>
                         <filter string='Default Unit of Measure' icon="terp-mrp" domain="[]" context="{'group_by' : 'product_uom'}"/>
                         <filter string="Routing" icon="terp-stock_align_left_24" domain="[]" context="{'group_by':'routing_id'}"/>
                         <filter string='Type' icon="terp-stock_symbol-selection" domain="[]" context="{'group_by' : 'type'}"/>
        <record id="mrp_bom_tree_view" model="ir.ui.view">
             <field name="name">mrp.bom.tree</field>
             <field name="model">mrp.bom</field>
-            <field name="field_parent">child_complete_ids</field>
+            <!--field name="field_parent">child_complete_ids</field-->
             <field name="arch" type="xml">
                 <tree string="Bill of Materials">
                     <field name="sequence" invisible="1"/>
                     <field name="name" invisible="1"/>
+                    <field name="product_tmpl_id"/>
                     <field name="product_id"/>
-                    <field name="product_qty"/>
                     <field name="product_uom" groups="product.group_uom"/>
                     <field name="code"/>
                     <field name="type"/>
                 </tree>
             </field>
         </record>
-       <record id="mrp_bom_component_tree_view" model="ir.ui.view">
-            <field name="name">mrp.bom.component.tree</field>
-            <field name="model">mrp.bom</field>
-            <field name="field_parent">child_complete_ids</field>
-            <field name="arch" type="xml">
-                <tree string="BoM Structure">
-                    <field name="sequence" invisible="1"/>
-                    <field name="name" groups="base.group_no_one"/>
-                    <field name="code"/>
-                    <field name="product_id"/>
-                    <field name="bom_id" groups="product.group_mrp_properties"/>
-                    <field name="product_qty"/>
-                    <field name="product_uom" groups="product.group_uom"/>
-                    <field name="type"/>
-                    <field name="routing_id" groups="mrp.group_mrp_routings"/>
-                    <field name="date_start" groups="product.group_mrp_properties"/>
-                    <field name="date_stop" groups="product.group_mrp_properties"/>
-                </tree>
-            </field>
-        </record>
+
         <record id="mrp_bom_form_action" model="ir.actions.act_window">
             <field name="name">Bill of Materials</field>
             <field name="type">ir.actions.act_window</field>
             <field name="res_model">mrp.bom</field>
             <field name="view_type">form</field>
-            <field name="domain">[('bom_id','=',False)]</field>
             <field name="search_view_id" ref="view_mrp_bom_filter"/>
             <field name="help" type="html">
               <p class="oe_view_nocontent_create">
               </p>
             </field>
         </record>
+
+       <record id="mrp_bom_component_tree_view" model="ir.ui.view">
+            <field name="name">mrp.bom.component.tree</field>
+            <field name="model">mrp.bom.line</field>
+            <field name="arch" type="xml">
+                <tree string="Components" editable="top">
+                    <field name="sequence" widget="handle"/>
+                    <field name="bom_id"/>
+                    <field name="product_id" on_change="onchange_product_id(product_id)"/>
+                    <field name="type"/>
+                    <field name="product_qty"/>
+                    <field name="product_rounding"/>
+                    <field name="product_efficiency"/>
+                    <field name="product_uom" on_change="onchange_uom(product_id, product_uom)" groups="product.group_uom"/>
+                    <field name="product_uos_qty" groups="product.group_uos"/>
+                    <field name="product_uos" groups="product.group_uos"/>
+                    <field name="date_start"/>
+                    <field name="date_stop"/>
+                    <field name="routing_id"/>
+                    <field name="attribute_value_ids" widget="many2many_tags"/>
+                    <field name="property_ids" widget="many2many_tags"/>
+                </tree>
+            </field>
+        </record>
+
+        <record id="view_mrp_bom_line_filter" model="ir.ui.view">
+            <field name="name">mrp.bom.line.select</field>
+            <field name="model">mrp.bom.line</field>
+            <field name="arch" type="xml">
+                <search string="Search Bill Of Material Components">
+                    <field name="bom_id"/>
+                    <field name="product_id"/>
+                    <group expand="0" string="Group By...">
+                        <filter string="Bill Of Material" icon="terp-accessories-archiver" domain="[]" context="{'group_by':'bom_id'}"/>
+                        <filter string="Product" icon="terp-accessories-archiver" domain="[]" context="{'group_by':'product_id'}"/>
+                        <filter string='Default Unit of Measure' icon="terp-mrp" domain="[]" context="{'group_by' : 'product_uom'}"/>
+                        <filter string="Routing" icon="terp-stock_align_left_24" domain="[]" context="{'group_by':'routing_id'}"/>
+                        <filter string='Type' icon="terp-stock_symbol-selection" domain="[]" context="{'group_by' : 'type'}"/>
+                        <filter string=" Valid From Month" icon="terp-go-month" domain="[]" context="{'group_by':'date_start'}" help="Valid From Date by Month"/>
+                   </group>
+                </search>
+            </field>
+        </record>
+
         <record id="mrp_bom_form_action2" model="ir.actions.act_window">
             <field name="name">Bill of Material Components</field>
             <field name="type">ir.actions.act_window</field>
-            <field name="res_model">mrp.bom</field>
-            <field name="view_type">form</field>
-            <field name="view_id" ref="mrp_bom_component_tree_view"/>
-            <field name="domain">[]</field>
+            <field name="res_model">mrp.bom.line</field>
+            <field name="view_type">tree</field>
+            <field name="view_mode">tree</field>
             <field name="help" type="html">
               <p class="oe_view_nocontent_create">
                 Click to add a component to a bill of material.
               </p>
             </field>
         </record>
-        <record id="product_search_form_view_procurment" model="ir.ui.view">
-             <field name="name">product.search.bom</field>
-             <field name="model">product.product</field>
-             <field name="inherit_id" ref="product.product_search_form_view"/>
+
+        <record id="product_template_search_view_procurment" model="ir.ui.view">
+             <field name="name">product.template.search.bom</field>
+             <field name="model">product.template</field>
+             <field name="inherit_id" ref="product.product_template_search_view"/>
              <field name="arch" type="xml">
                  <xpath expr="//filter[@string='Consumable']" position="after">
                      <separator/>
-                    <filter string="Components" name="components" icon="terp-accessories-archiver" domain="[('bom_ids','not in',[]),('bom_ids.bom_id','!=',False)]"/>
+                    <filter string="Components" name="components" icon="terp-accessories-archiver" domain="[('bom_ids','not in',[])]"/>
                  </xpath>
              </field>
         </record>
         
         <record id="product_template_form_view_inherit" model="ir.ui.view">
-             <field name="name">product.template.form.view.inherited</field>
+             <field name="name">product.product.form.view.inherited</field>
              <field name="model">product.product</field>
-             <field name="inherit_id" ref="product.product_template_form_view"/>
+             <field name="inherit_id" ref="product.product_normal_form_view"/>
              <field name="arch" type="xml">
-                  <xpath expr="//field[@name='warranty']" position="before">
-                    <label for="produce_delay"/>
-                    <div>
+                <group name="sale_condition" position="inside">
+                    <label for="produce_delay" attrs="{'invisible':[('type','=','service')]}"/>
+                    <div attrs="{'invisible':[('type','=','service')]}">
                         <field name="produce_delay" class="oe_inline"/> days
                     </div>
-                </xpath>
+                </group>
              </field>
         </record>
-        
-        <record id="view_normal_procurement_locations_form_inherited" model="ir.ui.view">
-            <field name="name">product.normal.procurement.locations.inherited</field>
-            <field name="model">product.product</field>
-            <field name="inherit_id" ref="product.product_normal_form_view"/>
-            <field name="arch" type="xml">
-                <xpath expr="//group[@name='procurement_uom']" position="after">
-                    <group name="delay" string="Delays" attrs="{'invisible':[('type','=','service')]}">
-                        <label for="produce_delay" />
-                        <div attrs="{'invisible':[('type','=','service')]}">
-                            <field name="produce_delay" class="oe_inline" style="vertical-align:baseline"/> days
-                        </div>                        
-                    </group>                
-                </xpath>
-            </field>
-        </record>
 
         <record id="view_mrp_product_form_inherited" model="ir.ui.view">
             <field name="name">product.form.mrp.inherited</field>
                     </div>
                     <group>
                         <group>
-                            <field name="product_id" on_change="product_id_change(product_id, product_qty)" domain="[('bom_ids','!=',False),('bom_ids.bom_id','=',False),('bom_ids.type','!=','phantom')]" class="oe_inline" context='{"default_type": "product"}'/>
+                            <field name="product_id" on_change="product_id_change(product_id, product_qty)" domain="[('bom_ids','!=',False),('bom_ids.type','!=','phantom')]" class="oe_inline" context='{"default_type": "product"}'/>
                             <label for="product_qty"/>
                             <div>
                                 <field name="product_qty" class="oe_inline" on_change="product_id_change(product_id, product_qty)"/>
             <field name="arch" type="xml">
             <data>
                 <xpath expr="//field[@name='origin']" position="before">
-                    <field name="bom_id" domain="[('product_id','=',product_id),('bom_id','=',False)]"/>
+                    <field name="bom_id" domain="[('product_id','=',product_id)]"/>
                     <field name="production_id" attrs="{'invisible': [('production_id','=',False)]}"/>
                 </xpath>
                 <xpath expr="//field[@name='origin']" position="after">
             </field>
         </record>
 
-
         <!-- Menu for Resource for MRP-->
 
         <record id="mrp_workcenter_action" model="ir.actions.act_window">
                 id="menu_mrp_production_order_action" name="Order Planning"
                 parent="menu_mrp_planning" sequence="1"/>
 
-        <record id="act_product_mrp_bom_open" model="ir.actions.act_window">
-            <field name="name">BoM Structure</field>
-            <field name="context">{'default_product_id': active_id}</field>
-            <field name="domain">[('product_id', 'in', active_ids),('bom_id','=',False)]</field>
-            <field name="res_model">mrp.bom</field>
-        </record>
         <record model="ir.actions.act_window" id="product_open_bom">
-            <field name="context">{'default_product_id': active_id, 'search_default_product_id': active_id}</field>
+            <field name="context">{'default_product_tmpl_id': active_id, 'search_default_product_tmpl_id': active_id}</field>
             <field name="name">Bill of Materials</field>
-            <field name="domain">[('bom_id','=',False)]</field>
             <field name="res_model">mrp.bom</field>
             <field name="view_type">form</field>
         </record>
             <field name="res_model">mrp.production</field>
             <field name="view_id" ref="mrp_production_tree_view"/>
         </record>
-        <record model="ir.ui.view" id="product_form_view_bom_button">
-            <field name="name">product.product.procurement</field>
-            <field name="model">product.product</field>
-            <field name="inherit_id" ref="product.product_normal_form_view"/>
+        <record model="ir.ui.view" id="product_template_form_view_bom_button">
+            <field name="name">product.template.procurement</field>
+            <field name="model">product.template</field>
+            <field name="inherit_id" ref="product.product_template_form_view"/>
             <field name="arch" type="xml">
-                <xpath expr="//div[@name='buttons']" position="inside">
+                <div name="buttons" position="inside">
                     <button class="oe_inline oe_stat_button" name="%(product_open_bom)d" type="action" 
                         groups="mrp.group_mrp_user" attrs="{'invisible':[('type', '=', 'service')]}" icon="fa-flask">
                         <field string="Bill of Materials" name="bom_count" widget="statinfo" />
                     </button>
-                    <button class="oe_inline oe_stat_button" name="%(act_product_mrp_bom_open)d" type="action" 
-                        groups="mrp.group_mrp_user" attrs="{'invisible':[('type', '=', 'service')]}" icon="fa-flask">
-                        <field string="BoM Structure" name="bom_strct" widget="statinfo" />
-                    </button>
                     <button class="oe_inline oe_stat_button" name="%(act_product_mrp_production)d" type="action" 
                         groups="mrp.group_mrp_user" attrs="{'invisible':[('type', '=', 'service')]}" icon="fa-list-alt">
                         <field string="Manufacturing" name="mo_count" widget="statinfo" />
                     </button>
-                </xpath>
+                </div>
             </field>
         </record>
         
index c9910f8..50650b7 100644 (file)
@@ -62,7 +62,8 @@ class procurement_order(osv.osv):
         """
         for procurement in self.browse(cr, uid, ids, context=context):
             properties = [x.id for x in procurement.property_ids]
-            bom_id = self.pool.get('mrp.bom')._bom_find(cr, uid, procurement.product_id.id, procurement.product_uom.id, properties)
+            bom_id = self.pool.get('mrp.bom')._bom_find(cr, uid, procurement.product_uom.id,
+                product_id=procurement.product_id.id, properties=properties)
             if not bom_id:
                 return False
         return True
@@ -83,7 +84,8 @@ class procurement_order(osv.osv):
                     routing_id = procurement.bom_id.routing_id.id
                 else:
                     properties = [x.id for x in procurement.property_ids]
-                    bom_id = bom_obj._bom_find(cr, uid, procurement.product_id.id, procurement.product_uom.id, properties)
+                    bom_id = bom_obj._bom_find(cr, uid, procurement.product_uom.id,
+                        product_id=procurement.product_id.id, properties=properties)
                     bom = bom_obj.browse(cr, uid, bom_id, context=context)
                     routing_id = bom.routing_id.id
 
index c6b2376..97ef9cf 100644 (file)
 ##############################################################################
 
 from openerp.osv import fields, osv
-from openerp.tools.translate import _
 
 
+class product_template(osv.osv):
+    _inherit = "product.template"
+    def _bom_orders_count(self, cr, uid, ids, field_name, arg, context=None):
+        Bom = self.pool('mrp.bom')
+        res = {}
+        for product_tmpl_id in ids:
+            nb = Bom.search_count(cr, uid, [('product_tmpl_id', '=', product_tmpl_id)], context=context)
+            res[product_tmpl_id] = {
+                'bom_count': nb,
+            }
+        return res
+
+    def _bom_orders_count_mo(self, cr, uid, ids, name, arg, context=None):
+        res = {}
+        for product_tmpl_id in self.browse(cr, uid, ids):
+            res[product_tmpl_id.id] = sum([p.mo_count for p in product_tmpl_id.product_variant_ids])
+        return res
+
+    _columns = {
+        "bom_ids": fields.one2many('mrp.bom', 'product_tmpl_id','Bill of Materials'),
+        'bom_count': fields.function(_bom_orders_count, string='# Bill of Material', type='integer', multi="_bom_order_count"),
+        'mo_count': fields.function(_bom_orders_count_mo, string='# Manufacturing Orders', type='integer'),
+    }
+    def copy(self, cr, uid, id, default=None, context=None):
+        if not default:
+            default = {}
+        default.update({
+            'bom_ids': []
+        })
+        return super(product_template, self).copy(cr, uid, id, default, context=context)
+
 class product_product(osv.osv):
-    _inherit = "product.product"    
+    _inherit = "product.product"
+    def _bom_orders_count(self, cr, uid, ids, field_name, arg, context=None):
+        Production = self.pool('mrp.production')
+        res = {}
+        for product_id in ids:
+            res[product_id] = Production.search_count(cr,uid, [('product_id', '=', product_id)], context=context)
+        return res
+
     _columns = {
-        "bom_ids": fields.one2many('mrp.bom', 'product_id','Bill of Materials', domain=[('bom_id','=',False)]),
         "produce_delay": fields.float('Manufacturing Lead Time', help="Average delay in days to produce this product. In the case of multi-level BOM, the manufacturing lead times of the components will be added."),
         'track_production': fields.boolean('Track Manufacturing Lots', help="Forces to specify a Serial Number for all moves containing this product and generated by a Manufacturing Order"),
+        'mo_count': fields.function(_bom_orders_count, string='# Manufacturing Orders', type='integer'),
     }
     
     _defaults = {
         "produce_delay": 1,
     }
-    def copy(self, cr, uid, id, default=None, context=None):
-        if not default:
-            default = {}
-        default.update({
-            'bom_ids': []
-        })
-        return super(product_product, self).copy(cr, uid, id, default, context=context)
 
 
 
index 388d737..70baf1b 100644 (file)
@@ -144,7 +144,7 @@ class report_custom(report_rml):
 
         for product in product_pool.browse(cr, uid, ids, context=context):
             product_uom_name = to_xml(product.uom_id.name)
-            bom_id = bom_pool._bom_find(cr, uid, product.id, product.uom_id.id)
+            bom_id = bom_pool._bom_find(cr, uid, product.uom_id.id, product_id=product.id)
             title = "<title>%s</title>" %(_("Cost Structure"))
             title += "<title>%s</title>" % (to_xml(product.name))
             xml += "<lines style='header'>" + title + prod_header + "</lines>"
@@ -168,7 +168,7 @@ class report_custom(report_rml):
             else:
                 bom = bom_pool.browse(cr, uid, bom_id, context=context)
                 factor = number * product.uom_id.factor / bom.product_uom.factor
-                sub_boms = bom_pool._bom_explode(cr, uid, bom, factor / bom.product_qty)
+                sub_boms = bom_pool._bom_explode(cr, uid, bom, product, factor / bom.product_qty)
                 total = 0
                 total_strd = 0
                 parent_bom = {
index da7ba42..61f62fd 100644 (file)
@@ -4,6 +4,7 @@ access_mrp_workcenter,mrp.workcenter,model_mrp_workcenter,mrp.group_mrp_user,1,0
 access_mrp_routing,mrp.routing,model_mrp_routing,mrp.group_mrp_user,1,0,0,0
 access_mrp_routing_workcenter,mrp.routing.workcenter,model_mrp_routing_workcenter,mrp.group_mrp_user,1,0,0,0
 access_mrp_bom,mrp.bom,model_mrp_bom,group_mrp_user,1,0,0,0
+access_mrp_bom_line,mrp.bom.line,model_mrp_bom_line,group_mrp_user,1,0,0,0
 access_mrp_production,mrp.production user,model_mrp_production,mrp.group_mrp_user,1,1,1,1
 access_mrp_production_salesman,mrp.production salesman,model_mrp_production,base.group_sale_salesman,1,1,1,0
 access_mrp_production_product_line_salesman,mrp.production.product.line salesman,model_mrp_production_product_line,base.group_sale_salesman,1,0,1,0
@@ -14,6 +15,7 @@ access_mrp_workcenter_manager,mrp.workcenter.manager,model_mrp_workcenter,mrp.gr
 access_mrp_routing_manager,mrp.routing.manager,model_mrp_routing,mrp.group_mrp_manager,1,1,1,1
 access_mrp_routing_workcenter_manager,mrp.routing.workcenter.manager,model_mrp_routing_workcenter,mrp.group_mrp_manager,1,1,1,1
 access_mrp_bom_manager,mrp.bom.manager,model_mrp_bom,mrp.group_mrp_manager,1,1,1,1
+access_mrp_bom_line_manager,mrp.bom.line.manager,model_mrp_bom_line,mrp.group_mrp_manager,1,1,1,1
 access_stock_location_mrp_worker,stock.location mrp_worker,stock.model_stock_location,mrp.group_mrp_user,1,0,0,0
 access_stock_move_mrp_worker,stock.move mrp_worker,stock.model_stock_move,mrp.group_mrp_user,1,1,1,0
 access_stock_picking_mrp_worker,stock.picking mrp_worker,stock.model_stock_picking,mrp.group_mrp_user,1,1,1,1
@@ -55,6 +57,8 @@ access_report_mrp_inout_user,report.mrp.inout user,model_report_mrp_inout,mrp.gr
 access_report_workcenter_load_user,report.workcenter.load.user,model_report_workcenter_load,mrp.group_mrp_user,1,0,0,0
 access_mrp_bom_salesman,mrp.bom,model_mrp_bom,base.group_sale_salesman,1,0,0,0
 access_mrp_bom_stockuser,mrp.bom,model_mrp_bom,stock.group_stock_user,1,0,0,0
+access_mrp_bom_line_salesman,mrp.bom.line,model_mrp_bom_line,base.group_sale_salesman,1,0,0,0
+access_mrp_bom_line_stockuser,mrp.bom.line,model_mrp_bom_line,stock.group_stock_user,1,0,0,0
 access_product_uom_categ_mrp_manager,product.uom.categ mrp_manager,product.model_product_uom_categ,mrp.group_mrp_manager,1,1,1,1
 access_product_uom_mrp_manager,product.uom mrp_manager,product.model_product_uom,mrp.group_mrp_manager,1,1,1,1
 access_product_ul_mrp_manager,product.ul mrp_manager,product.model_product_ul,mrp.group_mrp_manager,1,1,1,1
index e77b811..1ff7e7e 100644 (file)
@@ -55,13 +55,14 @@ class StockMove(osv.osv):
         user_company = self.pool.get('res.users').browse(cr, uid, uid, context=context).company_id.id
         #doing the search as SUPERUSER because a user with the permission to write on a stock move should be able to explode it
         #without giving him the right to read the boms.
-        return self.pool.get('mrp.bom').search(cr, SUPERUSER_ID, [
-            ('product_id', '=', move.product_id.id),
-            ('bom_id', '=', False),
+        domain = [
+            '|', ('product_id', '=', move.product_id.id),
+            '&', ('product_id', '=', False), ('product_tmpl_id.product_variant_ids', '=', move.product_id.id),
             ('type', '=', 'phantom'),
             '|', ('date_start', '=', False), ('date_start', '<=', time.strftime(DEFAULT_SERVER_DATETIME_FORMAT)),
             '|', ('date_stop', '=', False), ('date_stop', '>=', time.strftime(DEFAULT_SERVER_DATETIME_FORMAT)),
-            ('company_id', '=', user_company)], context=context)
+            ('company_id', '=', user_company)]
+        return self.pool.get('mrp.bom').search(cr, SUPERUSER_ID, domain, context=context)
 
     def _action_explode(self, cr, uid, move, context=None):
         """ Explodes pickings.
@@ -76,7 +77,7 @@ class StockMove(osv.osv):
         if bis:
             factor = move.product_qty
             bom_point = bom_obj.browse(cr, SUPERUSER_ID, bis[0], context=context)
-            res = bom_obj._bom_explode(cr, SUPERUSER_ID, bom_point, factor, [])
+            res = bom_obj._bom_explode(cr, SUPERUSER_ID, bom_point, move.product_id, factor, [])
             state = 'confirmed'
             if move.state == 'assigned':
                 state = 'assigned'
index d06a248..b2b807d 100644 (file)
@@ -4,17 +4,17 @@
   !record {model: mrp.bom, id: mrp_bom_test1}:
     company_id: base.main_company
     name: PC Assemble SC234
+    product_tmpl_id: product.product_product_3_product_template
     product_id: product.product_product_3
+    product_uom: product.product_uom_unit
     product_qty: 1.0
     type: normal
-    bom_lines:
-      - company_id: base.main_company
-        name: On Site Assistance
-        product_id: product.product_product_2
+    bom_line_ids:
+      - product_id: product.product_product_2
+        product_uom: product.product_uom_unit
         product_qty: 1.0
-      - company_id: base.main_company
-        name: GrapWorks Software
-        product_id: product.product_product_44
+      - product_id: product.product_product_44
+        product_uom: product.product_uom_unit
         product_qty: 1.0
 -
   I make the production order using BoM having one service type product and one consumable product.
index 0e49143..d25ef12 100644 (file)
@@ -7,11 +7,11 @@
   I create Production Order of PC Assemble SC349 to produce 5.0 Unit.
 -
   !record {model: mrp.production, id: mrp_production_test1}:
-    product_id: product.product_product_4
+    product_id: product.product_product_3
     product_qty: 5.0
     location_src_id: stock.stock_location_14
     location_dest_id: stock.stock_location_output
-    bom_id: mrp_bom_24
+    bom_id: mrp_bom_9
     routing_id: mrp.mrp_routing_1
     
     
index ae5469d..fe34edf 100644 (file)
                                 </td>
                                 <td><span t-field="o.code"/></td>
                             </tr>
-                            <tr t-foreach="get_children(o.bom_lines)" t-as="l">
+                            <tr t-foreach="get_children(o.bom_line_ids)" t-as="l">
                                 <td>
                                     <span style="color: white;" t-esc="'... '*(l['level'])"/>
-                                    - <span t-esc="l['name']"/>
                                 </td>
                                  <td>
                                         [ <span t-esc="l['pcode']"/> ]
index 0f3d0cb..6b1c9aa 100644 (file)
@@ -78,7 +78,7 @@ class change_production_qty(osv.osv_memory):
                 bom_point = prod.bom_id
                 bom_id = prod.bom_id.id
                 if not bom_point:
-                    bom_id = bom_obj._bom_find(cr, uid, prod.product_id.id, prod.product_uom.id)
+                    bom_id = bom_obj._bom_find(cr, uid, prod.product_uom.id, product_id=prod.product_id.id)
                     if not bom_id:
                         raise osv.except_osv(_('Error!'), _("Cannot find bill of material for this product."))
                     prod_obj.write(cr, uid, [prod.id], {'bom_id': bom_id})
@@ -89,7 +89,7 @@ class change_production_qty(osv.osv_memory):
 
                 factor = prod.product_qty * prod.product_uom.factor / bom_point.product_uom.factor
                 product_details, workcenter_details = \
-                    bom_obj._bom_explode(cr, uid, bom_point, factor / bom_point.product_qty, [])
+                    bom_obj._bom_explode(cr, uid, bom_point, prod.product_id, factor / bom_point.product_qty, [])
                 for r in product_details:
                     if r['product_id'] == move.product_id.id:
                         move_obj.write(cr, uid, [move.id], {'product_uom_qty': r['product_qty']})
index cd6ce88..ac1a114 100644 (file)
@@ -4,7 +4,7 @@
 -
   I add a sub product in Bill of material for product External Hard Disk.
 -
-  !record {model: mrp.bom, id: mrp.mrp_bom_24}:
+  !record {model: mrp.bom, id: mrp.mrp_bom_9}:
     product_id: product.product_product_28
     name: External Hard Disk + Subproduct
     product_uom: product.product_uom_unit
@@ -20,7 +20,7 @@
     product_id: product.product_product_28
     product_qty: 2.0
     product_uom: product.product_uom_unit
-    bom_id: mrp.mrp_bom_24
+    bom_id: mrp.mrp_bom_9
     location_src_id: stock.stock_location_stock
 -
   I compute the data of production order.
index b795983..c1172c0 100644 (file)
@@ -1316,30 +1316,80 @@ class ean_wizard(osv.osv_memory):
             self.pool[m].write(cr,uid,[m_id],{'ean13':ean13})
         return { 'type' : 'ir.actions.act_window_close' }
 
-class product_product(osv.osv):
-    _inherit = 'product.product'
+class pos_category(osv.osv):
+    _name = "pos.category"
+    _description = "Public Category"
+    _order = "sequence, name"
 
+    _constraints = [
+        (osv.osv._check_recursion, 'Error ! You cannot create recursive categories.', ['parent_id'])
+    ]
 
-    #def _get_small_image(self, cr, uid, ids, prop, unknow_none, context=None):
-    #    result = {}
-    #    for obj in self.browse(cr, uid, ids, context=context):
-    #        if not obj.product_image:
-    #            result[obj.id] = False
-    #            continue
+    def name_get(self, cr, uid, ids, context=None):
+        if not len(ids):
+            return []
+        reads = self.read(cr, uid, ids, ['name','parent_id'], context=context)
+        res = []
+        for record in reads:
+            name = record['name']
+            if record['parent_id']:
+                name = record['parent_id'][1]+' / '+name
+            res.append((record['id'], name))
+        return res
+
+    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 _get_image(self, cr, uid, ids, name, args, context=None):
+        result = dict.fromkeys(ids, False)
+        for obj in self.browse(cr, uid, ids, context=context):
+            result[obj.id] = tools.image_get_resized_images(obj.image)
+        return result
+    
+    def _set_image(self, cr, uid, id, name, value, args, context=None):
+        return self.write(cr, uid, [id], {'image': tools.image_resize_image_big(value)}, context=context)
+
+    _columns = {
+        'name': fields.char('Name', required=True, translate=True),
+        'complete_name': fields.function(_name_get_fnc, type="char", string='Name'),
+        'parent_id': fields.many2one('pos.category','Parent Category', select=True),
+        'child_id': fields.one2many('pos.category', 'parent_id', string='Children Categories'),
+        'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of product categories."),
+        
+        # NOTE: there is no 'default image', because by default we don't show thumbnails for categories. However if we have a thumbnail
+        # for at least one category, then we display a default image on the other, so that the buttons have consistent styling.
+        # In this case, the default image is set by the js code.
+        # NOTE2: image: all image fields are base64 encoded and PIL-supported
+        'image': fields.binary("Image",
+            help="This field holds the image used as image for the cateogry, limited to 1024x1024px."),
+        'image_medium': fields.function(_get_image, fnct_inv=_set_image,
+            string="Medium-sized image", type="binary", multi="_get_image",
+            store={
+                'pos.category': (lambda self, cr, uid, ids, c={}: ids, ['image'], 10),
+            },
+            help="Medium-sized image of the category. It is automatically "\
+                 "resized as a 128x128px image, with aspect ratio preserved. "\
+                 "Use this field in form views or some kanban views."),
+        'image_small': fields.function(_get_image, fnct_inv=_set_image,
+            string="Smal-sized image", type="binary", multi="_get_image",
+            store={
+                'pos.category': (lambda self, cr, uid, ids, c={}: ids, ['image'], 10),
+            },
+            help="Small-sized image of the category. It is automatically "\
+                 "resized as a 64x64px image, with aspect ratio preserved. "\
+                 "Use this field anywhere a small image is required."),
+    }
 
-    #        image_stream = io.BytesIO(obj.product_image.decode('base64'))
-    #        img = Image.open(image_stream)
-    #        img.thumbnail((120, 100), Image.ANTIALIAS)
-    #        img_stream = StringIO.StringIO()
-    #        img.save(img_stream, "JPEG")
-    #        result[obj.id] = img_stream.getvalue().encode('base64')
-    #    return result
+class product_template(osv.osv):
+    _inherit = 'product.template'
 
     _columns = {
         'income_pdt': fields.boolean('Point of Sale Cash In', help="Check if, this is a product you can use to put cash into a statement for the point of sale backend."),
         'expense_pdt': fields.boolean('Point of Sale Cash Out', help="Check if, this is a product you can use to take cash from a statement for the point of sale backend, example: money lost, transfer to bank, etc."),
         'available_in_pos': fields.boolean('Available in the Point of Sale', help='Check if you want this product to appear in the Point of Sale'), 
         'to_weight' : fields.boolean('To Weigh', help="Check if the product should be weighted (mainly used with self check-out interface)."),
+        'pos_categ_id': fields.many2one('pos.category','Point of Sale Category', help="Those categories are used to group similar products for point of sale."),
     }
 
     _defaults = {
index a0a68ec..ea6d624 100644 (file)
             <field name="journal_ids" eval="[(6, 0, [ref('account.cash_journal'), ref('account.bank_journal'), ref('account.check_journal')])]" />
         </record>
 
-        <!-- Resource: product.public.category -->
+        <!-- Resource: pos.category -->
 
-        <record id="product.computers" model="product.public.category">
+        <record id="computers" model="pos.category">
+          <field name="name">Computers</field>
           <field name="image" type="base64" file="point_of_sale/static/img/computer.png"/>
         </record>
 
-        <record id="beverage" model="product.public.category">
+        <record id="beverage" model="pos.category">
           <field name="name">Beverages</field>
           <field name="image" type="base64" file="point_of_sale/static/img/beverage-image.jpg"/>
         </record>
 
-        <record id="water" model="product.public.category">
+        <record id="water" model="pos.category">
           <field name="parent_id" ref="beverage"/>
           <field name="name">Water</field>
           <field name="image" type="base64" file="point_of_sale/static/img/water-image.jpg"/>
         </record>
-        <record id="plain_water" model="product.public.category">
+        <record id="plain_water" model="pos.category">
           <field name="parent_id" ref="water"/>
           <field name="name">Plain Water</field>
           <field name="image" type="base64" file="point_of_sale/static/img/plain_water-image.jpg"/>
         </record>
-        <record id="sparkling_water" model="product.public.category">
+        <record id="sparkling_water" model="pos.category">
           <field name="parent_id" ref="water"/>
           <field name="name">Sparkling Water</field>
           <field name="image" type="base64" file="point_of_sale/static/img/sparkling_water-image.jpg"/>
         </record>
-        <record id="soda" model="product.public.category">
+        <record id="soda" model="pos.category">
           <field name="parent_id" ref="beverage"/>
           <field name="name">Soda</field>
           <field name="image" type="base64" file="point_of_sale/static/img/soda-image.jpg"/>
         </record>
-        <record id="coke" model="product.public.category">
+        <record id="coke" model="pos.category">
             <field name="parent_id" ref="soda"/>
             <field name="name">Coke</field>
             <field name="image" type="base64" file="point_of_sale/static/img/coke-image.jpg"/>
         </record>
-        <record id="soda_orange" model="product.public.category">
+        <record id="soda_orange" model="pos.category">
             <field name="parent_id" ref="soda"/>
             <field name="name">Orange</field>
             <field name="image" type="base64" file="point_of_sale/static/img/soda_orange-image.jpg"/>
         </record>
-        <record id="beers" model="product.public.category">
+        <record id="beers" model="pos.category">
           <field name="parent_id" ref="beverage"/>
           <field name="name">Beers</field>
           <field name="image" type="base64" file="point_of_sale/static/img/beers-image.jpg"/>
         </record>
-        <record id="pils" model="product.public.category">
+        <record id="pils" model="pos.category">
             <field name="parent_id" ref="beers"/>
             <field name="name">Pils</field>
             <field name="image" type="base64" file="point_of_sale/static/img/pils-image.jpg"/>
         </record>
-        <record id="fruity_beers" model="product.public.category">
+        <record id="fruity_beers" model="pos.category">
             <field name="parent_id" ref="beers"/>
             <field name="name">Fruity Beers</field>
             <field name="image" type="base64" file="point_of_sale/static/img/fruity_beers-image.jpg"/>
         </record>
-        <record id="special_beers" model="product.public.category">
+        <record id="special_beers" model="pos.category">
             <field name="parent_id" ref="beers"/>
             <field name="name">Special Beers</field>
             <field name="image" type="base64" file="point_of_sale/static/img/special_beers-image.jpg"/>
         </record>
-        <record id="food" model="product.public.category">
+        <record id="food" model="pos.category">
           <field name="name">Food</field>
           <field name="image" type="base64" file="point_of_sale/static/img/food-image.jpg"/>
         </record>
-        <record id="pizza" model="product.public.category">
+        <record id="pizza" model="pos.category">
           <field name="parent_id" ref="food"/>
           <field name="name">Pizza</field>
           <field name="image" type="base64" file="point_of_sale/static/img/pizza-image.jpg"/>
         </record>
-        <record id="ice_cream" model="product.public.category">
+        <record id="ice_cream" model="pos.category">
           <field name="parent_id" ref="food"/>
           <field name="name">Ice Cream</field>
           <field name="image" type="base64" file="point_of_sale/static/img/ice_cream-image.jpg"/>
         </record>
-        <record id="chips" model="product.public.category">
+        <record id="chips" model="pos.category">
           <field name="parent_id" ref="food"/>
           <field name="name">Chips</field>
           <field name="image" type="base64" file="point_of_sale/static/img/chips-image.jpg"/>
         </record>
-        <record id="fruits" model="product.public.category">
+        <record id="fruits" model="pos.category">
           <field name="name">Fresh Fruits</field>
           <field name="image" type="base64" file="point_of_sale/static/img/fruits-image.jpg"/>
         </record>
-        <record id="oranges" model="product.public.category">
+        <record id="oranges" model="pos.category">
           <field name="parent_id" ref="fruits"/>
           <field name="name">Oranges</field>
           <field name="image" type="base64" file="point_of_sale/static/img/oranges-image.jpg"/>
         </record>
-        <record id="pomme" model="product.public.category">
+        <record id="pomme" model="pos.category">
           <field name="parent_id" ref="fruits"/>
           <field name="name">Apples</field>
           <field name="image" type="base64" file="point_of_sale/static/img/pomme-image.jpg"/>
         </record>
-        <record id="autres_agrumes" model="product.public.category">
+        <record id="autres_agrumes" model="pos.category">
           <field name="parent_id" ref="fruits"/>
           <field name="name">Other Citrus</field>
           <field name="image" type="base64" file="point_of_sale/static/img/autres_agrumes-image.jpg"/>
         </record>
-        <record id="poire" model="product.public.category">
+        <record id="poire" model="pos.category">
           <field name="parent_id" ref="fruits"/>
           <field name="name">Pears</field>
           <field name="image" type="base64" file="point_of_sale/static/img/poire-image.jpg"/>
         </record>
-        <record id="rouges_noyau_fruits" model="product.public.category">
+        <record id="rouges_noyau_fruits" model="pos.category">
           <field name="parent_id" ref="fruits"/>
           <field name="name">Berries</field>
           <field name="image" type="base64" file="point_of_sale/static/img/rouges_noyau_fruits-image.jpg"/>
         </record>
-        <record id="raisins" model="product.public.category">
+        <record id="raisins" model="pos.category">
           <field name="parent_id" ref="fruits"/>
           <field name="name">Grapes</field>
           <field name="image" type="base64" file="point_of_sale/static/img/raisins-image.jpg"/>
         </record>
-        <record id="legumes" model="product.public.category">
+        <record id="legumes" model="pos.category">
           <field name="name">Fresh vegetables</field>
           <field name="image" type="base64" file="point_of_sale/static/img/legumes-image.jpg"/>
         </record>
-        <record id="pommes_de_terre" model="product.public.category">
+        <record id="pommes_de_terre" model="pos.category">
           <field name="parent_id" ref="legumes"/>
           <field name="name">Potatoes</field>
           <field name="image" type="base64" file="point_of_sale/static/img/pommes_de_terre-image.jpg"/>
         </record>
-        <record id="legumes_racine" model="product.public.category">
+        <record id="legumes_racine" model="pos.category">
           <field name="parent_id" ref="legumes"/>
           <field name="name">Root vegetables</field>
           <field name="image" type="base64" file="point_of_sale/static/img/legumes_racine-image.jpg"/>
         </record>
-        <record id="tomates" model="product.public.category">
+        <record id="tomates" model="pos.category">
           <field name="parent_id" ref="legumes"/>
           <field name="name">Tomatos</field>
           <field name="image" type="base64" file="point_of_sale/static/img/tomates-image.jpg"/>
         </record>
-        <record id="oignons_ail_echalotes" model="product.public.category">
+        <record id="oignons_ail_echalotes" model="pos.category">
           <field name="parent_id" ref="legumes"/>
           <field name="name">Onions / Garlic / Shallots</field>
           <field name="image" type="base64" file="point_of_sale/static/img/oignons_ail_echalotes-image.jpg"/>
         </record>
-        <record id="autres_legumes_frais" model="product.public.category">
+        <record id="autres_legumes_frais" model="pos.category">
           <field name="parent_id" ref="legumes"/>
           <field name="name">Other fresh vegetables</field>
           <field name="image" type="base64" file="point_of_sale/static/img/autres_legumes_frais-image.jpg"/>
           <field name="name">Boni Oranges</field>
           <field name="to_weight">True</field>
           <field name="ean13">2100002000003</field>
-          <field name="public_categ_id" ref="oranges"/>
+          <field name="pos_categ_id" ref="oranges"/>
           <field name="uom_id" ref="product.product_uom_kgm" />
           <field name="uom_po_id" ref="product.product_uom_kgm" />
           <field name="image" type="base64" file="point_of_sale/static/img/boni_orange-image.jpg"/>
           <field name="available_in_pos">True</field>
           <field name="list_price">2.83</field>
           <field name="name">Orange Butterfly</field>
-          <field name="public_categ_id" ref="oranges"/>
+          <field name="pos_categ_id" ref="oranges"/>
           <field name="to_weight">True</field>
           <field name="uom_id" ref="product.product_uom_kgm" />
           <field name="uom_po_id" ref="product.product_uom_kgm" />
           <field name="name">Lemon</field>
           <field name="ean13">2301000000006</field>
           <field name="to_weight">True</field>
-          <field name="public_categ_id" ref="autres_agrumes"/>
+          <field name="pos_categ_id" ref="autres_agrumes"/>
           <field name="uom_id" ref="product.product_uom_kgm" />
           <field name="uom_po_id" ref="product.product_uom_kgm" />
           <field name="image" type="base64" file="point_of_sale/static/img/citron-image.jpg"/>
           <field name="list_price">3.19</field>
           <field name="name">Stringers</field>
           <field name="to_weight">True</field>
-          <field name="public_categ_id" ref="autres_agrumes"/>
+          <field name="pos_categ_id" ref="autres_agrumes"/>
           <field name="uom_id" ref="product.product_uom_kgm" />
           <field name="uom_po_id" ref="product.product_uom_kgm" />
           <field name="image" type="base64" file="point_of_sale/static/img/limon-image.jpg"/>
           <field name="list_price">1.98</field>
           <field name="name">Red grapefruit</field>
           <field name="to_weight">True</field>
-          <field name="public_categ_id" ref="autres_agrumes"/>
+          <field name="pos_categ_id" ref="autres_agrumes"/>
           <field name="uom_id" ref="product.product_uom_kgm" />
           <field name="uom_po_id" ref="product.product_uom_kgm" />
           <field name="image" type="base64" file="point_of_sale/static/img/pamplemousse_rouge_pamplemousse-image.jpg"/>
           <field name="list_price">2.09</field>
           <field name="name">Granny Smith apples</field>
           <field name="to_weight">True</field>
-          <field name="public_categ_id" ref="pomme"/>
+          <field name="pos_categ_id" ref="pomme"/>
           <field name="uom_id" ref="product.product_uom_kgm" />
           <field name="uom_po_id" ref="product.product_uom_kgm" />
           <field name="image" type="base64" file="point_of_sale/static/img/pomme_granny_smith-image.jpg"/>
           <field name="list_price">1.10</field>
           <field name="name">Jonagold apples</field>
           <field name="to_weight">True</field>
-          <field name="public_categ_id" ref="pomme"/>
+          <field name="pos_categ_id" ref="pomme"/>
           <field name="uom_id" ref="product.product_uom_kgm" />
           <field name="uom_po_id" ref="product.product_uom_kgm" />
           <field name="image" type="base64" file="point_of_sale/static/img/pomme_jonagold-image.jpg"/>
           <field name="list_price">1.69</field>
           <field name="name">Golden Apples Perlim</field>
           <field name="to_weight">True</field>
-          <field name="public_categ_id" ref="pomme"/>
+          <field name="pos_categ_id" ref="pomme"/>
           <field name="uom_id" ref="product.product_uom_kgm" />
           <field name="uom_po_id" ref="product.product_uom_kgm" />
           <field name="image" type="base64" file="point_of_sale/static/img/pomme_golden_perlim-image.jpg"/>
           <field name="list_price">1.70</field>
           <field name="name">Conference pears</field>
           <field name="to_weight">True</field>
-          <field name="public_categ_id" ref="poire"/>
+          <field name="pos_categ_id" ref="poire"/>
           <field name="uom_id" ref="product.product_uom_kgm" />
           <field name="uom_po_id" ref="product.product_uom_kgm" />
           <field name="image" type="base64" file="point_of_sale/static/img/poire_conference-image.jpg"/>
           <field name="list_price">5.70</field>
           <field name="name">Peach</field>
           <field name="to_weight">True</field>
-          <field name="public_categ_id" ref="rouges_noyau_fruits"/>
+          <field name="pos_categ_id" ref="rouges_noyau_fruits"/>
           <field name="uom_id" ref="product.product_uom_kgm" />
           <field name="uom_po_id" ref="product.product_uom_kgm" />
           <field name="image" type="base64" file="point_of_sale/static/img/nectarine-image.jpg"/>
           <field name="name">Peaches</field>
           <field name="to_weight">True</field>
           <field name="ean13">2300001000008</field>
-          <field name="public_categ_id" ref="rouges_noyau_fruits"/>
+          <field name="pos_categ_id" ref="rouges_noyau_fruits"/>
           <field name="uom_id" ref="product.product_uom_kgm" />
           <field name="uom_po_id" ref="product.product_uom_kgm" />
           <field name="image" type="base64" file="point_of_sale/static/img/peche-image.jpg"/>
           <field name="list_price">4.80</field>
           <field name="name">Black Grapes</field>
           <field name="to_weight">True</field>
-          <field name="public_categ_id" ref="raisins"/>
+          <field name="pos_categ_id" ref="raisins"/>
           <field name="uom_id" ref="product.product_uom_kgm" />
           <field name="uom_po_id" ref="product.product_uom_kgm" />
           <field name="image" type="base64" file="point_of_sale/static/img/raisins_noir-image.jpg"/>
           <field name="list_price">1.39</field>
           <field name="name">Potatoes</field>
           <field name="to_weight">True</field>
-          <field name="public_categ_id" ref="pommes_de_terre"/>
+          <field name="pos_categ_id" ref="pommes_de_terre"/>
           <field name="uom_id" ref="product.product_uom_kgm" />
           <field name="uom_po_id" ref="product.product_uom_kgm" />
           <field name="image" type="base64" file="point_of_sale/static/img/pomme_de_terre-image.jpg"/>
           <field name="list_price">2.20</field>
           <field name="name">Extra Flandria chicory</field>
           <field name="to_weight">True</field>
-          <field name="public_categ_id" ref="legumes_racine"/>
+          <field name="pos_categ_id" ref="legumes_racine"/>
           <field name="uom_id" ref="product.product_uom_kgm" />
           <field name="uom_po_id" ref="product.product_uom_kgm" />
           <field name="image" type="base64" file="point_of_sale/static/img/chicon_flandria_extra-image.jpg"/>
           <field name="list_price">0.90</field>
           <field name="name">Carrots</field>
           <field name="to_weight">True</field>
-          <field name="public_categ_id" ref="legumes_racine"/>
+          <field name="pos_categ_id" ref="legumes_racine"/>
           <field name="uom_id" ref="product.product_uom_kgm" />
           <field name="uom_po_id" ref="product.product_uom_kgm" />
           <field name="image" type="base64" file="point_of_sale/static/img/carotte-image.jpg"/>
           <field name="list_price">2.10</field>
           <field name="name">Fennel</field>
           <field name="to_weight">True</field>
-          <field name="public_categ_id" ref="legumes_racine"/>
+          <field name="pos_categ_id" ref="legumes_racine"/>
           <field name="uom_id" ref="product.product_uom_kgm" />
           <field name="uom_po_id" ref="product.product_uom_kgm" />
           <field name="image" type="base64" file="point_of_sale/static/img/fenouil_fenouil-image.jpg"/>
           <field name="list_price">1.90</field>
           <field name="name">In Cluster Tomatoes</field>
           <field name="to_weight">True</field>
-          <field name="public_categ_id" ref="tomates"/>
+          <field name="pos_categ_id" ref="tomates"/>
           <field name="uom_id" ref="product.product_uom_kgm" />
           <field name="uom_po_id" ref="product.product_uom_kgm" />
           <field name="image" type="base64" file="point_of_sale/static/img/tomate_en_grappe-image.jpg"/>
           <field name="name">Onions</field>
           <field name="to_weight">True</field>
           <field name="ean13">2100001000004</field>
-          <field name="public_categ_id" ref="oignons_ail_echalotes"/>
+          <field name="pos_categ_id" ref="oignons_ail_echalotes"/>
           <field name="uom_id" ref="product.product_uom_kgm" />
           <field name="uom_po_id" ref="product.product_uom_kgm" />
           <field name="image" type="base64" file="point_of_sale/static/img/Onions-image.jpg"/>
           <field name="list_price">3.10</field>
           <field name="name">Red Pepper</field>
           <field name="to_weight">True</field>
-          <field name="public_categ_id" ref="autres_legumes_frais"/>
+          <field name="pos_categ_id" ref="autres_legumes_frais"/>
           <field name="uom_id" ref="product.product_uom_kgm" />
           <field name="uom_po_id" ref="product.product_uom_kgm" />
           <field name="image" type="base64" file="point_of_sale/static/img/poivron_rouges-image.jpg"/>
           <field name="list_price">3.00</field>
           <field name="name">Green Peppers</field>
           <field name="to_weight">True</field>
-          <field name="public_categ_id" ref="autres_legumes_frais"/>
+          <field name="pos_categ_id" ref="autres_legumes_frais"/>
           <field name="uom_id" ref="product.product_uom_kgm" />
           <field name="uom_po_id" ref="product.product_uom_kgm" />
           <field name="image" type="base64" file="point_of_sale/static/img/poivron_verts-image.jpg"/>
           <field name="list_price">2.70</field>
           <field name="name">Yellow Peppers</field>
           <field name="to_weight">True</field>
-          <field name="public_categ_id" ref="autres_legumes_frais"/>
+          <field name="pos_categ_id" ref="autres_legumes_frais"/>
           <field name="uom_id" ref="product.product_uom_kgm" />
           <field name="uom_po_id" ref="product.product_uom_kgm" />
           <field name="image" type="base64" file="point_of_sale/static/img/poivron_jaunes-image.jpg"/>
           <field name="list_price">2.29</field>
           <field name="name">Leeks</field>
           <field name="to_weight">True</field>
-          <field name="public_categ_id" ref="autres_legumes_frais"/>
+          <field name="pos_categ_id" ref="autres_legumes_frais"/>
           <field name="uom_id" ref="product.product_uom_kgm" />
           <field name="uom_po_id" ref="product.product_uom_kgm" />
           <field name="image" type="base64" file="point_of_sale/static/img/poireaux_poireaux-image.jpg"/>
           <field name="list_price">1.20</field>
           <field name="name">Zucchini</field>
           <field name="to_weight">True</field>
-          <field name="public_categ_id" ref="autres_legumes_frais"/>
+          <field name="pos_categ_id" ref="autres_legumes_frais"/>
           <field name="uom_id" ref="product.product_uom_kgm" />
           <field name="uom_po_id" ref="product.product_uom_kgm" />
           <field name="image" type="base64" file="point_of_sale/static/img/courgette-image.jpg"/>
           <field name="list_price">1.49</field>
           <field name="name">Coca-Cola Regular 1L</field>
           <field name="ean13">5449000054227</field>
-          <field name="public_categ_id" ref="coke"/>
+          <field name="pos_categ_id" ref="coke"/>
           <field name="image" type="base64" file="point_of_sale/static/img/coca_regular_1l-image.jpg"/>
         </record>
         <record id="coca_regular_2l" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">2.38</field>
           <field name="name">Coca-Cola Regular 2L</field>
-          <field name="public_categ_id" ref="coke"/>
+          <field name="pos_categ_id" ref="coke"/>
           <field name="image" type="base64" file="point_of_sale/static/img/coca_regular_2l-image.jpg"/>
         </record>
         <record id="coca_regular_50cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">0.97</field>
           <field name="name">Coca-Cola Regular 50cl</field>
-          <field name="public_categ_id" ref="coke"/>
+          <field name="pos_categ_id" ref="coke"/>
           <field name="image" type="base64" file="point_of_sale/static/img/coca_regular_50cl-image.jpg"/>
         </record>
         <record id="coca_regular_33cl" model="product.product">
           <field name="list_price">0.51</field>
           <field name="name">Coca-Cola Regular 33cl</field>
           <field name="ean13">5449000000996</field>
-          <field name="public_categ_id" ref="coke"/>
+          <field name="pos_categ_id" ref="coke"/>
           <field name="image" type="base64" file="point_of_sale/static/img/coca_regular_33cl-image.jpg"/>
         </record>
 
           <field name="available_in_pos">True</field>
           <field name="list_price">1.49</field>
           <field name="name">Coca-Cola Light 1L</field>
-          <field name="public_categ_id" ref="coke"/>
+          <field name="pos_categ_id" ref="coke"/>
           <field name="image" type="base64" file="point_of_sale/static/img/coca_light_1l-image.jpg"/>
         </record>
         <record id="coca_light_2l" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">2.38</field>
           <field name="name">Coca-Cola Light 2L</field>
-          <field name="public_categ_id" ref="coke"/>
+          <field name="pos_categ_id" ref="coke"/>
           <field name="image" type="base64" file="point_of_sale/static/img/coca_light_2l-image.jpg"/>
         </record>
         <record id="coca_light_50cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">0.97</field>
           <field name="name">Coca-Cola Light 50cl</field>
-          <field name="public_categ_id" ref="coke"/>
+          <field name="pos_categ_id" ref="coke"/>
           <field name="image" type="base64" file="point_of_sale/static/img/coca_light_50cl-image.jpg"/>
         </record>
         <record id="coca_light_33cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">0.51</field>
           <field name="name">Coca-Cola Light 33cl</field>
-          <field name="public_categ_id" ref="coke"/>
+          <field name="pos_categ_id" ref="coke"/>
           <field name="image" type="base64" file="point_of_sale/static/img/coca_light_33cl-image.jpg"/>
         </record>
         <record id="coca_light_decaf_33cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">0.53</field>
           <field name="name">Coca-Cola Light 33cl Decaf</field> 
-          <field name="public_categ_id" ref="coke"/>
+          <field name="pos_categ_id" ref="coke"/>
           <field name="image" type="base64" file="point_of_sale/static/img/coca_light_decaf_33cl-image.jpg"/>
         </record>
 
           <field name="available_in_pos">True</field>
           <field name="list_price">1.49</field>
           <field name="name">Coca-Cola Zero 1L</field>
-          <field name="public_categ_id" ref="coke"/>
+          <field name="pos_categ_id" ref="coke"/>
           <field name="image" type="base64" file="point_of_sale/static/img/coca_zero_1l-image.jpg"/>
         </record>
         <record id="coca_zero_2l" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">2.38</field>
           <field name="name">Coca-Cola Zero 2L</field>
-          <field name="public_categ_id" ref="coke"/>
+          <field name="pos_categ_id" ref="coke"/>
           <field name="image" type="base64" file="point_of_sale/static/img/coca_zero_2l-image.jpg"/>
         </record>
         <record id="coca_zero_50cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">0.97</field>
           <field name="name">Coca-Cola Zero 50cl</field>
-          <field name="public_categ_id" ref="coke"/>
+          <field name="pos_categ_id" ref="coke"/>
           <field name="image" type="base64" file="point_of_sale/static/img/coca_zero_50cl-image.jpg"/>
         </record>
         <record id="coca_zero_33cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">0.51</field>
           <field name="name">Coca-Cola Zero 33cl</field>
-          <field name="public_categ_id" ref="coke"/>
+          <field name="pos_categ_id" ref="coke"/>
           <field name="image" type="base64" file="point_of_sale/static/img/coca_zero_33cl-image.jpg"/>
         </record>
         <record id="coca_zero_decaf_33cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">0.67</field>
           <field name="name">Coca-Cola Zero Decaf 33cl</field>
-          <field name="public_categ_id" ref="coke"/>
+          <field name="pos_categ_id" ref="coke"/>
           <field name="image" type="base64" file="point_of_sale/static/img/coca_zero_decaf_33cl-image.jpg"/>
         </record>
 
           <field name="available_in_pos">True</field>
           <field name="list_price">2.83</field>
           <field name="name">Coca-Cola Light Lemon 2L</field>
-          <field name="public_categ_id" ref="coke"/>
+          <field name="pos_categ_id" ref="coke"/>
           <field name="image" type="base64" file="point_of_sale/static/img/coca_light_lemon_2l-image.jpg"/>
         </record>
         <record id="coca_light_lemon_50cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">1.16</field>
           <field name="name">Coca-Cola Light Lemon 50cl</field>
-          <field name="public_categ_id" ref="coke"/>
+          <field name="pos_categ_id" ref="coke"/>
           <field name="image" type="base64" file="point_of_sale/static/img/coca_light_lemon_50cl-image.jpg"/>
         </record>
         <record id="coca_light_lemon_33cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">0.53</field>
           <field name="name">Coca-Cola Light Lemon 33cl</field>
-          <field name="public_categ_id" ref="coke"/>
+          <field name="pos_categ_id" ref="coke"/>
           <field name="image" type="base64" file="point_of_sale/static/img/coca_light_lemon_33cl-image.jpg"/>
         </record>
 
           <field name="available_in_pos">True</field>
           <field name="list_price">1.70</field>
           <field name="name">Pepsi 2L</field>
-          <field name="public_categ_id" ref="coke"/>
+          <field name="pos_categ_id" ref="coke"/>
           <field name="image" type="base64" file="point_of_sale/static/img/pepsi_2l-image.jpg"/>
         </record>
         <record id="pepsi_33cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">0.43</field>
           <field name="name">Pepsi 33cl</field>
-          <field name="public_categ_id" ref="coke"/>
+          <field name="pos_categ_id" ref="coke"/>
           <field name="image" type="base64" file="point_of_sale/static/img/pepsi_33cl-image.jpg"/>
         </record>
         <record id="pepsi_max_2l" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">1.71</field>
           <field name="name">Pepsi Max 2L</field>
-          <field name="public_categ_id" ref="coke"/>
+          <field name="pos_categ_id" ref="coke"/>
           <field name="image" type="base64" file="point_of_sale/static/img/pepsi_max_2l-image.jpg"/>
         </record>
         <record id="pepsi_max_33cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">0.40</field>
           <field name="name">Pepsi Max 33cl</field>
-          <field name="public_categ_id" ref="coke"/>
+          <field name="pos_categ_id" ref="coke"/>
           <field name="image" type="base64" file="point_of_sale/static/img/pepsi_max_33cl-image.jpg"/>
         </record>
         <record id="pepsi_max_50cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">0.61</field>
           <field name="name">Pepsi Max 50cl</field>
-          <field name="public_categ_id" ref="coke"/>
+          <field name="pos_categ_id" ref="coke"/>
           <field name="image" type="base64" file="point_of_sale/static/img/pepsi_max_50cl-image.jpg"/>
         </record>
         <record id="pepsi_max_lemon_33cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">0.40</field>
           <field name="name">Pepsi Max Cool Lemon 33cl</field>
-          <field name="public_categ_id" ref="coke"/>
+          <field name="pos_categ_id" ref="coke"/>
           <field name="image" type="base64" file="point_of_sale/static/img/pepsi_max_lemon_33cl-image.jpg"/>
         </record>
 
           <field name="available_in_pos">True</field>
           <field name="list_price">0.75</field>
           <field name="name">Spa Fruit and Orange 50cl</field>
-          <field name="public_categ_id" ref="soda_orange"/>
+          <field name="pos_categ_id" ref="soda_orange"/>
           <field name="image" type="base64" file="point_of_sale/static/img/spa_et_fruit_50cl-image.jpg"/>
         </record>
         <record id="orangina_33cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">0.72</field>
           <field name="name">Orangina 33cl</field>
-          <field name="public_categ_id" ref="soda_orange"/>
+          <field name="pos_categ_id" ref="soda_orange"/>
           <field name="image" type="base64" file="point_of_sale/static/img/orangina_33cl-image.jpg"/>
         </record>
         <record id="orangina_1,5l" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">2.42</field>
           <field name="name">Orangina 1.5L</field>
-          <field name="public_categ_id" ref="soda_orange"/>
+          <field name="pos_categ_id" ref="soda_orange"/>
           <field name="image" type="base64" file="point_of_sale/static/img/orangina_1,5l-image.jpg"/>
         </record>
         <record id="fanta_orange_50cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">0.98</field>
           <field name="name">Fanta Orange 50cl</field>
-          <field name="public_categ_id" ref="soda_orange"/>
+          <field name="pos_categ_id" ref="soda_orange"/>
           <field name="image" type="base64" file="point_of_sale/static/img/fanta_orange_50cl-image.jpg"/>
         </record>
         <record id="fanta_orange_2l" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">2.28</field>
           <field name="name">Fanta Orange 2L</field>
-          <field name="public_categ_id" ref="soda_orange"/>
+          <field name="pos_categ_id" ref="soda_orange"/>
           <field name="image" type="base64" file="point_of_sale/static/img/fanta_orange_2l-image.jpg"/>
         </record>
         <record id="fanta_orange_33cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">0.51</field>
           <field name="name">Fanta Orange 33cl</field>
-          <field name="public_categ_id" ref="soda_orange"/>
+          <field name="pos_categ_id" ref="soda_orange"/>
           <field name="image" type="base64" file="point_of_sale/static/img/fanta_orange_33cl-image.jpg"/>
         </record>
         <record id="fanta_orange_25cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">0.84</field>
           <field name="name">Fanta Orange 25cl</field>
-          <field name="public_categ_id" ref="soda_orange"/>
+          <field name="pos_categ_id" ref="soda_orange"/>
           <field name="image" type="base64" file="point_of_sale/static/img/fanta_orange_25cl-image.jpg"/>
         </record>
         <record id="fanta_zero_orange_1,5l" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">2.08</field>
           <field name="name">Fanta Orange Zero 1.5L</field>
-          <field name="public_categ_id" ref="soda_orange"/>
+          <field name="pos_categ_id" ref="soda_orange"/>
           <field name="image" type="base64" file="point_of_sale/static/img/fanta_zero_orange_1,5l-image.jpg"/>
         </record>
         <record id="fanta_zero_orange_33cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">0.53</field>
           <field name="name">Fanta Zero Orange 33cl</field>
-          <field name="public_categ_id" ref="soda_orange"/>
+          <field name="pos_categ_id" ref="soda_orange"/>
           <field name="image" type="base64" file="point_of_sale/static/img/fanta_zero_orange_33cl-image.jpg"/>
         </record>
 
           <field name="available_in_pos">True</field>
           <field name="list_price">0.52</field>
           <field name="name">Evian 50cl</field>
-          <field name="public_categ_id" ref="plain_water"/>
+          <field name="pos_categ_id" ref="plain_water"/>
           <field name="image" type="base64" file="point_of_sale/static/img/evian_50cl-image.jpg"/>
         </record>
         <record id="evian_1l" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">0.70</field>
           <field name="name">Evian 1L</field>
-          <field name="public_categ_id" ref="plain_water"/>
+          <field name="pos_categ_id" ref="plain_water"/>
           <field name="image" type="base64" file="point_of_sale/static/img/evian_1l-image.jpg"/>
         </record>
         <record id="evian_2l" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">1.26</field>
           <field name="name">2L Evian</field>
-          <field name="public_categ_id" ref="plain_water"/>
+          <field name="pos_categ_id" ref="plain_water"/>
           <field name="image" type="base64" file="point_of_sale/static/img/evian_2l-image.jpg"/>
         </record>
         <record id="spa_33cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">0.40</field>
           <field name="name">Spa Reine 33cl</field>
-          <field name="public_categ_id" ref="plain_water"/>
+          <field name="pos_categ_id" ref="plain_water"/>
           <field name="image" type="base64" file="point_of_sale/static/img/spa_33cl-image.jpg"/>
         </record>
         <record id="spa_50cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">0.46</field>
           <field name="name">Spa Reine 50cl</field>
-          <field name="public_categ_id" ref="plain_water"/>
+          <field name="pos_categ_id" ref="plain_water"/>
           <field name="image" type="base64" file="point_of_sale/static/img/spa_50cl-image.jpg"/>
         </record>
         <record id="spa_1l" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">0.65</field>
           <field name="name">Spa Reine 1L</field>
-          <field name="public_categ_id" ref="plain_water"/>
+          <field name="pos_categ_id" ref="plain_water"/>
           <field name="image" type="base64" file="point_of_sale/static/img/spa_1l-image.jpg"/>
         </record>
         <record id="spa_2l" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">1.30</field>
           <field name="name">Spa Reine 2L</field>
-          <field name="public_categ_id" ref="plain_water"/>
+          <field name="pos_categ_id" ref="plain_water"/>
           <field name="image" type="base64" file="point_of_sale/static/img/spa_2l-image.jpg"/>
         </record>
         <record id="chaudfontaine_33cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">0.34</field>
           <field name="name">Chaudfontaine 33cl</field>
-          <field name="public_categ_id" ref="plain_water"/>
+          <field name="pos_categ_id" ref="plain_water"/>
           <field name="image" type="base64" file="point_of_sale/static/img/chaudfontaine_33cl-image.jpg"/>
         </record>
         <record id="chaudfontaine_50cl" model="product.product">
           <field name="list_price">0.44</field>
           <field name="ean13">5449000111715</field>
           <field name="name">Chaudfontaine 50cl</field>
-          <field name="public_categ_id" ref="plain_water"/>
+          <field name="pos_categ_id" ref="plain_water"/>
           <field name="image" type="base64" file="point_of_sale/static/img/chaudfontaine_50cl-image.jpg"/>
         </record>
         <record id="chaudfontaine_1,5l" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">0.86</field>
           <field name="name">Chaudfontaine 1.5l</field>
-          <field name="public_categ_id" ref="plain_water"/>
+          <field name="pos_categ_id" ref="plain_water"/>
           <field name="image" type="base64" file="point_of_sale/static/img/chaudfontaine_1,5l-image.jpg"/>
         </record>
 
           <field name="available_in_pos">True</field>
           <field name="list_price">0.38</field>
           <field name="name">Spa Barisart 33cl</field>
-          <field name="public_categ_id" ref="sparkling_water"/>
+          <field name="pos_categ_id" ref="sparkling_water"/>
           <field name="image" type="base64" file="point_of_sale/static/img/spa_gazeuse_33cl-image.jpg"/>
         </record>
         <record id="spa_gazeuse_50cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">0.49</field>
           <field name="name">Spa Barisart 50cl</field>
-          <field name="public_categ_id" ref="sparkling_water"/>
+          <field name="pos_categ_id" ref="sparkling_water"/>
           <field name="image" type="base64" file="point_of_sale/static/img/spa_gazeuse_50cl-image.jpg"/>
         </record>
         <record id="spa_gazeuse_1,5l" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">1.00</field>
           <field name="name">Spa Barisart 1.5l</field>
-          <field name="public_categ_id" ref="sparkling_water"/>
+          <field name="pos_categ_id" ref="sparkling_water"/>
           <field name="image" type="base64" file="point_of_sale/static/img/spa_gazeuse_1,5l-image.jpg"/>
         </record>
         <record id="chaudfontaine_petillante_33cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">0.41</field>
           <field name="name">Chaudfontaine Petillante 33cl</field>
-          <field name="public_categ_id" ref="sparkling_water"/>
+          <field name="pos_categ_id" ref="sparkling_water"/>
           <field name="image" type="base64" file="point_of_sale/static/img/chaudfontaine_petillante_33cl-image.jpg"/>
         </record>
         <record id="chaudfontaine_petillante_50cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">0.57</field>
           <field name="name">Chaudfontaine Petillante 50cl</field>
-          <field name="public_categ_id" ref="sparkling_water"/>
+          <field name="pos_categ_id" ref="sparkling_water"/>
           <field name="image" type="base64" file="point_of_sale/static/img/chaudfontaine_petillante_50cl-image.jpg"/>
         </record>
         <record id="chaudfontaine_petillante_1,5l" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">0.98</field>
           <field name="name">Chaudfontaine Petillante 1.5l</field>
-          <field name="public_categ_id" ref="sparkling_water"/>
+          <field name="pos_categ_id" ref="sparkling_water"/>
           <field name="image" type="base64" file="point_of_sale/static/img/chaudfontaine_petillante_1,5l-image.jpg"/>
         </record>
         <record id="perrier_50cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">0.71</field>
           <field name="name">50cl Perrier</field>
-          <field name="public_categ_id" ref="sparkling_water"/>
+          <field name="pos_categ_id" ref="sparkling_water"/>
           <field name="image" type="base64" file="point_of_sale/static/img/perrier_50cl-image.jpg"/>
         </record>
         <record id="perrier_1l" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">0.96</field>
           <field name="name">Perrier 1L</field>
-          <field name="public_categ_id" ref="sparkling_water"/>
+          <field name="pos_categ_id" ref="sparkling_water"/>
           <field name="image" type="base64" file="point_of_sale/static/img/perrier_1l-image.jpg"/>
         </record>
         <record id="san_pellegrino_1l" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">0.98</field>
           <field name="name">San Pellegrino 1L</field>
-          <field name="public_categ_id" ref="sparkling_water"/>
+          <field name="pos_categ_id" ref="sparkling_water"/>
           <field name="image" type="base64" file="point_of_sale/static/img/san_pellegrino_1l-image.jpg"/>
         </record>
 
           <field name="available_in_pos">True</field>
           <field name="list_price">1.19</field>
           <field name="name">Stella Artois 50cl</field>
-          <field name="public_categ_id" ref="pils"/>
+          <field name="pos_categ_id" ref="pils"/>
           <field name="image" type="base64" file="point_of_sale/static/img/stella_50cl-image.jpg"/>
         </record>
         <record id="stella_33cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">0.82</field>
           <field name="name">Stella Artois 33cl</field>
-          <field name="public_categ_id" ref="pils"/>
+          <field name="pos_categ_id" ref="pils"/>
           <field name="image" type="base64" file="point_of_sale/static/img/stella_33cl-image.jpg"/>
         </record>
         <record id="maes_50cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">0.95</field>
           <field name="name">Maes 50cl</field>
-          <field name="public_categ_id" ref="pils"/>
+          <field name="pos_categ_id" ref="pils"/>
           <field name="image" type="base64" file="point_of_sale/static/img/maes_50cl-image.jpg"/>
         </record>
         <record id="maes_33cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">0.77</field>
           <field name="name">Maes 33cl</field>
-          <field name="public_categ_id" ref="pils"/>
+          <field name="pos_categ_id" ref="pils"/>
           <field name="image" type="base64" file="point_of_sale/static/img/maes_33cl-image.jpg"/>
         </record>
         <record id="jupiler_50cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">0.97</field>
           <field name="name">Jupiler 50cl</field>
-          <field name="public_categ_id" ref="pils"/>
+          <field name="pos_categ_id" ref="pils"/>
           <field name="image" type="base64" file="point_of_sale/static/img/jupiler_50cl-image.jpg"/>
         </record>
         <record id="jupiler_33cl" model="product.product">
           <field name="list_price">0.77</field>
           <field name="ean13">5410228142027</field>
           <field name="name">Jupiler 33cl</field>
-          <field name="public_categ_id" ref="pils"/>
+          <field name="pos_categ_id" ref="pils"/>
           <field name="image" type="base64" file="point_of_sale/static/img/jupiler_33cl-image.jpg"/>
         </record>
 
           <field name="available_in_pos">True</field>
           <field name="list_price">2.53</field>
           <field name="name">Boon Framboise 37.5cl</field>
-          <field name="public_categ_id" ref="fruity_beers"/>
+          <field name="pos_categ_id" ref="fruity_beers"/>
           <field name="image" type="base64" file="point_of_sale/static/img/boon_framboise_37,5cl-image.jpg"/>
         </record>
         <record id="timmermans_geuze_37,5cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">1.54</field>
           <field name="name">Timmermans Geuze 37.5cl</field>
-          <field name="public_categ_id" ref="fruity_beers"/>
+          <field name="pos_categ_id" ref="fruity_beers"/>
           <field name="image" type="base64" file="point_of_sale/static/img/timmermans_geuze_37,5cl-image.jpg"/>
         </record>
         <record id="timmermans_kriek_37,5cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">1.7</field>
           <field name="name">Timmermans Kriek 37.5cl</field>
-          <field name="public_categ_id" ref="fruity_beers"/>
+          <field name="pos_categ_id" ref="fruity_beers"/>
           <field name="image" type="base64" file="point_of_sale/static/img/timmermans_kriek_37,5cl-image.jpg"/>
         </record>
         <record id="timmermans_faro_37,5cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">1.56</field>
           <field name="name">Timmermans Faro 37.5cl</field>
-          <field name="public_categ_id" ref="fruity_beers"/>
+          <field name="pos_categ_id" ref="fruity_beers"/>
           <field name="image" type="base64" file="point_of_sale/static/img/timmermans_faro_37,5cl-image.jpg"/>
         </record>
         <record id="lindemans_pecheresse_37,,5cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">1.94</field>
           <field name="name">Lindemans sinful 37.5cl</field>
-          <field name="public_categ_id" ref="fruity_beers"/>
+          <field name="pos_categ_id" ref="fruity_beers"/>
           <field name="image" type="base64" file="point_of_sale/static/img/lindemans_pecheresse_37,,5cl-image.jpg"/>
         </record>
         <record id="lindemans_kriek_37,5cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">1.51</field>
           <field name="name">Lindemans Kriek 37.5cl</field>
-          <field name="public_categ_id" ref="fruity_beers"/>
+          <field name="pos_categ_id" ref="fruity_beers"/>
           <field name="image" type="base64" file="point_of_sale/static/img/lindemans_kriek_37,5cl-image.jpg"/>
         </record>
         <record id="grisette_cerise_25cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">1.04</field>
           <field name="name">Grisette Cherry 25cl</field>
-          <field name="public_categ_id" ref="fruity_beers"/>
+          <field name="pos_categ_id" ref="fruity_beers"/>
           <field name="image" type="base64" file="point_of_sale/static/img/grisette_cerise_25cl-image.jpg"/>
         </record>
         <record id="belle_vue_kriek_25cl" model="product.product">
           <field name="list_price">0.83</field>
           <field name="name">Belle-Vue Kriek 25cl</field>
           <field name='ean13'>5410228193449</field>
-          <field name="public_categ_id" ref="fruity_beers"/>
+          <field name="pos_categ_id" ref="fruity_beers"/>
           <field name="image" type="base64" file="point_of_sale/static/img/belle_vue_kriek_25cl-image.jpg"/>
         </record>
 
           <field name="list_price">1.00</field>
           <field name="name">Leffe Brune 33cl</field>
           <field name='ean13'>5410228142164</field>
-          <field name="public_categ_id" ref="special_beers"/>
+          <field name="pos_categ_id" ref="special_beers"/>
           <field name="image" type="base64" file="point_of_sale/static/img/leffe_brune_33cl-image.jpg"/>
         </record>
         <record id="leffe_blonde_33cl" model="product.product">
           <field name="list_price">1.00</field>
           <field name="name">Leffe Blonde 33cl</field>
           <field name='ean13'>5410228142218</field>
-          <field name="public_categ_id" ref="special_beers"/>
+          <field name="pos_categ_id" ref="special_beers"/>
           <field name="image" type="base64" file="point_of_sale/static/img/leffe_blonde_33cl-image.jpg"/>
         </record>
         <record id="leffe_9_33cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">1.16</field>
           <field name="name">Leffe Brune "9" 33cl</field>
-          <field name="public_categ_id" ref="special_beers"/>
+          <field name="pos_categ_id" ref="special_beers"/>
           <field name="image" type="base64" file="point_of_sale/static/img/leffe_9_33cl-image.jpg"/>
         </record>
         <record id="orval_33cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">1.59</field>
           <field name="name">Orval 33cl</field>
-          <field name="public_categ_id" ref="special_beers"/>
+          <field name="pos_categ_id" ref="special_beers"/>
           <field name="image" type="base64" file="point_of_sale/static/img/orval_33cl-image.jpg"/>
         </record>
         <record id="rochefort_8_33cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">1.75</field>
           <field name="name">Rochefort "8" 33cl</field>
-          <field name="public_categ_id" ref="special_beers"/>
+          <field name="pos_categ_id" ref="special_beers"/>
           <field name="image" type="base64" file="point_of_sale/static/img/rochefort_8_33cl-image.jpg"/>
         </record>
         <record id="chimay_bleu_33cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">1.46</field>
           <field name="name">Chimay Bleu 33cl</field>
-          <field name="public_categ_id" ref="special_beers"/>
+          <field name="pos_categ_id" ref="special_beers"/>
           <field name="image" type="base64" file="point_of_sale/static/img/chimay_bleu_33cl-image.jpg"/>
         </record>
         <record id="chimay_bleu_75cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">3.57</field>
           <field name="name">Chimay Bleu 75cl</field>
-          <field name="public_categ_id" ref="special_beers"/>
+          <field name="pos_categ_id" ref="special_beers"/>
           <field name="image" type="base64" file="point_of_sale/static/img/chimay_bleu_75cl-image.jpg"/>
         </record>
         <record id="chimay_rouge_33cl" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">1.02</field>
           <field name="name">Chimay Red 33cl</field>
-          <field name="public_categ_id" ref="special_beers"/>
+          <field name="pos_categ_id" ref="special_beers"/>
           <field name="image" type="base64" file="point_of_sale/static/img/chimay_rouge_33cl-image.jpg"/>
         </record>
 
           <field name="available_in_pos">True</field>
           <field name="list_price">2.86</field>
           <field name="name">Dr. Oetker Ristorante Mozzarella</field>
-          <field name="public_categ_id" ref="pizza"/>
+          <field name="pos_categ_id" ref="pizza"/>
           <field name="image" type="base64" file="point_of_sale/static/img/oetker_mozzarella-image.jpg"/>
         </record>
         <record id="oetker_bolognese" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">2.86</field>
           <field name="name">Dr. Oetker Ristorante Bolognese</field>
-          <field name="public_categ_id" ref="pizza"/>
+          <field name="pos_categ_id" ref="pizza"/>
           <field name="image" type="base64" file="point_of_sale/static/img/oetker_bolognese-image.jpg"/>
         </record>
         <record id="oetker_funghi" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">2.86</field>
           <field name="name">Dr. Oetker Ristorante Funghi</field>
-          <field name="public_categ_id" ref="pizza"/>
+          <field name="pos_categ_id" ref="pizza"/>
           <field name="image" type="base64" file="point_of_sale/static/img/oetker_funghi-image.jpg"/>
         </record>
         <record id="oetker_hawaii" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">2.86</field>
           <field name="name">Dr. Oetker Ristorante Hawaii</field>
-          <field name="public_categ_id" ref="pizza"/>
+          <field name="pos_categ_id" ref="pizza"/>
           <field name="image" type="base64" file="point_of_sale/static/img/oetker_hawaii-image.jpg"/>
         </record>
         <record id="oetker_pollo" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">2.86</field>
           <field name="name">Dr. Oetker Ristorante Pollo</field>
-          <field name="public_categ_id" ref="pizza"/>
+          <field name="pos_categ_id" ref="pizza"/>
           <field name="image" type="base64" file="point_of_sale/static/img/oetker_pollo-image.jpg"/>
         </record>
         <record id="oetker_prosciutto" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">2.86</field>
           <field name="name">Dr. Oetker Ristorante Prosciutto</field>
-          <field name="public_categ_id" ref="pizza"/>
+          <field name="pos_categ_id" ref="pizza"/>
           <field name="image" type="base64" file="point_of_sale/static/img/oetker_prosciutto-image.jpg"/>
         </record>
         <record id="oetker_4formaggi" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">2.86</field>
           <field name="name">Dr. Oetker Ristorante Quattro Formaggi</field>
-          <field name="public_categ_id" ref="pizza"/>
+          <field name="pos_categ_id" ref="pizza"/>
           <field name="image" type="base64" file="point_of_sale/static/img/oetker_4formaggi-image.jpg"/>
         </record>
         <record id="oetker_speciale" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">2.86</field>
           <field name="name">Dr. Oetker Ristorante Speciale</field>
-          <field name="public_categ_id" ref="pizza"/>
+          <field name="pos_categ_id" ref="pizza"/>
           <field name="image" type="base64" file="point_of_sale/static/img/oetker_speciale-image.jpg"/>
         </record>
         <record id="oetker_spinaci" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">2.86</field>
           <field name="name">Dr. Oetker Ristorante Spinaci</field>
-          <field name="public_categ_id" ref="pizza"/>
+          <field name="pos_categ_id" ref="pizza"/>
           <field name="image" type="base64" file="point_of_sale/static/img/oetker_spinaci-image.jpg"/>
         </record>
         <record id="oetker_tonno" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">2.86</field>
           <field name="name">Dr. Oetker Ristorante Tonno</field>
-          <field name="public_categ_id" ref="pizza"/>
+          <field name="pos_categ_id" ref="pizza"/>
           <field name="image" type="base64" file="point_of_sale/static/img/oetker_tonno-image.jpg"/>
         </record>
         <record id="oetker_vegetale" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">2.86</field>
           <field name="name">Dr. Oetker Ristorante Vegetable</field>
-          <field name="public_categ_id" ref="pizza"/>
+          <field name="pos_categ_id" ref="pizza"/>
           <field name="image" type="base64" file="point_of_sale/static/img/oetker_vegetale-image.jpg"/>
         </record>
         <record id="oetker_margherita" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">2.67</field>
           <field name="name">Dr. Oetker La Margherita</field>
-          <field name="public_categ_id" ref="pizza"/>
+          <field name="pos_categ_id" ref="pizza"/>
           <field name="image" type="base64" file="point_of_sale/static/img/oetker_margherita-image.jpg"/>
         </record>
 
           <field name="available_in_pos">True</field>
           <field name="list_price">0.33</field>
           <field name="name">Croky Paprika 45g</field>
-          <field name="public_categ_id" ref="chips"/>
+          <field name="pos_categ_id" ref="chips"/>
           <field name="image" type="base64" file="point_of_sale/static/img/croky_paprika_45g-image.jpg"/>
         </record>
         <record id="croky_naturel_45g" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">0.39</field>
           <field name="name">Croky Natural 45g</field>
-          <field name="public_categ_id" ref="chips"/>
+          <field name="pos_categ_id" ref="chips"/>
           <field name="image" type="base64" file="point_of_sale/static/img/croky_naturel_45g-image.jpg"/>
         </record>
         <record id="croky_bolognaise_250g" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">1.78</field>
           <field name="name">Croky Bolognese 250g</field>
-          <field name="public_categ_id" ref="chips"/>
+          <field name="pos_categ_id" ref="chips"/>
           <field name="image" type="base64" file="point_of_sale/static/img/croky_bolognaise_250g-image.jpg"/>
         </record>
         <record id="lays_pickles_250g" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">1.48</field>
           <field name="name">250g Lays Pickels</field>
-          <field name="public_categ_id" ref="chips"/>
+          <field name="pos_categ_id" ref="chips"/>
           <field name="image" type="base64" file="point_of_sale/static/img/lays_pickles_250g-image.jpg"/>
         </record>
         <record id="lays_ketchup_250g" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">1.48</field>
           <field name="name">Lays Ketchup 250g</field>
-          <field name="public_categ_id" ref="chips"/>
+          <field name="pos_categ_id" ref="chips"/>
           <field name="image" type="base64" file="point_of_sale/static/img/lays_ketchup_250g-image.jpg"/>
         </record>
         <record id="lays_poivre_sel_oven_150g" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">1.58</field>
           <field name="name">Lays Salt and Pepper Oven Baked 150g</field>
-          <field name="public_categ_id" ref="chips"/>
+          <field name="pos_categ_id" ref="chips"/>
           <field name="image" type="base64" file="point_of_sale/static/img/lays_poivre_sel_oven_150g-image.jpg"/>
         </record>
 
           <field name="available_in_pos">True</field>
           <field name="list_price">1.54</field>
           <field name="name">Oven Baked Lays Paprika 150g</field>
-          <field name="public_categ_id" ref="chips"/>
+          <field name="pos_categ_id" ref="chips"/>
           <field name="image" type="base64" file="point_of_sale/static/img/lays_paprika_oven_150g-image.jpg"/>
         </record>
         <record id="lays_paprika_300g" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">1.55</field>
           <field name="name">Lays Paprika XXL 300g</field>
-          <field name="public_categ_id" ref="chips"/>
+          <field name="pos_categ_id" ref="chips"/>
           <field name="image" type="base64" file="point_of_sale/static/img/lays_paprika_300g-image.jpg"/>
         </record>
         <record id="lays_paprika_170g" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">1.48</field>
           <field name="name">Lays Light Paprika 170g</field>
-          <field name="public_categ_id" ref="chips"/>
+          <field name="pos_categ_id" ref="chips"/>
           <field name="image" type="base64" file="point_of_sale/static/img/lays_paprika_170g-image.jpg"/>
         </record>
         <record id="lays_light_paprika_170g" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">1.48</field>
           <field name="name">Lays Light Paprika 170g</field>
-          <field name="public_categ_id" ref="chips"/>
+          <field name="pos_categ_id" ref="chips"/>
           <field name="image" type="base64" file="point_of_sale/static/img/lays_light_paprika_170g-image.jpg"/>
         </record>
         <record id="lays_paprika_45g" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">0.39</field>
           <field name="name">Lays Paprika 45g</field>
-          <field name="public_categ_id" ref="chips"/>
+          <field name="pos_categ_id" ref="chips"/>
           <field name="image" type="base64" file="point_of_sale/static/img/lays_paprika_45g-image.jpg"/>
         </record>
 
           <field name="available_in_pos">True</field>
           <field name="list_price">1.54</field>
           <field name="name">Oven Baked Lays Natural 150g</field>
-          <field name="public_categ_id" ref="chips"/>
+          <field name="pos_categ_id" ref="chips"/>
           <field name="image" type="base64" file="point_of_sale/static/img/lays_naturel_oven_150g-image.jpg"/>
         </record>
         <record id="lays_naturel_300g" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">1.55</field>
           <field name="name">Lays Natural XXL 300g</field>
-          <field name="public_categ_id" ref="chips"/>
+          <field name="pos_categ_id" ref="chips"/>
           <field name="image" type="base64" file="point_of_sale/static/img/lays_naturel_300g-image.jpg"/>
         </record>
         <record id="lays_naturel_170g" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">1.48</field>
           <field name="name">Lays Natural Light 170g</field>
-          <field name="public_categ_id" ref="chips"/>
+          <field name="pos_categ_id" ref="chips"/>
           <field name="image" type="base64" file="point_of_sale/static/img/lays_naturel_170g-image.jpg"/>
         </record>
         <record id="lays_light_naturel_170g" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">1.48</field>
           <field name="name">Lays Natural Light 170g</field>
-          <field name="public_categ_id" ref="chips"/>
+          <field name="pos_categ_id" ref="chips"/>
           <field name="image" type="base64" file="point_of_sale/static/img/lays_light_naturel_170g-image.jpg"/>
         </record>
         <record id="lays_naturel_45g" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">0.39</field>
           <field name="name">Lays Natural 45g</field>
-          <field name="public_categ_id" ref="chips"/>
+          <field name="pos_categ_id" ref="chips"/>
           <field name="image" type="base64" file="point_of_sale/static/img/lays_naturel_45g-image.jpg"/>
         </record>
 
           <field name="available_in_pos">True</field>
           <field name="list_price">7.60</field>
           <field name="name">IJsboerke Chocolat 2.5L</field>
-          <field name="public_categ_id" ref="ice_cream"/>
+          <field name="pos_categ_id" ref="ice_cream"/>
           <field name="image" type="base64" file="point_of_sale/static/img/ijsboerke_chocolat_2,5l-image.jpg"/>
         </record>
         <record id="ijsboerke_moka_2,5l" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">7.60</field>
           <field name="name">IJsboerke Mocha 2.5L</field>
-          <field name="public_categ_id" ref="ice_cream"/>
+          <field name="pos_categ_id" ref="ice_cream"/>
           <field name="image" type="base64" file="point_of_sale/static/img/ijsboerke_moka_2,5l-image.jpg"/>
         </record>
         <record id="ijsboerke_vanille_2,5l" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">7.40</field>
           <field name="name">IJsboerke Vanilla 2.5L</field>
-          <field name="public_categ_id" ref="ice_cream"/>
+          <field name="pos_categ_id" ref="ice_cream"/>
           <field name="image" type="base64" file="point_of_sale/static/img/ijsboerke_vanille_2,5l-image.jpg"/>
         </record>
         <record id="ijsboerke_stracciatella_2,5l" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">8.40</field>
           <field name="name">IJsboerke Stracciatella 2.5L</field>
-          <field name="public_categ_id" ref="ice_cream"/>
+          <field name="pos_categ_id" ref="ice_cream"/>
           <field name="image" type="base64" file="point_of_sale/static/img/ijsboerke_stracciatella_2,5l-image.jpg"/>
         </record>
         <record id="ijsboerke_dame_blanche_2,5l" model="product.product">
           <field name="available_in_pos">True</field>
           <field name="list_price">7.60</field>
           <field name="name">IJsboerke 2.5L White Lady</field>
-          <field name="public_categ_id" ref="ice_cream"/>
+          <field name="pos_categ_id" ref="ice_cream"/>
           <field name="image" type="base64" file="point_of_sale/static/img/ijsboerke_dame_blanche_2,5l-image.jpg"/>
         </record>
         
index dc8a585..6d19d8b 100644 (file)
 
 
 
-        <record id="product_normal_form_view" model="ir.ui.view">
-            <field name="name">product.normal.form.inherit</field>
-            <field name="model">product.product</field>
-            <field name="inherit_id" ref="stock.view_normal_procurement_locations_form"/>
+        <!-- Product Public Categories -->
+        <record id="product_pos_category_form_view" model="ir.ui.view">
+            <field name="name">pos.category.form</field>
+            <field name="model">pos.category</field>
             <field name="arch" type="xml">
-                <group name="sale" position="inside">
+                <form string="Pos Categories" version="7.0">
+                    <sheet>
+                        <field name="image_medium" widget='image' class="oe_avatar oe_right"/>
+                        <div class="oe_left">
+                            <group>
+                                <field name="name"/>
+                                <field name="parent_id"/>
+                                <field name="sequence"/>
+                            </group>
+                        </div>
+                    </sheet>
+                </form>
+            </field>
+        </record>
+        <record id="product_pos_category_tree_view" model="ir.ui.view">
+            <field name="name">pos.category.tree</field>
+            <field name="model">pos.category</field>
+            <field name="field_parent" eval="False"/>
+            <field name="arch" type="xml">
+                <tree string="Product Product Categories">
+                    <field name="sequence" invisible="1"/>
+                    <field name="complete_name"/>
+                </tree>
+            </field>
+        </record>
+        <record id="product_pos_category_action" model="ir.actions.act_window">
+            <field name="name">Pos Product Categories</field>
+            <field name="type">ir.actions.act_window</field>
+            <field name="res_model">pos.category</field>
+            <field name="view_type">form</field>
+            <field name="view_mode">tree,form</field>
+            <field name="view_id" eval="False"/>
+            <field name="help" type="html">
+              <p class="oe_view_nocontent_create">
+                Click to define a new category.
+              </p><p>
+                Categories are used to browse your products through the
+                touchscreen interface.
+              </p><p>
+                If you put a photo on the category, the layout of the
+                touchscreen interface will automatically. We suggest not to put
+                a photo on categories for small (1024x768) screens.
+              </p>
+            </field>
+        </record>
+        <menuitem action="product_pos_category_action" id="menu_product_pos_category" parent="menu_point_of_sale_product" sequence="0" />
+        <!-- END -->
+
+
+        <record id="product_template_form_view" model="ir.ui.view">
+            <field name="name">product.template.form.inherit</field>
+            <field name="model">product.template</field>
+            <field name="inherit_id" ref="product.product_template_form_view"/>
+            <field name="arch" type="xml">
+                <group name="website_and_pos" position="inside">
                     <group name="pos" string="Point of Sale">
+                        <field name="pos_categ_id"/>
                         <field name="available_in_pos"/>
                         <field name="to_weight" />
                         <field name="income_pdt"/>
                     </group>
                 </group>
                 <field name="ean13" position="after">
-                    <button name="edit_ean" type="object" string="Set a Custom EAN" class="oe_link oe_edit_only"/>
+                    <button colspan="2" name="edit_ean" type="object" string="Set a Custom EAN" class="oe_link oe_edit_only"/>
                 </field>
             </field>
         </record>
-
-        <!-- Categories tree view -->
-        <menuitem action="product.product_public_category_action" id="menu_product_public_category" parent="menu_point_of_sale_product" sequence="0" />
         <!-- END -->
 
         <menuitem name="Configuration" parent="menu_point_root"
index 0ef1231..faa14f1 100644 (file)
@@ -57,5 +57,5 @@ access_product_pricelist_manager,product.pricelist manager,product.model_product
 access_pos_session_user,pos.session user,model_pos_session,group_pos_user,1,1,1,0\r
 access_pos_config_user,pos.config user,model_pos_config,group_pos_user,1,1,1,0\r
 access_ir_sequence_manager,ir.sequence manager,base.model_ir_sequence,group_pos_manager,1,1,1,1\r
-access_product_category_pos_manager,product.public.category manager,product.model_product_public_category,group_pos_manager,1,1,1,1\r
-access_product_category_pos_user,product.public.category user,product.model_product_public_category,group_pos_user,1,0,0,0\r
+access_product_category_pos_manager,pos.category manager,model_pos_category,group_pos_manager,1,1,1,1\r
+access_product_category_pos_user,pos.category user,model_pos_category,group_pos_user,1,0,0,0\r
index 0c7ba8f..b8edc9d 100644 (file)
@@ -145,7 +145,7 @@ function openerp_pos_db(instance, module){
             for(var i = 0, len = products.length; i < len; i++){
                 var product = products[i];
                 var search_string = this._product_search_string(product);
-                var categ_id = product.public_categ_id ? product.public_categ_id[0] : this.root_category_id;
+                var categ_id = product.pos_categ_id ? product.pos_categ_id[0] : this.root_category_id;
                 if (product.variants){
                     product.name = product.name+" ("+product.variants+")";
                 }
index c0c376e..0c3c91f 100644 (file)
@@ -208,13 +208,13 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal
                 }).then(function(packagings){
                     self.db.add_packagings(packagings);
 
-                    return self.fetch('product.public.category', ['id','name','parent_id','child_id','image'])
+                    return self.fetch('pos.category', ['id','name','parent_id','child_id','image'])
                 }).then(function(categories){
                     self.db.add_categories(categories);
 
                     return self.fetch(
                         'product.product', 
-                        ['name', 'list_price','price','public_categ_id', 'taxes_id', 'ean13', 'default_code', 'variants',
+                        ['name', 'list_price','price','pos_categ_id', 'taxes_id', 'ean13', 'default_code', 'variants',
                          'to_weight', 'uom_id', 'uos_id', 'uos_coeff', 'mes_type', 'description_sale', 'description'],
                         [['sale_ok','=',true],['available_in_pos','=',true]],
                         {pricelist: self.pricelist.id} // context for price
index 54aa8d1..95e07a1 100644 (file)
@@ -436,7 +436,7 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa
         },
 
         get_image_url: function(category){
-            return window.location.origin + '/web/binary/image?model=product.public.category&field=image_medium&id='+category.id;
+            return window.location.origin + '/web/binary/image?model=pos.category&field=image_medium&id='+category.id;
         },
 
         render_category: function( category, with_image ){
index aa37c26..beedac5 100644 (file)
@@ -27,6 +27,8 @@ import openerp.addons.decimal_precision as dp
 from openerp.tools.translate import _
 import openerp
 
+PROCUREMENT_PRIORITIES = [('0', 'Not urgent'), ('1', 'Normal'), ('2', 'Urgent'), ('3', 'Very Urgent')]
+
 class procurement_group(osv.osv):
     '''
     The procurement group class is used to group products together
@@ -113,7 +115,7 @@ class procurement_order(osv.osv):
         'company_id': fields.many2one('res.company', 'Company', required=True),
 
         # These two fields are used for shceduling
-        'priority': fields.selection([('0', 'Not urgent'), ('1', 'Normal'), ('2', 'Urgent'), ('3', 'Very Urgent')], 'Priority', required=True, select=True, track_visibility='onchange'),
+        'priority': fields.selection(PROCUREMENT_PRIORITIES, 'Priority', required=True, select=True, track_visibility='onchange'),
         'date_planned': fields.datetime('Scheduled Date', required=True, select=True, track_visibility='onchange'),
 
         'group_id': fields.many2one('procurement.group', 'Procurement Group'),
index 72f1c0e..53b0993 100644 (file)
@@ -188,10 +188,13 @@ class product_pricelist(osv.osv):
 
         products = map(lambda x: x[0], products_by_qty_by_partner)
         currency_obj = self.pool.get('res.currency')
-        product_obj = self.pool.get('product.product')
+        product_obj = self.pool.get('product.template')
         product_uom_obj = self.pool.get('product.uom')
         price_type_obj = self.pool.get('product.price.type')
 
+        if not products:
+            return {}
+
         version = False
         for v in pricelist.version_id:
             if ((v.date_start is False) or (v.date_start <= date)) and ((v.date_end is False) or (v.date_end >= date)):
@@ -207,8 +210,13 @@ class product_pricelist(osv.osv):
                 categ = categ.parent_id
         categ_ids = categ_ids.keys()
 
-        prod_ids = [x.id for x in products]
-        prod_tmpl_ids = [x.product_tmpl_id.id for x in products]
+        is_product_template = products[0]._name == "product.template"
+        if is_product_template:
+            prod_tmpl_ids = [tmpl.id for tmpl in products]
+            prod_ids = [product.id for product in tmpl.product_variant_ids for tmpl in products]
+        else:
+            prod_ids = [product.id for product in products]
+            prod_tmpl_ids = [product.product_tmpl_id.id for product in products]
 
         # Load all rules
         cr.execute(
@@ -234,10 +242,17 @@ class product_pricelist(osv.osv):
             for rule in items:
                 if rule.min_quantity and qty<rule.min_quantity:
                     continue
-                if rule.product_tmpl_id and product.product_tmpl_id.id<>rule.product_tmpl_id.id:
-                    continue
-                if rule.product_id and product.id<>rule.product_id.id:
-                    continue
+                if is_product_template:
+                    if rule.product_tmpl_id and product.id<>rule.product_tmpl_id.id:
+                        continue
+                    if rule.product_id:
+                        continue
+                else:
+                    if rule.product_tmpl_id and product.product_tmpl_id.id<>rule.product_tmpl_id.id:
+                        continue
+                    if rule.product_id and product.id<>rule.product_id.id:
+                        continue
+
                 if rule.categ_id:
                     cat = product.categ_id
                     while cat:
index 2804588..2369db4 100644 (file)
@@ -29,6 +29,7 @@ from openerp import tools
 from openerp.osv import osv, fields
 from openerp.tools.translate import _
 from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT
+import psycopg2
 
 import openerp.addons.decimal_precision as dp
 
@@ -273,7 +274,7 @@ class product_category(osv.osv):
 
 
     _defaults = {
-        'type' : lambda *a : 'normal',
+        'type' : 'normal',
     }
 
     _parent_name = "parent_id"
@@ -316,69 +317,78 @@ class produce_price_history(osv.osv):
     }
 
 
-class product_public_category(osv.osv):
-    _name = "product.public.category"
-    _description = "Public Category"
-    _order = "sequence, name"
-
-    _constraints = [
-        (osv.osv._check_recursion, 'Error ! You cannot create recursive categories.', ['parent_id'])
-    ]
-
-    def name_get(self, cr, uid, ids, context=None):
-        if not len(ids):
-            return []
-        reads = self.read(cr, uid, ids, ['name','parent_id'], context=context)
-        res = []
-        for record in reads:
-            name = record['name']
-            if record['parent_id']:
-                name = record['parent_id'][1]+' / '+name
-            res.append((record['id'], name))
-        return res
+#----------------------------------------------------------
+# Product Attributes
+#----------------------------------------------------------
+class product_attribute(osv.osv):
+    _name = "product.attribute"
+    _description = "Product Attribute"
+    _columns = {
+        'name': fields.char('Name', translate=True, required=True),
+        'value_ids': fields.one2many('product.attribute.value', 'attribute_id', 'Values'),
+    }
 
-    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)
+class product_attribute_value(osv.osv):
+    _name = "product.attribute.value"
+    _order = 'sequence'
+    def _get_price_extra(self, cr, uid, ids, name, args, context=None):
+        result = dict.fromkeys(ids, 0)
+        if not context.get('active_id'):
+            return result
 
-    def _get_image(self, cr, uid, ids, name, args, context=None):
-        result = dict.fromkeys(ids, False)
         for obj in self.browse(cr, uid, ids, context=context):
-            result[obj.id] = tools.image_get_resized_images(obj.image)
+            for price_id in obj.price_ids:
+                if price_id.product_tmpl_id.id == context.get('active_id'):
+                    result[obj.id] = price_id.price_extra
+                    break
         return result
-    
-    def _set_image(self, cr, uid, id, name, value, args, context=None):
-        return self.write(cr, uid, [id], {'image': tools.image_resize_image_big(value)}, context=context)
+
+    def _set_price_extra(self, cr, uid, id, name, value, args, context=None):
+        if 'active_id' not in context:
+            return None
+        p_obj = self.pool['product.attribute.price']
+        p_ids = p_obj.search(cr, uid, [('value_id', '=', id), ('product_tmpl_id', '=', context['active_id'])], context=context)
+        if p_ids:
+            p_obj.write(cr, uid, p_ids, {'price_extra': value}, context=context)
+        else:
+            p_obj.create(cr, uid, p_ids, {
+                    'product_tmpl_id': context['active_id'],
+                    'value_id': id,
+                    'price_extra': value,
+                }, context=context)
 
     _columns = {
-        'name': fields.char('Name', required=True, translate=True),
-        'complete_name': fields.function(_name_get_fnc, type="char", string='Name'),
-        'parent_id': fields.many2one('product.public.category','Parent Category', select=True),
-        'child_id': fields.one2many('product.public.category', 'parent_id', string='Children Categories'),
-        'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of product categories."),
-        
-        # NOTE: there is no 'default image', because by default we don't show thumbnails for categories. However if we have a thumbnail
-        # for at least one category, then we display a default image on the other, so that the buttons have consistent styling.
-        # In this case, the default image is set by the js code.
-        # NOTE2: image: all image fields are base64 encoded and PIL-supported
-        'image': fields.binary("Image",
-            help="This field holds the image used as image for the cateogry, limited to 1024x1024px."),
-        'image_medium': fields.function(_get_image, fnct_inv=_set_image,
-            string="Medium-sized image", type="binary", multi="_get_image",
-            store={
-                'product.public.category': (lambda self, cr, uid, ids, c={}: ids, ['image'], 10),
-            },
-            help="Medium-sized image of the category. It is automatically "\
-                 "resized as a 128x128px image, with aspect ratio preserved. "\
-                 "Use this field in form views or some kanban views."),
-        'image_small': fields.function(_get_image, fnct_inv=_set_image,
-            string="Smal-sized image", type="binary", multi="_get_image",
-            store={
-                'product.public.category': (lambda self, cr, uid, ids, c={}: ids, ['image'], 10),
-            },
-            help="Small-sized image of the category. It is automatically "\
-                 "resized as a 64x64px image, with aspect ratio preserved. "\
-                 "Use this field anywhere a small image is required."),
+        'sequence': fields.integer('Sequence', help="Determine the display order"),
+        'name': fields.char('Value', translate=True, required=True),
+        'attribute_id': fields.many2one('product.attribute', 'Attribute', required=True),
+        'product_ids': fields.many2many('product.product', id1='att_id', id2='prod_id', string='Variants', readonly=True),
+        'price_extra': fields.function(_get_price_extra, type='float', string='Attribute Price Extra',
+            fnct_inv=_set_price_extra,
+            digits_compute=dp.get_precision('Product Price'),
+            help="Price Extra: Extra price for the variant with this attribute value on sale price. eg. 200 price extra, 1000 + 200 = 1200."),
+        'price_ids': fields.one2many('product.attribute.price', 'value_id', string='Attribute Prices', readonly=True),
+    }
+    _sql_constraints = [
+        ('value_company_uniq', 'unique (name,attribute_id)', 'This attribute value already exists !')
+    ]
+    _defaults = {
+        'price_extra': 0.0,
+    }
+
+class product_attribute_price(osv.osv):
+    _name = "product.attribute.price"
+    _columns = {
+        'product_tmpl_id': fields.many2one('product.template', 'Product Template', required=True),
+        'value_id': fields.many2one('product.attribute.value', 'Product Attribute Value', required=True),
+        'price_extra': fields.float('Price Extra', digits_compute=dp.get_precision('Product Price')),
+    }
+
+class product_attribute_line(osv.osv):
+    _name = "product.attribute.line"
+    _columns = {
+        'product_tmpl_id': fields.many2one('product.template', 'Product Template', required=True),
+        'attribute_id': fields.many2one('product.attribute', 'Attribute', required=True),
+        'value_ids': fields.many2many('product.attribute.value', id1='line_id', id2='val_id', string='Product Attribute Value'),
     }
 
 
@@ -399,6 +409,42 @@ class product_template(osv.osv):
     def _set_image(self, cr, uid, id, name, value, args, context=None):
         return self.write(cr, uid, [id], {'image': tools.image_resize_image_big(value)}, context=context)
 
+    def _is_product_variant(self, cr, uid, ids, name, arg, context=None):
+        return self.is_product_variant(cr, uid, ids, name, arg, context=context)
+
+    def is_product_variant(self, cr, uid, ids, name, arg, context=None):
+        prod = self.pool.get('product.product')
+        res = dict.fromkeys(ids, False)
+        ctx = dict(context, active_test=True)
+        for product in self.browse(cr, uid, ids, context=context):
+            res[product.id] = prod.search(cr, uid, [('product_tmpl_id','=',product.id)], context=ctx, count=True) == 1
+        return res
+
+
+    def _product_template_price(self, cr, uid, ids, name, arg, context=None):
+        plobj = self.pool.get('product.pricelist')
+        res = {}
+        quantity = context.get('quantity') or 1.0
+        pricelist = context.get('pricelist', False)
+        partner = context.get('partner', False)
+        if pricelist:
+            # Support context pricelists specified as display_name or ID for compatibility
+            if isinstance(pricelist, basestring):
+                pricelist_ids = plobj.name_search(
+                    cr, uid, pricelist, operator='=', context=context, limit=1)
+                pricelist = pricelist_ids[0][0] if pricelist_ids else pricelist
+
+            if isinstance(pricelist, (int, long)):
+                products = self.browse(cr, uid, ids, context=context)
+                qtys = map(lambda x: (x, quantity, partner), products)
+                pl = plobj.browse(cr, uid, pricelist, context=context)
+                price = plobj._price_get_multi(cr,uid, pl, qtys, context=context)
+                for id in ids:
+                    res[id] = price.get(id, 0.0)
+        for id in ids:
+            res.setdefault(id, 0.0)
+        return res
+
     def get_history_price(self, cr, uid, product_tmpl, company_id, date=None, context=None):
         if context is None:
             context = {}
@@ -421,6 +467,12 @@ class product_template(osv.osv):
             'company_id': company_id,
         }, context=context)
 
+    def _get_product_variant_count(self, cr, uid, ids, name, arg, context=None):
+        res = {}
+        for product in self.browse(cr, uid, ids):
+            res[product.id] = len(product.product_variant_ids)
+        return res
+
     _columns = {
         'name': fields.char('Name', required=True, translate=True, select=True),
         'product_manager': fields.many2one('res.users','Product Manager'),
@@ -434,9 +486,10 @@ class product_template(osv.osv):
                  "This description will be copied to every Sale Order, Delivery Order and Customer Invoice/Refund"),
         'type': fields.selection([('consu', 'Consumable'),('service','Service')], 'Product Type', required=True, help="Consumable are product where you don't manage stock, a service is a non-material product provided by a company or an individual."),        
         'rental': fields.boolean('Can be Rent'),
-        'categ_id': fields.many2one('product.category','Category', required=True, change_default=True, domain="[('type','=','normal')]" ,help="Select category for the current product"),
-        'public_categ_id': fields.many2one('product.public.category','Public Category', help="Those categories are used to group similar products for public sales (eg.: point of sale, e-commerce)."),
+        'categ_id': fields.many2one('product.category','Internal Category', required=True, change_default=True, domain="[('type','=','normal')]" ,help="Select category for the current product"),
+        'price': fields.function(_product_template_price, type='float', string='Price', digits_compute=dp.get_precision('Product Price')),
         'list_price': fields.float('Sale Price', digits_compute=dp.get_precision('Product Price'), help="Base price to compute the customer price. Sometimes called the catalog price."),
+        'lst_price' : fields.related('list_price', type="float", string='Public Price', digits_compute=dp.get_precision('Product Price')),
         'standard_price': fields.property(type = 'float', digits_compute=dp.get_precision('Product Price'), 
                                           help="Cost price of the product template used for standard stock valuation in accounting and used as a base price on purchase orders.", 
                                           groups="base.group_user", string="Cost Price"),
@@ -445,6 +498,7 @@ class product_template(osv.osv):
         'weight_net': fields.float('Net Weight', digits_compute=dp.get_precision('Stock Weight'), help="The net weight in Kg."),
         'warranty': fields.float('Warranty'),
         'sale_ok': fields.boolean('Can be Sold', help="Specify if the product can be selected in a sales order line."),
+        'pricelist_id': fields.dummy(string='Pricelist', relation='product.pricelist', type='many2one'),
         'state': fields.selection([('',''),
             ('draft', 'In Development'),
             ('sellable','Normal'),
@@ -458,13 +512,12 @@ class product_template(osv.osv):
             help='Coefficient to convert default Unit of Measure to Unit of Sale\n'
             ' uos = uom * coeff'),
         'mes_type': fields.selection((('fixed', 'Fixed'), ('variable', 'Variable')), 'Measure Type'),
-        'seller_ids': fields.one2many('product.supplierinfo', 'product_tmpl_id', 'Supplier'),
         'company_id': fields.many2one('res.company', 'Company', select=1),
         # image: all image fields are base64 encoded and PIL-supported
         'image': fields.binary("Image",
             help="This field holds the image used as image for the product, limited to 1024x1024px."),
         'image_medium': fields.function(_get_image, fnct_inv=_set_image,
-            string="Medium-sized image", type="binary", multi="_get_image",
+            string="Medium-sized image", type="binary", multi="_get_image", 
             store={
                 'product.template': (lambda self, cr, uid, ids, c={}: ids, ['image'], 10),
             },
@@ -479,13 +532,64 @@ class product_template(osv.osv):
             help="Small-sized image of the product. It is automatically "\
                  "resized as a 64x64px image, with aspect ratio preserved. "\
                  "Use this field anywhere a small image is required."),
-        'product_variant_ids': fields.one2many('product.product', 'product_tmpl_id', 'Product Variants', required=True),
+
+        'packaging' : fields.one2many('product.packaging', 'product_id', 'Logistical Units',
+            help="Gives the different ways to package the same product. This has no impact on the picking order and is mainly used if you use the EDI module."),
+        
+        'seller_ids': fields.one2many('product.supplierinfo', 'product_tmpl_id', 'Supplier'),
+        'seller_delay': fields.related('seller_ids','delay', type='integer', string='Supplier Lead Time',
+            help="This is the average delay in days between the purchase order confirmation and the reception of goods for this product and for the default supplier. It is used by the scheduler to order requests based on reordering delays."),
+        'seller_qty': fields.related('seller_ids','qty', type='float', string='Supplier Quantity',
+            help="This is minimum quantity to purchase from Main Supplier."),
+        'seller_id': fields.related('seller_ids','name', type='many2one', relation='res.partner', string='Main Supplier',
+            help="Main Supplier who has highest priority in Supplier List."),
+
+        'active': fields.boolean('Active', help="If unchecked, it will allow you to hide the product without removing it."),
+        'color': fields.integer('Color Index'),
+        'is_product_variant': fields.function( _is_product_variant, type='boolean', string='Only one product variant'),
+
+        'attribute_line_ids': fields.one2many('product.attribute.line', 'product_tmpl_id', 'Product Attributes'),
+        'product_variant_ids': fields.one2many('product.product', 'product_tmpl_id', 'Products', required=True),
+        'product_variant_count': fields.function( _get_product_variant_count, type='integer', string='# of Product Variants'),
+
+        # related to display product product information if is_product_variant
+        'ean13': fields.related('product_variant_ids', 'ean13', type='char', string='EAN13 Barcode'),
+        'default_code': fields.related('product_variant_ids', 'default_code', type='char', string='Internal Reference'),
     }
 
+    def _price_get_list_price(self, product):
+        return 0.0
+
+    def _price_get(self, cr, uid, products, ptype='list_price', context=None):
+        if context is None:
+            context = {}
+
+        if 'currency_id' in context:
+            pricetype_obj = self.pool.get('product.price.type')
+            price_type_id = pricetype_obj.search(cr, uid, [('field','=',ptype)])[0]
+            price_type_currency_id = pricetype_obj.browse(cr,uid,price_type_id).currency_id.id
+
+        res = {}
+        product_uom_obj = self.pool.get('product.uom')
+        for product in products:
+            res[product.id] = product[ptype] or 0.0
+            if ptype == 'list_price':
+                res[product.id] += product._name == "product.product" and product.price_extra or 0.0
+            if 'uom' in context:
+                uom = product.uom_id or product.uos_id
+                res[product.id] = product_uom_obj._compute_price(cr, uid,
+                        uom.id, res[product.id], context['uom'])
+            # Convert from price_type currency to asked one
+            if 'currency_id' in context:
+                # Take the price_type currency from the product field
+                # This is right cause a field cannot be in more than one currency
+                res[product.id] = self.pool.get('res.currency').compute(cr, uid, price_type_currency_id,
+                    context['currency_id'], res[product.id],context=context)
+
+        return res
+
     def _get_uom_id(self, cr, uid, *args):
-        cr.execute('select id from product_uom order by id limit 1')
-        res = cr.fetchone()
-        return res and res[0] or False
+        return self.pool["product.uom"].search(cr, uid, [], limit=1, order='id')[0]
 
     def _default_category(self, cr, uid, context=None):
         if context is None:
@@ -505,9 +609,68 @@ class product_template(osv.osv):
             return {'value': {'uom_po_id': uom_id}}
         return {}
 
+    def create_variant_ids(self, cr, uid, ids, context=None):
+        product_obj = self.pool.get("product.product")
+        ctx = context and context.copy() or {}
+
+        if ctx.get("create_product_variant"):
+            return None
+
+        ctx.update(active_test=False, create_product_variant=True)
+
+        tmpl_ids = self.browse(cr, uid, ids, context=ctx)
+        for tmpl_id in tmpl_ids:
+
+            # list of values combination
+            all_variants = [[]]
+            for variant_id in tmpl_id.attribute_line_ids:
+                if len(variant_id.value_ids) > 1:
+                    temp_variants = []
+                    for value_id in variant_id.value_ids:
+                        for variant in all_variants:
+                            temp_variants.append(variant + [int(value_id)])
+                    all_variants = temp_variants
+
+            # check product
+            variant_ids_to_active = []
+            variants_active_ids = []
+            variants_inactive = []
+            for product_id in tmpl_id.product_variant_ids:
+                variants = map(int,product_id.attribute_value_ids)
+                if variants in all_variants:
+                    variants_active_ids.append(product_id.id)
+                    all_variants.pop(all_variants.index(variants))
+                    if not product_id.active:
+                        variant_ids_to_active.append(product_id.id)
+                else:
+                    variants_inactive.append(product_id)
+            if variant_ids_to_active:
+                product_obj.write(cr, uid, variant_ids_to_active, {'active': True}, context=ctx)
+
+            # create new product
+            for variant_ids in all_variants:
+                values = {
+                    'product_tmpl_id': tmpl_id.id,
+                    'attribute_value_ids': [(6, 0, variant_ids)]
+                }
+                id = product_obj.create(cr, uid, values, context=ctx)
+                variants_active_ids.append(id)
+
+            # unlink or inactive product
+            for variant_id in map(int,variants_inactive):
+                try:
+                    with cr.savepoint():
+                        product_obj.unlink(cr, uid, [variant_id], context=ctx)
+                except (psycopg2.Error, osv.except_osv):
+                    product_obj.write(cr, uid, [variant_id], {'active': False}, context=ctx)
+                    pass
+        return True
+
     def create(self, cr, uid, vals, context=None):
         ''' Store the initial standard price in order to be able to retrieve the cost of a product template for a given date'''
         product_template_id = super(product_template, self).create(cr, uid, vals, context=context)
+        if not context or "create_product_product" not in context:
+            self.create_variant_ids(cr, uid, [product_template_id], context=context)
         self._set_standard_price(cr, uid, product_template_id, vals.get('standard_price', 0.0), context=context)
         return product_template_id
 
@@ -524,7 +687,17 @@ class product_template(osv.osv):
         if 'standard_price' in vals:
             for prod_template_id in ids:
                 self._set_standard_price(cr, uid, prod_template_id, vals['standard_price'], context=context)
-        return super(product_template, self).write(cr, uid, ids, vals, context=context)
+        res = super(product_template, self).write(cr, uid, ids, vals, context=context)
+        if 'attribute_line_ids' in vals or vals.get('active'):
+            self.create_variant_ids(cr, uid, ids, context=context)
+        if 'active' in vals and not vals.get('active'):
+            ctx = context and context.copy() or {}
+            ctx.update(active_test=False)
+            product_ids = []
+            for product in self.browse(cr, uid, ids, context=ctx):
+                product_ids = map(int,product.product_variant_ids)
+            self.pool.get("product.product").write(cr, uid, product_ids, {'active': vals.get('active')}, context=ctx)
+        return res
 
     def copy(self, cr, uid, id, default=None, context=None):
         if default is None:
@@ -544,6 +717,7 @@ class product_template(osv.osv):
         'mes_type': 'fixed',
         'categ_id' : _default_category,
         'type' : 'consu',
+        'active': True,
     }
 
     def _check_uom(self, cursor, user, ids, context=None):
@@ -579,14 +753,6 @@ class product_product(osv.osv):
     _inherit = ['mail.thread']
     _order = 'default_code,name_template'
 
-    def view_header_get(self, cr, uid, view_id, view_type, context=None):
-        if context is None:
-            context = {}
-        res = super(product_product, self).view_header_get(cr, uid, view_id, view_type, context)
-        if (context.get('categ_id', False)):
-            return _('Products: ') + self.pool.get('product.category').browse(cr, uid, context['categ_id'], context=context).name
-        return res
-
     def _product_price(self, cr, uid, ids, name, arg, context=None):
         plobj = self.pool.get('product.pricelist')
         res = {}
@@ -613,11 +779,19 @@ class product_product(osv.osv):
             res.setdefault(id, 0.0)
         return res
 
+    def view_header_get(self, cr, uid, view_id, view_type, context=None):
+        if context is None:
+            context = {}
+        res = super(product_product, self).view_header_get(cr, uid, view_id, view_type, context)
+        if (context.get('categ_id', False)):
+            return _('Products: ') + self.pool.get('product.category').browse(cr, uid, context['categ_id'], context=context).name
+        return res
+
     def _product_lst_price(self, cr, uid, ids, name, arg, context=None):
         res = {}
         product_uom_obj = self.pool.get('product.uom')
-        for id in ids:
-            res.setdefault(id, 0.0)
+        res = dict.fromkeys(ids, 0.0)
+
         for product in self.browse(cr, uid, ids, context=context):
             if 'uom' in context:
                 uom = product.uos_id or product.uom_id
@@ -625,20 +799,17 @@ class product_product(osv.osv):
                         uom.id, product.list_price, context['uom'])
             else:
                 res[product.id] = product.list_price
-            res[product.id] =  (res[product.id] or 0.0) * (product.price_margin or 1.0) + product.price_extra
+            price_extra = 0.0
+            for variant_id in product.attribute_value_ids:
+                price_extra += variant_id.price_extra
+            res[product.id] =  (res[product.id] or 0.0) + price_extra
         return res
 
-    def _save_product_lst_price(self, cr, uid, product_id, field_name, field_value, arg, context=None):
-        field_value = field_value or 0.0
-        product = self.browse(cr, uid, product_id, context=context)
-        list_price = (field_value - product.price_extra) / (product.price_margin or 1.0)
-        return self.write(cr, uid, [product_id], {'list_price': list_price}, context=context)
-
     def _get_partner_code_name(self, cr, uid, ids, product, partner_id, context=None):
         for supinfo in product.seller_ids:
             if supinfo.name.id == partner_id:
-                return {'code': supinfo.product_code or product.default_code, 'name': supinfo.product_name or product.name, 'variants': ''}
-        res = {'code': product.default_code, 'name': product.name, 'variants': product.variants}
+                return {'code': supinfo.product_code or product.default_code, 'name': supinfo.product_name or product.name}
+        res = {'code': product.default_code, 'name': product.name}
         return res
 
     def _product_code(self, cr, uid, ids, name, arg, context=None):
@@ -655,48 +826,15 @@ class product_product(osv.osv):
             context = {}
         for p in self.browse(cr, uid, ids, context=context):
             data = self._get_partner_code_name(cr, uid, [], p, context.get('partner_id', None), context=context)
-            if not data['variants']:
-                data['variants'] = p.variants
             if not data['code']:
                 data['code'] = p.code
             if not data['name']:
                 data['name'] = p.name
-            res[p.id] = (data['code'] and ('['+data['code']+'] ') or '') + \
-                    (data['name'] or '') + (data['variants'] and (' - '+data['variants']) or '')
+            res[p.id] = (data['code'] and ('['+data['code']+'] ') or '') + (data['name'] or '')
         return res
 
-    def _is_only_child(self, cr, uid, ids, name, arg, context=None):
-        res = dict.fromkeys(ids, True)
-        for product in self.browse(cr, uid, ids, context=context):
-            if product.product_tmpl_id and len(product.product_tmpl_id.product_variant_ids) > 1:
-                res[product.id] = False
-        return res
-
-    def _get_main_product_supplier(self, cr, uid, product, context=None):
-        """Determines the main (best) product supplier for ``product``,
-        returning the corresponding ``supplierinfo`` record, or False
-        if none were found. The default strategy is to select the
-        supplier with the highest priority (i.e. smallest sequence).
-
-        :param browse_record product: product to supply
-        :rtype: product.supplierinfo browse_record or False
-        """
-        sellers = [(seller_info.sequence, seller_info)
-                       for seller_info in product.seller_ids or []
-                       if seller_info and isinstance(seller_info.sequence, (int, long))]
-        return sellers and sellers[0][1] or False
-
-    def _calc_seller(self, cr, uid, ids, fields, arg, context=None):
-        result = {}
-        for product in self.browse(cr, uid, ids, context=context):
-            main_supplier = self._get_main_product_supplier(cr, uid, product, context=context)
-            result[product.id] = {
-                'seller_info_id': main_supplier and main_supplier.id or False,
-                'seller_delay': main_supplier.delay if main_supplier else 1,
-                'seller_qty': main_supplier and main_supplier.qty or 0.0,
-                'seller_id': main_supplier and main_supplier.name.id or False
-            }
-        return result
+    def is_product_variant(self, cr, uid, ids, name, arg, context=None):
+        return dict.fromkeys(ids, True)
 
     def _get_name_template_ids(self, cr, uid, ids, context=None):
         result = set()
@@ -705,39 +843,68 @@ class product_product(osv.osv):
             result.add(el)
         return list(result)
 
+    def _get_image_variant(self, cr, uid, ids, name, args, context=None):
+        result = dict.fromkeys(ids, False)
+        for obj in self.browse(cr, uid, ids, context=context):
+            result[obj.id] = obj.image_variant or getattr(obj.product_tmpl_id, name)
+        return result
+
+    def _set_image_variant(self, cr, uid, id, name, value, args, context=None):
+        image = tools.image_resize_image_big(value)
+        res = self.write(cr, uid, [id], {'image_variant': image}, context=context)
+        product = self.browse(cr, uid, id, context=context)
+        if not product.product_tmpl_id.image:
+            product.write({'image_variant': None}, context=context)
+            product.product_tmpl_id.write({'image': image}, context=context)
+        return res
+
+    def _get_price_extra(self, cr, uid, ids, name, args, context=None):
+        result = dict.fromkeys(ids, False)
+        for product in self.browse(cr, uid, ids, context=context):
+            price_extra = 0.0
+            for variant_id in product.attribute_value_ids:
+                for price_id in variant_id.price_ids:
+                    if price_id.product_tmpl_id.id == product.product_tmpl_id.id:
+                        price_extra += price_id.price_extra
+            result[product.id] = price_extra
+        return result
+
     _columns = {
-        'price': fields.function(_product_price, fnct_inv=_save_product_lst_price, type='float', string='Price', digits_compute=dp.get_precision('Product Price')),
-        'lst_price' : fields.function(_product_lst_price, fnct_inv=_save_product_lst_price, type='float', string='Public Price', digits_compute=dp.get_precision('Product Price')),
+        'price': fields.function(_product_price, type='float', string='Price', digits_compute=dp.get_precision('Product Price')),
+        'price_extra': fields.function(_get_price_extra, type='float', string='Variant Extra Price', help="This is le sum of the extra price of all attributes"),
+        'lst_price': fields.function(_product_lst_price, type='float', string='Public Price', digits_compute=dp.get_precision('Product Price')),
         'code': fields.function(_product_code, type='char', string='Internal Reference'),
         'partner_ref' : fields.function(_product_partner_ref, type='char', string='Customer ref'),
         'default_code' : fields.char('Internal Reference', select=True),
         'active': fields.boolean('Active', help="If unchecked, it will allow you to hide the product without removing it."),
-        'variants': fields.char('Variants', translate=True),
         'product_tmpl_id': fields.many2one('product.template', 'Product Template', required=True, ondelete="cascade", select=True),
-        'is_only_child': fields.function(
-            _is_only_child, type='boolean', string='Sole child of the parent template'),
         'ean13': fields.char('EAN13 Barcode', size=13, help="International Article Number used for product identification."),
         'packaging': fields.one2many('product.packaging', 'product_id', 'Packaging', help="Gives the different ways to package the same product. This has no impact on the picking order and is mainly used if you use the EDI module."),
-        'price_extra': fields.float('Variant Price Extra', digits_compute=dp.get_precision('Product Price'), help="Price Extra: Extra price for the variant on sale price. eg. 200 price extra, 1000 + 200 = 1200."),
-        'price_margin': fields.float('Variant Price Margin', digits_compute=dp.get_precision('Product Price'), help="Price Margin: Margin in percentage amount on sale price for the variant. eg. 10 price margin, 1000 * 1.1 = 1100."),
-        'pricelist_id': fields.dummy(string='Pricelist', relation='product.pricelist', type='many2one'),
         'name_template': fields.related('product_tmpl_id', 'name', string="Template Name", type='char', store={
             'product.template': (_get_name_template_ids, ['name'], 10),
             'product.product': (lambda self, cr, uid, ids, c=None: ids, [], 10),
         }, select=True),
-        'color': fields.integer('Color Index'),
-        'seller_info_id': fields.function(_calc_seller, type='many2one', relation="product.supplierinfo", string="Supplier Info", multi="seller_info"),
-        'seller_delay': fields.function(_calc_seller, type='integer', string='Supplier Lead Time', multi="seller_info", help="This is the average delay in days between the purchase order confirmation and the reception of goods for this product and for the default supplier. It is used by the scheduler to order requests based on reordering delays."),
-        'seller_qty': fields.function(_calc_seller, type='float', string='Supplier Quantity', multi="seller_info", help="This is minimum quantity to purchase from Main Supplier."),
-        'seller_id': fields.function(_calc_seller, type='many2one', relation="res.partner", string='Main Supplier', help="Main Supplier who has highest priority in Supplier List.", multi="seller_info"),
+        'attribute_value_ids': fields.many2many('product.attribute.value', id1='prod_id', id2='att_id', string='Attributes', readonly=True),
+
+        # image: all image fields are base64 encoded and PIL-supported
+        'image_variant': fields.binary("Variant Image",
+            help="This field holds the image used as image for the product variant, limited to 1024x1024px."),
+
+        'image': fields.function(_get_image_variant, fnct_inv=_set_image_variant,
+            string="Big-sized image", type="binary",
+            help="Image of the product variant (Big-sized image of product template if false). It is automatically "\
+                 "resized as a 1024x1024px image, with aspect ratio preserved."),
+        'image_small': fields.function(_get_image_variant, fnct_inv=_set_image_variant,
+            string="Small-sized image", type="binary",
+            help="Image of the product variant (Small-sized image of product template if false)."),
+        'image_medium': fields.function(_get_image_variant, fnct_inv=_set_image_variant,
+            string="Medium-sized image", type="binary",
+            help="Image of the product variant (Medium-sized image of product template if false)."),
     }
 
     _defaults = {
-        'active': lambda *a: 1,
-        'price_extra': lambda *a: 0.0,
-        'price_margin': lambda *a: 1.0,
+        'active': 1,
         'color': 0,
-        'is_only_child': True,
     }
 
     def unlink(self, cr, uid, ids, context=None):
@@ -767,8 +934,9 @@ class product_product(osv.osv):
 
     def _check_ean_key(self, cr, uid, ids, context=None):
         for product in self.read(cr, uid, ids, ['ean13'], context=context):
-            res = check_ean(product['ean13'])
-        return res
+            if not check_ean(product['ean13']):
+                return False
+        return True
 
     _constraints = [(_check_ean_key, 'You provided an invalid "EAN13 Barcode" reference. You may use the "Internal Reference" field instead.', ['ean13'])]
 
@@ -782,13 +950,12 @@ class product_product(osv.osv):
             ids = [ids]
         if not len(ids):
             return []
+
         def _name_get(d):
             name = d.get('name','')
             code = d.get('default_code',False)
             if code:
                 name = '[%s] %s' % (code,name)
-            if d.get('variants'):
-                name = name + ' - %s' % (d['variants'],)
             return (d['id'], name)
 
         partner_id = context.get('partner_id', False)
@@ -800,6 +967,8 @@ class product_product(osv.osv):
 
         result = []
         for product in self.browse(cr, SUPERUSER_ID, ids, context=context):
+            variant = ", ".join([v.name for v in product.attribute_value_ids])
+            name = variant and "%s (%s)" % (product.name, variant) or product.name
             sellers = []
             if partner_id:
                 sellers = filter(lambda x: x.name.id == partner_id, product.seller_ids)
@@ -807,17 +976,15 @@ class product_product(osv.osv):
                 for s in sellers:
                     mydict = {
                               'id': product.id,
-                              'name': s.product_name or product.name,
+                              'name': s.product_name or name,
                               'default_code': s.product_code or product.default_code,
-                              'variants': product.variants
                               }
                     result.append(_name_get(mydict))
             else:
                 mydict = {
                           'id': product.id,
-                          'name': product.name,
+                          'name': name,
                           'default_code': product.default_code,
-                          'variants': product.variants
                           }
                 result.append(_name_get(mydict))
         return result
@@ -855,44 +1022,7 @@ class product_product(osv.osv):
     #
     def price_get(self, cr, uid, ids, ptype='list_price', context=None):
         products = self.browse(cr, uid, ids, context=context)
-        return self._price_get(cr, uid, products, ptype=ptype, context=context)
-
-    def _price_get(self, cr, uid, products, ptype='list_price', context=None):
-        if context is None:
-            context = {}
-
-        if 'currency_id' in context:
-            pricetype_obj = self.pool.get('product.price.type')
-            price_type_id = pricetype_obj.search(cr, uid, [('field','=',ptype)])[0]
-            price_type_currency_id = pricetype_obj.browse(cr,uid,price_type_id).currency_id.id
-
-        res = {}
-        # standard_price field can only be seen by users in base.group_user
-        # Thus, in order to compute the sale price from the cost price for users not in this group
-        # We fetch the standard price as the superuser
-        for product in products:
-            if ptype != 'standard_price':
-                res[product.id] = product[ptype] or 0.0
-            else: 
-                res[product.id] = self.read(cr, SUPERUSER_ID, product.id, [ptype], context=context)[ptype] or 0.0
-
-        product_uom_obj = self.pool.get('product.uom')
-        for product in products:
-            if ptype == 'list_price':
-                res[product.id] = (res[product.id] * (product.price_margin or 1.0)) + \
-                        product.price_extra
-            if 'uom' in context:
-                uom = product.uom_id or product.uos_id
-                res[product.id] = product_uom_obj._compute_price(cr, uid,
-                        uom.id, res[product.id], context['uom'])
-            # Convert from price_type currency to asked one
-            if 'currency_id' in context:
-                # Take the price_type currency from the product field
-                # This is right cause a field cannot be in more than one currency
-                res[product.id] = self.pool.get('res.currency').compute(cr, uid, price_type_currency_id,
-                    context['currency_id'], res[product.id],context=context)
-
-        return res
+        return self.pool.get("product.template")._price_get(cr, uid, products, ptype=ptype, context=context)
 
     def copy(self, cr, uid, id, default=None, context=None):
         if context is None:
@@ -923,6 +1053,12 @@ class product_product(osv.osv):
                 'res_id': product.product_tmpl_id.id,
                 'target': 'new'}
 
+    def create(self, cr, uid, vals, context=None):
+        if context is None:
+            context = {}
+        ctx = dict(context or {}, create_product_product=True)
+        return super(product_product, self).create(cr, uid, vals, context=ctx)
+
 
 class product_packaging(osv.osv):
     _name = "product.packaging"
@@ -948,8 +1084,9 @@ class product_packaging(osv.osv):
 
     def _check_ean_key(self, cr, uid, ids, context=None):
         for pack in self.browse(cr, uid, ids, context=context):
-            res = check_ean(pack.ean)
-        return res
+            if not check_ean(pack.ean):
+                return False
+        return True
 
     _constraints = [(_check_ean_key, 'Error: Invalid ean code', ['ean'])]
 
@@ -969,8 +1106,8 @@ class product_packaging(osv.osv):
         return (res and res[0]) or False
 
     _defaults = {
-        'rows' : lambda *a : 3,
-        'sequence' : lambda *a : 1,
+        'rows' : 3,
+        'sequence' : 1,
         'ul' : _get_1st_ul,
     }
 
@@ -1010,9 +1147,9 @@ class product_supplierinfo(osv.osv):
         'company_id':fields.many2one('res.company','Company',select=1),
     }
     _defaults = {
-        'qty': lambda *a: 0.0,
-        'sequence': lambda *a: 1,
-        'delay': lambda *a: 1,
+        'qty': 0.0,
+        'sequence': 1,
+        'delay': 1,
         'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'product.supplierinfo', context=c),
     }
     def price_get(self, cr, uid, supplier_ids, product_id, product_qty=1, context=None):
index 85462bb..54e6fac 100644 (file)
@@ -255,10 +255,5 @@ parameter) will see those record just disappear.
             <field name="type">service</field>
             <field name="sale_ok" eval="False"/>
         </record>
-
-        <!-- Product Public Categories -->
-        <record id="categ_others" model="product.public.category">
-            <field name="name">Others</field>
-        </record>
     </data>
 </openerp>
index 20d3777..4f922f4 100644 (file)
             <field name="type">box</field>
         </record>
 
-
-    <!-- product.public.category -->
-
-        <record id="computers" model="product.public.category">
-          <field name="name">Computers</field>
-        </record>
-        
-        <record id="Components" model="product.public.category">
-          <field name="parent_id" ref="computers"/>
-          <field name="name">Components</field>
-        </record>
-
-        <record id="case" model="product.public.category">
-          <field name="parent_id" ref="Components"/>
-          <field name="name">Case</field>
-        </record>
-        <record id="HDD" model="product.public.category">
-          <field name="parent_id" ref="Components"/>
-          <field name="name">Hard Drive</field>
-        </record>
-        <record id="motherboard" model="product.public.category">
-          <field name="parent_id" ref="Components"/>
-          <field name="name">Motherboard</field>
-        </record>
-        <record id="graphics_card" model="product.public.category">
-          <field name="parent_id" ref="Components"/>
-          <field name="name">Graphics Card</field>
-        </record>
-        <record id="Memory" model="product.public.category">
-          <field name="parent_id" ref="Components"/>
-          <field name="name">Memory</field>
-        </record>
-        <record id="processor" model="product.public.category">
-          <field name="parent_id" ref="Components"/>
-          <field name="name">Processor</field>
-        </record>
-        <record id="video_acquisition" model="product.public.category">
-          <field name="parent_id" ref="Components"/>
-          <field name="name">Video Acquisition</field>
-        </record>
-
-        <record id="devices" model="product.public.category">
-          <field name="parent_id" ref="computers"/>
-          <field name="name">Devices</field>
-        </record>
-
-        <record id="Screen" model="product.public.category">
-          <field name="parent_id" ref="devices"/>
-          <field name="name">Screen</field>
-        </record>
-        <record id="Pen_Drive" model="product.public.category">
-          <field name="parent_id" ref="devices"/>
-          <field name="name">Pen Drive</field>
-        </record>
-        <record id="External_Hard_Drive" model="product.public.category">
-          <field name="parent_id" ref="devices"/>
-          <field name="name">External Hard Drive</field>
-        </record>
-        <record id="Keyboard_Mouse" model="product.public.category">
-          <field name="parent_id" ref="devices"/>
-          <field name="name">Keyboard / Mouse</field>
-        </record>
-        <record id="printer" model="product.public.category">
-          <field name="parent_id" ref="devices"/>
-          <field name="name">Printer</field>
-        </record>
-        <record id="Speakers" model="product.public.category">
-          <field name="parent_id" ref="devices"/>
-          <field name="name">Speakers</field>
-        </record>
-        <record id="Headset" model="product.public.category">
-          <field name="parent_id" ref="devices"/>
-          <field name="name">Headset</field>
-        </record>
-        <record id="Software" model="product.public.category">
-          <field name="parent_id" ref="devices"/>
-          <field name="name">Software</field>
-        </record>
-
-        <record id="laptops" model="product.public.category">
-          <field name="parent_id" ref="computers"/>
-          <field name="name">Laptops</field>
-        </record>
-
-        <record id="sub_computers" model="product.public.category">
-          <field name="parent_id" ref="computers"/>
-          <field name="name">Computers</field>
-        </record>
-
-        <record id="Computer_all_in_one" model="product.public.category">
-          <field name="parent_id" ref="sub_computers"/>
-          <field name="name">Computer all-in-one</field>
-        </record>
-        <record id="server" model="product.public.category">
-          <field name="parent_id" ref="sub_computers"/>
-          <field name="name">Server</field>
-        </record>
-
-        <record id="network" model="product.public.category">
-          <field name="parent_id" ref="computers"/>
-          <field name="name">Network</field>
-        </record>
-
-        <record id="Switch" model="product.public.category">
-          <field name="parent_id" ref="network"/>
-          <field name="name">Switch</field>
-        </record>
-        <record id="Modem_Router" model="product.public.category">
-          <field name="parent_id" ref="network"/>
-          <field name="name">Modem &amp; Router</field>
-        </record>
-        <record id="Switch" model="product.public.category">
-          <field name="parent_id" ref="network"/>
-          <field name="name">Switch</field>
-        </record>
-        
-        <record id="services" model="product.public.category">
-          <field name="parent_id" ref="computers"/>
-          <field name="name">Services</field>
-        </record>
-
     <!-- Apple Products -->
     <record id="apple" model="product.category">
           <field name="name">Apple Products</field>
             <field name="sale_ok" eval="True"/>
         </record>
 
-        <record id="product_template_1" model="product.template">
+        <record id="product_product_1" model="product.product">
             <field name="name">On Site Monitoring</field>
             <field name="categ_id" ref="product_category_5"/>
-            <field name="public_categ_id" ref="services"/>
             <field name="standard_price">20.5</field>
             <field name="list_price">30.75</field>
             <field name="type">service</field>
             <field name="description">This type of service include basic monitoring of products.</field>
             <field name="description_sale">This type of service include basic monitoring of products.</field>
         </record>
-        <record id="product_product_1" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_1"/>
-        </record>
 
 
-        <record id="product_template_2" model="product.template">
+        <record id="product_product_2" model="product.product">
             <field name="name">On Site Assistance</field>
             <field name="categ_id" ref="product_category_5"/>
-            <field name="public_categ_id" ref="services"/>
             <field name="standard_price">25.5</field>
             <field name="list_price">38.25</field>
             <field name="type">service</field>
             <field name="uom_po_id" ref="product_uom_hour"/>
             <field name="description">This type of service include assistance for security questions, system configuration requirements, implementation or special needs.</field>
         </record>
-        <record id="product_product_2" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_2"/>
-        </record>
 
 
-        <record id="product_template_3" model="product.template">
+        <record id="product_product_3" model="product.product">
             <field name="name">PC Assemble SC234</field>
             <field name="categ_id" ref="product_category_4"/>
-            <field name="public_categ_id" ref="Computer_all_in_one"/>
             <field name="list_price">450.0</field>
             <field name="standard_price">300.0</field>
             <field name="type">consu</field>
 Processor AMD 8-Core
 512MB RAM
 HDD SH-1</field>
-        </record>
-        <record id="product_product_3" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_3"/>
             <field name="default_code">PCSC234</field>
         </record>
 
+        <!-- -->
+
+        <record id="product_attribute_1" model="product.attribute">
+            <field name="name">Memory</field>
+        </record>
+        <record id="product_attribute_value_1" model="product.attribute.value">
+            <field name="name">16 Go</field>
+            <field name="attribute_id" ref="product_attribute_1"/>
+        </record>
+        <record id="product_attribute_value_2" model="product.attribute.value">
+            <field name="name">32 Go</field>
+            <field name="attribute_id" ref="product_attribute_1"/>
+        </record>
+
+        <record id="product_attribute_2" model="product.attribute">
+            <field name="name">Color</field>
+        </record>
+        <record id="product_attribute_value_3" model="product.attribute.value">
+            <field name="name">White</field>
+            <field name="attribute_id" ref="product_attribute_2"/>
+        </record>
+        <record id="product_attribute_value_4" model="product.attribute.value">
+            <field name="name">Black</field>
+            <field name="attribute_id" ref="product_attribute_2"/>
+        </record>
+
+        <record id="product_attribute_3" model="product.attribute">
+            <field name="name">Wi-Fi</field>
+        </record>
+        <record id="product_attribute_value_5" model="product.attribute.value">
+            <field name="name">2.4 GHz</field>
+            <field name="attribute_id" ref="product_attribute_3"/>
+        </record>
 
-        <record id="product_template_4" model="product.template">
+        <record id="product_product_4" model="product.product">
             <field name="name">iPad Retina Display</field>
             <field name="categ_id" ref="ipad"/>
-            <field name="public_categ_id" ref="Computer_all_in_one"/>
             <field name="standard_price">500.0</field>
             <field name="list_price">750.0</field>
             <field name="type">consu</field>
@@ -275,17 +174,56 @@ HDD SH-1</field>
             <field name="description_sale">7.9‑inch (diagonal) LED-backlit, 128Gb
 Dual-core A5 with quad-core graphics
 FaceTime HD Camera, 1.2 MP Photos</field>
-        </record>
-        <record id="product_product_4" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_4"/>
             <field name="default_code">A2323</field>
+            <field name="attribute_value_ids" eval="[(6,0,[ref('product.product_attribute_value_1'), ref('product.product_attribute_value_3')])]"/>
+        </record>
+        <record id="product_product_4b" model="product.product">
+            <field name="default_code">A2324</field>
+            <field name="product_tmpl_id" ref="product_product_4_product_template"/>
+            <field name="attribute_value_ids" eval="[(6,0,[ref('product.product_attribute_value_1'), ref('product.product_attribute_value_4')])]"/>
+        </record>
+        <record id="product_product_4c" model="product.product">
+            <field name="default_code">A2325</field>
+            <field name="product_tmpl_id" ref="product_product_4_product_template"/>
+            <field name="attribute_value_ids" eval="[(6,0,[ref('product.product_attribute_value_2'), ref('product.product_attribute_value_3')])]"/>
+        </record>
+        <record id="product_product_4d" model="product.product">
+            <field name="default_code">A2326</field>
+            <field name="product_tmpl_id" ref="product_product_4_product_template"/>
+            <field name="attribute_value_ids" eval="[(6,0,[ref('product.product_attribute_value_2'), ref('product.product_attribute_value_4')])]"/>
+        </record>
+
+        <record id="product_attribute_line_1" model="product.attribute.line">
+            <field name="product_tmpl_id" ref="product_product_4_product_template"/>
+            <field name="attribute_id" ref="product_attribute_1"/>
+            <field name="value_ids" eval="[(6,0,[ref('product.product_attribute_value_1'), ref('product.product_attribute_value_2')])]"/>
+        </record>
+        <record id="product_attribute_line_2" model="product.attribute.line">
+            <field name="product_tmpl_id" ref="product_product_4_product_template"/>
+            <field name="attribute_id" ref="product_attribute_2"/>
+            <field name="value_ids" eval="[(6,0,[ref('product.product_attribute_value_3'), ref('product.product_attribute_value_4')])]"/>
+        </record>
+        <record id="product_attribute_line_3" model="product.attribute.line">
+            <field name="product_tmpl_id" ref="product_product_4_product_template"/>
+            <field name="attribute_id" ref="product_attribute_3"/>
+            <field name="value_ids" eval="[(6,0,[ref('product.product_attribute_value_5')])]"/>
         </record>
 
+        <record id="product_product_4_product_template" model="product.template">
+            <field name="attribute_line_ids" eval="[(6,0,[ref('product.product_attribute_line_1'), ref('product.product_attribute_line_2'), ref('product.product_attribute_line_3')])]"/>
+        </record>
+        
+        <record id="product_attribute_price_1" model="product.attribute.price">
+            <field name="product_tmpl_id" ref="product_product_4_product_template"/>
+            <field name="value_id" ref="product_attribute_value_2"/>
+            <field name="price_extra">50.40</field>
+        </record>
 
-        <record id="product_template_5" model="product.template">
+        <!-- -->
+
+        <record id="product_product_5" model="product.product">
             <field name="name">Bose Mini Bluetooth Speaker</field>
             <field name="categ_id" ref="accessories"/>
-            <field name="public_categ_id" ref="Speakers"/>
             <field name="standard_price">600.0</field>
             <field name="list_price">147.0</field>
             <field name="type">consu</field>
@@ -293,44 +231,33 @@ FaceTime HD Camera, 1.2 MP Photos</field>
             <field name="uom_po_id" ref="product_uom_unit"/>
             <field name="description">Custom computer assembled on order based on customer's requirement.</field>
             <field name="description_sale">Bose's smallest portable Bluetooth speaker</field>
-        </record>
-        <record id="product_product_5" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_5"/>
             <field name="default_code">B3423</field>
         </record>
 
 
-        <record id="product_template_6" model="product.template">
+        <record id="product_product_6" model="product.product">
             <field name="name">iPad Mini</field>
             <field name="categ_id" ref="ipad"/>
-            <field name="public_categ_id" ref="Screen"/>
             <field name="standard_price">800.0</field>
             <field name="list_price">320.0</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_unit"/>
             <field name="uom_po_id" ref="product_uom_unit"/>
-        </record>
-        <record id="product_product_6" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_6"/>
             <field name="default_code">A1232</field>
         </record>
 
-        <record id="product_template_7" model="product.template">
+        <record id="product_product_7" model="product.product">
             <field name="name">Apple In-Ear Headphones</field>
             <field name="categ_id" ref="accessories"/>
-            <field name="public_categ_id" ref="Screen"/>
             <field name="standard_price">70.0</field>
             <field name="list_price">79.0</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_unit"/>
             <field name="uom_po_id" ref="product_uom_unit"/>
-        </record>
-        <record id="product_product_7" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_7"/>
             <field name="default_code">A8767</field>
         </record>
 
-        <record id="product_template_8" model="product.template">
+        <record id="product_product_8" model="product.product">
             <field name="name">iMac</field>
             <field name="categ_id" ref="imac"/>
             <field name="standard_price">1299.0</field>
@@ -338,272 +265,215 @@ FaceTime HD Camera, 1.2 MP Photos</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_unit"/>
             <field name="uom_po_id" ref="product_uom_unit"/>
-        </record>
-        <record id="product_product_8" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_8"/>
             <field name="default_code">A1090</field>
         </record>
 
-        <record id="product_template_9" model="product.template">
+        <record id="product_product_9" model="product.product">
             <field name="name">Apple Wireless Keyboard</field>
             <field name="categ_id" ref="accessories"/>
-            <field name="public_categ_id" ref="Keyboard_Mouse"/>
             <field name="standard_price">10.0</field>
             <field name="list_price">47.0</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_unit"/>
             <field name="uom_po_id" ref="product_uom_unit"/>
-        </record>
-        <record id="product_product_9" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_9"/>
             <field name="default_code">AK789</field>
         </record>
 
-        <record id="product_template_10" model="product.template">
+        <record id="product_product_10" model="product.product">
             <field name="name">Mouse, Optical</field>
             <field name="categ_id" ref="product_category_8"/>
-            <field name="public_categ_id" ref="Keyboard_Mouse"/>
             <field name="standard_price">12.50</field>
             <field name="list_price">14</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_unit"/>
             <field name="uom_po_id" ref="product_uom_unit"/>
-        </record>
-        <record id="product_product_10" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_10"/>
             <field name="default_code">M-Opt</field>
         </record>
 
-        <record id="product_template_11" model="product.template">
-            <field name="name">iPod</field>
-            <field name="categ_id" ref="ipod"/>
-            <field name="public_categ_id" ref="Keyboard_Mouse"/>
-            <field name="standard_price">14</field>
-            <field name="list_price">16.50</field>
-            <field name="type">consu</field>
-            <field name="uom_id" ref="product_uom_unit"/>
-            <field name="uom_po_id" ref="product_uom_unit"/>
-        </record>
+        <!-- -->
+
         <record id="product_product_11" model="product.product">
             <field name="name">iPod</field>
-            <field name="variants">16 Gb</field>
-            <field name="default_code">A6678</field>
             <field name="categ_id" ref="ipod"/>
-            <field name="public_categ_id" ref="Keyboard_Mouse"/>
             <field name="standard_price">14</field>
             <field name="list_price">16.50</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_unit"/>
             <field name="uom_po_id" ref="product_uom_unit"/>
-            <field name="product_tmpl_id" ref="product_template_11"/>
             <field name="default_code">A6678</field>
+            <field name="attribute_value_ids" eval="[(6,0,[ref('product.product_attribute_value_1')])]"/>
+        </record>
+        <record id="product_product_11b" model="product.product">
+            <field name="default_code">A6679</field>
+            <field name="product_tmpl_id" ref="product_product_11_product_template"/>
+            <field name="attribute_value_ids" eval="[(6,0,[ref('product.product_attribute_value_2')])]"/>
         </record>
-        <record id="product_product_11_b" model="product.product">
-            <field name="variants">32 Gb</field>
-            <field name="price_extra">12</field>
-            <field name="product_tmpl_id" ref="product_template_11"/>
+
+        <record id="product_attribute_line_4" model="product.attribute.line">
+            <field name="product_tmpl_id" ref="product_product_11_product_template"/>
+            <field name="attribute_id" ref="product_attribute_1"/>
+            <field name="value_ids" eval="[(6,0,[ref('product.product_attribute_value_1'), ref('product.product_attribute_value_2')])]"/>
         </record>
 
-        <record id="product_template_12" model="product.template">
+        <record id="product_product_11_product_template" model="product.template">
+            <field name="attribute_line_ids" eval="[(6,0,[ref('product.product_attribute_line_4')])]"/>
+        </record>
+        
+        <record id="product_attribute_price_2" model="product.attribute.price">
+            <field name="product_tmpl_id" ref="product_product_11_product_template"/>
+            <field name="value_id" ref="product_attribute_value_2"/>
+            <field name="price_extra">6.40</field>
+        </record>
+
+        <!-- -->
+
+        <record id="product_product_12" model="product.product">
             <field name="name">Mouse, Wireless</field>
             <field name="categ_id" ref="product_category_8"/>
-            <field name="public_categ_id" ref="Keyboard_Mouse"/>
             <field name="standard_price">18</field>
             <field name="list_price">12.50</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_unit"/>
             <field name="uom_po_id" ref="product_uom_unit"/>
-        </record>
-        <record id="product_product_12" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_12"/>
             <field name="default_code">M-Wir</field>
         </record>
 
-        <record id="product_template_13" model="product.template">
+        <record id="product_product_13" model="product.product">
             <field name="name">RAM SR5</field>
             <field name="categ_id" ref="product_category_8"/>
-            <field name="public_categ_id" ref="Memory"/>
             <field name="standard_price">78.0</field>
             <field name="list_price">85.0</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_unit"/>
             <field name="uom_po_id" ref="product_uom_unit"/>
-        </record>
-        <record id="product_product_13" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_13"/>
             <field name="default_code">RAM-SR5</field>
         </record>
 
-        <record id="product_template_14" model="product.template">
+        <record id="product_product_14" model="product.product">
             <field name="name">RAM SR2</field>
             <field name="categ_id" ref="product_category_8"/>
-            <field name="public_categ_id" ref="Memory"/>
             <field name="standard_price">87.0</field>
             <field name="list_price">95.0</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_unit"/>
             <field name="uom_po_id" ref="product_uom_unit"/>
-        </record>
-        <record id="product_product_14" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_14"/>
             <field name="default_code">RAM-SR2</field>
         </record>
 
-        <record id="product_template_15" model="product.template">
+        <record id="product_product_15" model="product.product">
             <field name="name">RAM SR3</field>
             <field name="categ_id" ref="product_category_8"/>
-            <field name="public_categ_id" ref="Memory"/>
             <field name="standard_price">80.0</field>
             <field name="list_price">85.0</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_unit"/>
             <field name="uom_po_id" ref="product_uom_unit"/>
-        </record>
-        <record id="product_product_15" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_15"/>
             <field name="default_code">RAM-SR3</field>
         </record>
 
-        <record id="product_template_16" model="product.template">
+        <record id="product_product_16" model="product.product">
             <field name="name">Computer Case</field>
             <field name="categ_id" ref="product_category_8"/>
-            <field name="public_categ_id" ref="case"/>
             <field name="standard_price">20.0</field>
             <field name="list_price">25.0</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_unit"/>
             <field name="uom_po_id" ref="product_uom_unit"/>
-        </record>
-        <record id="product_product_16" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_16"/>
             <field name="default_code">C-Case</field>
         </record>
 
-        <record id="product_template_17" model="product.template">
+        <record id="product_product_17" model="product.product">
             <field name="name">HDD SH-1</field>
             <field name="categ_id" ref="product_category_8"/>
-            <field name="public_categ_id" ref="HDD"/>
             <field name="standard_price">860.0</field>
             <field name="list_price">975.0</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_unit"/>
             <field name="uom_po_id" ref="product_uom_unit"/>
-        </record>
-        <record id="product_product_17" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_17"/>
             <field name="default_code">HDD-SH1</field>
         </record>
 
-        <record id="product_template_18" model="product.template">
+        <record id="product_product_18" model="product.product">
             <field name="name">HDD SH-2</field>
             <field name="categ_id" ref="product_category_8"/>
-            <field name="public_categ_id" ref="HDD"/>
             <field name="standard_price">1020.0</field>
             <field name="list_price">1150.0</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_unit"/>
             <field name="uom_po_id" ref="product_uom_unit"/>
-        </record>
-        <record id="product_product_18" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_18"/>
             <field name="default_code">HDD-SH2</field>
         </record>
 
-        <record id="product_template_19" model="product.template">
+        <record id="product_product_19" model="product.product">
             <field name="name">HDD on Demand</field>
             <field name="categ_id" ref="product_category_8"/>
-            <field name="public_categ_id" ref="HDD"/>
             <field name="standard_price">1100.0</field>
             <field name="list_price">1250.0</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_unit"/>
             <field name="uom_po_id" ref="product_uom_unit"/>
             <field name="description">On demand hard-disk having capacity based on requirement.</field>
-        </record>
-        <record id="product_product_19" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_19"/>
             <field name="default_code">HDD-DEM</field>
         </record>
 
-        <record id="product_template_20" model="product.template">
+        <record id="product_product_20" model="product.product">
             <field name="name">Motherboard I9P57</field>
             <field name="categ_id" ref="product_category_8"/>
-            <field name="public_categ_id" ref="motherboard"/>
             <field name="standard_price">1700.0</field>
             <field name="list_price">1950.0</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_unit"/>
             <field name="uom_po_id" ref="product_uom_unit"/>
-        </record>
-        <record id="product_product_20" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_20"/>
             <field name="default_code">MBi9</field>
         </record>
 
-        <record id="product_template_21" model="product.template">
+        <record id="product_product_21" model="product.product">
             <field name="name">Motherboard A20Z7</field>
             <field name="categ_id" ref="product_category_8"/>
-            <field name="public_categ_id" ref="motherboard"/>
             <field name="standard_price">1790.0</field>
             <field name="list_price">2000.0</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_unit"/>
             <field name="uom_po_id" ref="product_uom_unit"/>
-        </record>
-        <record id="product_product_21" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_21"/>
             <field name="default_code">MBa20</field>
         </record>
 
-        <record id="product_template_22" model="product.template">
+        <record id="product_product_22" model="product.product">
             <field name="name">Processor Core i5 2.70 Ghz</field>
             <field name="categ_id" ref="product_category_8"/>
-            <field name="public_categ_id" ref="processor"/>
             <field name="standard_price">2010.0</field>
             <field name="list_price">2100.0</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_unit"/>
             <field name="uom_po_id" ref="product_uom_unit"/>
-        </record>
-        <record id="product_product_22" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_22"/>
             <field name="default_code">CPUi5</field>
         </record>
 
-        <record id="product_template_23" model="product.template">
+        <record id="product_product_23" model="product.product">
             <field name="name">Processor AMD 8-Core</field>
             <field name="categ_id" ref="product_category_8"/>
-            <field name="public_categ_id" ref="processor"/>
             <field name="standard_price">1910.0</field>
             <field name="list_price">1980.0</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_unit"/>
             <field name="uom_po_id" ref="product_uom_unit"/>
-        </record>
-        <record id="product_product_23" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_23"/>
             <field name="default_code">CPUa8</field>
         </record>
 
-        <record id="product_template_24" model="product.template">
+        <record id="product_product_24" model="product.product">
             <field name="name">Graphics Card</field>
             <field name="categ_id" ref="product_category_8"/>
-            <field name="public_categ_id" ref="graphics_card"/>
             <field name="standard_price">876.0</field>
             <field name="list_price">885.0</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_unit"/>
             <field name="uom_po_id" ref="product_uom_unit"/>
-        </record>
-        <record id="product_product_24" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_24"/>
             <field name="default_code">CARD</field>
         </record>
 
-        <record id="product_template_25" model="product.template">
+        <record id="product_product_25" model="product.product">
             <field name="name">Laptop E5023</field>
             <field name="categ_id" ref="product_category_4"/>
-            <field name="public_categ_id" ref="laptops"/>
             <field name="standard_price">2870.0</field>
             <field name="list_price">2950.0</field>
             <field name="type">consu</field>
@@ -613,16 +483,12 @@ FaceTime HD Camera, 1.2 MP Photos</field>
 4GB RAM
 Standard-1294P Processor
 QWERTY keyboard</field>
-        </record>
-        <record id="product_product_25" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_25"/>
             <field name="default_code">LAP-E5</field>
         </record>
 
-        <record id="product_template_26" model="product.template">
+        <record id="product_product_26" model="product.product">
             <field name="name">Laptop S3450</field>
             <field name="categ_id" ref="product_category_4"/>
-            <field name="public_categ_id" ref="laptops"/>
             <field name="standard_price">3000.0</field>
             <field name="list_price">3245.0</field>
             <field name="type">consu</field>
@@ -632,141 +498,106 @@ QWERTY keyboard</field>
 6GB RAM
 Hi-Speed 234Q Processor
 QWERTY keyboard</field>
-        </record>
-        <record id="product_product_26" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_26"/>
             <field name="default_code">LAP-S3</field>
         </record>
 
-        <record id="product_template_27" model="product.template">
+        <record id="product_product_27" model="product.product">
             <field name="name">Laptop Customized</field>
             <field name="categ_id" ref="product_category_4"/>
-            <field name="public_categ_id" ref="laptops"/>
             <field name="standard_price">3300.0</field>
             <field name="list_price">3645.0</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_unit"/>
             <field name="uom_po_id" ref="product_uom_unit"/>
             <field name="description">Custom Laptop based on customer's requirement.</field>
-        </record>
-        <record id="product_product_27" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_27"/>
             <field name="default_code">LAP-CUS</field>
         </record>
 
-        <record id="product_template_28" model="product.template">
+        <record id="product_product_28" model="product.product">
             <field name="name">External Hard disk</field>
             <field name="categ_id" ref="product_category_6"/>
-            <field name="public_categ_id" ref="External_Hard_Drive"/>
             <field name="standard_price">390.0</field>
             <field name="list_price">405.0</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_unit"/>
             <field name="uom_po_id" ref="product_uom_unit"/>
-        </record>
-        <record id="product_product_28" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_28"/>
             <field name="default_code">EXT-HDD</field>
         </record>
 
 
-        <record id="product_template_29" model="product.template">
+        <record id="product_product_29" model="product.product">
             <field name="name">Pen drive, SP-2</field>
             <field name="categ_id" ref="product_category_7"/>
-            <field name="public_categ_id" ref="Pen_Drive"/>
             <field name="standard_price">90.0</field>
             <field name="list_price">100.0</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_unit"/>
             <field name="uom_po_id" ref="product_uom_unit"/>
-        </record>
-        <record id="product_product_29" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_29"/>
             <field name="default_code">PD-SP2</field>
         </record>
 
 
-        <record id="product_template_30" model="product.template">
+        <record id="product_product_30" model="product.product">
             <field name="name">Pen drive, SP-4</field>
             <field name="categ_id" ref="product_category_7"/>
-            <field name="public_categ_id" ref="Pen_Drive"/>
             <field name="standard_price">126.0</field>
             <field name="list_price">145.0</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_unit"/>
             <field name="uom_po_id" ref="product_uom_unit"/>
-        </record>
-        <record id="product_product_30" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_30"/>
             <field name="default_code">PD-SP4</field>
         </record>
 
-        <record id="product_template_31" model="product.template">
+        <record id="product_product_31" model="product.product">
             <field name="name">Multimedia Speakers</field>
             <field name="categ_id" ref="product_category_7"/>
-            <field name="public_categ_id" ref="Speakers"/>
             <field name="standard_price">134.0</field>
             <field name="list_price">150.0</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_unit"/>
             <field name="uom_po_id" ref="product_uom_unit"/>
             <field name="description">.</field>
-        </record>
-        <record id="product_product_31" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_31"/>
             <field name="default_code">MM-SPK</field>
         </record>
 
-        <record id="product_template_32" model="product.template">
+        <record id="product_product_32" model="product.product">
             <field name="name">Headset standard</field>
             <field name="categ_id" ref="product_category_7"/>
-            <field name="public_categ_id" ref="Headset"/>
             <field name="standard_price">57.0</field>
             <field name="list_price">62.0</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_unit"/>
             <field name="uom_po_id" ref="product_uom_unit"/>
             <field name="description">Hands free headset for laptop PC with in-line microphone and headphone plug.</field>
-        </record>
-        <record id="product_product_32" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_32"/>
             <field name="default_code">HEAD</field>
         </record>
 
-        <record id="product_template_33" model="product.template">
+        <record id="product_product_33" model="product.product">
             <field name="name">Headset USB</field>
             <field name="categ_id" ref="product_category_7"/>
-            <field name="public_categ_id" ref="Headset"/>
             <field name="standard_price">60.0</field>
             <field name="list_price">65.0</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_unit"/>
             <field name="uom_po_id" ref="product_uom_unit"/>
             <field name="description">Headset for laptop PC with USB connector.</field>
-        </record>
-        <record id="product_product_33" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_33"/>
             <field name="default_code">HEAD-USB</field>
         </record>
 
 
-        <record id="product_template_34" model="product.template">
+        <record id="product_product_34" model="product.product">
             <field name="name">Webcam</field>
             <field name="categ_id" ref="product_category_7"/>
-            <field name="public_categ_id" ref="video_acquisition"/>
             <field name="standard_price">38.0</field>
             <field name="list_price">45.0</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_unit"/>
             <field name="uom_po_id" ref="product_uom_unit"/>
-        </record>
-        <record id="product_product_34" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_34"/>
             <field name="default_code">WCAM</field>
         </record>
 
 
-        <record id="product_template_35" model="product.template">
+        <record id="product_product_35" model="product.product">
             <field name="name">Blank CD</field>
             <field name="categ_id" ref="product_category_7"/>
             <field name="standard_price">18.40</field>
@@ -774,14 +605,11 @@ QWERTY keyboard</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_dozen"/>
             <field name="uom_po_id" ref="product_uom_dozen"/>
-        </record>
-        <record id="product_product_35" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_35"/>
             <field name="default_code">CD</field>
         </record>
 
 
-        <record id="product_template_36" model="product.template">
+        <record id="product_product_36" model="product.product">
             <field name="name">Blank DVD-RW</field>
             <field name="categ_id" ref="product_category_7"/>
             <field name="standard_price">21.60</field>
@@ -789,193 +617,146 @@ QWERTY keyboard</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_dozen"/>
             <field name="uom_po_id" ref="product_uom_dozen"/>
-        </record>
-        <record id="product_product_36" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_36"/>
             <field name="default_code">DVD</field>
         </record>
 
 
-        <record id="product_template_37" model="product.template">
+        <record id="product_product_37" model="product.product">
             <field name="name">Printer, All-in-one</field>
             <field name="categ_id" ref="product_category_6"/>
-            <field name="public_categ_id" ref="printer"/>
             <field name="standard_price">4258.0</field>
             <field name="list_price">4410.0</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_unit"/>
             <field name="uom_po_id" ref="product_uom_unit"/>
             <field name="description">All in one hi-speed printer with fax and scanner.</field>
-        </record>
-        <record id="product_product_37" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_37"/>
             <field name="default_code">PRINT</field>
         </record>
 
 
-        <record id="product_template_38" model="product.template">
+        <record id="product_product_38" model="product.product">
             <field name="name">Ink Cartridge</field>
             <field name="categ_id" ref="product_category_6"/>
-            <field name="public_categ_id" ref="printer"/>
             <field name="standard_price">60.0</field>
             <field name="list_price">65.0</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_unit"/>
             <field name="uom_po_id" ref="product_uom_unit"/>
-        </record>
-        <record id="product_product_38" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_38"/>
             <field name="default_code">INK</field>
         </record>
 
 
-        <record id="product_template_39" model="product.template">
+        <record id="product_product_39" model="product.product">
             <field name="name">Toner Cartridge</field>
             <field name="categ_id" ref="product_category_6"/>
-            <field name="public_categ_id" ref="printer"/>
             <field name="standard_price">66.0</field>
             <field name="list_price">70.0</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_unit"/>
             <field name="uom_po_id" ref="product_uom_unit"/>
-        </record>
-        <record id="product_product_39" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_39"/>
             <field name="default_code">TONER</field>
         </record>
 
 
-        <record id="product_template_40" model="product.template">
+        <record id="product_product_40" model="product.product">
             <field name="name">Windows 7 Professional</field>
             <field name="categ_id" ref="product_category_9"/>
-            <field name="public_categ_id" ref="Software"/>
             <field name="standard_price">330.0</field>
             <field name="list_price">470.0</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_unit"/>
             <field name="uom_po_id" ref="product_uom_unit"/>
-        </record>
-        <record id="product_product_40" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_40"/>
             <field name="default_code">Win7</field>
         </record>
 
 
-        <record id="product_template_41" model="product.template">
+        <record id="product_product_41" model="product.product">
             <field name="name">Windows Home Server 2011</field>
             <field name="categ_id" ref="product_category_9"/>
-            <field name="public_categ_id" ref="Software"/>
             <field name="standard_price">540.0</field>
             <field name="list_price">620.0</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_unit"/>
             <field name="uom_po_id" ref="product_uom_unit"/>
-        </record>
-        <record id="product_product_41" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_41"/>
             <field name="default_code">WServer</field>
         </record>
 
 
-        <record id="product_template_42" model="product.template">
+        <record id="product_product_42" model="product.product">
             <field name="name">Office Suite</field>
             <field name="categ_id" ref="product_category_9"/>
-            <field name="public_categ_id" ref="Software"/>
             <field name="standard_price">110.0</field>
             <field name="list_price">170.0</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_unit"/>
             <field name="uom_po_id" ref="product_uom_unit"/>
             <field name="description_sale">Office Editing Software with word processing, spreadsheets, presentations, graphics, and databases...</field>
-        </record>
-        <record id="product_product_42" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_42"/>
             <field name="default_code">OSuite</field>
         </record>
 
 
-        <record id="product_template_43" model="product.template">
+        <record id="product_product_43" model="product.product">
             <field name="name">Zed+ Antivirus</field>
             <field name="categ_id" ref="product_category_9"/>
-            <field name="public_categ_id" ref="Software"/>
             <field name="standard_price">235.0</field>
             <field name="list_price">280.0</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_unit"/>
             <field name="uom_po_id" ref="product_uom_unit"/>
-        </record>
-        <record id="product_product_43" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_43"/>
             <field name="default_code">Zplus</field>
         </record>
 
 
-        <record id="product_template_44" model="product.template">
+        <record id="product_product_44" model="product.product">
             <field name="name">GrapWorks Software</field>
             <field name="categ_id" ref="product_category_9"/>
-            <field name="public_categ_id" ref="Software"/>
             <field name="standard_price">155.0</field>
             <field name="list_price">173.0</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_unit"/>
             <field name="uom_po_id" ref="product_uom_unit"/>
             <field name="description_sale">Full featured image editing software.</field>
-        </record>
-        <record id="product_product_44" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_44"/>
             <field name="default_code">GRAPs/w</field>
         </record>
 
 
-        <record id="product_template_45" model="product.template">
+        <record id="product_product_45" model="product.product">
             <field name="name">Router R430</field>
             <field name="categ_id" ref="product_category_6"/>
-            <field name="public_categ_id" ref="Modem_Router"/>
             <field name="standard_price">55.0</field>
             <field name="list_price">60.0</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_unit"/>
             <field name="uom_po_id" ref="product_uom_unit"/>
-        </record>
-        <record id="product_product_45" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_45"/>
             <field name="default_code">ROUT_430</field>
         </record>
 
 
-        <record id="product_template_46" model="product.template">
+        <record id="product_product_46" model="product.product">
             <field name="name">Datacard</field>
             <field name="categ_id" ref="product_category_6"/>
-            <field name="public_categ_id" ref="Pen_Drive"/>
             <field name="standard_price">35.0</field>
             <field name="list_price">40.0</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_unit"/>
             <field name="uom_po_id" ref="product_uom_unit"/>
-        </record>
-        <record id="product_product_46" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_46"/>
             <field name="default_code">DC</field>
         </record>
 
 
-        <record id="product_template_47" model="product.template">
+        <record id="product_product_47" model="product.product">
             <field name="name">Switch, 24 ports</field>
             <field name="categ_id" ref="product_category_6"/>
-            <field name="public_categ_id" ref="Switch"/>
             <field name="standard_price">55.0</field>
             <field name="list_price">70.0</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_unit"/>
             <field name="uom_po_id" ref="product_uom_unit"/>
-        </record>
-        <record id="product_product_47" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_47"/>
             <field name="default_code">SW24</field>
         </record>
 
 
-        <record id="product_template_48" model="product.template">
+        <record id="product_product_48" model="product.product">
             <field name="name">USB Adapter</field>
             <field name="categ_id" ref="product_category_6"/>
             <field name="standard_price">13.0</field>
@@ -983,9 +764,6 @@ QWERTY keyboard</field>
             <field name="type">consu</field>
             <field name="uom_id" ref="product_uom_unit"/>
             <field name="uom_po_id" ref="product_uom_unit"/>
-        </record>
-        <record id="product_product_48" model="product.product">
-            <field name="product_tmpl_id" ref="product_template_48"/>
             <field name="default_code">ADPT</field>
         </record>
 
@@ -995,315 +773,315 @@ QWERTY keyboard</field>
     -->
 
         <record id="product_supplierinfo_1" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_6"/>
+            <field name="product_tmpl_id" ref="product_product_6_product_template"/>
             <field name="name" ref="base.res_partner_1"/>
             <field name="delay">3</field>
             <field name="min_qty">1</field>
         </record>
 
         <record id="product_supplierinfo_2" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_6"/>
+            <field name="product_tmpl_id" ref="product_product_6_product_template"/>
             <field name="name" ref="base.res_partner_4"/>
             <field name="delay">3</field>
             <field name="min_qty">1</field>
         </record>
 
         <record id="product_supplierinfo_3" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_7"/>
+            <field name="product_tmpl_id" ref="product_product_7_product_template"/>
             <field name="name" ref="base.res_partner_1"/>
             <field name="delay">3</field>
             <field name="min_qty">1</field>
         </record>
 
         <record id="product_supplierinfo_4" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_7"/>
+            <field name="product_tmpl_id" ref="product_product_7_product_template"/>
             <field name="name" ref="base.res_partner_4"/>
             <field name="delay">3</field>
             <field name="min_qty">1</field>
         </record>
 
         <record id="product_supplierinfo_5" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_8"/>
+            <field name="product_tmpl_id" ref="product_product_8_product_template"/>
             <field name="name" ref="base.res_partner_16"/>
             <field name="delay">2</field>
             <field name="min_qty">5</field>
         </record>
 
         <record id="product_supplierinfo_6" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_8"/>
+            <field name="product_tmpl_id" ref="product_product_8_product_template"/>
             <field name="name" ref="base.res_partner_8"/>
             <field name="delay">4</field>
             <field name="min_qty">1</field>
         </record>
 
         <record id="product_supplierinfo_7" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_10"/>
+            <field name="product_tmpl_id" ref="product_product_10_product_template"/>
             <field name="name" ref="base.res_partner_16"/>
             <field name="delay">2</field>
             <field name="min_qty">1</field>
         </record>
 
         <record id="product_supplierinfo_8" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_11"/>
+            <field name="product_tmpl_id" ref="product_product_11_product_template"/>
             <field name="name" ref="base.res_partner_16"/>
             <field name="delay">2</field>
             <field name="min_qty">1</field>
         </record>
 
         <record id="product_supplierinfo_9" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_13"/>
+            <field name="product_tmpl_id" ref="product_product_13_product_template"/>
             <field name="name" ref="base.res_partner_4"/>
             <field name="delay">5</field>
             <field name="min_qty">1</field>
         </record>
 
         <record id="product_supplierinfo_10" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_14"/>
+            <field name="product_tmpl_id" ref="product_product_14_product_template"/>
             <field name="name" ref="base.res_partner_4"/>
             <field name="delay">5</field>
             <field name="min_qty">1</field>
         </record>
 
         <record id="product_supplierinfo_11" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_15"/>
+            <field name="product_tmpl_id" ref="product_product_15_product_template"/>
             <field name="name" ref="base.res_partner_4"/>
             <field name="delay">5</field>
             <field name="min_qty">1</field>
         </record>
 
         <record id="product_supplierinfo_12" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_15"/>
+            <field name="product_tmpl_id" ref="product_product_15_product_template"/>
             <field name="name" ref="base.res_partner_1"/>
             <field name="delay">1</field>
             <field name="min_qty">1</field>
         </record>
 
         <record id="product_supplierinfo_13" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_16"/>
+            <field name="product_tmpl_id" ref="product_product_16_product_template"/>
             <field name="name" ref="base.res_partner_3"/>
             <field name="delay">1</field>
             <field name="min_qty">1</field>
         </record>
 
         <record id="product_supplierinfo_14" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_17"/>
+            <field name="product_tmpl_id" ref="product_product_17_product_template"/>
             <field name="name" ref="base.res_partner_19"/>
             <field name="delay">3</field>
             <field name="min_qty">1</field>
         </record>
 
         <record id="product_supplierinfo_15" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_20"/>
+            <field name="product_tmpl_id" ref="product_product_20_product_template"/>
             <field name="name" ref="base.res_partner_4"/>
             <field name="delay">3</field>
             <field name="min_qty">1</field>
         </record>
 
         <record id="product_supplierinfo_16" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_20"/>
+            <field name="product_tmpl_id" ref="product_product_20_product_template"/>
             <field name="name" ref="base.res_partner_16"/>
             <field name="delay">4</field>
             <field name="min_qty">5</field>
         </record>
 
         <record id="product_supplierinfo_17" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_21"/>
+            <field name="product_tmpl_id" ref="product_product_21_product_template"/>
             <field name="name" ref="base.res_partner_4"/>
             <field name="delay">3</field>
             <field name="min_qty">1</field>
         </record>
 
         <record id="product_supplierinfo_18" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_21"/>
+            <field name="product_tmpl_id" ref="product_product_21_product_template"/>
             <field name="name" ref="base.res_partner_16"/>
             <field name="delay">2</field>
             <field name="min_qty">1</field>
         </record>
 
         <record id="product_supplierinfo_19" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_22"/>
+            <field name="product_tmpl_id" ref="product_product_22_product_template"/>
             <field name="name" ref="base.res_partner_19"/>
             <field name="delay">3</field>
             <field name="min_qty">1</field>
         </record>
 
         <record id="product_supplierinfo_20" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_23"/>
+            <field name="product_tmpl_id" ref="product_product_23_product_template"/>
             <field name="name" ref="base.res_partner_19"/>
             <field name="delay">3</field>
             <field name="min_qty">1</field>
         </record>
 
         <record id="product_supplierinfo_21" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_24"/>
+            <field name="product_tmpl_id" ref="product_product_24_product_template"/>
             <field name="name" ref="base.res_partner_19"/>
             <field name="delay">3</field>
             <field name="min_qty">1</field>
         </record>
 
         <record id="product_supplierinfo_22" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_25"/>
+            <field name="product_tmpl_id" ref="product_product_25_product_template"/>
             <field name="name" ref="base.res_partner_1"/>
             <field name="delay">8</field>
             <field name="min_qty">1</field>
         </record>
 
         <record id="product_supplierinfo_23" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_26"/>
+            <field name="product_tmpl_id" ref="product_product_26_product_template"/>
             <field name="name" ref="base.res_partner_1"/>
             <field name="delay">8</field>
             <field name="min_qty">1</field>
         </record>
 
         <record id="product_supplierinfo_24" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_28"/>
+            <field name="product_tmpl_id" ref="product_product_28_product_template"/>
             <field name="name" ref="base.res_partner_19"/>
             <field name="delay">4</field>
             <field name="min_qty">1</field>
         </record>
 
         <record id="product_supplierinfo_25" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_28"/>
+            <field name="product_tmpl_id" ref="product_product_28_product_template"/>
             <field name="name" ref="base.res_partner_1"/>
             <field name="delay">5</field>
             <field name="min_qty">1</field>
         </record>
 
         <record id="product_supplierinfo_26" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_29"/>
+            <field name="product_tmpl_id" ref="product_product_29_product_template"/>
             <field name="name" ref="base.res_partner_3"/>
             <field name="delay">2</field>
             <field name="min_qty">12</field>
         </record>
 
         <record id="product_supplierinfo_27" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_30"/>
+            <field name="product_tmpl_id" ref="product_product_30_product_template"/>
             <field name="name" ref="base.res_partner_3"/>
             <field name="delay">2</field>
             <field name="min_qty">12</field>
         </record>
 
         <record id="product_supplierinfo_28" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_31"/>
+            <field name="product_tmpl_id" ref="product_product_31_product_template"/>
             <field name="name" ref="base.res_partner_3"/>
             <field name="delay">2</field>
             <field name="min_qty">5</field>
         </record>
 
         <record id="product_supplierinfo_29" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_32"/>
+            <field name="product_tmpl_id" ref="product_product_32_product_template"/>
             <field name="name" ref="base.res_partner_3"/>
             <field name="delay">2</field>
             <field name="min_qty">12</field>
         </record>
 
         <record id="product_supplierinfo_30" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_34"/>
+            <field name="product_tmpl_id" ref="product_product_34_product_template"/>
             <field name="name" ref="base.res_partner_16"/>
             <field name="delay">2</field>
             <field name="min_qty">5</field>
         </record>
 
         <record id="product_supplierinfo_31" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_35"/>
+            <field name="product_tmpl_id" ref="product_product_35_product_template"/>
             <field name="name" ref="base.res_partner_8"/>
             <field name="delay">2</field>
             <field name="min_qty">1</field>
         </record>
 
         <record id="product_supplierinfo_32" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_36"/>
+            <field name="product_tmpl_id" ref="product_product_36_product_template"/>
             <field name="name" ref="base.res_partner_8"/>
             <field name="delay">2</field>
             <field name="min_qty">1</field>
         </record>
 
         <record id="product_supplierinfo_33" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_38"/>
+            <field name="product_tmpl_id" ref="product_product_38_product_template"/>
             <field name="name" ref="base.res_partner_22"/>
             <field name="delay">4</field>
             <field name="min_qty">1</field>
         </record>
 
         <record id="product_supplierinfo_34" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_39"/>
+            <field name="product_tmpl_id" ref="product_product_39_product_template"/>
             <field name="name" ref="base.res_partner_22"/>
             <field name="delay">4</field>
             <field name="min_qty">1</field>
         </record>
 
         <record id="product_supplierinfo_35" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_45"/>
+            <field name="product_tmpl_id" ref="product_product_45_product_template"/>
             <field name="name" ref="base.res_partner_22"/>
             <field name="delay">5</field>
             <field name="min_qty">1</field>
         </record>
 
         <record id="product_supplierinfo_36" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_46"/>
+            <field name="product_tmpl_id" ref="product_product_46_product_template"/>
             <field name="name" ref="base.res_partner_22"/>
             <field name="delay">5</field>
             <field name="min_qty">1</field>
         </record>
 
         <record id="product_supplierinfo_37" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_47"/>
+            <field name="product_tmpl_id" ref="product_product_47_product_template"/>
             <field name="name" ref="base.res_partner_8"/>
             <field name="delay">7</field>
             <field name="min_qty">1</field>
         </record>
 
         <record id="product_supplierinfo_39" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_18"/>
+            <field name="product_tmpl_id" ref="product_product_18_product_template"/>
             <field name="name" ref="base.res_partner_19"/>
             <field name="delay">4</field>
             <field name="min_qty">1</field>
         </record>
 
         <record id="product_supplierinfo_40" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_19"/>
+            <field name="product_tmpl_id" ref="product_product_19_product_template"/>
             <field name="name" ref="base.res_partner_1"/>
             <field name="delay">4</field>
             <field name="min_qty">0</field>
         </record>
 
         <record id="product_supplierinfo_41" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_19"/>
+            <field name="product_tmpl_id" ref="product_product_19_product_template"/>
             <field name="name" ref="base.res_partner_8"/>
             <field name="delay">5</field>
             <field name="min_qty">0</field>
         </record>
 
         <record id="product_supplierinfo_42" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_33"/>
+            <field name="product_tmpl_id" ref="product_product_33_product_template"/>
             <field name="name" ref="base.res_partner_3"/>
             <field name="delay">2</field>
             <field name="min_qty">0</field>
         </record>
 
         <record id="product_supplierinfo_43" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_9"/>
+            <field name="product_tmpl_id" ref="product_product_9_product_template"/>
             <field name="name" ref="base.res_partner_8"/>
             <field name="delay">4</field>
             <field name="min_qty">0</field>
         </record>
 
         <record id="product_supplierinfo_44" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_27"/>
+            <field name="product_tmpl_id" ref="product_product_27_product_template"/>
             <field name="name" ref="base.res_partner_1"/>
             <field name="delay">10</field>
             <field name="min_qty">0</field>
         </record>
 
         <record id="product_supplierinfo_45" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_12"/>
+            <field name="product_tmpl_id" ref="product_product_12_product_template"/>
             <field name="name" ref="base.res_partner_16"/>
             <field name="delay">3</field>
             <field name="min_qty">0</field>
         </record>
 
         <record id="product_supplierinfo_46" model="product.supplierinfo">
-            <field name="product_tmpl_id" ref="product_template_37"/>
+            <field name="product_tmpl_id" ref="product_product_37_product_template"/>
             <field name="name" ref="base.res_partner_22"/>
             <field name="delay">5</field>
             <field name="min_qty">0</field>
index 6983fe4..9b5770a 100644 (file)
 <?xml version="1.0" encoding="utf-8"?>
 <openerp>
     <data>
-        <menuitem id="prod_config_main" name="Products" parent="base.menu_base_config" sequence="70"/>
+        <menuitem id="base.menu_product" name="Product Variants" parent="base.menu_base_partner" sequence="9"/>
 
-        <record id="product_search_form_view" model="ir.ui.view">
-            <field name="name">product.search.form</field>
-            <field name="model">product.product</field>
+        <!-- templates -->
+
+        <record id="product_template_search_view" model="ir.ui.view">
+            <field name="name">product.template.search</field>
+            <field name="model">product.template</field>
             <field name="arch" type="xml">
                 <search string="Product">
-                   <field name="name" string="Product" filter_domain="['|','|',('name','ilike',self),('default_code','ilike',self),('variants','ilike',self)]"/>
-                   <filter string="Services" icon="terp-accessories-archiver" domain="[('type','=','service')]"/>
-                   <filter string="Consumable" name="consumable" icon="terp-accessories-archiver" domain="[('type','=','consu')]" help="Consumable products"/>
-                   <separator/>
-                   <filter string="Can be Sold" name="filter_to_sell" icon="terp-accessories-archiver-minus" domain="[('sale_ok','=',1)]"/>
-                   <field name="categ_id" operator="child_of"/>
-                   <group expand="0" string="Context...">
-                       <field name="pricelist_id" widget="selection" context="{'pricelist': self}" filter_domain="[]" groups="product.group_sale_pricelist"/> <!-- Keep widget=selection on this field to pass numeric `self` value, which is not the case for regular m2o widgets! -->
-                       <field name="company_id" groups="base.group_multi_company"/>
-                   </group>
-                   <group  expand='0' string='Group by...'>
-                       <filter string='Category' icon="terp-stock_symbol-selection" domain="[]" context="{'group_by' : 'categ_id'}"/>
+                    <field name="name" string="Product"/>
+                    <filter string="Services" icon="terp-accessories-archiver" domain="[('type','=','service')]"/>
+                    <filter string="Consumable" name="consumable" icon="terp-accessories-archiver" domain="[('type','=','consu')]" help="Consumable products"/>
+                    <separator/>
+                    <filter string="Can be Sold" name="filter_to_sell" icon="terp-accessories-archiver-minus" domain="[('sale_ok','=',1)]"/>
+                    <field string="Product Variant" name="product_variant_ids" filter_domain="['|', ('product_variant_ids.name','ilike',self), ('product_variant_ids.attribute_value_ids.name','ilike',self)]"/>
+                    <field name="company_id"/>
+                    <field name="pricelist_id" widget="selection" context="{'pricelist': self}" filter_domain="[]" groups="product.group_sale_pricelist"/> <!-- Keep widget=selection on this field to pass numeric `self` value, which is not the case for regular m2o widgets! -->
+                    <group  expand='0' string='Group by...'>
                        <filter string='Default Unit of Measure' icon="terp-mrp" domain="[]" context="{'group_by' : 'uom_id'}"/>
                        <filter string='Type' icon="terp-stock_symbol-selection" domain="[]" context="{'group_by' : 'type'}"/>
-                       <filter string='Company' icon="terp-go-home" domain="[]" context="{'group_by' : 'company_id'}" groups="base.group_multi_company"/>
-                       <filter string='Template' name="template_id" domain="[]" context="{'group_by' : 'product_tmpl_id'}" groups="product.group_product_variant"/>
-                   </group>
+                    </group>
                 </search>
             </field>
         </record>
 
-        <record id="product_product_tree_view" model="ir.ui.view">
-            <field name="name">product.product.tree</field>
-            <field name="model">product.product</field>
-            <field eval="7" name="priority"/>
+        <record id="product_template_tree_view" model="ir.ui.view">
+            <field name="name">product.template.product.tree</field>
+            <field name="model">product.template</field>
             <field name="arch" type="xml">
-                <tree string="Products">
-                    <field name="default_code"/>
+                <tree string="Product">
                     <field name="name"/>
-                    <field name="variants" groups="product.group_product_variant"/>
-                    <field name="categ_id" invisible="1"/>
-                    <field name="type" invisible="1"/>
-                    <field name="uom_id" string="Unit of Measure" groups="product.group_uom"/>
-                    <field name="lst_price"/>
-                    <field name="price" invisible="not context.get('pricelist',False)"/>
-                    <field name="standard_price" invisible="1"/>
+                    <field name="categ_id"/>
+                    <field name="type"/>
                     <field name="state"/>
-                    <field name="company_id" groups="base.group_multi_company" invisible="1"/>
-                    <field name="product_tmpl_id" invisible="1"/>
+                    <field name="uom_id" invisible="1"/>
                 </tree>
             </field>
         </record>
 
-        <record id="product_normal_form_view" model="ir.ui.view">
-            <field name="name">product.normal.form</field>
-            <field name="model">product.product</field>
-            <field eval="7" name="priority"/>
+        <record id="product_template_form_view" model="ir.ui.view">
+            <field name="name">product.template.product.form</field>
+            <field name="model">product.template</field>
             <field name="arch" type="xml">
                 <form string="Product" version="7.0">
+                    <field name="is_product_variant" invisible="1"/>
                     <sheet>
-                        <field name="is_only_child" invisible="1"/>
-                        <field name="image_medium" widget="image" class="oe_avatar oe_left"
-                            attrs="{'readonly': [('is_only_child', '=', False)]}"/>
-                        <div class="oe_title">
-                            <div class="oe_edit_only">
-                                <label for="name" name='label_name' string="Product Name"
-                                    attrs="{'invisible': [('is_only_child', '=', False)]}"/>
-                                <label for="name" name='label_name' string="Product Template"
-                                    attrs="{'invisible': [('is_only_child', '=', True)]}"/>
+                        <field name="id" invisible="True"/>
+                        <div class="oe_right oe_button_box" style="width: 300px;" name="buttons">
+                        </div>
+                        <div class="oe_left" style="width: 500px;">
+                            <field name="image_medium" widget="image" class="oe_avatar oe_left"/>
+                            <div class="oe_title" style="width: 390px;">
+                                <label class="oe_edit_only" for="name" string="Product Name"/>
+                                <h1><field name="name" class="oe_inline"/></h1>
                             </div>
-                            <h1>
-                                <field name="name" class="oe_inline"
-                                    attrs="{'required': [('is_only_child', '=', True)],
-                                            'invisible': [('is_only_child', '=', False)]}"/>
-                                <field name="product_tmpl_id" class="oe_inline" readonly="1" required="0"
-                                    attrs="{'invisible': [('is_only_child', '=', True)]}"/>
-                                <span groups="product.group_product_variant"
-                                    attrs="{'invisible': [('is_only_child', '=', True), ('variants', '=', False)]}">
-                                    - <field name="variants" placeholder="Variant Name" class="oe_inline"/>
-                                </span>
-                            </h1>
-                            <span attrs="{'invisible': [('is_only_child', '=', True)]}">
-                                <p>Generic product settings are managed on
-                                    <button name="open_product_template" type="object" string="the template" class="oe_link"/>
-                                </p>
-                            </span>
-                            <label for="categ_id" class="oe_edit_only"/>
-                            <h2><field name="categ_id" attrs="{'readonly': [('is_only_child', '=', False)]}"/></h2>
-                            <label for="public_categ_id" class="oe_edit_only"/>
-                            <h3><field name="public_categ_id" attrs="{'readonly': [('is_only_child', '=', False)]}"/></h3>
-                            <div name="options" groups="base.group_user">
-                                <field name="sale_ok"/>
-                                <label for="sale_ok"/>
+                            <div class="oe_left" name="options" groups="base.group_user">
+                                <div>
+                                    <field name="sale_ok"/>
+                                    <label for="sale_ok"/>
+                                </div>
                             </div>
                         </div>
-                        <div class="oe_right oe_button_box" name="buttons">
-                        </div>
                         <notebook>
                             <page string="Information">
-                                <group>
+                                <group colspan="4">
                                     <group>
-                                        <field name="type"
-                                            attrs="{'invisible': [('is_only_child', '=', False)]}"/>
-                                        <field name="uom_id" on_change="onchange_uom(uom_id,uom_po_id)" groups="product.group_uom"
-                                            attrs="{'invisible': [('is_only_child', '=', False)]}"/>
-                                        <field name="lst_price" string="Public Sale Price"
-                                            attrs="{'readonly': [('is_only_child', '=', False)]}"/>
-                                        <field name="price_extra"
-                                            attrs="{'invisible': [('is_only_child', '=', True)]}"/>
+                                        <field name="type"/>
+                                        <field name="uom_id" on_change="onchange_uom(uom_id,uom_po_id)" groups="product.group_uom"/>
+                                        <field name="lst_price"/>
                                     </group>
                                     <group>
+                                        <field name="active"/>
+                                        <field name="ean13"/>
                                         <field name="default_code"/>
-                                        <label for="ean13"/>
-                                        <div name="ean">
-                                            <field name="ean13" placeholder="e.g. 5901234123457"/>
-                                        </div>
-                                        <field name="company_id" groups="base.group_multi_company" widget="selection"
-                                            attrs="{'invisible': [('is_only_child', '=', False)]}"/>
-                                        <field name="active" />
                                     </group>
                                 </group>
-                                <field name="description" placeholder="describe the product characteristics..."
-                                    attrs="{'readonly': [('is_only_child', '=', False)]}"/>
+                                <group colspan="4">
+                                    <field name="company_id" groups="base.group_multi_company" widget="selection"/>
+                                </group>
+                                <field name="description" placeholder="describe the product characteristics..."/>
                             </page>
                             <page string="Procurements" groups="base.group_user">
                                 <group name="procurement">
                                     <group name="general">
-                                        <field name="standard_price" attrs="{'readonly': [('is_only_child', '=', False)]}"/>
+                                        <field name="standard_price"/>
                                     </group>
                                     <group name="procurement_uom" groups="product.group_uom" string="Purchase">
-                                        <field name="uom_po_id"
-                                            attrs="{'readonly': [('is_only_child', '=', False)]}"/>
+                                        <field name="uom_po_id"/>
                                     </group>
                                 </group>
+                                <separator string="Suppliers"/>
+                                <field name="seller_ids"/>
                                 <separator string="Description for Suppliers"/>
                                 <field name="description_purchase" placeholder="This note will be displayed on requests for quotation..."/>
                             </page>
-                            <page string="Inventory" groups="base.group_user">
+                            <page string="Inventory">
                                 <group name="inventory">
-                                    <group name="status" string="Status">
-                                        <field name="state"
-                                            attrs="{'readonly': [('is_only_child', '=', False)]}"/>
-                                        <field name="product_manager"
-                                            attrs="{'readonly': [('is_only_child', '=', False)]}"
-                                            context="{'default_groups_ref': ['base.group_user', 'base.group_partner_manager', 'base.group_sale_manager']}"/>
+                                     <group name="status" string="Status">
+                                        <field name="state"/>
+                                        <field name="product_manager"/>
                                     </group>
-                                    <group name="Weights" groups="product.group_stock_packaging" string="Weights">
-                                        <field digits="(14, 3)" name="volume"
-                                            attrs="{'readonly': ['|', ('type','=','service'), ('is_only_child', '=', False)]}"/>
-                                        <field name="weight"
-                                            attrs="{'readonly': ['|', ('type','=','service'), ('is_only_child', '=', False)]}"/>
-                                        <field name="weight_net" 
-                                            attrs="{'readonly': ['|', ('type','=','service'), ('is_only_child', '=', False)]}"/>
+                                    <group name="weight" string="Weights">
+                                        <field digits="(14, 3)" name="volume" attrs="{'readonly':[('type','=','service')]}"/>
+                                        <field digits="(14, 3)" name="weight" attrs="{'readonly':[('type','=','service')]}"/>
+                                        <field digits="(14, 3)" name="weight_net" attrs="{'readonly':[('type','=','service')]}"/>
                                     </group>
                                 </group>
                             </page>
                             <page string="Sales" attrs="{'invisible':[('sale_ok','=',False)]}">
                                 <group name="sale">
-                                    <group string="Sale Conditions">
+                                    <group name="sale_condition" string="Sale Conditions" colspan="3">
                                         <label for="warranty"/>
-                                        <div attrs="{'readonly': [('is_only_child', '=', False)]}">
+                                        <div>
                                             <field name="warranty" class="oe_inline"/> months
                                         </div>
                                     </group>
                                     <group groups="product.group_uos" string="Unit of Measure">
-                                        <field name="uos_id"
-                                            attrs="{'readonly': [('is_only_child', '=', False)]}"/>
-                                        <field name="uos_coeff"
-                                            attrs="{'readonly': [('is_only_child', '=', False)]}"/>
-                                        <field name="mes_type"
-                                            attrs="{'readonly': [('is_only_child', '=', False)]}"/>
+                                        <field name="uos_id"/>
+                                        <field name="uos_coeff"/>
+                                        <field name="mes_type"/>
                                     </group>
                                 </group>
-                                <separator string="Packages" groups="product.group_stock_packaging"/>
-                                <field name="packaging" groups="product.group_stock_packaging" attrs="{'readonly': [('is_only_child', '=', False)]}">
-                                    <form string="Packaging" version="7.0">
-                                        <group col="4">
-                                            <field name="ean"/>
-                                            <field name="sequence" invisible="1"/>
-                                            <newline/>
-                                            <field name="qty"/>
-                                            <field name="ul"/>
-                                            <separator colspan="4" string="Palletization"/>
-                                            <field name="ul_qty"/>
-                                            <field name="ul_container" domain="[('type', '=', 'pallet')]" context="{'default_type': 'pallet'}"/>
-                                            <field name="rows"/>
-                                            <field name="weight"/>
-                                        </group>
-                                        <separator colspan="4" string="Description"/>
-                                        <field name="name"/>
-                                    </form>
-                                </field>
+                                <group name="website_and_pos" col="2">
+                                </group>
                                 <separator string="Description for Quotations"/>
-                                <field name="description_sale" placeholder="note to be displayed on quotations..."
-                                    attrs="{'readonly': [('is_only_child', '=', False)]}"/>
+                                <field name="description_sale" placeholder="note to be displayed on quotations..."/>
+                            </page>
+                            <page name="variants" string="Variants">
+                                <field name="attribute_line_ids" widget="one2many_list">
+                                    <tree string="Variants" editable="bottom">
+                                        <field name="attribute_id"/>
+                                        <field name="value_ids" widget="many2many_tags" domain="[('attribute_id', '=', attribute_id)]" context="{'default_attribute_id': attribute_id}"/>
+                                    </tree>
+                                </field>
                             </page>
                         </notebook>
                     </sheet>
             </field>
         </record>
 
-        <!-- Product Kanban View  -->
-
-        <record model="ir.ui.view" id="product.product_kanban_view">
-            <field name="name">Product Kanban</field>
-            <field name="model">product.product</field>
+        <record id="product_template_kanban_view" model="ir.ui.view">
+            <field name="name">Product.template.product.kanban</field>
+            <field name="model">product.template</field>
             <field name="arch" type="xml">
                 <kanban>
-                    <field name="color"/>
-                    <field name="type"/>
-                    <field name="list_price"/>
+                    <field name="image_small"/>
+                    <field name="lst_price"/>
                     <templates>
                         <t t-name="kanban-box">
                             <div class="oe_kanban_vignette oe_semantic_html_override">
-                                <a type="open"><img t-att-src="kanban_image('product.product', 'image_small', record.id.value)" class="oe_kanban_image"/></a>
+                                <a type="open"><img t-att-src="kanban_image('product.template', 'image_small', record.id.value)" class="oe_kanban_image"/></a>
                                 <div class="oe_kanban_details">
                                     <h4>
                                         <a type="open">
-                                             <t t-if="record.code.raw_value">[<field name="code"/>]</t> <field name="name"/> <t t-if="record.variants.raw_value">(<field name="variants"/>)</t>
+                                             <field name="name"/> 
                                         </a>
                                     </h4>
                                     <div name="tags"/>
             </field>
         </record>
 
-        <record id="product_normal_action" model="ir.actions.act_window">
+        <record id="product_template_action" model="ir.actions.act_window">
             <field name="name">Products</field>
             <field name="type">ir.actions.act_window</field>
-            <field name="res_model">product.product</field>
+            <field name="res_model">product.template</field>
+            <field name="view_mode">kanban,tree,form</field>
+            <field name="view_type">form</field>
+            <field name="view_id" ref="product_template_kanban_view"/>
+        </record>
+
+        <menuitem action="product_template_action"
+            id="menu_product_template_action"
+            parent="base.menu_product" sequence="1" />
+
+        <!-- variants -->
+
+        <record id="variants_template_tree_view" model="ir.ui.view">
+            <field name="name">variants.template.tree</field>
+            <field name="model">product.attribute.value</field>
+            <field name="arch" type="xml">
+                <tree string="Variant Values" editable="top">
+                    <field name="sequence" widget="handle"/>
+                    <field name="attribute_id"/>
+                    <field name="name"/>
+                    <field name="price_extra"/>
+                </tree>
+            </field>
+        </record>
+        <record id="variants_template_action" model="ir.actions.act_window">
+            <field name="name">Variant Values</field>
+            <field name="type">ir.actions.act_window</field>
+            <field name="res_model">product.attribute.value</field>
+            <field name="view_mode">tree</field>
             <field name="view_type">form</field>
+            <field name="domain">[('product_ids.product_tmpl_id', '=', active_id)]</field>
+            <field name="context">{'default_product_tmpl_id': active_id}</field>
+        </record>
+
+        <!-- product product -->
+
+        <menuitem id="prod_config_main" name="Product Variants" parent="base.menu_base_config" sequence="70" groups="base.group_no_one"/>
+
+        <record id="product_search_form_view" model="ir.ui.view">
+            <field name="name">product.product.search</field>
+            <field name="model">product.product</field>
+            <field name="mode">primary</field>
+            <field name="inherit_id" ref="product.product_template_search_view"/>
+            <field name="arch" type="xml">
+                <field name="name" position="replace">
+                   <field name="name" string="Product" filter_domain="['|',('default_code','ilike',self),('name','ilike',self)]"/>
+                </field>
+                <field name="product_variant_ids" position="replace">
+                    <field name="attribute_value_ids"/>
+                </field>
+                <field name="name" position="after">
+                   <field name="product_tmpl_id" string="Product Template"/>
+                </field>
+                <xpath expr="//group[@string='Group by...']" position="inside">
+                    <filter string='Product Template' name="template_id" domain="[]" context="{'group_by' : 'product_tmpl_id'}"/>
+                </xpath>
+            </field>
+        </record>
+
+        <record id="product_product_tree_view" model="ir.ui.view">
+            <field name="name">product.product.tree</field>
+            <field name="model">product.product</field>
+            <field eval="7" name="priority"/>
+            <field name="arch" type="xml">
+
+                <tree string="Product Variants">
+                    <field name="default_code"/>
+                    <field name="name"/>
+                    <field name="attribute_value_ids" widget="many2many_tags"/>
+                    <field name="lst_price"/>
+                    <field name="price" invisible="not context.get('pricelist',False)"/>
+                    <field name="uom_id"/>
+                    <field name="ean13"/>
+                    <field name="state" invisible="1"/>
+                    <field name="product_tmpl_id" invisible="1"/>
+                </tree>
+
+            </field>
+        </record>
+
+        <record id="product_normal_form_view" model="ir.ui.view">
+            <field name="name">product.product.form</field>
+            <field name="model">product.product</field>
+            <field name="mode">primary</field>
+            <field eval="7" name="priority"/>
+            <field name="inherit_id" ref="product.product_template_form_view"/>
+            <field name="arch" type="xml">
+                <form position="attributes">
+                    <attribute name="string">Product Variant</attribute>
+                </form>
+                <field name="name" position="replace">
+                    <field name="name" attrs="{'invisible': [('id', '!=', False)]}"/>
+                    <field name="product_tmpl_id" class="oe_inline" readonly="1" attrs="{'invisible': [('id', '=', False)]}"/>
+                </field>
+                <xpath expr="//div[@class='oe_title']" position="inside">
+                    <field name="attribute_value_ids" widget="many2many_tags"/>
+                </xpath>
+                <page name="variants" position="replace">
+                </page>
+            </field>
+        </record>
+
+        <record id="product_kanban_view" model="ir.ui.view">
+            <field name="name">Product Kanban</field>
+            <field name="model">product.product</field>
+            <field name="mode">primary</field>
+            <field name="inherit_id" ref="product.product_template_kanban_view"/>
+            <field name="arch" type="xml">
+                <field name="name" position="after">
+                    <field name="attribute_value_ids"/>
+                </field>
+                <xpath expr="//img[@class='oe_kanban_image']" position="replace">
+                    <img t-att-src="kanban_image('product.product', 'image_small', record.id.value)" class="oe_kanban_image"/>
+                </xpath>
+            </field>
+        </record>
+
+        <!--  -->
+
+        <record id="product_normal_action" model="ir.actions.act_window">
+            <field name="name">Product Variants</field>
+            <field name="type">ir.actions.act_window</field>
+            <field name="res_model">product.product</field>
             <field name="view_mode">tree,form,kanban</field>
-            <field name="view_id" ref="product_product_tree_view"/>
+            <field name="view_type">form</field>
             <field name="search_view_id" ref="product_search_form_view"/>
             <field name="help" type="html">
               <p class="oe_view_nocontent_create">
               </p>
             </field>
         </record>
-        <record id="product_normal_action_sell" model="ir.actions.act_window">
-            <field name="name">Products</field>
+
+        <!--  -->
+
+        <record id="product_variant_action" model="ir.actions.act_window">
+            <field name="name">Product Variants</field>
             <field name="type">ir.actions.act_window</field>
             <field name="res_model">product.product</field>
-            <field name="view_mode">kanban,tree,form</field>
+            <field name="view_mode">tree,form,kanban</field>
             <field name="view_type">form</field>
-            <field name="context">{"search_default_filter_to_sell":1}</field>
-            <field name="view_id" ref="product_product_tree_view"/>
+            <field name="context">{'search_default_product_tmpl_id': [active_id], 'default_product_tmpl_id': active_id}</field>
             <field name="search_view_id" ref="product_search_form_view"/>
             <field name="help" type="html">
               <p class="oe_view_nocontent_create">
                 Click to define a new product.
               </p><p>
-                You must define a product for everything you sell, whether it's
-                a physical product, a consumable or a service you offer to
-                customers.
-              </p><p>
-                The product form contains information to simplify the sale
-                process: price, notes in the quotation, accounting data,
-                procurement methods, etc.
+                You must define a product for everything you buy or sell,
+                whether it's a physical product, a consumable or service.
               </p>
             </field>
         </record>
 
-        <record id="open_view_product_tree1" model="ir.actions.act_window.view">
-            <field name="sequence" eval="2"/>
-            <field name="view_mode">tree</field>
-            <field name="view_id" ref="product_product_tree_view"/>
-            <field name="act_window_id" ref="product_normal_action_sell"/>
-        </record>
-
-        <record id="open_view_product_form1" model="ir.actions.act_window.view">
-            <field name="sequence" eval="3"/>
-            <field name="view_mode">form</field>
-            <field name="view_id" ref="product_normal_form_view"/>
-            <field name="act_window_id" ref="product_normal_action_sell"/>
+        <record id="product_template_form_view_variant_button" model="ir.ui.view">
+            <field name="name">product.template.form</field>
+            <field name="model">product.template</field>
+            <field name="inherit_id" ref="product.product_template_form_view"/>
+            <field name="arch" type="xml">
+                <field name="attribute_line_ids" position="before">
+                    <div class="oe_right">
+                        <button class="oe_inline oe_stat_button" string="Variant Prices"  name="%(product.variants_template_action)d" type="action" icon="fa-strikethrough"/>
+                        <button class="oe_inline oe_stat_button" name="%(product.product_variant_action)d" type="action" icon="fa-sitemap">
+                            <field string="List of Variants" name="product_variant_count" widget="statinfo" />
+                        </button>
+                    </div>
+                </field>
+            </field>
         </record>
 
-        <record id="open_view_product_kanban1" model="ir.actions.act_window.view">
-            <field name="sequence" eval="1"/>
-            <field name="view_mode">kanban</field>
-            <field name="view_id" ref="product_kanban_view"/>
-            <field name="act_window_id" ref="product_normal_action_sell"/>
+        <record id="product_template_kanban_view_variant_button" model="ir.ui.view">
+            <field name="name">product.template.form</field>
+            <field name="model">product.template</field>
+            <field name="inherit_id" ref="product.product_template_kanban_view"/>
+            <field name="arch" type="xml">
+                <field name="lst_price" position="after">
+                    <field name="is_product_variant"/>
+                    <field name="product_variant_count"/>
+                    <field name="product_variant_ids"/>
+                </field>
+                <h4 position="after">
+                    <a name="%(product.product_variant_action)d" type="action" t-if="!record.is_product_variant.raw_value &amp; record.product_variant_count.raw_value&gt;1">
+                        <t t-esc="record.product_variant_count.value"/> Variants
+                    </a>
+                </h4>
+            </field>
         </record>
 
-        <menuitem id="base.menu_product" name="Products" parent="base.menu_base_partner" sequence="9"/>
-        <menuitem id="product.menu_products" action="product.product_normal_action_sell" parent="base.menu_product" sequence="1"/>
+        <!--  -->
 
-        <record id="product_normal_action_puchased" model="ir.actions.act_window">
-            <field name="name">Products</field>
+        <record id="product_normal_action_sell" model="ir.actions.act_window">
+            <field name="name">Product Variants</field>
             <field name="type">ir.actions.act_window</field>
             <field name="res_model">product.product</field>
-            <field name="view_type">form</field>
             <field name="view_mode">kanban,tree,form</field>
-            <field name="context">{"search_default_filter_to_purchase":1}</field>
-            <field name="view_id" ref="product_kanban_view"/>
+            <field name="view_type">form</field>
+            <field name="context">{"search_default_filter_to_sell":1}</field>
+            <field name="view_id" ref="product_product_tree_view"/>
             <field name="search_view_id" ref="product_search_form_view"/>
             <field name="help" type="html">
               <p class="oe_view_nocontent_create">
                 Click to define a new product.
               </p><p>
-                You must define a product for everything you purchase, whether
-                it's a physical product, a consumable or services you buy to
-                subcontractants.
+                You must define a product for everything you sell, whether it's
+                a physical product, a consumable or a service you offer to
+                customers.
               </p><p>
-                The product form contains detailed information to improve the
-                purchase process: prices, procurement logistics, accounting data,
-                available suppliers, etc.
+                The product form contains information to simplify the sale
+                process: price, notes in the quotation, accounting data,
+                procurement methods, etc.
               </p>
             </field>
         </record>
 
+        <menuitem id="product.menu_products" action="product.product_normal_action_sell" parent="base.menu_product" groups="base.group_no_one" sequence="10"/>
+
         <record id="product_category_search_view" model="ir.ui.view">
             <field name="name">product.category.search</field>
             <field name="model">product.category</field>
 
 
         <record id="product_normal_action_tree" model="ir.actions.act_window">
-            <field name="name">Products</field>
+            <field name="name">Product Variants</field>
             <field name="type">ir.actions.act_window</field>
             <field name="res_model">product.product</field>
             <field name="view_type">form</field>
             <field eval="'ir.actions.act_window,%d'%product_normal_action_tree" name="value"/>
         </record>
 
-
-        <!-- Product Public Categories -->
-        <record id="product_public_category_form_view" model="ir.ui.view">
-            <field name="name">product.public.category.form</field>
-            <field name="model">product.public.category</field>
-            <field name="arch" type="xml">
-                <form string="Pos/Public Categories" version="7.0">
-                    <sheet>
-                        <field name="image_medium" widget='image' class="oe_avatar oe_right"/>
-                        <div class="oe_left">
-                            <group>
-                                <field name="name"/>
-                                <field name="parent_id"/>
-                                <field name="sequence"/>
-                            </group>
-                        </div>
-                    </sheet>
-                </form>
-            </field>
-        </record>
-        <record id="product_public_category_tree_view" model="ir.ui.view">
-            <field name="name">product.public.category.tree</field>
-            <field name="model">product.public.category</field>
-            <field name="field_parent" eval="False"/>
-            <field name="arch" type="xml">
-                <tree string="Product Product Categories">
-                    <field name="sequence" invisible="1"/>
-                    <field name="complete_name"/>
-                </tree>
-            </field>
-        </record>
-        <record id="product_public_category_action" model="ir.actions.act_window">
-            <field name="name">Pos/Public Product Categories</field>
-            <field name="type">ir.actions.act_window</field>
-            <field name="res_model">product.public.category</field>
-            <field name="view_type">form</field>
-            <field name="view_mode">tree,form</field>
-            <field name="view_id" eval="False"/>
-            <field name="help" type="html">
-              <p class="oe_view_nocontent_create">
-                Click to define a new category.
-              </p><p>
-                Categories are used to browse your products through the
-                touchscreen interface.
-              </p><p>
-                If you put a photo on the category, the layout of the
-                touchscreen interface will automatically. We suggest not to put
-                a photo on categories for small (1024x768) screens.
-              </p>
-            </field>
-        </record>
-        <menuitem action="product_public_category_action" id="menu_product_public_category" parent="prod_config_main" sequence="10" />
-        <!-- END -->
-
         <!-- Unit of Measure -->
 
         <record id="product_uom_tree_view" model="ir.ui.view">
             </field>
         </record>
 
-        <!-- Variants -->
-        <record id="product_variant_search_form_view" model="ir.ui.view">
-            <field name="name">product.variant.search.form</field>
-            <field name="model">product.product</field>
-            <field name="arch" type="xml">
-                <search string="Product Variant">
-                   <field name="product_tmpl_id"/>
-                   <field name="name" string="Product" filter_domain="['|','|',('name','ilike',self),('default_code','ilike',self),('variants','ilike',self)]"/>
-                   <group  expand='0' string='Group by...'>
-                       <filter string='Template' name="template_id" domain="[]" context="{'group_by' : 'product_tmpl_id'}"/>
-                   </group>
-                </search>
-            </field>
-        </record>
-        <record id="product_variant_form_view" model="ir.ui.view">
-            <field name="name">product.variant.form</field>
-            <field name="model">product.product</field>
-            <field name="arch" type="xml">
-                <form string="Product Variant" version="7.0">
-                    <group col="4">
-                        <field name="product_tmpl_id"/>
-                        <field name="active"/>
-                        <field name="variants" required="1"/>
-                        <field name="default_code"/>
-                        <field name="price_margin"/>
-                        <field name="price_extra"/>
-                    </group>
-                </form>
-            </field>
-        </record>
-        <record id="product_variant_tree_view" model="ir.ui.view">
-            <field name="name">product.variant.tree</field>
-            <field name="model">product.product</field>
-            <field name="arch" type="xml">
-                <tree string="Product Variant">
-                    <field name="product_tmpl_id"/>
-                    <field name="variants"/>
-                    <field name="default_code"/>
-                    <field name="price_margin"/>
-                    <field name="price_extra"/>
-                    <field name="company_id" invisible="1"/>
-                    <field name="type" invisible="1"/>
-                    <field name="uom_id" invisible="1"/>
-                    <field name="categ_id" invisible="1"/>
-                </tree>
-            </field>
-        </record>
-        <record id="product_variant_action" model="ir.actions.act_window">
-            <field name="name">Product Variants</field>
-            <field name="type">ir.actions.act_window</field>
-            <field name="domain">[('variants','!=', '')]</field>
-            <field name="res_model">product.product</field>
-            <field name="view_type">form</field>
-            <field name="view_mode">tree,form,kanban</field>
-            <field name="view_id" ref="product_variant_tree_view"/>
-            <field name="search_view_id" ref="product_variant_search_form_view"/>
-            <field name="help" type="html">
-              <p class="oe_view_nocontent_create">
-                Click to define a new variant of product.
-              </p>
-            </field>
-        </record>
-        <record id="tree_view_product_variant" model="ir.actions.act_window.view">
-            <field name="sequence" eval="10"/>
-            <field name="view_mode">tree</field>
-            <field name="view_id" ref="product_variant_tree_view"/>
-            <field name="act_window_id" ref="product_variant_action"/>
-        </record>
-        <record id="form_view_product_variant" model="ir.actions.act_window.view">
-            <field name="sequence" eval="20"/>
-            <field name="view_mode">form</field>
-            <field name="view_id" ref="product_variant_form_view"/>
-            <field name="act_window_id" ref="product_variant_action"/>
-        </record>
-        <menuitem action="product.product_variant_action" id="product.menu_variant_product" parent="prod_config_main" sequence="4" groups="product.group_product_variant"/>
-
-        <!-- templates -->
-
-        <record id="product_template_search_view" model="ir.ui.view">
-            <field name="name">product.template.search</field>
-            <field name="model">product.template</field>
-            <field name="arch" type="xml">
-                <search string="Product Template">
-                    <field name="name" string="Product"/>
-                    <filter string="Services" icon="terp-accessories-archiver" domain="[('type','=','service')]"/>
-                    <filter string="Consumable" name="consumable" icon="terp-accessories-archiver" domain="[('type','=','consu')]" help="Consumable products"/>
-                    <separator/>
-                    <filter string="Can be Sold" name="filter_to_sell" icon="terp-accessories-archiver-minus" domain="[('sale_ok','=',1)]"/>
-                    <field name="categ_id"/>
-                    <group  expand='0' string='Group by...'>
-                       <filter string='Category' icon="terp-stock_symbol-selection" domain="[]" context="{'group_by' : 'categ_id'}"/>
-                       <filter string='Default Unit of Measure' icon="terp-mrp" domain="[]" context="{'group_by' : 'uom_id'}"/>
-                       <filter string='Type' icon="terp-stock_symbol-selection" domain="[]" context="{'group_by' : 'type'}"/>
-                    </group>
-                </search>
-            </field>
-        </record>
-
-        <record id="product_template_tree_view" model="ir.ui.view">
-            <field name="name">product.template.product.tree</field>
-            <field name="model">product.template</field>
-            <field name="arch" type="xml">
-                <tree string="Product Template">
-                    <field name="name"/>
-                    <field name="categ_id"/>
-                    <field name="type"/>
-                    <field name="state"/>
-                    <field name="uom_id" invisible="1"/>
-                </tree>
-            </field>
-        </record>
-
-        <record id="product_template_form_view" model="ir.ui.view">
-            <field name="name">product.template.product.form</field>
-            <field name="model">product.template</field>
-            <field name="arch" type="xml">
-                <form string="Product Template" version="7.0">
-                    <sheet>
-                        <field name="image_medium" widget="image" class="oe_avatar oe_left"/>
-                        <div class="oe_title">
-                            <div class="oe_edit_only">
-                                <label for="name" string="Product Name"/>
-                            </div>
-                            <h1>
-                                <field name="name"/>
-                            </h1>
-                            <label for="categ_id" class="oe_edit_only"/>
-                            <h2><field name="categ_id"/></h2>
-                            <label for="public_categ_id" class="oe_edit_only"/>
-                            <h3><field name="public_categ_id"/></h3>
-                            <div name="options" groups="base.group_user">
-                                <field name="sale_ok"/>
-                                <label for="sale_ok"/>
-                            </div>
-                        </div>
-                        <notebook>
-                            <page string="Information">
-                                <group  colspan="4">
-                                    <group>
-                                        <field name="type"/>
-                                        <field name="uom_id" on_change="onchange_uom(uom_id,uom_po_id)" groups="product.group_uom"/>
-                                        <field name="list_price"/>
-                                    </group>
-                                    <group>
-                                        <field name="company_id" groups="base.group_multi_company" widget="selection"/>
-                                    </group>
-                                </group>
-                                <group colspan="4" string="Product Variants" groups="product.group_product_variant">
-                                    <field colspan="4" name="product_variant_ids" nolabel="1" >
-                                        <tree string="Product Variants" editable="bottom">
-                                            <field name="variants" required="1"/>
-                                            <field name="price_margin" string="Variant Price Margin"/>
-                                            <field name="price_extra"/>
-                                            <field name="lst_price" string="Sale Price" readonly="1"/>
-                                        </tree>
-                                    </field>
-                                </group>
-                                <field name="description" placeholder="describe the product characteristics..."/>
-                            </page>
-                            <page string="Procurements" groups="base.group_user">
-                                <group name="procurement">
-                                    <group name="general">
-                                        <field name="standard_price" attrs="{'readonly': [('is_only_child', '=', False)]}"/>
-                                    </group>
-                                    <group name="procurement_uom" groups="product.group_uom" string="Purchase">
-                                        <field name="uom_po_id"/>
-                                    </group>
-                                </group>
-                                <separator string="Suppliers"/>
-                                <field name="seller_ids"/>
-                                <separator string="Description for Suppliers"/>
-                                <field name="description_purchase" placeholder="This note will be displayed on requests for quotation..."/>
-                            </page>
-                            <page string="Inventory">
-                                <group name="inventory">
-                                     <group name="status" string="Status">
-                                        <field name="state"/>
-                                        <field name="product_manager"/>
-                                    </group>
-                                    <group name ="weight" string="Weights">
-                                        <field digits="(14, 3)" name="volume" attrs="{'readonly':[('type','=','service')]}"/>
-                                        <field digits="(14, 3)" name="weight" attrs="{'readonly':[('type','=','service')]}"/>
-                                        <field digits="(14, 3)" name="weight_net" attrs="{'readonly':[('type','=','service')]}"/>
-                                    </group>
-                                </group>
-                            </page>
-                            <page string="Sales" attrs="{'invisible':[('sale_ok','=',False)]}">   
-                                <group name="sale">
-                                    <group name="sale_condition" string="Sale Conditions">
-                                        <label for="warranty"/>
-                                        <div>
-                                            <field name="warranty" class="oe_inline" style="vertical-align:baseline"/> months
-                                        </div>
-                                    </group>
-                                    <group groups="product.group_uos" string="Unit of Measure">
-                                        <field name="uos_id"/>
-                                        <field name="uos_coeff"/>
-                                        <field name="mes_type"/>
-                                    </group>
-                                </group>
-                                <separator string="Description for Quotations"/>
-                                <field name="description_sale" placeholder="note to be displayed on quotations..."/>
-                            </page>
-                        </notebook>
-                    </sheet>
-                    <div class="oe_chatter">
-                        <field name="message_follower_ids" widget="mail_followers"/>
-                        <field name="message_ids" widget="mail_thread"/>
-                    </div>
-                </form>
-            </field>
-        </record>
-
-        <record model="ir.ui.view" id="product_template_kanban_view">
-            <field name="name">Product Template Kanban</field>
-            <field name="model">product.template</field>
-            <field name="arch" type="xml">
-                <kanban>
-                    <field name="image_small"/>
-                    <field name="list_price"/>
-                    <templates>
-                        <t t-name="kanban-box">
-                            <div class="oe_kanban_vignette oe_semantic_html_override">
-                                <a type="open"><img t-att-src="kanban_image('product.template', 'image_small', record.id.value)" class="oe_kanban_image"/></a>
-                                <div class="oe_kanban_details">
-                                    <h4>
-                                        <a type="open">
-                                             <field name="name"/> 
-                                        </a>
-                                    </h4>
-                                    <div name="tags"/>
-                                    <ul>
-                                        <li>Price: <field name="list_price"></field></li>
-                                    </ul>
-                                </div>
-                            </div>
-                        </t>
-                    </templates>
-                </kanban>
-            </field>
-        </record>
-
-        <record id="product_template_action" model="ir.actions.act_window">
-            <field name="name">Templates</field>
-            <field name="type">ir.actions.act_window</field>
-            <field name="res_model">product.template</field>
-            <field name="view_mode">kanban,tree,form</field>
-            <field name="view_type">form</field>
-            <field name="view_id" ref="product_template_kanban_view"/>
-        </record>
-
-        <menuitem action="product_template_action"
-            id="menu_product_template_action"
-            parent="base.menu_product" sequence="20" 
-            groups="product.group_product_variant"/>
-
     </data>
 </openerp>
index beb8d22..00d587d 100644 (file)
@@ -3,7 +3,7 @@
     <lot-line type="fields" name="id">
         <code type="field" name="code"/>
         <product type="field" name="name"/>
-        <variant type="field" name="variants"/>
+        <variant type="field" name="attribute_value_ids"/>
         <price type="field" name="list_price"/>
         <ean13 type="field" name="ean13"/>
         <currency type="field" name="company_id.currency_id.name"/>
index 7919e3a..e8c9bfd 100644 (file)
@@ -19,5 +19,11 @@ access_product_price_history_employee,prices.history employee,model_product_pric
 access_product_template_sale_manager,product.template salemanager,model_product_template,base.group_sale_manager,1,1,1,1\r
 access_product_product_sale_manager,product.product salemanager,model_product_product,base.group_sale_manager,1,1,1,1\r
 access_product_category_sale_manager,product.category salemanager,product.model_product_category,base.group_sale_manager,1,1,1,1\r
-access_product_category_pos_manager,product.public.category manager,model_product_public_category,base.group_sale_manager,1,1,1,1\r
-access_product_category_pos_user,product.public.category user,model_product_public_category,base.group_user,1,0,0,0\r
+access_product_attribute,product.attribute,model_product_attribute,base.group_user,1,0,0,0\r
+access_product_attribute_value,product.attribute value,model_product_attribute_value,base.group_user,1,0,0,0\r
+access_product_attribute_price,product.attribute price,model_product_attribute_price,base.group_user,1,0,0,0\r
+access_product_attribute_line,product.attribute line,model_product_attribute_line,base.group_user,1,0,0,0\r
+access_product_attribute_sale_manager,product.attribute manager,model_product_attribute,base.group_sale_manager,1,1,1,1\r
+access_product_attribute_value_sale_manager,product.attribute manager value,model_product_attribute_value,base.group_sale_manager,1,1,1,1\r
+access_product_attribute_price_sale_manager,product.attribute manager price,model_product_attribute_price,base.group_sale_manager,1,1,1,1\r
+access_product_attribute_line_sale_manager,product.attribute manager line,model_product_attribute_line,base.group_sale_manager,1,1,1,1\r
index 94fb456..6a3718e 100644 (file)
@@ -1,21 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <openerp>
 <data noupdate="0">
-    <!-- Change name of group for 7.0 users since product variant module doesn't exist anymore
-    DO NOT CHANGE IT IN TRUNK -->
-
-    <record id="group_product_variant" model="res.groups">
-        <field name="name">Manage Product Variants</field>
-        <field name="category_id" ref="base.module_category_hidden"/>
-    </record>
-
-    <record id="group_product_mono" model="res.groups">
-        <field name="name">Do Not Manage Product Variants</field>
-        <field name="category_id" ref="base.module_category_hidden"/>
-    </record>
-    <record id="base.group_user" model="res.groups">
-        <field name="implied_ids" eval="[(4, ref('product.group_product_mono'))]"/>
-    </record>
 
     <record id="group_sale_pricelist" model="res.groups">
         <field name="name">Sales Pricelists</field>
index 60a4a4b..53fa22d 100644 (file)
@@ -6,19 +6,19 @@
   !python {model: product.product}: |
     context.update({'pricelist': ref("customer_pricelist"), 'quantity':1})
     product = self.browse(cr, uid, ref("product_product_4"), context=context)
-    assert product.price == (product.lst_price-product.lst_price*(0.10)), "Wrong sale price."
+    assert product.price == (product.lst_price-product.lst_price*(0.10)), "Wrong sale price: Assemble Computer."
 -
   I check sale price of Laptop.
 -
   !python {model: product.product}: |
     product = self.browse(cr, uid, ref("product_product_25"), context=context)
-    assert product.price == product.lst_price + 1, "Wrong sale price."
+    assert product.price == product.lst_price + 1, "Wrong sale price: Laptop."
 -
   I check sale price of IT component.
 -
   !python {model: product.product}: |
     product = self.browse(cr, uid, ref("product_product_7"), context=context)
-    assert product.price == product.lst_price, "Wrong sale price."
+    assert product.price == product.lst_price, "Wrong sale price: IT component."
 
 -
   I check sale price of IT component if more than 3 Unit.
   !python {model: product.product}: |
     context.update({'quantity':5})
     product = self.browse(cr, uid, ref("product_product_26"), context=context)
-    assert product.price == product.lst_price-product.lst_price*(0.05), "Wrong sale price."
+    assert product.price == product.lst_price-product.lst_price*(0.05), "Wrong sale price: IT component if more than 3 Unit."
 -
   I check sale price of LCD Monitor.
 -
   !python {model: product.product}: |
     context.update({'quantity':1})
     product = self.browse(cr, uid, ref("product_product_6"), context=context)
-    assert product.price == product.lst_price, "Wrong sale price."
+    assert product.price == product.lst_price, "Wrong sale price: LCD Monitor."
 
 -
   I check sale price of LCD Monitor on end of year.
@@ -41,7 +41,7 @@
   !python {model: product.product}: |
     context.update({'quantity':1, 'date': '2011-12-31'})
     product = self.browse(cr, uid, ref("product_product_6"), context=context)
-    assert product.price == product.lst_price-product.lst_price*(0.30), "Wrong sale price."
+    assert product.price == product.lst_price-product.lst_price*(0.30), "Wrong sale price: LCD Monitor on end of year."
 
 -
   I check cost price of LCD Monitor.
   !python {model: product.product}: |
     context.update({'quantity':1, 'date': False, 'partner': ref('base.res_partner_4'), 'pricelist': ref("supplier_pricelist")})
     product = self.browse(cr, uid, ref("product_product_6"), context=context)
-    assert product.price == 792, "wrong cost price."
+    assert product.price == 792, "wrong cost price: LCD Monitor."
 -
   I check cost price of LCD Monitor if more than 3 Unit.
 -
   !python {model: product.product}: |
     context.update({'quantity':3})
     product = self.browse(cr, uid, ref("product_product_6"), context=context)
-    assert product.price == 787, "wrong cost price."
+    assert product.price == 787, "wrong cost price: LCD Monitor if more than 3 Unit."
 
 -
  I print the sale prices report.
index a52eeb8..3c98d8f 100644 (file)
@@ -1,10 +1,10 @@
 <?xml version="1.0" encoding="utf-8"?>
 <openerp>
     <data>
-        <record id="product_normal_form_view_template" model="ir.ui.view">
-            <field name="name">product.normal.procurement.locations.inherit</field>
-            <field name="model">product.product</field>
-            <field name="inherit_id" ref="product.product_normal_form_view"/>
+        <record id="product_template_form_view" model="ir.ui.view">
+            <field name="name">product.template.form.inherit</field>
+            <field name="model">product.template</field>
+            <field name="inherit_id" ref="product.product_template_form_view"/>
             <field name="arch" type="xml">
                 <field name="company_id" position="after">
                     <field name="email_template_id"
@@ -15,7 +15,7 @@
                             'default_subject': name,
                             'default_name': name,
                         }"
-                        attrs="{'invisible': [('is_only_child', '=', False)]}"
+                        attrs="{'invisible': [('is_product_variant', '=', False)]}"
                     />
                 </field>
             </field>
index 2b20d05..e311356 100644 (file)
@@ -98,7 +98,7 @@ class stock_quant(osv.osv):
 
 
 class product_product(osv.osv):
-    _inherit = 'product.product'
+    _inherit = 'product.template'
     _columns = {
         'life_time': fields.integer('Product Life Time',
             help='When a new a Serial Number is issued, this is the number of days before the goods may become dangerous and must not be consumed.'),
index b28b644..e5f3c5f 100644 (file)
 
         <record model="ir.ui.view" id="view_product_form_expiry">
             <field name="name">product.normal.form</field>
-            <field name="model">product.product</field>
-            <field name="inherit_id" ref="stock.view_normal_procurement_locations_form" />
+            <field name="model">product.template</field>
+            <field name="inherit_id" ref="product.product_template_form_view" />
             <field name="arch" type="xml">
-                <group name="Weights" position="after">
+                <group name="weight" position="after">
                     <group string="Dates">
                         <field name="life_time" />
                         <field name="use_time" />
index e8adcba..6ed71c6 100644 (file)
@@ -36,7 +36,7 @@ class product_product(osv.osv):
         testdict = {}
         for prod_id in ids:
             bom_obj = self.pool.get('mrp.bom')
-            bom_ids = bom_obj.search(cr, uid, [('bom_id', '=', False), ('product_id','=', prod_id), ('bom_lines', '!=', False)], context=context)
+            bom_ids = bom_obj.search(cr, uid, [('product_id','=', prod_id), ('bom_line_ids', '!=', False)], context=context)
             if bom_ids:
                 bom_id = bom_ids[0]
                 # In recursive mode, it will first compute the prices of child boms
@@ -63,9 +63,9 @@ class product_product(osv.osv):
             context={}
         price = 0
         uom_obj = self.pool.get("product.uom")
-        if bom.bom_lines:
-            for sbom in bom.bom_lines:
-                my_qty = sbom.bom_lines and 1.0 or sbom.product_qty
+        if bom.bom_line_ids:
+            for sbom in bom.bom_line_ids:
+                my_qty = sbom.bom_line_ids and 1.0 or sbom.product_qty
                 price += uom_obj._compute_price(cr, uid, sbom.product_id.uom_id.id, sbom.product_id.standard_price, sbom.product_uom.id) * my_qty
 
         if bom.routing_id:
@@ -98,7 +98,7 @@ class product_bom(osv.osv):
     _inherit = 'mrp.bom'
             
     _columns = {
-        'standard_price': fields.related('product_id','standard_price',type="float",relation="product.product",string="Standard Price",store=False)
+        'standard_price': fields.related('product_tmpl_id','standard_price',type="float",relation="product.product",string="Standard Price",store=False)
     }
 
 product_bom()
diff --git a/addons/product_manufacturer/__init__.py b/addons/product_manufacturer/__init__.py
deleted file mode 100644 (file)
index 9b2446b..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-##############################################################################
-#
-#    OpenERP, Open Source Management Solution
-#    Copyright (C) 2004-2009 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/>.
-#
-##############################################################################
-
-import product_manufacturer
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-
diff --git a/addons/product_manufacturer/__openerp__.py b/addons/product_manufacturer/__openerp__.py
deleted file mode 100644 (file)
index f43ed92..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-##############################################################################
-#
-#    OpenERP, Open Source Management Solution
-#    Copyright (C) 2004-2009 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/>.
-#
-##############################################################################
-{
-    'name': 'Products Manufacturers',
-    'version': '1.0',
-    'author': 'OpenERP SA',
-    'category': 'Purchase Management',
-    'depends': ['stock'],
-    'demo': [],
-    'description': """
-A module that adds manufacturers and attributes on the product form.
-====================================================================
-
-You can now define the following for a product:
------------------------------------------------
-    * Manufacturer
-    * Manufacturer Product Name
-    * Manufacturer Product Code
-    * Product Attributes
-    """,
-    'data': [
-        'security/ir.model.access.csv',
-        'product_manufacturer_view.xml'
-    ],
-    'auto_install': False,
-    'installable': True,
-    'images': ['images/products_manufacturer.jpeg'],
-}
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/product_manufacturer/i18n/ar.po b/addons/product_manufacturer/i18n/ar.po
deleted file mode 100644 (file)
index 4b3af93..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-# Arabic translation for openobject-addons
-# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
-# This file is distributed under the same license as the openobject-addons package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: openobject-addons\n"
-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2012-01-12 22:07+0000\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: Arabic <ar@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-22 07:26+0000\n"
-"X-Generator: Launchpad (build 16985)\n"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr "كود تصنيع المنتج"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr "المنتج"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr "اسم قالب المنتج"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr "سمات المنتج"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr "سمات المنتج"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr "الخاصية"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr "قيمة"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr "صفات"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr "اسم مصنع المنتج"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr "مصنّع"
-
-#~ msgid "Error: Invalid ean code"
-#~ msgstr "خطأ: كود إين غير صالح"
diff --git a/addons/product_manufacturer/i18n/bg.po b/addons/product_manufacturer/i18n/bg.po
deleted file mode 100644 (file)
index 3c9c83d..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-# Bulgarian 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 <EMAIL@ADDRESS>, 2011.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: openobject-addons\n"
-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2011-02-10 23:42+0000\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: Bulgarian <bg@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-22 07:26+0000\n"
-"X-Generator: Launchpad (build 16985)\n"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr "Код на производител"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr "Продукт"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr "Име на шаблона на продукта"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr "Атрибути на продукта"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr "Атрибути на продукта"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr "Атрибут"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr "Стойност"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr "Атрибути"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr "Име на производител"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr "Производител"
-
-#~ msgid "Error: Invalid ean code"
-#~ msgstr "Грешка: Невалиден европейски баркод"
-
-#~ msgid "A module that add manufacturers and attributes on the product form"
-#~ msgstr "Модул, който добавя производители и атрибути във формата на продукта"
-
-#~ msgid "Products Attributes & Manufacturers"
-#~ msgstr "Продуктови атрибути и производители"
diff --git a/addons/product_manufacturer/i18n/bs.po b/addons/product_manufacturer/i18n/bs.po
deleted file mode 100644 (file)
index 35919a3..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-# Bosnian translation for openobject-addons
-# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
-# This file is distributed under the same license as the openobject-addons package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: openobject-addons\n"
-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2013-10-30 00:09+0000\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: Bosnian <bs@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-22 07:26+0000\n"
-"X-Generator: Launchpad (build 16985)\n"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr "Proizvođačka šifra artikla"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr "Proizvod"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr "Naziv predloška proizvoda"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr "Atributi proizvoda"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr "Atributi proizvoda"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr "Atribut"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr "Vrijednost"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr "Atributi"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr "Proizvođački naziv proizvoda"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr "Proizvođač"
diff --git a/addons/product_manufacturer/i18n/ca.po b/addons/product_manufacturer/i18n/ca.po
deleted file mode 100644 (file)
index 870d9a5..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-# Catalan 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 <EMAIL@ADDRESS>, 2011.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: openobject-addons\n"
-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2011-02-12 21:08+0000\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: Catalan <ca@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-22 07:26+0000\n"
-"X-Generator: Launchpad (build 16985)\n"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr "Codi de producte del fabricant"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr "Producte"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr "Nom de plantilla de producte"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr "Atributs de producte"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr "Atributs del producte"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr "Atribut"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr "Valor"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr "Atributs"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr "Nom del producte del fabricant"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr "Fabricant"
-
-#~ msgid "A module that add manufacturers and attributes on the product form"
-#~ msgstr ""
-#~ "Un mòdul que afegeix fabricants i atributs en el formulari de producte"
-
-#~ msgid "Error: Invalid ean code"
-#~ msgstr "Error: Codi EAN no vàlid"
-
-#~ msgid "Products Attributes & Manufacturers"
-#~ msgstr "Fabricants i atributs dels productes"
diff --git a/addons/product_manufacturer/i18n/cs.po b/addons/product_manufacturer/i18n/cs.po
deleted file mode 100644 (file)
index b149f15..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-# Czech translation for openobject-addons
-# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
-# This file is distributed under the same license as the openobject-addons package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: openobject-addons\n"
-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2012-12-31 10:46+0000\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: Czech <cs@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-22 07:26+0000\n"
-"X-Generator: Launchpad (build 16985)\n"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr "Kód výrobku od výrobce"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr "Výrobek"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr "Název šalony výrobku"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr "Vlastnosti výrobku"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr "Vlastnosti výrobku"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr "Vlastnost"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr "Hodnota"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr "Vlastnosti"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr "Název výrobku od výrobce"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr "Výrobce"
diff --git a/addons/product_manufacturer/i18n/da.po b/addons/product_manufacturer/i18n/da.po
deleted file mode 100644 (file)
index d2cb246..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-# Danish translation for openobject-addons
-# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
-# This file is distributed under the same license as the openobject-addons package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: openobject-addons\n"
-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2012-01-27 06:25+0000\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: Danish <da@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-22 07:26+0000\n"
-"X-Generator: Launchpad (build 16985)\n"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr "Producent varenummer"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr "Vare"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr "Vare skabelon navn"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr "Vare egenskaber"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr "Vare Egenskaber"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr "Egenskab"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr "Værdi"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr "Egenskaber"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr "Producent Vare Navn"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr "Producent"
diff --git a/addons/product_manufacturer/i18n/de.po b/addons/product_manufacturer/i18n/de.po
deleted file mode 100644 (file)
index 4a90991..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-# German translation for openobject-addons
-# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010
-# This file is distributed under the same license as the openobject-addons package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: openobject-addons\n"
-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2011-02-12 20:19+0000\n"
-"Last-Translator: Steffi Frank (Bremskerl, DE) <Unknown>\n"
-"Language-Team: German <de@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-22 07:26+0000\n"
-"X-Generator: Launchpad (build 16985)\n"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr "Hersteller-Artikelnummer"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr "Produkt"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr "Produkt Vorlagenname"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr "Produkteigenschaften"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr "Produkteigenschaften"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr "Eigenschaft"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr "Wert"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr "Eigenschaften"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr "Hersteller-Produktname"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr "Hersteller"
-
-#~ msgid "Error: Invalid ean code"
-#~ msgstr "Fehler: Falscher EAN code"
-
-#~ msgid "Products Attributes & Manufacturers"
-#~ msgstr "Produkt-Eigenschaften und -Produzenten"
-
-#~ msgid "A module that add manufacturers and attributes on the product form"
-#~ msgstr ""
-#~ "Ein Modul, durch das einem Produkt Produzenten und Merkmale hinzgefügt "
-#~ "werden können"
diff --git a/addons/product_manufacturer/i18n/el.po b/addons/product_manufacturer/i18n/el.po
deleted file mode 100644 (file)
index 95ad9cc..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-# Greek translation for openobject-addons
-# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010
-# This file is distributed under the same license as the openobject-addons package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: openobject-addons\n"
-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2010-11-11 15:58+0000\n"
-"Last-Translator: Dimitris Andavoglou <dimitrisand@gmail.com>\n"
-"Language-Team: Greek <el@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-22 07:26+0000\n"
-"X-Generator: Launchpad (build 16985)\n"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr "Κωδικός Κατασκευαστή"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr "Προϊόν"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr "Όνομα Προτύπου Προϊόντος"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr "Ιδιότητες προϊόντος"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr "Χαρακτηριστικά Προϊόντος"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr "Χαρακτηριστικό"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr "Τιμή"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr "Ιδιότητες"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr "Όνομα Προϊόντος Κατασκευαστή"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr "Κατασκευαστής"
-
-#~ msgid "Products Attributes & Manufacturers"
-#~ msgstr "Ιδιότητες Προϊόντος και Κατασκευαστές"
diff --git a/addons/product_manufacturer/i18n/es.po b/addons/product_manufacturer/i18n/es.po
deleted file mode 100644 (file)
index 1f9490e..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-# Spanish translation for openobject-addons
-# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010
-# This file is distributed under the same license as the openobject-addons package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: openobject-addons\n"
-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2010-12-08 21:40+0000\n"
-"Last-Translator: Jordi Esteve (www.zikzakmedia.com) "
-"<jesteve@zikzakmedia.com>\n"
-"Language-Team: Spanish <es@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-22 07:26+0000\n"
-"X-Generator: Launchpad (build 16985)\n"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr "Código producto fabricante"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr "Producto"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr "Nombre de plantilla de producto"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr "Atributos de producto"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr "Atributos del producto"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr "Atributo"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr "Valor"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr "Atributos"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr "Nombre producto fabricante"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr "Fabricante"
-
-#~ msgid "A module that add manufacturers and attributes on the product form"
-#~ msgstr ""
-#~ "Un módulo que añade fabricantes y atributos en el formulario de producto"
-
-#~ msgid "Products Attributes & Manufacturers"
-#~ msgstr "Fabricantes y atributos de los productos"
-
-#~ msgid "Error: Invalid ean code"
-#~ msgstr "Error: Código EAN no válido"
diff --git a/addons/product_manufacturer/i18n/es_CR.po b/addons/product_manufacturer/i18n/es_CR.po
deleted file mode 100644 (file)
index 39f64dd..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-# Spanish translation for openobject-addons
-# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010
-# This file is distributed under the same license as the openobject-addons package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: openobject-addons\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2012-02-17 00:27+0000\n"
-"Last-Translator: Carlos Vásquez (CLEARCORP) "
-"<carlos.vasquez@clearcorp.co.cr>\n"
-"Language-Team: Spanish <es@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-22 07:26+0000\n"
-"X-Generator: Launchpad (build 16985)\n"
-"Language: es\n"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr "Código producto fabricante"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr "Producto"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr "Nombre de plantilla de producto"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr "Atributos de producto"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr "Atributos del producto"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr "Atributo"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr "Valor"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr "Atributos"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr "Nombre producto fabricante"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr "Fabricante"
-
-#~ msgid "Error: Invalid ean code"
-#~ msgstr "Error: Código EAN no válido"
-
-#~ msgid "A module that add manufacturers and attributes on the product form"
-#~ msgstr ""
-#~ "Un módulo que añade fabricantes y atributos en el formulario de producto"
-
-#~ msgid "Products Attributes & Manufacturers"
-#~ msgstr "Fabricantes y atributos de los productos"
diff --git a/addons/product_manufacturer/i18n/es_EC.po b/addons/product_manufacturer/i18n/es_EC.po
deleted file mode 100644 (file)
index 576687f..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-# Spanish translation for openobject-addons
-# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010
-# This file is distributed under the same license as the openobject-addons package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: openobject-addons\n"
-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2010-09-19 00:08+0000\n"
-"Last-Translator: Borja López Soilán (NeoPolus) <borjalopezsoilan@gmail.com>\n"
-"Language-Team: Spanish <es@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-22 07:26+0000\n"
-"X-Generator: Launchpad (build 16985)\n"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr ""
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr "Producto"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr "Nombre de plantilla de producto"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr "Atributos de producto"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr ""
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr "Atributo"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr "Valor"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr "Atributos"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr ""
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr "Fabricante"
-
-#~ msgid "A module that add manufacturers and attributes on the product form"
-#~ msgstr ""
-#~ "Un módulo que añade fabricantes y atributos en el formulario de producto"
-
-#~ msgid "Products Attributes & Manufacturers"
-#~ msgstr "Fabricantes y atributos de los productos"
diff --git a/addons/product_manufacturer/i18n/es_MX.po b/addons/product_manufacturer/i18n/es_MX.po
deleted file mode 100644 (file)
index 25bd32d..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-# Spanish translation for openobject-addons
-# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010
-# This file is distributed under the same license as the openobject-addons package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: openobject-addons\n"
-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2011-01-11 11:15+0000\n"
-"PO-Revision-Date: 2010-12-08 21:40+0000\n"
-"Last-Translator: Jordi Esteve (www.zikzakmedia.com) "
-"<jesteve@zikzakmedia.com>\n"
-"Language-Team: Spanish <es@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-09-05 05:46+0000\n"
-"X-Generator: Launchpad (build 13830)\n"
-
-#. module: product_manufacturer
-#: model:ir.module.module,description:product_manufacturer.module_meta_information
-msgid "A module that add manufacturers and attributes on the product form"
-msgstr ""
-"Un módulo que añade fabricantes y atributos en el formulario de producto"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr "Código producto fabricante"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr "Producto"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr "Nombre de plantilla de producto"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr "Atributos de producto"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr "Atributos del producto"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr "Atributo"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr "Valor"
-
-#. module: product_manufacturer
-#: constraint:product.product:0
-msgid "Error: Invalid ean code"
-msgstr "Error: Código EAN no válido"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr "Atributos"
-
-#. module: product_manufacturer
-#: model:ir.module.module,shortdesc:product_manufacturer.module_meta_information
-msgid "Products Attributes & Manufacturers"
-msgstr "Fabricantes y atributos de los productos"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr "Nombre producto fabricante"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr "Fabricante"
diff --git a/addons/product_manufacturer/i18n/es_VE.po b/addons/product_manufacturer/i18n/es_VE.po
deleted file mode 100644 (file)
index 25bd32d..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-# Spanish translation for openobject-addons
-# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010
-# This file is distributed under the same license as the openobject-addons package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: openobject-addons\n"
-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2011-01-11 11:15+0000\n"
-"PO-Revision-Date: 2010-12-08 21:40+0000\n"
-"Last-Translator: Jordi Esteve (www.zikzakmedia.com) "
-"<jesteve@zikzakmedia.com>\n"
-"Language-Team: Spanish <es@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-09-05 05:46+0000\n"
-"X-Generator: Launchpad (build 13830)\n"
-
-#. module: product_manufacturer
-#: model:ir.module.module,description:product_manufacturer.module_meta_information
-msgid "A module that add manufacturers and attributes on the product form"
-msgstr ""
-"Un módulo que añade fabricantes y atributos en el formulario de producto"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr "Código producto fabricante"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr "Producto"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr "Nombre de plantilla de producto"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr "Atributos de producto"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr "Atributos del producto"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr "Atributo"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr "Valor"
-
-#. module: product_manufacturer
-#: constraint:product.product:0
-msgid "Error: Invalid ean code"
-msgstr "Error: Código EAN no válido"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr "Atributos"
-
-#. module: product_manufacturer
-#: model:ir.module.module,shortdesc:product_manufacturer.module_meta_information
-msgid "Products Attributes & Manufacturers"
-msgstr "Fabricantes y atributos de los productos"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr "Nombre producto fabricante"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr "Fabricante"
diff --git a/addons/product_manufacturer/i18n/et.po b/addons/product_manufacturer/i18n/et.po
deleted file mode 100644 (file)
index c6526be..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-# Estonian translation for openobject-addons
-# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010
-# This file is distributed under the same license as the openobject-addons package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: openobject-addons\n"
-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2010-06-25 18:10+0000\n"
-"Last-Translator: lyyser <Unknown>\n"
-"Language-Team: Estonian <et@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-22 07:26+0000\n"
-"X-Generator: Launchpad (build 16985)\n"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr "Tootja tootekood"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr "Toode"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr "Toote malli nimi"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr "Toote omadused"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr "Toote omadused"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr "Atribuut"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr "Väärtus"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr "Omadused"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr "Tootja tootenimi"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr "Tootja"
diff --git a/addons/product_manufacturer/i18n/fi.po b/addons/product_manufacturer/i18n/fi.po
deleted file mode 100644 (file)
index f6ddcec..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-# Finnish 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 <EMAIL@ADDRESS>, 2011.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: openobject-addons\n"
-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2011-06-20 10:09+0000\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: Finnish <fi@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-22 07:26+0000\n"
-"X-Generator: Launchpad (build 16985)\n"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr "Valmistajan tuotekoodi"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr "Tuote"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr "Tuotemallipohjan nimi"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr "Tuotteen attribuutit"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr "Tuotteen attribuutit"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr "Attribuutti"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr "Arvo"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr "Attribuutit"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr "Valmistajan tuotenimi"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr "Valmistaja"
-
-#~ msgid "A module that add manufacturers and attributes on the product form"
-#~ msgstr "Moduuli jo lisää valmistajia ja attribuutteja tuotelomakkeelle"
-
-#~ msgid "Error: Invalid ean code"
-#~ msgstr "Virhe: Väärä EAN-koodi"
-
-#~ msgid "Products Attributes & Manufacturers"
-#~ msgstr "Tuotteen attribuutit ja valmistajat"
diff --git a/addons/product_manufacturer/i18n/fr.po b/addons/product_manufacturer/i18n/fr.po
deleted file mode 100644 (file)
index 619e264..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-# French translation for openobject-addons
-# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010
-# This file is distributed under the same license as the openobject-addons package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: openobject-addons\n"
-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2010-12-29 07:38+0000\n"
-"Last-Translator: Aline (OpenERP) <Unknown>\n"
-"Language-Team: French <fr@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-22 07:26+0000\n"
-"X-Generator: Launchpad (build 16985)\n"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr "Code produit du fabriquant"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr "Produit"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr "Nom du modèle de produit"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr "Attributs du produit"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr "Attributs du produit"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr "Attribut"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr "Valeur"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr "Caractéristiques"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr "Nom du produit chez le fabricant"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr "Fabricant"
-
-#~ msgid "A module that add manufacturers and attributes on the product form"
-#~ msgstr ""
-#~ "Un module qui ajoute des fabricants et des attributs sur la fiche Produit"
-
-#~ msgid "Products Attributes & Manufacturers"
-#~ msgstr "Attributs et fabricants des produits"
-
-#~ msgid "Error: Invalid ean code"
-#~ msgstr "Erreur : code EAN incorrect"
diff --git a/addons/product_manufacturer/i18n/gl.po b/addons/product_manufacturer/i18n/gl.po
deleted file mode 100644 (file)
index 4178e3a..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-# Galician 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 <EMAIL@ADDRESS>, 2011.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: openobject-addons\n"
-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2011-03-22 18:14+0000\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: Galician <gl@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-22 07:26+0000\n"
-"X-Generator: Launchpad (build 16985)\n"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr "Código produto fabricante"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr "Produto"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr "Nome do modelo de produto"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr "Atributos do produto"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr "Atributos do produto"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr "Atributo"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr "Valor"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr "Atributos"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr "Nome produto fabricante"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr "Fabricante"
-
-#~ msgid "A module that add manufacturers and attributes on the product form"
-#~ msgstr ""
-#~ "Un módulo que engade fabricantes e atributos no formulario de produto"
-
-#~ msgid "Error: Invalid ean code"
-#~ msgstr "Erro: Código EAN non válido"
-
-#~ msgid "Products Attributes & Manufacturers"
-#~ msgstr "Fabricantes e atributos dos produtos"
diff --git a/addons/product_manufacturer/i18n/hr.po b/addons/product_manufacturer/i18n/hr.po
deleted file mode 100644 (file)
index bf9f48e..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-# Croatian translation for openobject-addons
-# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010
-# This file is distributed under the same license as the openobject-addons package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: openobject-addons\n"
-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2010-09-10 08:27+0000\n"
-"Last-Translator: Dejan Radočaj <Unknown>\n"
-"Language-Team: Croatian <hr@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-22 07:26+0000\n"
-"X-Generator: Launchpad (build 16985)\n"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr "Proizvođačka šifra artikla"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr "Proizvod"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr "Naziv predloška proizvoda"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr "Značajke proizvoda"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr "Značajke proizvoda"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr "Značajka"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr "Vrijednost"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr "Značajke"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr "Proizvođački naziv artikla"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr "Proizvođač"
-
-#~ msgid "A module that add manufacturers and attributes on the product form"
-#~ msgstr "Modul koji dodaje proizvođače i značajke  na proizvodnu formu"
-
-#~ msgid "Products Attributes & Manufacturers"
-#~ msgstr "Značajke i proizvođači proizvoda"
diff --git a/addons/product_manufacturer/i18n/hu.po b/addons/product_manufacturer/i18n/hu.po
deleted file mode 100644 (file)
index f816a72..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-# Translation of OpenERP Server.
-# This file contains the translation of the following modules:
-#    * product_manufacturer
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: OpenERP Server 6.0dev\n"
-"Report-Msgid-Bugs-To: support@openerp.com\n"
-"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2011-01-25 21:42+0000\n"
-"Last-Translator: Krisztian Eyssen <krisz@eyssen.hu>\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: 2014-04-22 07:26+0000\n"
-"X-Generator: Launchpad (build 16985)\n"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr "Gyártói termékkód"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr "Termék"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr "Terméksablon neve"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr "Termék tulajdonságok"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr "Termék tulajdonságok"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr "Tulajdonság"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr "Érték"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr "Tulajdonságok"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr "Gyártói termék megnevezés"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr "Gyártó"
-
-#~ msgid "Error: Invalid ean code"
-#~ msgstr "Hiba: Érvénytelen vonalkód"
-
-#~ msgid "Products Attributes & Manufacturers"
-#~ msgstr "Termékek tulajdonságai és gyártók"
diff --git a/addons/product_manufacturer/i18n/it.po b/addons/product_manufacturer/i18n/it.po
deleted file mode 100644 (file)
index 5982a1e..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-# Italian 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 <EMAIL@ADDRESS>, 2011.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: openobject-addons\n"
-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2011-01-13 22:51+0000\n"
-"Last-Translator: Nicola Riolini - Micronaet <Unknown>\n"
-"Language-Team: Italian <it@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-22 07:26+0000\n"
-"X-Generator: Launchpad (build 16985)\n"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr "Codice prodotto del produttore"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr "Prodotto"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr "Nome modello prodotto"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr "Attributi prodotto"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr "Attributi prodotto"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr "Attributo"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr "Valore"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr "Attributi"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr "Nome prodotto del produttore"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr "Produttore"
-
-#~ msgid "Error: Invalid ean code"
-#~ msgstr "Errore: Codice EAN non valido"
-
-#~ msgid "A module that add manufacturers and attributes on the product form"
-#~ msgstr "Un modulo che aggiunge produttori e attributi al form del prodotto"
-
-#~ msgid "Products Attributes & Manufacturers"
-#~ msgstr "Attributi & Produttori dei prodotti"
diff --git a/addons/product_manufacturer/i18n/ja.po b/addons/product_manufacturer/i18n/ja.po
deleted file mode 100644 (file)
index c638799..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-# Japanese translation for openobject-addons
-# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
-# This file is distributed under the same license as the openobject-addons package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: openobject-addons\n"
-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2012-06-08 17:13+0000\n"
-"Last-Translator: Akira Hiyama <Unknown>\n"
-"Language-Team: Japanese <ja@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-22 07:26+0000\n"
-"X-Generator: Launchpad (build 16985)\n"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr "製造者製品コード"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr "製品"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr "製品テンプレート名"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr "製品属性"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr "製品属性"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr "属性"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr "値"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr "属性"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr "製造者製品名"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr "製造者"
-
-#~ msgid "Error: Invalid ean code"
-#~ msgstr "エラー:無効な商品識別番号です。"
diff --git a/addons/product_manufacturer/i18n/lt.po b/addons/product_manufacturer/i18n/lt.po
deleted file mode 100644 (file)
index cc57ccb..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-# Lithuanian translation for openobject-addons
-# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
-# This file is distributed under the same license as the openobject-addons package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: openobject-addons\n"
-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2013-01-26 14:43+0000\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: Lithuanian <lt@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-22 07:26+0000\n"
-"X-Generator: Launchpad (build 16985)\n"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr "Produkto kodas"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr "Produktas"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr ""
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr ""
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr ""
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr ""
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr "Reikšmė"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr ""
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr "Produkto pavadinimas"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr "Gamintojas"
diff --git a/addons/product_manufacturer/i18n/lv.po b/addons/product_manufacturer/i18n/lv.po
deleted file mode 100644 (file)
index 3a9747f..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-# Latvian translation for openobject-addons
-# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
-# This file is distributed under the same license as the openobject-addons package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: openobject-addons\n"
-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2014-02-14 10:44+0000\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: Latvian <lv@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-22 07:26+0000\n"
-"X-Generator: Launchpad (build 16985)\n"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr ""
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr ""
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr ""
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr ""
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr ""
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr ""
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr ""
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr ""
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr ""
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr ""
diff --git a/addons/product_manufacturer/i18n/mk.po b/addons/product_manufacturer/i18n/mk.po
deleted file mode 100644 (file)
index 0f7487f..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-# Macedonian translation for openobject-addons
-# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
-# This file is distributed under the same license as the openobject-addons package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: openobject-addons\n"
-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2013-03-01 15:51+0000\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: Macedonian <mk@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-22 07:26+0000\n"
-"X-Generator: Launchpad (build 16985)\n"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr "Код на производителот на производот"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr "Производ"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr "Име на урнек на производ"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr "Атрибути на производ"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr "Атрибути на производ"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr "Атрибут"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr "Вредност"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr "Атрибути"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr "Име на производител на производ"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr "Производител"
diff --git a/addons/product_manufacturer/i18n/mn.po b/addons/product_manufacturer/i18n/mn.po
deleted file mode 100644 (file)
index fa4ae70..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-# Mongolian translation for openobject-addons
-# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010
-# This file is distributed under the same license as the openobject-addons package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: openobject-addons\n"
-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2010-12-16 12:39+0000\n"
-"Last-Translator: ub121 <ubs121@gmail.com>\n"
-"Language-Team: Mongolian <mn@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-22 07:26+0000\n"
-"X-Generator: Launchpad (build 16985)\n"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr "Үйлдвэрлэгчийн барааны код"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr "Бараа"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr "Барааны загварын нэр"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr "Барааны онцлог"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr "Барааны онцлогууд"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr "Аттрибут"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr "Утга"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr "Атрибут"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr "Үйлдвэрлэгчийн барааны нэр"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr "Үйлдвэрлэгч"
-
-#~ msgid "A module that add manufacturers and attributes on the product form"
-#~ msgstr ""
-#~ "Бүтээгдэхүүний дэлгэц дээр үйлдвэрлэгчийн мэдээлэл болон бусад атрибутуу "
-#~ "нэмэх модуль"
-
-#~ msgid "Products Attributes & Manufacturers"
-#~ msgstr "Барааны атрибут & Үйлдвэрлэгч"
-
-#~ msgid "Error: Invalid ean code"
-#~ msgstr "Алдаа: Буруу зураасан код"
diff --git a/addons/product_manufacturer/i18n/nb.po b/addons/product_manufacturer/i18n/nb.po
deleted file mode 100644 (file)
index 9172425..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-# Norwegian Bokmal translation for openobject-addons
-# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
-# This file is distributed under the same license as the openobject-addons package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: openobject-addons\n"
-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2012-07-22 21:31+0000\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: Norwegian Bokmal <nb@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-22 07:26+0000\n"
-"X-Generator: Launchpad (build 16985)\n"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr "Produsent produktkode"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr "Produkt"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr "Produkt template navn"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr "Produkt attributter"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr "Produktattributter"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr "Attributt"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr "Verdi"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr "Attributter"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr "Produsents produktnavn"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr "Produsent"
-
-#~ msgid "Error: Invalid ean code"
-#~ msgstr "Feil: Ugyldig ean kode"
diff --git a/addons/product_manufacturer/i18n/nl.po b/addons/product_manufacturer/i18n/nl.po
deleted file mode 100644 (file)
index b643411..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-# Dutch 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 <EMAIL@ADDRESS>, 2011.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: openobject-addons\n"
-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2011-01-17 10:12+0000\n"
-"Last-Translator: Douwe Wullink (Dypalio) <Unknown>\n"
-"Language-Team: Dutch <nl@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-22 07:26+0000\n"
-"X-Generator: Launchpad (build 16985)\n"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr "Productcode fabrikant"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr "Product"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr "Product Sjabloon Naam"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr "Product kenmerken"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr "Product kenmerken"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr "Kenmerk"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr "Waarde"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr "Kenmerken"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr "Productomschrijving fabrikant"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr "Fabrikant"
-
-#~ msgid "A module that add manufacturers and attributes on the product form"
-#~ msgstr ""
-#~ "Een module die fabrikanten en kenmerken op het product formulier toevoegen"
-
-#~ msgid "Error: Invalid ean code"
-#~ msgstr "Fout: ongeldige ean code"
-
-#~ msgid "Products Attributes & Manufacturers"
-#~ msgstr "Producten Kenmerken & Fabrikanten"
diff --git a/addons/product_manufacturer/i18n/pl.po b/addons/product_manufacturer/i18n/pl.po
deleted file mode 100644 (file)
index 6b9961b..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-# Polish translation for openobject-addons
-# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010
-# This file is distributed under the same license as the openobject-addons package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: openobject-addons\n"
-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2012-01-31 11:44+0000\n"
-"Last-Translator: djtms <Unknown>\n"
-"Language-Team: Polish <pl@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-22 07:26+0000\n"
-"X-Generator: Launchpad (build 16985)\n"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr "Kod producenta produktu"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr "Produkt"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr "Nazwa szablonu produktu"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr "Atrybuty produktu"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr "Atrybuty produktu"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr "Atrybut"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr "Wartość"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr "Atrybuty"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr "Nazwa produktu u producenta"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr "Producent"
-
-#~ msgid "A module that add manufacturers and attributes on the product form"
-#~ msgstr "Moduł do dodawania producentów i atrybutów w formularzu produktu"
-
-#~ msgid "Products Attributes & Manufacturers"
-#~ msgstr "Atrybuty i producenci produktu"
-
-#~ msgid "Error: Invalid ean code"
-#~ msgstr "Błąd: Niedozwolony kod EAN"
diff --git a/addons/product_manufacturer/i18n/product_manufacturer.pot b/addons/product_manufacturer/i18n/product_manufacturer.pot
deleted file mode 100644 (file)
index 404d226..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-# Translation of OpenERP Server.
-# This file contains the translation of the following modules:
-#      * product_manufacturer
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: OpenERP Server 7.0alpha\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2012-12-21 17:06+0000\n"
-"Last-Translator: <>\n"
-"Language-Team: \n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: \n"
-"Plural-Forms: \n"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr ""
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr ""
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr ""
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr ""
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr ""
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr ""
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr ""
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr ""
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr ""
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr ""
-
diff --git a/addons/product_manufacturer/i18n/pt.po b/addons/product_manufacturer/i18n/pt.po
deleted file mode 100644 (file)
index d23b885..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-# Portuguese translation for openobject-addons
-# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010
-# This file is distributed under the same license as the openobject-addons package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: openobject-addons\n"
-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2010-12-03 17:58+0000\n"
-"Last-Translator: Rui Franco (multibase.pt) <Unknown>\n"
-"Language-Team: Portuguese <pt@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-22 07:26+0000\n"
-"X-Generator: Launchpad (build 16985)\n"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr "Código do artigo (fabricante)"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr "Artigo"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr "Nome do modelo do artigo"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr "Atributos do artigo"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr "Atributos do artigo"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr "Atributo"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr "Valor"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr "Atributos"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr "Nome do artigo (fabricante)"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr "Fabricante"
-
-#~ msgid "Error: Invalid ean code"
-#~ msgstr "Erro: Código EAN inválido"
-
-#~ msgid "A module that add manufacturers and attributes on the product form"
-#~ msgstr "A module that add manufacturers and attributes on the product form"
-
-#~ msgid "Products Attributes & Manufacturers"
-#~ msgstr "Atributos dos artigos e Fabricantes"
diff --git a/addons/product_manufacturer/i18n/pt_BR.po b/addons/product_manufacturer/i18n/pt_BR.po
deleted file mode 100644 (file)
index ba1f1e6..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-# Brazilian Portuguese translation for openobject-addons
-# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010
-# This file is distributed under the same license as the openobject-addons package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: openobject-addons\n"
-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2011-01-08 18:30+0000\n"
-"Last-Translator: Emerson <Unknown>\n"
-"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-22 07:26+0000\n"
-"X-Generator: Launchpad (build 16985)\n"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr "Código de Fabricação do Produto"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr "Produto"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr "Nome do Modelo de Produto"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr "Atributos do produto"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr "Atributos de Produto"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr "Atributo"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr "Valor"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr "Atributos"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr "Nome de Fabricação do Produto"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr "Fabricante"
-
-#~ msgid "Products Attributes & Manufacturers"
-#~ msgstr "Atributos de Produto e Fabricantes"
-
-#~ msgid "Error: Invalid ean code"
-#~ msgstr "Erro: Código EAN inválido"
-
-#~ msgid "A module that add manufacturers and attributes on the product form"
-#~ msgstr "Um módulo que adiciona fabricantes e atributos na tela de produtos."
diff --git a/addons/product_manufacturer/i18n/ro.po b/addons/product_manufacturer/i18n/ro.po
deleted file mode 100644 (file)
index 4b4bfb3..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-# Romanian translation for openobject-addons
-# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
-# This file is distributed under the same license as the openobject-addons package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: openobject-addons\n"
-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2012-01-11 19:30+0000\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: Romanian <ro@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-22 07:26+0000\n"
-"X-Generator: Launchpad (build 16985)\n"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr "Codul Producatorului Produsului"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr "Produs"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr "Numele Sablonului Produsului"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr "Atribute produs"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr "Atribute Produs"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr "Atribut (caracteristica)"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr "Valoare"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr "Atribute"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr "Numele Producatorului Produsului"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr "Producator"
-
-#~ msgid "A module that add manufacturers and attributes on the product form"
-#~ msgstr ""
-#~ "Un modul care adaugă producători si atribute in formularul produsului"
-
-#~ msgid "Products Attributes & Manufacturers"
-#~ msgstr "Atribute Produse & Producători"
-
-#~ msgid "Error: Invalid ean code"
-#~ msgstr "Eroare: Cod ean invalid"
diff --git a/addons/product_manufacturer/i18n/ru.po b/addons/product_manufacturer/i18n/ru.po
deleted file mode 100644 (file)
index 8399571..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-# Russian translation for openobject-addons
-# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010
-# This file is distributed under the same license as the openobject-addons package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: openobject-addons\n"
-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2011-03-09 15:59+0000\n"
-"Last-Translator: Stanislav Hanzhin <Unknown>\n"
-"Language-Team: Russian <ru@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-22 07:26+0000\n"
-"X-Generator: Launchpad (build 16985)\n"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr "Код продукта у производителя"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr "Продукция"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr "Шаблон имени продукта"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr "Атрибуты продукта"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr "Атрибуты ТМЦ"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr "Атрибут"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr "Значение"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr "Атрибуты"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr "Название используемое производителем"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr "Производитель"
-
-#~ msgid "Error: Invalid ean code"
-#~ msgstr "Ошибка: Неправильный штрих-код"
-
-#~ msgid "Products Attributes & Manufacturers"
-#~ msgstr "Атрибуты и производители ТМЦ"
-
-#~ msgid "A module that add manufacturers and attributes on the product form"
-#~ msgstr "Модуль добавить производителей и атрибуты в форму ввода ТМЦ"
diff --git a/addons/product_manufacturer/i18n/sl.po b/addons/product_manufacturer/i18n/sl.po
deleted file mode 100644 (file)
index d8a9d63..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-# Slovenian translation for openobject-addons
-# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010
-# This file is distributed under the same license as the openobject-addons package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: openobject-addons\n"
-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2010-07-28 12:29+0000\n"
-"Last-Translator: Simon Vidmar <Unknown>\n"
-"Language-Team: Slovenian <sl@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-22 07:26+0000\n"
-"X-Generator: Launchpad (build 16985)\n"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr "Dobaviteljeva koda izdelka"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr "Izdelek"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr "Ime predloge produkta"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr "Lasnosti izdelka"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr "Lasnosti izdelka"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr "Lastnost"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr "Vrednost"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr "Lastnosti"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr "Dobaviteljevo ime izdelka"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr "Proizvajalec"
diff --git a/addons/product_manufacturer/i18n/sr.po b/addons/product_manufacturer/i18n/sr.po
deleted file mode 100644 (file)
index a54d350..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-# Serbian translation for openobject-addons
-# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010
-# This file is distributed under the same license as the openobject-addons package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: openobject-addons\n"
-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2010-10-14 16:37+0000\n"
-"Last-Translator: zmmaj <Unknown>\n"
-"Language-Team: Serbian <sr@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-22 07:26+0000\n"
-"X-Generator: Launchpad (build 16985)\n"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr "Proizvođačka šifra artikla"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr "Proizvod"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr "Naziv predloška proizvoda"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr "Atributi Proizvoda"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr "Atributi Proizvoda"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr "Atribut"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr "Vrednost"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr "Aтрибути"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr "Proizvođačev Naziv Proizvoda"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr "Proizvođač"
-
-#~ msgid "A module that add manufacturers and attributes on the product form"
-#~ msgstr "Modul koji dodaje proizvođače i atribute na proizvodnu formu"
-
-#~ msgid "Products Attributes & Manufacturers"
-#~ msgstr "Atributi i Proizvođači Proizvoda"
diff --git a/addons/product_manufacturer/i18n/sr@latin.po b/addons/product_manufacturer/i18n/sr@latin.po
deleted file mode 100644 (file)
index aac5c21..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-# Serbian latin translation for openobject-addons
-# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010
-# This file is distributed under the same license as the openobject-addons package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: openobject-addons\n"
-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2010-12-10 18:55+0000\n"
-"Last-Translator: Milan Milosevic <Unknown>\n"
-"Language-Team: Serbian latin <sr@latin@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-22 07:26+0000\n"
-"X-Generator: Launchpad (build 16985)\n"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr ""
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr ""
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr ""
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr "Osobine Proizvoda"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr ""
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr ""
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr ""
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr ""
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr ""
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr ""
diff --git a/addons/product_manufacturer/i18n/sv.po b/addons/product_manufacturer/i18n/sv.po
deleted file mode 100644 (file)
index 40800dd..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-# Swedish translation for openobject-addons
-# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010
-# This file is distributed under the same license as the openobject-addons package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: openobject-addons\n"
-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2010-12-13 20:52+0000\n"
-"Last-Translator: Anders Eriksson, Mobila System <ae@mobilasystem.se>\n"
-"Language-Team: Swedish <sv@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-22 07:26+0000\n"
-"X-Generator: Launchpad (build 16985)\n"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr "Tillverkarens produktnummer"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr "Produkt"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr "Produktmallnamn"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr "Produktattribut"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr "Produktattribut"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr "Attribut"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr "Värde"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr "Attribut"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr "Tillverkarens produktnamn"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr "Tillverkare"
-
-#~ msgid "Error: Invalid ean code"
-#~ msgstr "Fel: Felaktig EAN kod"
-
-#~ msgid "Products Attributes & Manufacturers"
-#~ msgstr "Produktattribut och tillverkare"
diff --git a/addons/product_manufacturer/i18n/tr.po b/addons/product_manufacturer/i18n/tr.po
deleted file mode 100644 (file)
index 62794cb..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-# Turkish 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 <EMAIL@ADDRESS>, 2011.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: openobject-addons\n"
-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2011-01-09 16:45+0000\n"
-"Last-Translator: Arif Aydogmus <arifaydogmus@gmail.com>\n"
-"Language-Team: Turkish <tr@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-22 07:26+0000\n"
-"X-Generator: Launchpad (build 16985)\n"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr "Üreticinin Ürün Kodu"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr "Ürün"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr "Ürün Şablonu Adı"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr "Ürün öznitelikleri"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr "Ürün Öznitelikleri"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr "Öznitelik"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr "Değer"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr "Öznitelikler"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr "Üreticinin Ürün Adı"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr "Üretici"
-
-#~ msgid "A module that add manufacturers and attributes on the product form"
-#~ msgstr "Ürüm kartına üretici firma ve özelliklerini ekleyen modül."
-
-#~ msgid "Error: Invalid ean code"
-#~ msgstr "Hata: Geçersiz barkod"
-
-#~ msgid "Products Attributes & Manufacturers"
-#~ msgstr "Ürün Özellikleri & Üreticiler"
diff --git a/addons/product_manufacturer/i18n/zh_CN.po b/addons/product_manufacturer/i18n/zh_CN.po
deleted file mode 100644 (file)
index d175f84..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-# Chinese (Simplified) translation for openobject-addons
-# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010
-# This file is distributed under the same license as the openobject-addons package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: openobject-addons\n"
-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2012-11-25 16:14+0000\n"
-"Last-Translator: 盈通 ccdos <ccdos@intoerp.com>\n"
-"Language-Team: Chinese (Simplified) <zh_CN@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-22 07:26+0000\n"
-"X-Generator: Launchpad (build 16985)\n"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr "制造商产品代码"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr "产品"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr "产品模板名称"
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr "产品属性"
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr "产品属性"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr "属性"
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr "值"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr "属性"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr "制造商产品名称"
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr "制造商"
-
-#~ msgid "Products Attributes & Manufacturers"
-#~ msgstr "产品属性和制造商"
-
-#~ msgid "Error: Invalid ean code"
-#~ msgstr "错误:无效EAN编码"
-
-#~ msgid "A module that add manufacturers and attributes on the product form"
-#~ msgstr "用于在产品表单中添加制造商与其他属性的模块。"
diff --git a/addons/product_manufacturer/i18n/zh_TW.po b/addons/product_manufacturer/i18n/zh_TW.po
deleted file mode 100644 (file)
index c62f8e6..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-# Chinese (Traditional) translation for openobject-addons
-# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
-# This file is distributed under the same license as the openobject-addons package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: openobject-addons\n"
-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2013-02-01 04:37+0000\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: Chinese (Traditional) <zh_TW@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-22 07:26+0000\n"
-"X-Generator: Launchpad (build 16985)\n"
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pref:0
-msgid "Manufacturer Product Code"
-msgstr ""
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_product
-#: field:product.manufacturer.attribute,product_id:0
-msgid "Product"
-msgstr ""
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-msgid "Product Template Name"
-msgstr ""
-
-#. module: product_manufacturer
-#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute
-msgid "Product attributes"
-msgstr ""
-
-#. module: product_manufacturer
-#: view:product.manufacturer.attribute:0
-#: view:product.product:0
-msgid "Product Attributes"
-msgstr ""
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,name:0
-msgid "Attribute"
-msgstr ""
-
-#. module: product_manufacturer
-#: field:product.manufacturer.attribute,value:0
-msgid "Value"
-msgstr ""
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,attribute_ids:0
-msgid "Attributes"
-msgstr ""
-
-#. module: product_manufacturer
-#: field:product.product,manufacturer_pname:0
-msgid "Manufacturer Product Name"
-msgstr ""
-
-#. module: product_manufacturer
-#: view:product.product:0
-#: field:product.product,manufacturer:0
-msgid "Manufacturer"
-msgstr ""
diff --git a/addons/product_manufacturer/product_manufacturer.py b/addons/product_manufacturer/product_manufacturer.py
deleted file mode 100644 (file)
index ea7acf6..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-##############################################################################
-#
-#    OpenERP, Open Source Management Solution
-#    Copyright (C) 2004-2009 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/>.
-#
-##############################################################################
-
-from openerp.osv import fields, osv
-
-class product_product(osv.osv):
-    _inherit = 'product.product'
-    _columns = {
-        'manufacturer' : fields.many2one('res.partner', 'Manufacturer'),
-        'manufacturer_pname' : fields.char('Manufacturer Product Name', size=64),
-        'manufacturer_pref' : fields.char('Manufacturer Product Code', size=64),
-        'attribute_ids': fields.one2many('product.manufacturer.attribute', 'product_id', 'Attributes'),
-    }
-
-class product_attribute(osv.osv):
-    _name = "product.manufacturer.attribute"
-    _description = "Product attributes"
-    _columns = {
-        'name' : fields.char('Attribute', size=64, required=True),
-        'value' : fields.char('Value', size=64),
-        'product_id': fields.many2one('product.product', 'Product', ondelete='cascade'),
-    }
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/product_manufacturer/product_manufacturer_view.xml b/addons/product_manufacturer/product_manufacturer_view.xml
deleted file mode 100644 (file)
index fb4aac9..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" ?>
-<openerp>
-    <data>
-
-        <record model="ir.ui.view" id="view_product_form_expiry">
-            <field name="name">product.normal.form</field>
-            <field name="model">product.product</field>
-            <field name="inherit_id" ref="product.product_normal_form_view" />
-            <field name="arch" type="xml">
-                <group name="procurement" position="inside">
-                    <group string="Manufacturer">
-                        <field name="manufacturer" context="{'default_supplier':True, 'default_customer':False}"/>
-                        <field name="manufacturer_pname"/>
-                        <field name="manufacturer_pref"/>
-                    </group>
-                    <group string="Attributes">
-                        <field name="attribute_ids" colspan="4" nolabel="1">
-                            <tree string="Product Attributes" editable="bottom">
-                                <field name="name"/>
-                                <field name="value"/>
-                            </tree>
-                        </field>
-                    </group>
-                </group>
-            </field>
-        </record>
-
-        <record model="ir.ui.view" id="product_manufacturer_attribute_tree_view">
-            <field name="name">product.manufacturer.attribute.tree</field>
-            <field name="model">product.manufacturer.attribute</field>
-            <field name="arch" type="xml">
-                <tree string="Product Attributes" editable="bottom">
-                    <field name="name"/>
-                    <field name="value"/>
-                </tree>
-            </field>
-        </record>
-        <record model="ir.ui.view" id="product_manufacturer_attribute_form_view">
-            <field name="name">product.manufacturer.attribute.form</field>
-            <field name="model">product.manufacturer.attribute</field>
-            <field name="arch" type="xml">
-                <form string="Product Template Name" version="7.0">
-                    <group>
-                        <field name="name"/>
-                        <field name="value"/>
-                    </group>
-                </form>
-            </field>
-        </record>
-
-    </data>
-</openerp>
-
diff --git a/addons/product_manufacturer/security/ir.model.access.csv b/addons/product_manufacturer/security/ir.model.access.csv
deleted file mode 100644 (file)
index aab8e07..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink\r
-access_product_manufacturer_attribute,product.manufacturer.attribute,model_product_manufacturer_attribute,base.group_user,1,1,1,1\r
index c0df0a8..651aa7d 100644 (file)
@@ -140,7 +140,7 @@ class project_task(osv.osv):
         return res
 
 class product_product(osv.osv):
-    _inherit = "product.product"
+    _inherit = "product.template"
     _columns = {
         'project_id': fields.many2one('project.project', 'Project', ondelete='set null',),
         'auto_create_task': fields.boolean('Create Task Automatically', help="Thick this option if you want to create a task automatically each time this product is sold"),
index 51ccc73..90ab668 100644 (file)
         </record>
         <record id="view_product_task_form" model="ir.ui.view">
             <field name="name">product.form.view.inherit</field>
-            <field name="model">product.product</field>
-            <field name="inherit_id" ref="product.product_normal_form_view"/>
+            <field name="model">product.template</field>
+            <field name="inherit_id" ref="stock.view_template_property_form"/>
             <field name="arch" type="xml">
-                <xpath expr="//group[@name='procurement_uom']" position="after">
+                <group name="procurement_uom" position="after">
                     <group string="Project Management Information" attrs="{'invisible': [('type', '!=', 'service')]}">
                         <field name="auto_create_task"/>
                         <field name="project_id" attrs="{'invisible':['|', ('type','!=','service'), ('auto_create_task', '=', False)]}"/>
                     </group>
-                </xpath>
+                </group>
             </field>
         </record>
         <record id="task_type_edit_mrp_inherit" model="ir.ui.view">
index 67b0764..22b1af1 100644 (file)
@@ -1358,8 +1358,14 @@ class product_template(osv.Model):
     _name = 'product.template'
     _inherit = 'product.template'
     
+    def _purchase_count(self, cr, uid, ids, field_name, arg, context=None):
+        res = dict.fromkeys(ids, 0)
+        for template in self.browse(cr, uid, ids, context=context):
+            res[template.id] = sum([p.purchase_count for p in template.product_variant_ids])
+        return res
     _columns = {
         'purchase_ok': fields.boolean('Can be Purchased', help="Specify if the product can be selected in a purchase order line."),
+        'purchase_count': fields.function(_purchase_count, string='# Purchases', type='integer'),
     }
     _defaults = {
         'purchase_ok': 1,
index 499308e..2f88439 100644 (file)
         </field>
     </record>
 
+
+    <record id="product_normal_action_puchased" model="ir.actions.act_window">
+        <field name="name">Products</field>
+        <field name="type">ir.actions.act_window</field>
+        <field name="res_model">product.product</field>
+        <field name="view_type">form</field>
+        <field name="view_mode">kanban,tree,form</field>
+        <field name="context">{"search_default_filter_to_purchase":1}</field>
+        <field name="view_id" ref="product.product_kanban_view"/>
+        <field name="search_view_id" ref="product.product_search_form_view"/>
+        <field name="help" type="html">
+          <p class="oe_view_nocontent_create">
+            Click to define a new product.
+          </p><p>
+            You must define a product for everything you purchase, whether
+            it's a physical product, a consumable or services you buy to
+            subcontractants.
+          </p><p>
+            The product form contains detailed information to improve the
+            purchase process: prices, procurement logistics, accounting data,
+            available suppliers, etc.
+          </p>
+        </field>
+    </record>
+
+
      <menuitem
           id="menu_procurement_management_pending_invoice"
           action="action_invoice_pending"
       <menuitem name="Products by Category" id="menu_product_by_category_purchase_form" action="product.product_category_action"
            parent="menu_procurement_management_product" sequence="10"/>
 
-      <menuitem name="Products" id="menu_procurement_partner_contact_form" action="product.product_normal_action_puchased"
+      <menuitem name="Products" id="menu_procurement_partner_contact_form" action="product_normal_action_puchased"
           parent="menu_procurement_management_product"/>
 
         <record model="ir.ui.view" id="purchase_order_calendar">
         <!-- Product Suppliers-->
         
         <record id="view_product_supplier_inherit" model="ir.ui.view">
-            <field name="name">product.normal.supplier.form.inherit</field>
-            <field name="model">product.product</field>
-            <field name="inherit_id" ref="product.product_normal_form_view"/>
+            <field name="name">product.template.supplier.form.inherit</field>
+            <field name="model">product.template</field>
+            <field name="inherit_id" ref="product.product_template_form_view"/>
             <field name="arch" type="xml">
                 <div name="options" position="inside">
-                    <field name="purchase_ok" attrs="{'readonly': [('is_only_child', '=', False)]}"/>
-                    <label for="purchase_ok"/>
+                    <div>
+                        <field name="purchase_ok" attrs="{'readonly': [('is_product_variant', '=', False)]}"/>
+                        <label for="purchase_ok"/>
+                    </div>
                 </div>
-                <group name="procurement" position="after">
-                     <separator string="Suppliers"/>
-                     <field name="seller_ids" context="{'uom_id': uom_id}"/>
-                </group>
             </field>
         </record>
 
-        <record id="product_search_form_view_purchase" model="ir.ui.view">
-            <field name="name">product.search.purchase.form</field>
-            <field name="model">product.product</field>
-            <field name="inherit_id" ref="product.product_search_form_view"/>
+        <record id="product_template_search_view_purchase" model="ir.ui.view">
+            <field name="name">product.template.search.purchase.form</field>
+            <field name="model">product.template</field>
+            <field name="inherit_id" ref="product.product_template_search_view"/>
             <field name="arch" type="xml">
                 <filter name="filter_to_sell" position="before">
                     <filter name="filter_to_purchase" string="To Purchase" icon="terp-accessories-archiver+" domain="[('purchase_ok', '=', 1)]"/>
             </field>
         </record>
 
-        <record id="product_template_search_view_purchase" model="ir.ui.view">
-            <field name="name">product.template.search.purchase</field>
-            <field name="model">product.template</field>
-            <field name="inherit_id" ref="product.product_template_search_view"/>
-            <field name="arch" type="xml">
-                <filter name="filter_to_sell" position="after">
-                    <filter name="filter_to_purchase" string="Can be Purchased" icon="terp-accessories-archiver+" domain="[('purchase_ok', '=', 1)]"/>
-                </filter>
-            </field>
-        </record>
-
-        <record id="view_template_purchase_ok_form" model="ir.ui.view">
-            <field name="name">product.template.purchase.ok.form.inherit</field>
-            <field name="model">product.template</field>
-            <field name="inherit_id" ref="product.product_template_form_view"/>
-            <field name="arch" type="xml">
-                <div name="options" position="inside">
-                    <field name="purchase_ok"/>
-                    <label for="purchase_ok"/>
-                </div>
-            </field>
-        </record>
         <record model="ir.actions.act_window" id="action_purchase_line_product_tree">
             <field name="context">{'search_default_product_id': active_id, 'default_product_id': active_id}</field>
             <field name="name">Purchases</field>
             <field name="res_model">purchase.order.line</field>
             <field name="view_id" ref="purchase_order_line_tree"/>
         </record>
+
         <record id="view_product_account_purchase_ok_form" model="ir.ui.view">
-            <field name="name">product.account.purchase.ok.form.inherit</field>
-            <field name="model">product.product</field>
-            <field name="inherit_id" ref="account.product_normal_form_view"/>
+            <field name="name">product.template.account.purchase.ok.form.inherit</field>
+            <field name="model">product.template</field>
+            <field name="inherit_id" ref="account.product_template_form_view"/>
             <field name="arch" type="xml">
                 <xpath expr="//div[@name='buttons']" position="inside">
                    <button class="oe_inline oe_stat_button" name="%(action_purchase_line_product_tree)d" type="action" 
index cdc56e3..5aecc39 100644 (file)
@@ -392,8 +392,8 @@ class purchase_order_line(osv.osv):
         return self.pool.get('purchase.requisition').generate_po(cr, uid, [tender_id], context=context)
 
 
-class product_product(osv.osv):
-    _inherit = 'product.product'
+class product_template(osv.osv):
+    _inherit = 'product.template'
 
     _columns = {
         'purchase_requisition': fields.boolean('Call for Bids', help="Check this box to generate Call for Bids instead of generating requests for quotation from procurement.")
index 2145052..862f6e0 100644 (file)
         parent="purchase.menu_procurement_management"
         action="action_purchase_requisition"/>
 
-    <record model="ir.ui.view" id="product_normal_form_view_inherit">
-        <field name="name">product.form.inherit</field>
-        <field name="model">product.product</field>
-        <field name="inherit_id" ref="stock.product_form_view_procurement_button"/>
+    <record model="ir.ui.view" id="product_template_form_view_inherit">
+        <field name="name">product.template.form.inherit</field>
+        <field name="model">product.template</field>
+        <field name="inherit_id" ref="stock.view_template_property_form"/>
         <field name="arch" type="xml">
             <field name="route_ids" position="after">
                 <field name="purchase_requisition"/>
index 17ce939..1159e18 100644 (file)
@@ -32,7 +32,7 @@
             <field name="arch" type="xml">
                 <field name="product_manager" position="after">
                     <field name="intrastat_id"
-                        attrs="{'readonly': [('is_only_child', '=', False)]}"/>
+                        attrs="{'readonly': [('is_product_variant', '=', False)]}"/>
                 </field>
             </field>
         </record>
index 88f7b24..94fd74e 100644 (file)
@@ -30,33 +30,6 @@ _logger = logging.getLogger(__name__)
 class sale_configuration(osv.TransientModel):
     _inherit = 'sale.config.settings'
 
-    def set_group_product_variant(self, cr, uid, ids, context=None):
-        """ This method is automatically called by res_config as it begins
-            with set. It is used to implement the 'one group or another'
-            behavior. We have to perform some group manipulation by hand
-            because in res_config.execute(), set_* methods are called
-            after group_*; therefore writing on an hidden res_config file
-            could not work.
-            If group_product_variant is checked: remove group_product_mono
-            from group_user, remove the users. Otherwise, just add
-            group_product_mono in group_user.
-            The inverse logic about group_product_variant is managed by the
-            normal behavior of 'group_product_variant' field.
-        """
-        def ref(xml_id):
-            mod, xml = xml_id.split('.', 1)
-            return self.pool['ir.model.data'].get_object(cr, uid, mod, xml, context)
-
-        for obj in self.browse(cr, uid, ids, context=context):
-            config_group = ref('product.group_product_mono')
-            base_group = ref('base.group_user')
-            if obj.group_product_variant:
-                base_group.write({'implied_ids': [(3, config_group.id)]})
-                config_group.write({'users': [(3, u.id) for u in base_group.users]})
-            else:
-                base_group.write({'implied_ids': [(4, config_group.id)]})
-        return True
-
     _columns = {
         'group_invoice_so_lines': fields.boolean('Generate invoices based on the sales order lines',
             implied_group='sale.group_invoice_so_lines',
@@ -82,9 +55,6 @@ Example: 10% for retailers, promotion of 5 EUR on this product, etc."""),
         'group_discount_per_so_line': fields.boolean("Allow setting a discount on the sales order lines",
             implied_group='sale.group_discount_per_so_line',
             help="Allows you to apply some discount per sales order line."),
-        'group_product_variant': fields.boolean("Support multiple variants per products  ",
-            implied_group='product.group_product_variant',
-            help="""Allow to manage several variants per product. As an example, if you  sell T-Shirts, for the same "Linux T-Shirt", you may have variants on  sizes or colors; S, M, L, XL, XXL."""),
         'module_warning': fields.boolean("Allow configuring alerts by customer or products",
             help='Allow to configure notification on products and trigger them when a user wants to sell a given product or a given customer.\n'
                  'Example: Product: this product is deprecated, do not purchase more than 5.\n'
index 641b161..e499af7 100644 (file)
                                 <field name="group_discount_per_so_line" class="oe_inline"/>
                                 <label for="group_discount_per_so_line"/>
                             </div>
-                            <div>
-                                <field name="group_product_variant" class="oe_inline"/>
-                                <label for="group_product_variant"/>
-                            </div>
                         </div>
                     </group>
                 </group>
index e3b59c0..70dece2 100644 (file)
@@ -880,7 +880,7 @@ class sale_order_line(osv.osv):
         'order_id': fields.many2one('sale.order', 'Order Reference', required=True, ondelete='cascade', select=True, readonly=True, states={'draft':[('readonly',False)]}),
         'name': fields.text('Description', required=True, readonly=True, states={'draft': [('readonly', False)]}),
         'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of sales order lines."),
-        'product_id': fields.many2one('product.product', 'Product', domain=[('sale_ok', '=', True)], change_default=True, readonly=True, states={'draft': [('readonly', False)]}),
+        'product_id': fields.many2one('product.product', 'Product', domain=[('sale_ok', '=', True)], change_default=True, readonly=True, states={'draft': [('readonly', False)]}, ondelete='restrict'),
         'invoice_lines': fields.many2many('account.invoice.line', 'sale_order_line_invoice_rel', 'order_line_id', 'invoice_id', 'Invoice Lines', readonly=True),
         'invoiced': fields.function(_fnct_line_invoiced, string='Invoiced', type='boolean',
             store={
index 0005e15..6a5c557 100644 (file)
     uom_id: product.product_uom_unit
     uom_po_id: product.product_uom_unit
 -
-  I create a bom for this product 
+  I create a bom for this product
 -
   !record {model: mrp.bom, id: mrp_bom_test1}:
     company_id: base.main_company
     name: My BOM
+    product_tmpl_id: product_manu_product_template
     product_id: product_manu
+    product_uom: product.product_uom_unit
     product_qty: 1.0
     type: normal
-    bom_lines:
-      - company_id: base.main_company
-        name: GrapWorks Software
-        product_id: product.product_product_44
+    bom_line_ids:
+      - product_id: product.product_product_44
+        product_uom: product.product_uom_unit
         product_qty: 1.0
 -
   And set routes on product to be MTO and manufacture
index 85e25b5..11b0af8 100644 (file)
     company_id: base.main_company
     name: Slider Mobile
     product_efficiency: 1.0
+    product_tmpl_id: product_product_slidermobile0_product_template
     product_id: product_product_slidermobile0
     product_qty: 1.0
     product_uom: product.product_uom_unit
-    product_uos_qty: 0.0
     sequence: 0.0
     type: normal
 -
index 5bb8e85..88dab71 100644 (file)
@@ -35,9 +35,9 @@ class TestMoveExplode(common.TransactionCase):
         self.mrp_bom = self.registry('mrp.bom')
 
         #product that has a phantom bom
-        self.product_bom_id = self.ir_model_data.get_object_reference(cr, uid, 'product', 'product_product_4')[1]
+        self.product_bom_id = self.ir_model_data.get_object_reference(cr, uid, 'product', 'product_product_3')[1]
         #bom with that product
-        self.bom_id = self.ir_model_data.get_object_reference(cr, uid, 'mrp', 'mrp_bom_24')[1]
+        self.bom_id = self.ir_model_data.get_object_reference(cr, uid, 'mrp', 'mrp_bom_9')[1]
         #partner agrolait
         self.partner_id = self.ir_model_data.get_object_reference(cr, uid, 'base', 'res_partner_1')[1]
 
@@ -55,5 +55,5 @@ class TestMoveExplode(common.TransactionCase):
         move_ids = [x.id for x in browse_move_ids]
         #we should have same amount of move as the component in the phatom bom
         bom = self.mrp_bom.browse(cr, uid, self.bom_id, context=context)
-        bom_component_length = self.mrp_bom._bom_explode(cr, uid, bom, 1, [])
+        bom_component_length = self.mrp_bom._bom_explode(cr, uid, bom, self.product_bom_id, 1, [])
         self.assertEqual(len(move_ids), len(bom_component_length[0]))
index 5e21055..6acc6a7 100644 (file)
@@ -84,7 +84,9 @@ Dashboard / Reports for Warehouse Management will include:
         'report/report_stock_view.xml',
         'res_config_view.xml',
         'views/report_package_barcode.xml',
-        'views/report_stockpicking.xml',
+        'views/report_lot_barcode.xml',
+        'views/report_location_barcode.xml',
+        'views/report_stockpicking.xml',    
         'views/report_stockinventory.xml',
         'views/stock.xml',
     ],
index 42a86a3..0a57457 100644 (file)
@@ -188,6 +188,7 @@ class procurement_order(osv.osv):
             'date': newdate,
             'date_expected': newdate,
             'propagate': procurement.rule_id.propagate,
+            'priority': procurement.priority,
         }
         return vals
 
@@ -288,7 +289,7 @@ class procurement_order(osv.osv):
             self._procure_orderpoint_confirm(cr, SUPERUSER_ID, use_new_cursor=False, company_id=company.id, context=context)
 
             #Search all confirmed stock_moves and try to assign them
-            confirmed_ids = move_obj.search(cr, uid, [('state', '=', 'confirmed')], limit=None, order='picking_priority desc, date_expected asc', context=context)
+            confirmed_ids = move_obj.search(cr, uid, [('state', '=', 'confirmed')], limit=None, order='priority desc, date_expected asc', context=context)
             for x in xrange(0, len(confirmed_ids), 100):
                 move_obj.action_assign(cr, uid, confirmed_ids[x:x + 100], context=context)
                 if use_new_cursor:
index 54353cd..0cf7df5 100644 (file)
@@ -168,9 +168,16 @@ class product_product(osv.osv):
             res.append(('id', 'in', ids))
         return res
 
+    def _product_available_text(self, cr, uid, ids, field_names=None, arg=False, context=None):
+        res = {}
+        for product in self.browse(cr, uid, ids, context=context):
+            res[product.id] = str(product.qty_available) +  _(" In Stock")
+        return res
+
     _columns = {
         'reception_count': fields.function(_stock_move_count, string="Reception", type='integer', multi='pickings'),
         'delivery_count': fields.function(_stock_move_count, string="Delivery", type='integer', multi='pickings'),
+        'qty_in_stock': fields.function(_product_available_text, type='char'),
         'qty_available': fields.function(_product_available, multi='qty_available',
             type='float', digits_compute=dp.get_precision('Product Unit of Measure'),
             string='Quantity On Hand',
@@ -222,14 +229,9 @@ class product_product(osv.osv):
                  "any of its children.\n"
                  "Otherwise, this includes goods leaving any Stock "
                  "Location with 'internal' type."),
-        'track_incoming': fields.boolean('Track Incoming Lots', help="Forces to specify a Serial Number for all moves containing this product and coming from a Supplier Location"),
-        'track_outgoing': fields.boolean('Track Outgoing Lots', help="Forces to specify a Serial Number for all moves containing this product and going to a Customer Location"),
-        'track_all': fields.boolean('Full Lots Traceability', help="Forces to specify a Serial Number on each and every operation related to this product"),
         'location_id': fields.dummy(string='Location', relation='stock.location', type='many2one'),
         'warehouse_id': fields.dummy(string='Warehouse', relation='stock.warehouse', type='many2one'),
         'orderpoint_ids': fields.one2many('stock.warehouse.orderpoint', 'product_id', 'Minimum Stock Rules'),
-        'route_ids': fields.many2many('stock.location.route', 'stock_route_product', 'product_id', 'route_id', 'Routes', domain="[('product_selectable', '=', True)]",
-                                    help="Depending on the modules installed, this will allow you to define the route of the product: whether it will be bought, manufactured, MTO/MTS,..."),
     }
 
     def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False):
@@ -275,25 +277,52 @@ class product_product(osv.osv):
                         res['fields']['qty_available']['string'] = _('Produced Qty')
         return res
 
-    def action_view_routes(self, cr, uid, ids, context=None):
-        route_obj = self.pool.get("stock.location.route")
-        act_obj = self.pool.get('ir.actions.act_window')
-        mod_obj = self.pool.get('ir.model.data')
-        product_route_ids = set()
-        for product in self.browse(cr, uid, ids, context=context):
-            product_route_ids |= set([r.id for r in product.route_ids])
-            product_route_ids |= set([r.id for r in product.categ_id.total_route_ids])
-        route_ids = route_obj.search(cr, uid, ['|', ('id', 'in', list(product_route_ids)), ('warehouse_selectable', '=', True)], context=context)
-        result = mod_obj.get_object_reference(cr, uid, 'stock', 'action_routes_form')
-        id = result and result[1] or False
-        result = act_obj.read(cr, uid, [id], context=context)[0]
-        result['domain'] = "[('id','in',[" + ','.join(map(str, route_ids)) + "])]"
-        return result
-
 class product_template(osv.osv):
     _name = 'product.template'
     _inherit = 'product.template'
+    
+    def _product_available(self, cr, uid, ids, name, arg, context=None):
+        res = dict.fromkeys(ids, 0)
+        for product in self.browse(cr, uid, ids, context=context):
+            res[product.id] = {
+                # "reception_count": sum([p.reception_count for p in product.product_variant_ids]),
+                # "delivery_count": sum([p.delivery_count for p in product.product_variant_ids]),
+                "qty_available": sum([p.qty_available for p in product.product_variant_ids]),
+                "virtual_available": sum([p.virtual_available for p in product.product_variant_ids]),
+                "incoming_qty": sum([p.incoming_qty for p in product.product_variant_ids]),
+                "outgoing_qty": sum([p.outgoing_qty for p in product.product_variant_ids]),
+            }
+        return res
+
+    def _search_product_quantity(self, cr, uid, obj, name, domain, context):
+        prod = self.pool.get("product.product")
+        res = []
+        for field, operator, value in domain:
+            #to prevent sql injections
+            assert field in ('qty_available', 'virtual_available', 'incoming_qty', 'outgoing_qty'), 'Invalid domain left operand'
+            assert operator in ('<', '>', '=', '<=', '>='), 'Invalid domain operator'
+            assert isinstance(value, (float, int)), 'Invalid domain right operand'
+
+            if operator == '=':
+                operator = '=='
+
+            product_ids = prod.search(cr, uid, [], context=context)
+            ids = []
+            if product_ids:
+                #TODO: use a query instead of this browse record which is probably making the too much requests, but don't forget
+                #the context that can be set with a location, an owner...
+                for element in prod.browse(cr, uid, product_ids, context=context):
+                    if eval(str(element[field]) + operator + str(value)):
+                        ids.append(element.id)
+            res.append(('product_variant_ids', 'in', ids))
+        return res
+
     _columns = {
+        'valuation':fields.selection([('manual_periodic', 'Periodical (manual)'),
+            ('real_time','Real Time (automated)'),], 'Inventory Valuation',
+            help="If real-time valuation is enabled for a product, the system will automatically write journal entries corresponding to stock moves." \
+                 "The inventory variation account set on the product category will represent the current inventory value, and the stock input and stock output account will hold the counterpart moves for incoming and outgoing products."
+            , required=True),
         'type': fields.selection([('product', 'Stockable Product'), ('consu', 'Consumable'), ('service', 'Service')], 'Product Type', required=True, help="Consumable: Will not imply stock management for this product. \nStockable product: Will imply stock management for this product."),
         'property_stock_procurement': fields.property(
             type='many2one',
@@ -317,12 +346,47 @@ class product_template(osv.osv):
         'loc_rack': fields.char('Rack', size=16),
         'loc_row': fields.char('Row', size=16),
         'loc_case': fields.char('Case', size=16),
+        'track_incoming': fields.boolean('Track Incoming Lots', help="Forces to specify a Serial Number for all moves containing this product and coming from a Supplier Location"),
+        'track_outgoing': fields.boolean('Track Outgoing Lots', help="Forces to specify a Serial Number for all moves containing this product and going to a Customer Location"),
+        'track_all': fields.boolean('Full Lots Traceability', help="Forces to specify a Serial Number on each and every operation related to this product"),
+        
+        # sum of product variant qty
+        # 'reception_count': fields.function(_product_available, multi='qty_available',
+        #     fnct_search=_search_product_quantity, type='float', string='Quantity On Hand'),
+        # 'delivery_count': fields.function(_product_available, multi='qty_available',
+        #     fnct_search=_search_product_quantity, type='float', string='Quantity On Hand'),
+        'qty_available': fields.function(_product_available, multi='qty_available',
+            fnct_search=_search_product_quantity, type='float', string='Quantity On Hand'),
+        'virtual_available': fields.function(_product_available, multi='qty_available',
+            fnct_search=_search_product_quantity, type='float', string='Quantity Available'),
+        'incoming_qty': fields.function(_product_available, multi='qty_available',
+            fnct_search=_search_product_quantity, type='float', string='Incoming'),
+        'outgoing_qty': fields.function(_product_available, multi='qty_available',
+            fnct_search=_search_product_quantity, type='float', string='Outgoing'),
+        
+        'route_ids': fields.many2many('stock.location.route', 'stock_route_product', 'product_id', 'route_id', 'Routes', domain="[('product_selectable', '=', True)]",
+                                    help="Depending on the modules installed, this will allow you to define the route of the product: whether it will be bought, manufactured, MTO/MTS,..."),
     }
 
     _defaults = {
         'sale_delay': 7,
+        'valuation': 'manual_periodic',
     }
 
+    def action_view_routes(self, cr, uid, ids, context=None):
+        route_obj = self.pool.get("stock.location.route")
+        act_obj = self.pool.get('ir.actions.act_window')
+        mod_obj = self.pool.get('ir.model.data')
+        product_route_ids = set()
+        for product in self.browse(cr, uid, ids, context=context):
+            product_route_ids |= set([r.id for r in product.route_ids])
+            product_route_ids |= set([r.id for r in product.categ_id.total_route_ids])
+        route_ids = route_obj.search(cr, uid, ['|', ('id', 'in', list(product_route_ids)), ('warehouse_selectable', '=', True)], context=context)
+        result = mod_obj.get_object_reference(cr, uid, 'stock', 'action_routes_form')
+        id = result and result[1] or False
+        result = act_obj.read(cr, uid, [id], context=context)[0]
+        result['domain'] = "[('id','in',[" + ','.join(map(str, route_ids)) + "])]"
+        return result
 
 class product_removal_strategy(osv.osv):
     _name = 'product.removal'
index aaecf4e..b482f2a 100644 (file)
@@ -2,70 +2,17 @@
 <openerp>
     <data>
 
-        <record id="product_search_form_view_stock" model="ir.ui.view">
-            <field name="name">product.search.stock.form</field>
-            <field name="model">product.product</field>
-            <field name="inherit_id" ref="product.product_search_form_view"/>
-            <field name="arch" type="xml">
-                <field name="pricelist_id" position="before">
-                    <field name="location_id" widget="selection" context="{'location': self}"/>
-                    <field name="warehouse_id" widget="selection" context="{'warehouse': self}"/>
-                </field>
-                <field name="categ_id" position="before">
-                    <separator/>
-                    <filter name="real_stock_available" string="Available Products" domain="[('qty_available','&gt;',0)]"/>
-                    <filter name="virtual_stock_available" string="Forecast Available Products" domain="[('virtual_available','&gt;',0)]"/>
-                    <filter name="real_stock_negative" string="Exhausted Stock" domain="[('qty_available','&lt;=',0)]"/>
-                    <filter name="virtual_stock_negative" string="Forecast Exhausted Stock" domain="[('virtual_available','&lt;=',0)]"/>
-                    
-                </field>
-            </field>
-        </record>
-
         <record id="view_stock_product_tree" model="ir.ui.view">
             <field name="name">product.stock.tree.inherit</field>
             <field name="model">product.product</field>
             <field name="inherit_id" ref="product.product_product_tree_view"/>
             <field name="arch" type="xml">
-
-                <field name="uom_id" position="after">
-                    <field name="qty_available"/>
-                    <field name="virtual_available"/>
-                </field>
                 <tree position="attributes">
                     <attribute name="colors">{'red':virtual_available&lt;0, 'blue':virtual_available&gt;=0 and state in ('draft', 'end', 'obsolete'), 'black':virtual_available&gt;=0 and state not in ('draft', 'end', 'obsolete')}</attribute>
                 </tree>
-            </field>
-        </record>
-
-        <record id="view_template_property_form" model="ir.ui.view">
-            <field name="name">product.template.stock.property.form.inherit</field>
-            <field name="model">product.template</field>
-            <field name="inherit_id" ref="product.product_template_form_view"/>
-            <field name="arch" type="xml">
-                <xpath expr="//group[@name='sale_condition']" position="inside">
-                    <label for="sale_delay"/>
-                    <div>
-                        <field name="sale_delay" attrs="{'readonly':[('sale_ok','=',False)]}" class="oe_inline" style="vertical-align:baseline"/> days
-                    </div>
-                </xpath>
-                <xpath expr="//group[@name='status']" position="after">
-                    <group name="store" string="Storage Location">
-                        <field name="loc_rack"/>
-                        <field name="loc_row"/>
-                        <field name="loc_case"/>
-                    </group>
-                </xpath>
-                <xpath expr="//group[@name='weight']" position="after">
-                    <group string="Counter-Part Locations Properties" groups="stock.group_locations">
-                        <field name="property_stock_procurement" domain="[('usage','=','procurement')]"/>
-                        <field name="property_stock_production" domain="[('usage','=','production')]"/>
-                        <field name="property_stock_inventory" domain="[('usage','=','inventory')]"/>
-                    </group>
-                </xpath>
-                <field name="product_manager" position="attributes" version="7.0">
-                    <attribute name="context">{'default_groups_ref': ['base.group_user', 'base.group_sale_manager', 'stock.group_stock_manager']}</attribute>
-                </field>
+                <tree position="inside">
+                    <field name="virtual_available" invisible="1"/>
+                </tree>
             </field>
         </record>
 
             </field>
         </record>
 
+        <!-- Product Template -->
+
+        <record id="product_template_search_form_view_stock" model="ir.ui.view">
+            <field name="name">product.template.search.stock.form</field>
+            <field name="model">product.template</field>
+            <field name="inherit_id" ref="product.product_template_search_view"/>
+            <field name="arch" type="xml">
+                <field name="product_variant_ids" position="before">
+                    <separator/>
+                    <filter name="real_stock_available" string="Available Products" domain="[('qty_available','&gt;',0)]"/>
+                    <filter name="virtual_stock_available" string="Forecast Available Products" domain="[('virtual_available','&gt;',0)]"/>
+                    <filter name="real_stock_negative" string="Exhausted Stock" domain="[('qty_available','&lt;=',0)]"/>
+                    <filter name="virtual_stock_negative" string="Forecast Exhausted Stock" domain="[('virtual_available','&lt;=',0)]"/>
+                </field>
+                <filter name="consumable" position="before">
+                   <filter string="Products" icon="terp-accessories-archiver" domain="[('type','=','product')]" help="Stockable products"/>
+                </filter>
+            </field>
+        </record>
+
+        <record id="view_template_property_form" model="ir.ui.view">
+            <field name="name">product.template.stock.property.form.inherit</field>
+            <field name="model">product.template</field>
+            <field name="inherit_id" ref="product.product_template_form_view"/>
+            <field name="arch" type="xml">
+                <group name="sale_condition" position="inside">
+                    <label for="sale_delay"/>
+                    <div>
+                        <field name="sale_delay" attrs="{'readonly':[('sale_ok','=',False)]}" class="oe_inline" style="vertical-align:baseline"/> days
+                    </div>
+                </group>
+                <group name="status" position="before">
+                    <group string="Stock and Expected Variations" attrs="{'invisible': [('type', '=', 'service')]}" groups="base.group_user">
+                        <label for="qty_available"/>
+                            <div>
+                                <field name="qty_available" class="oe_inline"/>
+                                <button name="%(action_view_change_product_quantity)d" string="⇒ Update"
+                                    type="action"
+                                    class="oe_link"/>
+                            </div>
+                        <label for="incoming_qty"/>
+                            <div>
+                                <field name="incoming_qty" class="oe_inline"/>
+                                <button string="⇒ Request Procurement" name="%(stock.act_make_procurement)d" type="action" class="oe_link"/>
+                            </div>
+                        <field name="virtual_available"/>
+                    </group>
+                </group>
+                <group name="status" position="after">
+                    <group name="store" string="Storage Location" attrs="{'invisible':[('type','=','service')]}">
+                        <field name="loc_rack"/>
+                        <field name="loc_row"/>
+                        <field name="loc_case"/>
+                    </group>
+                </group>
+                <group name="weight" position="before">
+                    <group name="store" groups="stock.group_locations" string="Counter-Part Locations Properties">
+                        <field name="property_stock_procurement" attrs="{'readonly':[('type','=','service')]}" domain="[('usage','=','procurement')]"/>
+                        <field name="property_stock_production" attrs="{'readonly':[('type','=','service')]}" domain="[('usage','=','production')]"/>
+                        <field name="property_stock_inventory"  attrs="{'readonly':[('type','=','service')]}" domain="[('usage','=','inventory')]"/>
+                    </group>
+                </group>
+                <field name="product_manager" position="attributes" version="7.0">
+                    <attribute name="context">{'default_groups_ref': ['base.group_user', 'base.group_sale_manager', 'stock.group_stock_manager']}</attribute>
+                </field>
+                <xpath expr="//div[@name='buttons']" position="inside">
+                    <button class="oe_inline oe_stat_button" name="action_view_routes" string="Routes" type="object" icon="fa-cogs"/>
+                </xpath>
+                <group name="procurement_uom" position="after" >
+                   <group string="Supply Chain Information" attrs="{'invisible': [('type', '=', 'service')]}" groups="base.group_user">
+                       <field name="route_ids" widget="many2many_checkboxes"/>
+                   </group>
+                </group>
+            </field>
+        </record>
+
+        <record model="ir.ui.view" id="product_template_kanban_stock_view">
+            <field name="name">Product Template Kanban Stock</field>
+            <field name="model">product.template</field>
+            <field name="inherit_id" ref="product.product_template_kanban_view"/>
+            <field name="arch" type="xml">
+                <field name="lst_price" position="after">
+                    <field name="type"/>
+                </field>
+                <ul position="inside">
+                    <li t-if="record.type.raw_value != 'service'">On hand: <field name="qty_available"/> <field name="uom_id"/></li>
+                    <li t-if="record.type.raw_value != 'service'">Forecasted: <field name="virtual_available"/> <field name="uom_id"/></li>
+                </ul>
+            </field>
+        </record>
+
+        <!-- Product Variant -->
+
+        <record id="product_search_form_view_stock" model="ir.ui.view">
+            <field name="name">product.search.stock.form</field>
+            <field name="model">product.product</field>
+            <field name="inherit_id" ref="product.product_search_form_view"/>
+            <field name="arch" type="xml">
+                <field name="pricelist_id" position="before">
+                    <field name="location_id" widget="selection" context="{'location': self}"/>
+                    <field name="warehouse_id" widget="selection" context="{'warehouse': self}"/>
+                </field>
+            </field>
+        </record>
+
         <record model="ir.ui.view" id="product_kanban_stock_view">
             <field name="name">Product Kanban Stock</field>
             <field name="model">product.product</field>
             <field name="inherit_id" ref="product.product_kanban_view"/>
             <field name="arch" type="xml">
-                <field name="list_price" position="after">
+                <field name="lst_price" position="after">
                     <field name="reception_count"/>
                     <field name="delivery_count"/>
                 </field>
                         <t t-esc="record.delivery_count.value"/> Delivery
                     </a>
                 </xpath>
-                <ul position="inside">
-                    <li t-if="record.type.raw_value != 'service'">On hand: <field name="qty_available"/> <field name="uom_id"/></li>
-                    <li t-if="record.type.raw_value != 'service'">Forecasted: <field name="virtual_available"/> <field name="uom_id"/></li>
-                </ul>
             </field>
         </record>
 
+        <record model="ir.ui.view" id="product_form_view_procurement_button">
+            <field name="name">product.product.procurement</field>
+            <field name="model">product.product</field>
+            <field name="inherit_id" ref="product.product_normal_form_view"/>
+            <field name="arch" type="xml">
+                <group name="status" position="before" version="7.0">
+                    <group name="lot" groups="stock.group_tracking_lot,stock.group_production_lot" string="Lots">
+                        <field name="track_all" groups="stock.group_production_lot"/>
+                        <field name="track_incoming" groups="stock.group_production_lot" attrs="{'invisible': [('track_all', '=', True)]}"/>
+                        <field name="track_outgoing" groups="stock.group_production_lot" attrs="{'invisible': [('track_all', '=', True)]}"/>
+                    </group>
+                </group>
+                <xpath expr="//div[@name='buttons']" position="inside">
+                   <button class="oe_stat_button"
+                           name="%(product_open_quants)d"
+                           icon="fa-bank"
+                           type="action"  attrs="{'invisible':[('type', '=', 'service')]}" groups="stock.group_locations">
+                    <div><field name="qty_in_stock"/></div>
+                    </button>
+                   <button class="oe_inline oe_stat_button" string="Moves" name= "%(act_product_stock_move_open)d" type="action" attrs="{'invisible':[('type', '=', 'service')]}" groups="stock.group_stock_user" icon="fa-arrows-v"/>
+                   <button class="oe_inline oe_stat_button" name="%(product_open_orderpoint)d" type="action" 
+                        attrs="{'invisible':[('type', '=', 'service')]}" icon="fa-pinterest" string="Reordering Rules"/>
+                </xpath>
+            </field>
+        </record>
     </data>
 </openerp>
index 976e835..f44d354 100644 (file)
         <field name="global" eval="True"/>
         <field name="domain_force">['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])]</field>
     </record>
+    
+    <record model="ir.rule" id="stock_picking_rule">
+        <field name="name">Stock Picking Type multi-company</field>
+        <field name="model_id" search="[('model','=','stock.picking.type')]" model="ir.model"/>
+        <field name="global" eval="True"/>
+        <field name="domain_force">['|', ('warehouse_id', '=', False), '|',('warehouse_id.company_id','=',False),('warehouse_id.company_id','child_of',[user.company_id.id])]</field>
+    </record>
+    
+    
 
     <record model="ir.rule" id="stock_warehouse_comp_rule">
         <field name="name">Warehouse multi-company</field>
index 774985e..e640c6d 100644 (file)
@@ -29,6 +29,7 @@ from openerp.tools.translate import _
 from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT, DEFAULT_SERVER_DATE_FORMAT
 from openerp import SUPERUSER_ID
 import openerp.addons.decimal_precision as dp
+from openerp.addons.procurement import procurement
 import logging
 
 
@@ -622,6 +623,12 @@ class stock_picking(osv.osv):
             move_ids = [move.id for move in self.browse(cr, uid, id, context=context).move_lines]
             move_obj.write(cr, uid, move_ids, {'date_expected': value}, context=context)
 
+    def _set_priority(self, cr, uid, id, field, value, arg, context=None):
+        move_obj = self.pool.get("stock.move")
+        if value:
+            move_ids = [move.id for move in self.browse(cr, uid, id, context=context).move_lines]
+            move_obj.write(cr, uid, move_ids, {'priority': value}, context=context)
+
     def get_min_max_date(self, cr, uid, ids, field_name, arg, context=None):
         """ Finds minimum and maximum dates for picking.
         @return: Dictionary of values
@@ -634,16 +641,18 @@ class stock_picking(osv.osv):
         cr.execute("""select
                 picking_id,
                 min(date_expected),
-                max(date_expected)
+                max(date_expected),
+                max(priority)
             from
                 stock_move
             where
                 picking_id IN %s
             group by
                 picking_id""", (tuple(ids),))
-        for pick, dt1, dt2 in cr.fetchall():
+        for pick, dt1, dt2, prio in cr.fetchall():
             res[pick]['min_date'] = dt1
             res[pick]['max_date'] = dt2
+            res[pick]['priority'] = prio
         return res
 
     def create(self, cr, user, vals, context=None):
@@ -759,7 +768,9 @@ class stock_picking(osv.osv):
                 * Transferred: has been processed, can't be modified or cancelled anymore\n
                 * Cancelled: has been cancelled, can't be confirmed anymore"""
         ),
-        'priority': fields.selection([('0', 'Low'), ('1', 'Normal'), ('2', 'High')], states={'done': [('readonly', True)], 'cancel': [('readonly', True)]}, string='Priority', required=True),
+        'priority': fields.function(get_min_max_date, multi="min_max_date", fnct_inv=_set_priority, type='selection', selection=procurement.PROCUREMENT_PRIORITIES, string='Priority',
+                                    store={'stock.move': (_get_pickings, ['priority'], 20)}, states={'done': [('readonly', True)], 'cancel': [('readonly', True)]}, select=1, help="Priority for this picking. Setting manually a value here would set it as priority for all the moves", 
+                                    track_visibility='onchange', required=True),
         'min_date': fields.function(get_min_max_date, multi="min_max_date", fnct_inv=_set_min_date,
                  store={'stock.move': (_get_pickings, ['date_expected'], 20)}, type='datetime', states={'done': [('readonly', True)], 'cancel': [('readonly', True)]}, string='Scheduled Date', select=1, help="Scheduled time for the first part of the shipment to be processed. Setting manually a value here would set it as expected date for all the stock moves.", track_visibility='onchange'),
         'max_date': fields.function(get_min_max_date, multi="min_max_date",
@@ -1591,7 +1602,7 @@ class stock_move(osv.osv):
 
     _columns = {
         'name': fields.char('Description', required=True, select=True),
-        'priority': fields.selection([('0', 'Not urgent'), ('1', 'Urgent')], 'Priority'),
+        'priority': fields.selection(procurement.PROCUREMENT_PRIORITIES, 'Priority'),
         'create_date': fields.datetime('Creation Date', readonly=True, select=True),
         'date': fields.datetime('Date', required=True, select=True, help="Move date: scheduled date until move is done, then date of actual move processing", states={'done': [('readonly', True)]}),
         'date_expected': fields.datetime('Expected Date', states={'done': [('readonly', True)]}, required=True, select=True, help="Scheduled date for the processing of this move"),
@@ -1628,7 +1639,6 @@ class stock_move(osv.osv):
         'move_orig_ids': fields.one2many('stock.move', 'move_dest_id', 'Original Move', help="Optional: previous stock move when chaining them", select=True),
 
         'picking_id': fields.many2one('stock.picking', 'Reference', select=True, states={'done': [('readonly', True)]}),
-        'picking_priority': fields.related('picking_id', 'priority', type='selection', selection=[('0', 'Low'), ('1', 'Normal'), ('2', 'High')], string='Picking Priority', store={'stock.picking': (_get_move_ids, ['priority'], 10)}),
         'note': fields.text('Notes'),
         'state': fields.selection([('draft', 'New'),
                                    ('cancel', 'Cancelled'),
@@ -1774,6 +1784,7 @@ class stock_move(osv.osv):
             'group_id': group_id,
             'route_ids': [(4, x.id) for x in move.route_ids],
             'warehouse_id': move.warehouse_id and move.warehouse_id.id or False,
+            'priority': move.priority,
         }
 
     def _push_apply(self, cr, uid, moves, context=None):
@@ -1981,7 +1992,7 @@ class stock_move(osv.osv):
             values = {
                 'origin': move.origin,
                 'company_id': move.company_id and move.company_id.id or False,
-                'move_type': move.group_id and move.group_id.move_type or 'one',
+                'move_type': move.group_id and move.group_id.move_type or 'direct',
                 'partner_id': move.partner_id.id or False,
                 'picking_type_id': move.picking_type_id and move.picking_type_id.id or False,
             }
@@ -2743,7 +2754,7 @@ class stock_warehouse(osv.osv):
 
     _columns = {
         'name': fields.char('Warehouse Name', size=128, required=True, select=True),
-        'company_id': fields.many2one('res.company', 'Company', required=True, select=True),
+        'company_id': fields.many2one('res.company', 'Company', required=True, readonly=True, select=True),
         'partner_id': fields.many2one('res.partner', 'Address'),
         'view_location_id': fields.many2one('stock.location', 'View Location', required=True, domain=[('usage', '=', 'view')]),
         'lot_stock_id': fields.many2one('stock.location', 'Location Stock', required=True, domain=[('usage', '=', 'internal')]),
@@ -3615,19 +3626,11 @@ class stock_package(osv.osv):
         return True
 
     def action_print(self, cr, uid, ids, context=None):
-        if context is None:
-            context = {}
-        datas = {
-            'ids': context.get('active_id') and [context.get('active_id')] or ids,
-            'model': 'stock.quant.package',
-            'form': self.read(cr, uid, ids)[0]
-        }
-        return {
-            'type': 'ir.actions.report.xml',
-            'report_name': 'stock.quant.package.barcode',
-            'datas': datas
-        }
-
+        context = context or {}
+        context['active_ids'] = ids
+        return self.pool.get("report").get_action(cr, uid, ids, 'stock.report_package_barcode', context=context)
+    
+    
     def unpack(self, cr, uid, ids, context=None):
         quant_obj = self.pool.get('stock.quant')
         for package in self.browse(cr, uid, ids, context=context):
index f5c9806..e88aa04 100644 (file)
@@ -20,6 +20,7 @@
         />
         <report auto="False" id="report_product_history" model="product.product" name="stock.product.history" string="Stock Level Forecast"/>
         <report id="action_report_quant_package_barcode" model="stock.quant.package" report_type="qweb-pdf" name="stock.report_package_barcode" string="Package BarCode" file="stock.report_package_barcode"/>
-
+        <report id="action_report_location_barcode" model="stock.location" report_type="qweb-pdf" name="stock.report_location_barcode" string="Location BarCode" file="stock.report_location_barcode"/>
+        <report id="action_report_lot_barcode" model="stock.production.lot" report_type="qweb-pdf" name="stock.report_lot_barcode" string="Lot BarCode" file="stock.report_lot_barcode"/>
     </data>
 </openerp>
index 06aba6e..e94231b 100644 (file)
             action="product.product_category_action_form" id="menu_product_category_config_stock"
             parent="stock.menu_product_in_config_stock" sequence="0"/>
         <menuitem
-            action="product.product_variant_action" id="menu_product_variant_config_stock"
-            parent="stock.menu_product_in_config_stock" groups="product.group_product_variant" sequence="2"/>
+            action="product.product_normal_action" id="menu_product_variant_config_stock"
+            parent="stock.menu_product_in_config_stock" sequence="2"/>
         <menuitem
             action="product.product_template_action" id="menu_product_template_config_stock"
-            parent="stock.menu_product_in_config_stock" groups="product.group_product_variant" sequence="1"/>
+            parent="stock.menu_product_in_config_stock" sequence="1"/>
         <menuitem
             action="product.product_ul_form_action" groups="product.group_stock_packaging"
             id="menu_product_packaging_stock_action" parent="stock.menu_product_in_config_stock" sequence="3"/>
             <field name="arch" type="xml">
                 <form string="Stock Location" version="7.0">
                     <div class="oe_right oe_button_box" name="buttons">
-                        <button string="Current Stock" name="%(location_open_quants)d" type="action"/>
+                        <button string="Current Stock" 
+                                class="oe_stat_button" 
+                                icon="fa-building-o" name="%(location_open_quants)d" type="action"
+                                context="{'search_default_internal_loc': 1}"/>
                     </div>
                     <label for="name" class="oe_edit_only"/>
                     <h1><field name="name"/></h1>
                 <form string="Warehouse" version="7.0">
                     <sheet>
                         <div class="oe_right oe_button_box">                        
-                            <button name="view_all_routes_for_wh" string="View Warehouse Routes" type="object"/> 
+                            <button name="view_all_routes_for_wh" 
+                                    string="Routes"
+                                    icon="fa-refresh"
+                                    class="oe_stat_button" 
+                                    type="object"/> 
                         </div>
                         <label for="name" class="oe_edit_only"/>
                         <h1><field name="name"/></h1>
                             <field name="pack_operation_exist" invisible="1"/>
                             <field name="note" placeholder="Add an internal note..." class="oe_inline"/>
                         </page>
+                        <page string="Operations Done" attrs="{'invisible': ['|', ('state','!=','done'), ('pack_operation_ids','=',[])]}">
+                            <field name="pack_operation_ids">
+                                <tree editable="top">   
+                                    <field name="location_id"/>
+                                    <field name="product_id"/>
+                                    <field name="product_uom_id" groups="product.group_uom"/>
+                                    <field name="lot_id" domain="[('product_id','=?', product_id)]" context="{'product_id': product_id}" groups="stock.group_production_lot"/>
+                                    <field name="package_id" groups="stock.group_tracking_lot"/>
+                                    <field name="owner_id" groups="stock.group_tracking_owner"/>
+                                    <field name="product_qty" attrs="{'required': [('product_id', '!=', False)]}"/>
+                                    <field name="location_dest_id"/>
+                                    <field name="result_package_id" groups="stock.group_tracking_lot"/>
+                                </tree>
+                            </field>
+                        </page>
                         <page string="Additional Info">
                             <group string="General Informations">
                                 <group>
                             </group>
                             <group name="main_grp_col2">
                                 <field name="picking_type_id"/>
-                                <field name="picking_priority"/>
+                                <field name="priority"/>
                                 <field name="company_id" groups="base.group_multi_company" widget="selection"/>
                                 <field name="date_expected" on_change="onchange_date(date,date_expected)" attrs="{'invisible': [('state', '=', 'done')]}"/>
                                 <field name="date" attrs="{'invisible': [('state', '!=', 'done')]}"/>
             <field name="res_model">stock.warehouse.orderpoint</field>
         </record>
         <record model="ir.actions.act_window" id="product_open_quants">
-            <field name="context">{'search_default_product_id': active_id, 'search_default_locationgroup':1}</field>
+            <field name="context">{'search_default_internal_loc': 1, 'search_default_product_id': active_id, 'search_default_locationgroup':1}</field>
             <field name="name">Quants</field>
             <field name="res_model">stock.quant</field>
         </record>
-
-<!-->
-        <record model="ir.ui.view" id="product_template_form_view_procurement">
-            <field name="name">product.template.procurement</field>
-            <field name="model">product.product</field>
-            <field name="inherit_id" ref="product.product_template_form_view"/>
-            <field name="arch" type="xml">
-                <xpath expr="//field[@name='standard_price']" position="after" >
-                   <group name="procurement_help" col="1" groups="base.group_user">
-                       <field name="route_ids" widget="many2many_tags"/>
-                   </group>
-                </xpath>
-            </field>
-        </record>-->
-        <record id="product_search_form_view_procurment" model="ir.ui.view">
-            <field name="name">product.search.procurment.form</field>
-            <field name="model">product.product</field>
-            <field name="inherit_id" ref="product.product_search_form_view"/>
-            <field name="arch" type="xml">
-                <filter name="consumable" position="before">
-                   <filter string="Products" icon="terp-accessories-archiver" domain="[('type','=','product')]" help="Stockable products"/>
-                </filter>
-            </field>
-        </record>
-
-        <record id="view_normal_procurement_locations_form" model="ir.ui.view">
-            <field name="name">product.normal.procurement.locations.inherit</field>
-            <field name="model">product.product</field>
-            <field name="inherit_id" ref="product.product_normal_form_view"/>
-            <field name="arch" type="xml">
-                
-                <xpath expr="//group[@name='procurement_uom']" position="after" >
-                   <newline/>
-                   <group string="Supply Chain Information" attrs="{'invisible': [('type', '=', 'service')]}">
-                       <field name="route_ids" widget="many2many_checkboxes"/>
-                   </group>
-                   <newline/>
-                </xpath>
-                
-                <xpath expr="//div[@name='buttons']" position="inside">
-                   <button string="Current Stock" name="%(product_open_quants)d" type="action"  attrs="{'invisible':[('type', '=', 'service')]}" groups="stock.group_locations"/>
-                   <button string="Moves" name= "%(act_product_stock_move_open)d" type="action" attrs="{'invisible':[('type', '=', 'service')]}" groups="stock.group_stock_user"/>
-                   <button class="oe_inline oe_stat_button" name="%(product_open_orderpoint)d" type="action" 
-                        attrs="{'invisible':[('type', '=', 'service')]}" icon="fa-pinterest" string="Reordering Rules"/>
-                </xpath>
-                
-                <xpath expr="//group[@string='Sale Conditions']" position="inside">
-                    <label for="sale_delay"/>
-                        <div>
-                            <field name="sale_delay" class="oe_inline"/> days
-                        </div>
-                </xpath>                
-
-                <xpath expr="//group[@name='status']" position="after" version="7.0">
-                    <group name="store" string="Storage Location" attrs="{'invisible':[('type','=','service')]}">
-                        <field name="loc_rack"/>
-                        <field name="loc_row"/>
-                        <field name="loc_case"/>
-                    </group>
-                </xpath>
-                
-                <xpath expr="//group[@name='Weights']" position="before">
-                    <group name="store" groups="stock.group_locations" string="Counter-Part Locations Properties">
-                        <field name="property_stock_procurement" attrs="{'readonly':[('type','=','service')]}" domain="[('usage','=','procurement')]"/>
-                        <field name="property_stock_production" attrs="{'readonly':[('type','=','service')]}" domain="[('usage','=','production')]"/>
-                        <field name="property_stock_inventory"  attrs="{'readonly':[('type','=','service')]}" domain="[('usage','=','inventory')]"/>
-                    </group>
-                </xpath>
-
-            </field>
-        </record>
-
-        <record model="ir.ui.view" id="product_form_view_procurement_button">
-            <field name="name">product.product.procurement</field>
-            <field name="model">product.product</field>
-            <field name="inherit_id" ref="view_normal_procurement_locations_form"/>
-            <field name="arch" type="xml">
-                <group name="status" position="before" version="7.0">
-                    <group string="Stock and Expected Variations" attrs="{'invisible': [('type', '=', 'service')]}" groups="base.group_user">
-                        <label for="qty_available"/>
-                            <div>
-                                <field name="qty_available" class="oe_inline"/>
-                                <button name="%(action_view_change_product_quantity)d" string="⇒ Update"
-                                    type="action"
-                                    class="oe_link"/>
-                            </div>
-                        <label for="incoming_qty"/>
-                        <div>
-                            <field name="incoming_qty" class="oe_inline"/>
-                            <button string="⇒ Request Procurement" name="%(act_make_procurement)d" type="action" class="oe_link"/>
-                        </div>
-                        <field name="outgoing_qty" class="oe_inline"/>
-                        <field name="virtual_available" class="oe_inline"/>
-                    </group>
-                    <group name="lot" groups="stock.group_tracking_lot,stock.group_production_lot" string="Lots">
-                        <field name="track_all" groups="stock.group_production_lot"/>
-                        <field name="track_incoming" groups="stock.group_production_lot" attrs="{'invisible': [('track_all', '=', True)]}"/>
-                        <field name="track_outgoing" groups="stock.group_production_lot" attrs="{'invisible': [('track_all', '=', True)]}"/>
-                    </group>
-                </group>
-            </field>
-        </record>
         
         <record model="ir.ui.view" id="view_quant_package_form">
             <field name="name">stock.quant.package.form</field>
         <menuitem action="action_routes_form" id="menu_stock_routes"
             parent="stock.menu_stock_configuration" sequence="11" />
 
-        <record id="view_product_procurement_rule_form" model="ir.ui.view">
-            <field name="name">product.template.procurement.rule.inherit</field>
-            <field name="model">product.product</field>
-            <field name="inherit_id" ref="product.product_normal_form_view"/>
-            <field name="arch" type="xml">
-                <xpath expr="//div[@name='buttons']" position="inside">
-                    <button name="action_view_routes" string="Routes" type="object"  />
-                </xpath>
-            </field>
-        </record>
-
         <record id="do_view_pickings" model="ir.actions.act_window">
             <field name="name">Pickings for Groups</field>
             <field name="res_model">stock.picking</field>
diff --git a/addons/stock/views/report_location_barcode.xml b/addons/stock/views/report_location_barcode.xml
new file mode 100644 (file)
index 0000000..d9065e0
--- /dev/null
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+<data>
+<template id="report_location_barcode">
+    <t t-call="report.html_container">
+        <t t-foreach="docs" t-as="o">
+            <t>
+                <div class="page">
+                    <div class="oe_structure"/>
+                    <div class="row">
+                        <div class="col-xs-4">
+                            <img class="image" t-att-src="'data:image/png;base64,%s' % res_company.logo" style="border:auto;"/>
+                        </div>
+                    </div>
+                    <div class="row">
+                        <div class="col-xs-6 mt6">
+                            <table class="table table-condensed" style="border-bottom: 3px solid black !important;"><thead><th> </th></thead></table>
+                            <img t-if="not o.loc_barcode" t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s' % ('Code128', o.name, 600, 100)" style="width:300px;height:50px"/>
+                            <img t-if="o.loc_barcode" t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s' % ('Code128', o.loc_barcode, 600, 100)" style="width:300px;height:50px"/>
+                            <p class="text-center" t-if="not o.loc_barcode" t-field="o.name"></p>
+                            <p class="text-center" t-if="o.loc_barcode" t-field="o.loc_barcode"></p>
+                        </div>
+                    </div>
+                </div>
+            </t>
+        </t>
+    </t>
+</template>
+</data>
+</openerp>
\ No newline at end of file
diff --git a/addons/stock/views/report_lot_barcode.xml b/addons/stock/views/report_lot_barcode.xml
new file mode 100644 (file)
index 0000000..e89f51e
--- /dev/null
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+<data>
+<template id="report_lot_barcode">
+    <t t-call="report.html_container">
+        <t t-foreach="docs" t-as="o">
+            <t>
+                <div class="page">
+                    <div class="oe_structure"/>
+                    <div class="row">
+                        <div class="col-xs-8">
+                            <table class="table table-condensed" style="border-bottom: 0px solid white !important;">
+                                <thead>
+                                    <tr>
+                                        <th>Product</th>
+                                        <th>Lot</th>
+                                    </tr>
+                                </thead>
+                                <tbody>
+                                    <td>
+                                       <span  t-field="o.product_id.name"/>
+                                    </td>
+                                    <td>
+                                        <span t-field="o.name"/>
+                                    </td>
+                                </tbody>
+                            </table>
+                        </div>
+                        <div class="col-xs-4">
+                            <img class="image" t-att-src="'data:image/png;base64,%s' % res_company.logo" style="border:auto;"/>
+                        </div>
+                    </div>
+                    <div class="row">
+                        <div class="col-xs-12 mt32">
+                            <table class="table table-condensed" style="border-bottom: 3px solid black !important;"><thead><th> </th></thead></table>
+                            <img t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s' % ('Code128', o.name, 600, 100)" style="width:300px;height:50px"/>
+                            <p class="text-center" t-field="o.name"></p>
+                        </div>
+                    </div>
+                </div>
+            </t>
+        </t>
+    </t>
+</template>
+</data>
+</openerp>
\ No newline at end of file
index 841486e..330dcd9 100644 (file)
@@ -40,7 +40,7 @@
                     <div class="row">
                         <div class="col-xs-12 mt32">
                             <table class="table table-condensed" style="border-bottom: 3px solid black !important;"><thead><th> </th></thead></table>
-                            <img t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s' % ('Standard39', o.name, 800, 40)" style="width:100%;"/>
+                            <img t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s' % ('Code128', o.name, 600, 100)" style="width:300px;height:50px"/>
                             <p class="text-center" t-field="o.name"></p>
                         </div>
                     </div>
index 1328cb7..0b67ba9 100644 (file)
@@ -7,7 +7,7 @@
                     <t t-call="report.external_layout">
                         <div class="page">
                             <div class="row"><div class="col-xs-4 pull-right">
-                            <img t-att-src="'/report/barcode/Standard39/%s' % o.name"/>
+                            <img t-att-src="'/report/barcode/Code128/%s' % o.name"/>
                             </div></div>
                              <div t-if="o.picking_type_id.code=='incoming'">
                                  <span><strong>Supplier Address:</strong></span>
                                     </t>
                                     <td>
                                         <span t-if="pack_operation.lot_id">
-                                            <img t-att-src="'/report/barcode/Standard39/%s' % pack_operation.lot_id.name"/>
+                                            <img t-att-src="'/report/barcode/Code128/%s' % pack_operation.lot_id.name"/>
                                         </span>
                                         <span t-if="pack_operation.product_id and not pack_operation.lot_id and pack_operation.product_id.ean13">
                                             <img t-att-src="'/report/barcode/EAN13/%s' % pack_operation.product_id.ean13"/>
                                         </span>
                                         <span t-if="pack_operation.package_id and not pack_operation.product_id">
-                                            <img t-att-src="'/report/barcode/Standard39/%s' % pack_operation.package_id.name"/>
+                                            <img t-att-src="'/report/barcode/Code128/%s' % pack_operation.package_id.name"/>
                                         </span>
                                     </td>
                                     <t t-if="o.picking_type_id.code != 'outgoing'"><td><span t-field="pack_operation.location_dest_id"/>
index e1e4146..32ef9c6 100644 (file)
             <field name="model">product.template</field>
             <field name="inherit_id" ref="product.product_template_form_view"/>
             <field name="arch" type="xml">
-                <group name="sale_condition" position="inside">
-                    <field name="sale_delay" attrs="{'readonly':[('sale_ok','=',False)]}"/>
-                </group>
-                <group name="procurement_uom" position="after">
-                    <group name="store" string="Storage Location">
-                        <field name="loc_rack"/>
-                        <field name="loc_row"/>
-                        <field name="loc_case"/>
-                    </group>
-                </group>
                 <xpath expr="//group[@name='weight']" position="after">
                     <group string="Accounting Entries">
                         <field name="property_stock_account_input" domain="[('type','&lt;&gt;','view'),('type','&lt;&gt;','consolidation')]"/>
             <field name="inherit_id" ref="product.product_normal_form_view"/>
             <field name="arch" type="xml">
                 <field name="standard_price" position="replace" version="7.0">
-                    <field name="cost_method" groups="stock_account.group_inventory_valuation" attrs="{'readonly': [('is_only_child', '=', False)]}"/>
+                    <field name="cost_method" groups="stock_account.group_inventory_valuation"/>
                     <label string="Cost Price" for="standard_price" align="1.0" groups="base.group_user"/>
                     <div groups="base.group_user">
-                        <field name="standard_price" attrs="{'readonly':['|', ('is_only_child', '=', False), '&amp;', ('valuation','=','real_time'), ('cost_method', 'in', ['standard', 'average'])]}" nolabel="1"/>
+                        <field name="standard_price" attrs="{'readonly':['&amp;', ('valuation','=','real_time'), ('cost_method', 'in', ['standard', 'average'])]}" nolabel="1"/>
                         <button name="%(action_view_change_standard_price)d" string="- update"
-                            type="action" attrs="{'invisible':['|', '|', ('is_only_child', '=', False), ('valuation','!=', 'real_time'), ('cost_method', 'not in', ['standard', 'average'])]}"
+                            type="action" attrs="{'invisible':['|', ('valuation','!=', 'real_time'), ('cost_method', 'not in', ['standard', 'average'])]}"
                             class="oe_link" groups="stock_account.group_inventory_valuation"/>
                     </div>
                 </field>
index 97ecaec..7c30c4a 100644 (file)
@@ -8,6 +8,15 @@
         <field name="name">Manage Inventory Valuation and Costing Methods</field>
         <field name="category_id" ref="base.module_category_hidden"/>
     </record>
+    
+    
+    <record model="ir.rule" id="stock_history_rule">
+        <field name="name">Stock History multi-company</field>
+        <field name="model_id" search="[('model','=','stock.history')]" model="ir.model"/>
+        <field name="global" eval="True"/>
+        <field name="domain_force">['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])]</field>
+    </record>
+    
 </data>
 </openerp>
 
index 6c6a20e..545bdc0 100644 (file)
@@ -281,8 +281,6 @@ class stock_move(osv.osv):
             #adapt standard price on incomming moves if the product cost_method is 'average'
             if (move.location_id.usage == 'supplier') and (move.product_id.cost_method == 'average'):
                 product = move.product_id
-                company_currency_id = move.company_id.currency_id.id
-                ctx = {'currency_id': company_currency_id}
                 product_avail = product.qty_available
                 if product.qty_available <= 0:
                     new_std_price = move.price_unit
index 93e2ec3..ebcb65a 100644 (file)
@@ -29,8 +29,8 @@ SPLIT_METHOD = [
     ('by_volume', 'By Volume'),
 ]
 
-class product_product(osv.osv):
-    _inherit = "product.product"
+class product_template(osv.osv):
+    _inherit = "product.template"
 
     _columns = {
         'landed_cost_ok': fields.boolean('Can constitute a landed cost'),
index f3db158..7003971 100644 (file)
@@ -3,21 +3,23 @@
     <data>
 
         <record id="view_product_landed_cost_form" model="ir.ui.view">
-            <field name="name">product.product.landed.cost.form</field>
-            <field name="model">product.product</field>
-            <field name="inherit_id" ref="product.product_normal_form_view"/>
+            <field name="name">product.template.landed.cost.form</field>
+            <field name="model">product.template</field>
+            <field name="inherit_id" ref="product.product_template_form_view"/>
             <field name="arch" type="xml">
-                <div name="options" position="after">
-                    <field name="landed_cost_ok"/>
-                    <label for="landed_cost_ok"/>
+                <div name="options" position="inside">
+                    <div>
+                        <field name="landed_cost_ok"/>
+                        <label for="landed_cost_ok"/>
+                    </div>
                 </div>
-                <xpath expr="//group[@name='properties']" position="before">
+                <group name="properties" position="before">
                     <group attrs="{'invisible':[('landed_cost_ok','=',False)]}">
                         <group colspan="2" col="2">
                             <field name="split_method"/>
                         </group>
                     </group>
-                </xpath>
+                </group>
             </field>
         </record>
 
index be59482..d42ce95 100644 (file)
            <field name="arch" type="xml">
                 <form string="Landed Costs" version="7.0">
                    <sheet>
-                        <field name="is_only_child" invisible="1"/>
-                        <field name="image_medium" widget="image" class="oe_avatar oe_left"
-                            attrs="{'readonly': [('is_only_child', '=', False)]}"/>
+                        <field name="image_medium" widget="image" class="oe_avatar oe_left"/>
                         <div class="oe_title">
                             <div class="oe_edit_only">
-                                <label for="name" name='label_name' string="Product Name"
-                                    attrs="{'invisible': [('is_only_child', '=', False)]}"/>
+                                <label for="name" name='label_name' string="Product Name"/>
                             </div>
                             <h1>
-                                <field name="name" class="oe_inline"
-                                    attrs="{'required': [('is_only_child', '=', True)],
-                                            'invisible': [('is_only_child', '=', False)]}"/>
+                                <field name="name" class="oe_inline"/>
                             </h1>
                             <label for="categ_id" class="oe_edit_only"/>
-                            <h2><field name="categ_id" attrs="{'readonly': [('is_only_child', '=', False)]}"/></h2>
+                            <h2><field name="categ_id"/></h2>
                             <div name="options" groups="base.group_user">
                                <field name="landed_cost_ok" readonly="1"/>
                                <label for="landed_cost_ok"/>
                                         <field name="property_account_expense"/>
                                     </group>
                                     <group>
-                                        <field name="company_id" groups="base.group_multi_company" widget="selection"
-                                            attrs="{'invisible': [('is_only_child', '=', False)]}"/>
-                                        <field name="type" attrs="{'invisible': [('is_only_child', '=', False)]}"/>
+                                        <field name="company_id" groups="base.group_multi_company" widget="selection"/>
+                                        <field name="type"/>
                                     </group>
                                 </group>
-                                <field name="description" placeholder="describe the product characteristics..."
-                                    attrs="{'readonly': [('is_only_child', '=', False)]}"/>
+                                <field name="description" placeholder="describe the product characteristics..."/>
                             </page>
                         </notebook>
                     </sheet>
index 45cc07b..dfafea3 100644 (file)
@@ -19,7 +19,6 @@
 #
 ##############################################################################
 
-import time
 from openerp.osv import fields,osv
 from openerp.tools.translate import _
 
@@ -165,34 +164,6 @@ class stock_picking(osv.osv):
             if partner.picking_warn == 'block':
                 return {'value': {'partner_id': False}, 'warning': warning}
 
-        result =  super(stock_picking, self).onchange_partner_in(cr, uid, ids, partner_id, context)
-        if result.get('warning',False):
-            warning['title'] = title and title +' & '+ result['warning']['title'] or result['warning']['title']
-            warning['message'] = message and message + ' ' + result['warning']['message'] or result['warning']['message']
-
-        return {'value': result.get('value',{}), 'warning':warning}
-
-
-class stock_picking(osv.osv):
-    _inherit = 'stock.picking'
-
-    def onchange_partner_in(self, cr, uid, ids, partner_id=None, context=None):
-        if not partner_id:
-            return {}
-        partner = self.pool.get('res.partner').browse(cr, uid, partner_id, context=context)
-        warning = {}
-        title = False
-        message = False
-        if partner.picking_warn != 'no-message':
-            title = _("Warning for %s") % partner.name
-            message = partner.picking_warn_msg
-            warning = {
-                'title': title,
-                'message': message
-            }
-            if partner.picking_warn == 'block':
-                return {'value': {'partner_id': False}, 'warning': warning}
-
         result =  super(stock_picking_in, self).onchange_partner_in(cr, uid, ids, partner_id, context)
         if result.get('warning',False):
             warning['title'] = title and title +' & '+ result['warning']['title'] or result['warning']['title']
@@ -202,7 +173,7 @@ class stock_picking(osv.osv):
 
 
 class product_product(osv.osv):
-    _inherit = 'product.product'
+    _inherit = 'product.template'
     _columns = {
          'sale_line_warn' : fields.selection(WARNING_MESSAGE,'Sales Order Line', help=WARNING_HELP, required=True),
          'sale_line_warn_msg' : fields.text('Message for Sales Order Line'),
index 04a3553..fdb199d 100644 (file)
@@ -40,8 +40,8 @@
 
         <record id="product_warning_form_view" model="ir.ui.view">
             <field name="name">product.warning.form.inherit</field>
-            <field name="model">product.product</field>
-            <field name="inherit_id" ref="product.product_normal_form_view"/>
+            <field name="model">product.template</field>
+            <field name="inherit_id" ref="product.product_template_form_view"/>
             <field name="arch" type="xml">
                 <notebook position="inside">
                     <page string="Warnings">
index f02dc3c..f664baf 100644 (file)
   color: black;
 }
 .openerp .oe_footer a span {
-  color: #c81010;
+  color: #a24689;
 }
 .openerp .oe_secondary_menu_section {
   font-weight: bold;
index c15c90a..4d952cc 100644 (file)
@@ -877,7 +877,7 @@ $sheet-padding: 16px
             font-weight: bold
             color: black
             span
-                color: #c81010
+                color: #a24689
     // }}}
     // Webclient.leftbar items {{{
 
index a323cc2..4abb409 100644 (file)
Binary files a/addons/web/static/src/img/favicon.ico and b/addons/web/static/src/img/favicon.ico differ
index 231cc26..a0a79df 100644 (file)
Binary files a/addons/web/static/src/img/logo.png and b/addons/web/static/src/img/logo.png differ
index 6b32937..1651b0c 100644 (file)
Binary files a/addons/web/static/src/img/logo2.png and b/addons/web/static/src/img/logo2.png differ
index 36ff0e1..be3cd13 100644 (file)
Binary files a/addons/web/static/src/img/nologo.png and b/addons/web/static/src/img/nologo.png differ
index f801e6c..6363f61 100644 (file)
             </a>
             <ul class="dropdown-menu">
                 <li><a href="#" data-menu="settings">Preferences</a></li>
-                <li><a href="#" data-menu="account">My OpenERP.com account</a></li>
-                <li><a href="#" data-menu="about">About OpenERP</a></li>
+                <li><a href="#" data-menu="account">My Odoo.com account</a></li>
+                <li><a href="#" data-menu="about">About Odoo</a></li>
                 <li><a href="#" data-menu="help">Help</a></li>
                 <li><a href="#" data-menu="logout">Log out</a></li>
             </ul>
 
       <div class="oe_bottom">
         <p>Copyright © 2004-TODAY OpenERP SA. All Rights Reserved.<br />
-            OpenERP is a trademark of the <a target="_blank" href="http://openerp.com/" style="text-decoration: underline;">OpenERP SA Company</a>.</p>
+            OpenERP is a trademark of the <a target="_blank" href="https://www.odoo.com" style="text-decoration: underline;">OpenERP SA Company</a>.</p>
         <p>Licenced under the terms of <a target="_blank" href="http://www.gnu.org/licenses/agpl.html" style="text-decoration: underline;">GNU Affero General Public License</a></p>
-        <p>For more information visit <a target="_blank" href="http://openerp.com/" style="text-decoration: underline;">OpenERP.com</a></p>
+        <p>For more information visit <a target="_blank" href="https://www.odoo.com" style="text-decoration: underline;">Odoo.com</a></p>
       </div>
     </div>
 
                 </a>
                 <div class="oe_secondary_menus_container"/>
                 <div class="oe_footer">
-                    Powered by <a href="http://www.openerp.com" target="_blank"><span>OpenERP</span></a>
+                    Powered by <a href="https://www.odoo.com" target="_blank"><span>Odoo</span></a>
                 </div>
             </td>
             <td class="oe_application">
index 4460808..0a2a5ed 100644 (file)
@@ -245,7 +245,7 @@ class Website(openerp.addons.web.controllers.main.Home):
     @http.route('/website/get_view_translations', type='json', auth='public', website=True)
     def get_view_translations(self, xml_id, lang=None):
         lang = lang or request.context.get('lang')
-        views = self.customize_template_get(xml_id, optional=False)
+        views = self.customize_template_get(xml_id, full=True)
         views_ids = [view.get('id') for view in views if view.get('active')]
         domain = [('type', '=', 'view'), ('res_id', 'in', views_ids), ('lang', '=', lang)]
         irt = request.registry.get('ir.translation')
index 398bbb6..c94281a 100644 (file)
@@ -6,6 +6,7 @@ import werkzeug
 
 from lxml import etree, html
 
+from openerp import SUPERUSER_ID
 from openerp.addons.website.models import website
 from openerp.http import request
 from openerp.osv import osv, fields
@@ -206,3 +207,7 @@ class view(osv.osv):
         self.write(cr, uid, res_id, {
             'arch': self._pretty_arch(arch)
         }, context=context)
+
+        view = self.browse(cr, SUPERUSER_ID, res_id, context=context)
+        if view.model_data_id:
+            view.model_data_id.write({'noupdate': True})
index 2e7d56e..16a6bd2 100644 (file)
 #
 ##############################################################################
 
-from openerp import SUPERUSER_ID
-from openerp.addons.web import http
-from openerp.addons.web.http import request
-from openerp.tools.translate import _
-from openerp.addons.website.controllers.main import Website as controllers
-controllers = controllers()
-
 import logging
-_logger = logging.getLogger(__name__)
-
-from datetime import datetime, timedelta
 import time
+from datetime import datetime, timedelta
 from dateutil.relativedelta import relativedelta
-from openerp import tools
+
 import werkzeug.urls
+
+from openerp import SUPERUSER_ID
+from openerp import http
+from openerp import tools
+from openerp.http import request
+from openerp.tools.translate import _
 from openerp.addons.website.models.website import slug
 
+_logger = logging.getLogger(__name__)
+
 try:
     import GeoIP
 except ImportError:
index 41f3eb7..8e3c1b3 100644 (file)
@@ -99,7 +99,7 @@
             <field name="domain" eval="[('model', '=', 'forum.post'), ('subtype_id', 'in', [ref('website_forum.mt_answer_edit'), ref('website_forum.mt_question_edit')])]"/>
             <field name="batch_mode">True</field>
             <field name="batch_distinctive_field" eval="ref('mail.field_mail_message_author_id')" />
-            <field name="batch_user_expression">user.id</field>
+            <field name="batch_user_expression">user.partner_id.id</field>
         </record>
         <record model="gamification.challenge" id="challenge_editor">
             <field name="name">Editor</field>
index 0bc8d3e..b5d037c 100644 (file)
@@ -3,9 +3,9 @@
     <data noupdate="1">
 
         <record model="mail.group" id="group_all_employees">
-            <field name="name">Newsletter</field>
+            <field name="name">Discussion Group</field>
             <field name="public">public</field>
-            <field name="description">Public Newsletter.</field>
+            <field name="description">Public Discussion Group</field>
         </record>
 
     </data>
diff --git a/addons/website_mail/static/src/img/blocks/button_group_subscribe.png b/addons/website_mail/static/src/img/blocks/button_group_subscribe.png
new file mode 100644 (file)
index 0000000..204239a
Binary files /dev/null and b/addons/website_mail/static/src/img/blocks/button_group_subscribe.png differ
index 7a26920..fdfb948 100644 (file)
@@ -10,7 +10,7 @@
             return website.prompt({
                 id: "editor_new_subscribe_button",
                 window_title: _t("Add a Subscribe Button"),
-                select: _t("Mailing List"),
+                select: _t("Discussion List"),
                 init: function (field) {
                     return website.session.model('mail.group')
                             .call('name_search', ['', [['public','=','public']]], { context: website.get_context() });
index 24c5f08..56bc4b0 100644 (file)
@@ -4,7 +4,6 @@
         <record id="product_template_quote_1" model="product.template">
             <field name="name">Functional Training</field>
             <field name="categ_id" ref="product.product_category_5"/>
-            <field name="public_categ_id" ref="product.Computer_all_in_one"/>
             <field name="standard_price">50000.0</field>
             <field name="list_price">750000.0</field>
             <field name="type">service</field>
@@ -21,7 +20,6 @@
         <record id="product_template_quote_2" model="product.template">
             <field name="name">Technical Training</field>
             <field name="categ_id" ref="product.product_category_5"/>
-            <field name="public_categ_id" ref="product.Computer_all_in_one"/>
             <field name="standard_price">50000.0</field>
             <field name="list_price">0.0</field>
             <field name="type">service</field>
@@ -38,7 +36,6 @@
         <record id="product_template_quote_3" model="product.template">
             <field name="name">Advanced CRM Functional</field>
             <field name="categ_id" ref="product.product_category_5"/>
-            <field name="public_categ_id" ref="product.Computer_all_in_one"/>
             <field name="standard_price">50000.0</field>
             <field name="list_price">750000.0</field>
             <field name="type">service</field>
index 34ec571..41d1ebd 100644 (file)
@@ -120,19 +120,35 @@ class website_sale(http.Controller):
 
         domain = request.website.sale_product_domain()
         if search:
-            domain += ['|', ('name', 'ilike', search), ('description', 'ilike', search)]
+            domain += ['|', '|', '|', ('name', 'ilike', search), ('description', 'ilike', search),
+                ('description_sale', 'ilike', search), ('product_variant_ids.default_code', 'ilike', search)]
         if category:
-            domain += [('product_variant_ids.public_categ_id', 'child_of', int(category))]
+            domain += [('product_variant_ids.public_categ_ids', 'child_of', int(category))]
 
-        attrib_values = map(int,request.httprequest.args.getlist('attrib'))
+        attrib_values = [map(int,v.split(",")) for v in request.httprequest.args.getlist('attrib') if v]
         if attrib_values:
-            domain += [('attribute_lines.value_id', 'in', attrib_values)]
-        attrib_set = set(attrib_values) 
+            attrib = None
+            ids = []
+            for value in attrib_values:
+                if not attrib:
+                    attrib = value[0]
+                    ids.append(value[1])
+                elif value[0] == attrib:
+                    ids.append(value[1])
+                else:
+                    domain += [('attribute_line_ids.value_ids', 'in', ids)]
+                    attrib = value[0]
+                    ids = [value[1]]
+            if attrib:
+                domain += [('attribute_line_ids.value_ids', 'in', ids)]
+
+        attrib_set = set([v[1] for v in attrib_values])
         keep = QueryURL('/shop', category=category and int(category), search=search, attrib=attrib_set)
 
         if not context.get('pricelist'):
             context['pricelist'] = int(self.get_pricelist())
         product_obj = pool.get('product.template')
+
         product_count = product_obj.search_count(cr, uid, domain, context=context)
         pager = request.website.pager(url="/shop", total=product_count, page=page, step=PPG, scope=7, url_args=post)
         product_ids = product_obj.search(cr, uid, domain, limit=PPG+10, offset=pager['offset'], order='website_published desc, website_sequence desc', context=context)
@@ -154,6 +170,7 @@ class website_sale(http.Controller):
         values = {
             'search': search,
             'category': category and int(category),
+            'attrib_values': attrib_values,
             'attrib_set': attrib_set,
             'pager': pager,
             'pricelist': self.get_pricelist(),
@@ -175,11 +192,13 @@ class website_sale(http.Controller):
         cr, uid, context, pool = request.cr, request.uid, request.context, request.registry
         category_obj = pool['product.public.category']
 
+        context.update(active_id=product.id)
+
         if category:
             category = category_obj.browse(request.cr, request.uid, int(category), context=request.context)
 
-        attrib_values = map(int,request.httprequest.args.getlist('attrib'))
-        attrib_set = set(attrib_values) 
+        attrib_values = [map(int,v.split(",")) for v in request.httprequest.args.getlist('attrib') if v]
+        attrib_set = set([v[1] for v in attrib_values])
 
         keep = QueryURL('/shop', category=category and category.id, search=search, attrib=attrib_set)
 
@@ -195,6 +214,7 @@ class website_sale(http.Controller):
             'search': search,
             'category': category,
             'pricelist': self.get_pricelist(),
+            'attrib_values': attrib_values,
             'attrib_set': attrib_set,
             'keep': keep,
             'category_list': category_list,
@@ -691,15 +711,11 @@ class website_sale(http.Controller):
         if not name:
             name = _("New Product")
         product_obj = request.registry.get('product.product')
-        product_id = product_obj.create(cr, uid, { 'name': name, 'public_categ_id': category }, context=context)
+        product_id = product_obj.create(cr, uid, { 'name': name, 'public_categ_ids': category }, context=context)
         product = product_obj.browse(cr, uid, product_id, context=context)
 
         return request.redirect("/shop/product/%s?enable_editor=1" % slug(product.product_tmpl_id))
 
-    @http.route(['/shop/reorder'], type='json', auth="public")
-    def reorder(self, product_id, operation):
-        request.registry['product.template'].website_reorder(request.cr, request.uid, [id], operation, context=request.context)
-
     @http.route(['/shop/change_styles'], type='json', auth="public")
     def change_styles(self, id, style_id):
         product_obj = request.registry.get('product.template')
@@ -722,6 +738,18 @@ class website_sale(http.Controller):
 
         return not active
 
+    @http.route(['/shop/change_sequence'], type='json', auth="public")
+    def change_sequence(self, id, sequence):
+        product_obj = request.registry.get('product.template')
+        if sequence == "top":
+            product_obj.set_sequence_top(request.cr, request.uid, [id], context=request.context)
+        elif sequence == "bottom":
+            product_obj.set_sequence_bottom(request.cr, request.uid, [id], context=request.context)
+        elif sequence == "up":
+            product_obj.set_sequence_up(request.cr, request.uid, [id], context=request.context)
+        elif sequence == "down":
+            product_obj.set_sequence_down(request.cr, request.uid, [id], context=request.context)
+
     @http.route(['/shop/change_size'], type='json', auth="public")
     def change_size(self, id, x, y):
         product_obj = request.registry.get('product.template')
index 5d0f33b..e28b95f 100644 (file)
@@ -2,11 +2,6 @@
 <openerp>
     <data noupdate="1">
 
-        <record id="product.group_product_attributes" model="res.groups">
-            <field name="name">Product Attributes</field>
-            <field name="category_id" ref="base.module_category_hidden"/>
-        </record>
-
         <record id="menu_shop" model="website.menu">
             <field name="name">Shop</field>
             <field name="url">/shop</field>
@@ -39,5 +34,9 @@
             <field name="use_quotations" eval="False"/>
         </record>
 
+        <!-- Product Public Categories -->
+        <record id="categ_others" model="product.public.category">
+            <field name="name">Others</field>
+        </record>
     </data>
 </openerp>
index f64b6e9..a4380c3 100644 (file)
@@ -6,6 +6,10 @@
             <field name="image" type="base64" file="website/static/description/website_edit.png"/>
         </record>
 
+        <record id="product.product_attribute_2" model="product.attribute">
+            <field name="type">color</field>
+        </record>
+
         <record id="product.product_product_4" model="product.product">
             <field name="website_published" eval="True"/>
             <field name="website_size_x">2</field>
@@ -536,13 +540,13 @@ Weight: 1.1 ounces</field>
                     </div>
                 </section>
             </field>
-            <field name="accessory_product_ids" eval="[(6, 0, [ref('product.product_template_7')])]"/>
+            <field name="accessory_product_ids" eval="[(6, 0, [ref('product.product_product_7')])]"/>
         </record>
 
         <record id="item1" model="product.pricelist.item">
             <field name="price_version_id" ref="product.ver0"/>
             <field name="base" ref="product.list_price"/>
-            <field name="product_id" ref="product.product_product_4"/>
+            <field name="product_tmpl_id" ref="product.product_product_4_product_template"/>
             <field name="name">Demo Discount</field>
             <field name="price_discount">-0.2000</field>
             <field name="sequence">1</field>
@@ -552,5 +556,260 @@ Weight: 1.1 ounces</field>
             <field name="member_ids" eval="[(4, ref('base.user_root'), ref('base.user_demo'))]"/>
         </record>
         
+
+
+    <!-- product.public.category -->
+
+        <record id="product.computers" model="product.public.category">
+          <field name="name">Computers</field>
+        </record>
+        
+        <record id="product.Components" model="product.public.category">
+          <field name="parent_id" ref="product.computers"/>
+          <field name="name">Components</field>
+        </record>
+
+        <record id="product.case" model="product.public.category">
+          <field name="parent_id" ref="product.Components"/>
+          <field name="name">Case</field>
+        </record>
+        <record id="product.HDD" model="product.public.category">
+          <field name="parent_id" ref="product.Components"/>
+          <field name="name">Hard Drive</field>
+        </record>
+        <record id="product.motherboard" model="product.public.category">
+          <field name="parent_id" ref="product.Components"/>
+          <field name="name">Motherboard</field>
+        </record>
+        <record id="product.graphics_card" model="product.public.category">
+          <field name="parent_id" ref="product.Components"/>
+          <field name="name">Graphics Card</field>
+        </record>
+        <record id="product.Memory" model="product.public.category">
+          <field name="parent_id" ref="product.Components"/>
+          <field name="name">Memory</field>
+        </record>
+        <record id="product.processor" model="product.public.category">
+          <field name="parent_id" ref="product.Components"/>
+          <field name="name">Processor</field>
+        </record>
+        <record id="product.video_acquisition" model="product.public.category">
+          <field name="parent_id" ref="product.Components"/>
+          <field name="name">Video Acquisition</field>
+        </record>
+
+        <record id="product.devices" model="product.public.category">
+          <field name="parent_id" ref="product.computers"/>
+          <field name="name">Devices</field>
+        </record>
+
+        <record id="product.Screen" model="product.public.category">
+          <field name="parent_id" ref="product.devices"/>
+          <field name="name">Screen</field>
+        </record>
+        <record id="product.Pen_Drive" model="product.public.category">
+          <field name="parent_id" ref="product.devices"/>
+          <field name="name">Pen Drive</field>
+        </record>
+        <record id="product.External_Hard_Drive" model="product.public.category">
+          <field name="parent_id" ref="product.devices"/>
+          <field name="name">External Hard Drive</field>
+        </record>
+        <record id="product.Keyboard_Mouse" model="product.public.category">
+          <field name="parent_id" ref="product.devices"/>
+          <field name="name">Keyboard / Mouse</field>
+        </record>
+        <record id="product.printer" model="product.public.category">
+          <field name="parent_id" ref="product.devices"/>
+          <field name="name">Printer</field>
+        </record>
+        <record id="product.Speakers" model="product.public.category">
+          <field name="parent_id" ref="product.devices"/>
+          <field name="name">Speakers</field>
+        </record>
+        <record id="product.Headset" model="product.public.category">
+          <field name="parent_id" ref="product.devices"/>
+          <field name="name">Headset</field>
+        </record>
+        <record id="product.Software" model="product.public.category">
+          <field name="parent_id" ref="product.devices"/>
+          <field name="name">Software</field>
+        </record>
+
+        <record id="product.laptops" model="product.public.category">
+          <field name="parent_id" ref="product.computers"/>
+          <field name="name">Laptops</field>
+        </record>
+
+        <record id="product.sub_computers" model="product.public.category">
+          <field name="parent_id" ref="product.computers"/>
+          <field name="name">Computers</field>
+        </record>
+
+        <record id="product.Computer_all_in_one" model="product.public.category">
+          <field name="parent_id" ref="product.sub_computers"/>
+          <field name="name">Computer all-in-one</field>
+        </record>
+        <record id="product.server" model="product.public.category">
+          <field name="parent_id" ref="product.sub_computers"/>
+          <field name="name">Server</field>
+        </record>
+
+        <record id="product.network" model="product.public.category">
+          <field name="parent_id" ref="product.computers"/>
+          <field name="name">Network</field>
+        </record>
+
+        <record id="product.Switch" model="product.public.category">
+          <field name="parent_id" ref="product.network"/>
+          <field name="name">Switch</field>
+        </record>
+        <record id="product.Modem_Router" model="product.public.category">
+          <field name="parent_id" ref="product.network"/>
+          <field name="name">Modem &amp; Router</field>
+        </record>
+        <record id="product.Switch" model="product.public.category">
+          <field name="parent_id" ref="product.network"/>
+          <field name="name">Switch</field>
+        </record>
+        
+        <record id="product.services" model="product.public.category">
+          <field name="parent_id" ref="product.computers"/>
+          <field name="name">Services</field>
+        </record>
+
+        <record id="product.product_product_1_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.services')])]"/>
+        </record>
+        <record id="product.product_product_2_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.services')])]"/>
+        </record>
+        <record id="product.product_product_3_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.Computer_all_in_one')])]"/>
+        </record>
+        <record id="product.product_product_4_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.Computer_all_in_one')])]"/>
+        </record>
+        <record id="product.product_product_5_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.Speakers')])]"/>
+        </record>
+        <record id="product.product_product_6_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.Screen')])]"/>
+        </record>
+        <record id="product.product_product_7_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.Screen')])]"/>
+        </record>
+        <record id="product.product_product_9_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.Keyboard_Mouse')])]"/>
+        </record>
+        <record id="product.product_product_10_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.Keyboard_Mouse')])]"/>
+        </record>
+        <record id="product.product_product_11_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.Keyboard_Mouse')])]"/>
+        </record>
+        <record id="product.product_product_12_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.Keyboard_Mouse')])]"/>
+        </record>
+        <record id="product.product_product_13_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.Memory')])]"/>
+        </record>
+        <record id="product.product_product_14_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.Memory')])]"/>
+        </record>
+        <record id="product.product_product_15_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.Memory')])]"/>
+        </record>
+        <record id="product.product_product_16_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.case')])]"/>
+        </record>
+        <record id="product.product_product_17_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.HDD')])]"/>
+        </record>
+        <record id="product.product_product_18_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.HDD')])]"/>
+        </record>
+        <record id="product.product_product_19_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.HDD')])]"/>
+        </record>
+        <record id="product.product_product_20_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.motherboard')])]"/>
+        </record>
+        <record id="product.product_product_21_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.motherboard')])]"/>
+        </record>
+        <record id="product.product_product_22_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.processor')])]"/>
+        </record>
+        <record id="product.product_product_23_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.processor')])]"/>
+        </record>
+        <record id="product.product_product_24_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.graphics_card')])]"/>
+        </record>
+        <record id="product.product_product_25_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.laptops')])]"/>
+        </record>
+        <record id="product.product_product_26_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.laptops')])]"/>
+        </record>
+        <record id="product.product_product_27_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.laptops')])]"/>
+        </record>
+        <record id="product.product_product_28_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.External_Hard_Drive')])]"/>
+        </record>
+        <record id="product.product_product_29_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.Pen_Drive')])]"/>
+        </record>
+        <record id="product.product_product_30_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.Pen_Drive')])]"/>
+        </record>
+        <record id="product.product_product_31_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.Speakers')])]"/>
+        </record>
+        <record id="product.product_product_32_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.Headset')])]"/>
+        </record>
+        <record id="product.product_product_33_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.Headset')])]"/>
+        </record>
+        <record id="product.product_product_34_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.video_acquisition')])]"/>
+        </record>
+        <record id="product.product_product_37_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.printer')])]"/>
+        </record>
+        <record id="product.product_product_38_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.printer')])]"/>
+        </record>
+        <record id="product.product_product_39_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.printer')])]"/>
+        </record>
+        <record id="product.product_product_40_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.Software')])]"/>
+        </record>
+        <record id="product.product_product_41_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.Software')])]"/>
+        </record>
+        <record id="product.product_product_42_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.Software')])]"/>
+        </record>
+        <record id="product.product_product_43_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.Software')])]"/>
+        </record>
+        <record id="product.product_product_44_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.Software')])]"/>
+        </record>
+        <record id="product.product_product_45_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.Modem_Router')])]"/>
+        </record>
+        <record id="product.product_product_46_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.Pen_Drive')])]"/>
+        </record>
+        <record id="product.product_product_47_product_template" model="product.template">
+            <field name="public_categ_ids" eval="[(6,0,[ref('product.Switch')])]"/>
+        </record>
+
     </data>
 </openerp>
index 0911887..93c9ae8 100644 (file)
 
 from openerp.osv import osv, fields
 
-class product_attribue(osv.Model):
-    # TODO merge product.attribute, mrp.properties product_manufacturer_attributes
-    _name = "product.attribute"
-    _columns = {
-        'name': fields.char('Name', translate=True, required=True),
-        'value_ids': fields.one2many('product.attribute.value', 'attribute_id', 'Values'),
-    }
-
-class product_attribute_value(osv.Model):
-    _name = "product.attribute.value"
-    _columns = {
-        'attribute_id': fields.many2one('product.attribute', 'attribute', required=True),
-        'name': fields.char('Value', translate=True, required=True),
-    }
-
-class product_attribute_line(osv.Model):
-    _name = "product.attribute.line"
-    _order = 'attribute_id, value_id'
-    _columns = {
-        'product_tmpl_id': fields.many2one('product.template', 'Product', required=True),
-        'attribute_id': fields.many2one('product.attribute', 'attribute', required=True),
-        'value_id': fields.many2one('product.attribute.value', 'Textual Value'),
-    }
-
-    def onchange_attribute_id(self, cr, uid, ids, attribute_id, context=None):
-        return {'value': {'value_id': False}}
-
 class product_style(osv.Model):
     _name = "product.style"
     _columns = {
@@ -61,6 +34,72 @@ class product_pricelist(osv.Model):
         'code': fields.char('Promotional Code'),
     }
 
+
+class product_public_category(osv.osv):
+    _name = "product.public.category"
+    _description = "Public Category"
+    _order = "sequence, name"
+
+    _constraints = [
+        (osv.osv._check_recursion, 'Error ! You cannot create recursive categories.', ['parent_id'])
+    ]
+
+    def name_get(self, cr, uid, ids, context=None):
+        if not len(ids):
+            return []
+        reads = self.read(cr, uid, ids, ['name','parent_id'], context=context)
+        res = []
+        for record in reads:
+            name = record['name']
+            if record['parent_id']:
+                name = record['parent_id'][1]+' / '+name
+            res.append((record['id'], name))
+        return res
+
+    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 _get_image(self, cr, uid, ids, name, args, context=None):
+        result = dict.fromkeys(ids, False)
+        for obj in self.browse(cr, uid, ids, context=context):
+            result[obj.id] = tools.image_get_resized_images(obj.image)
+        return result
+
+    def _set_image(self, cr, uid, id, name, value, args, context=None):
+        return self.write(cr, uid, [id], {'image': tools.image_resize_image_big(value)}, context=context)
+
+    _columns = {
+        'name': fields.char('Name', required=True, translate=True),
+        'complete_name': fields.function(_name_get_fnc, type="char", string='Name'),
+        'parent_id': fields.many2one('product.public.category','Parent Category', select=True),
+        'child_id': fields.one2many('product.public.category', 'parent_id', string='Children Categories'),
+        'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of product categories."),
+
+        # NOTE: there is no 'default image', because by default we don't show thumbnails for categories. However if we have a thumbnail
+        # for at least one category, then we display a default image on the other, so that the buttons have consistent styling.
+        # In this case, the default image is set by the js code.
+        # NOTE2: image: all image fields are base64 encoded and PIL-supported
+        'image': fields.binary("Image",
+            help="This field holds the image used as image for the cateogry, limited to 1024x1024px."),
+        'image_medium': fields.function(_get_image, fnct_inv=_set_image,
+            string="Medium-sized image", type="binary", multi="_get_image",
+            store={
+                'product.public.category': (lambda self, cr, uid, ids, c={}: ids, ['image'], 10),
+            },
+            help="Medium-sized image of the category. It is automatically "\
+                 "resized as a 128x128px image, with aspect ratio preserved. "\
+                 "Use this field in form views or some kanban views."),
+        'image_small': fields.function(_get_image, fnct_inv=_set_image,
+            string="Smal-sized image", type="binary", multi="_get_image",
+            store={
+                'product.public.category': (lambda self, cr, uid, ids, c={}: ids, ['image'], 10),
+            },
+            help="Small-sized image of the category. It is automatically "\
+                 "resized as a 64x64px image, with aspect ratio preserved. "\
+                 "Use this field anywhere a small image is required."),
+    }
+
 class product_template(osv.Model):
     _inherit = ["product.template", "website.seo.metadata"]
     _order = 'website_published desc, website_sequence desc, name'
@@ -73,8 +112,14 @@ class product_template(osv.Model):
             res[product.id] = "/shop/product/%s" % (product.id,)
         return res
 
+    def _get_available_variant_ids(self, cr, uid, ids, name, arg, context=None):
+        result = dict.fromkeys(ids, [])
+        for obj in self.browse(cr, uid, ids, context=context):
+            for p in obj.product_variant_ids:
+                result[obj.id].append([p.id, map(int,p.attribute_value_ids), p.price])
+        return result
+
     _columns = {
-        'attribute_lines': fields.one2many('product.attribute.line', 'product_tmpl_id', 'Product attributes'),
         # TODO FIXME tde: when website_mail/mail_thread.py inheritance work -> this field won't be necessary
         'website_message_ids': fields.one2many(
             'mail.message', 'res_id',
@@ -86,12 +131,14 @@ class product_template(osv.Model):
         'website_published': fields.boolean('Available in the website'),
         'website_description': fields.html('Description for the website'),
         'alternative_product_ids': fields.many2many('product.template','product_alternative_rel','src_id','dest_id', string='Alternative Products', help='Appear on the product page'),
-        'accessory_product_ids': fields.many2many('product.template','product_accessory_rel','src_id','dest_id', string='Accessory Products', help='Appear on the shopping cart'),
+        'accessory_product_ids': fields.many2many('product.product','product_accessory_rel','src_id','dest_id', string='Accessory Products', help='Appear on the shopping cart'),
         'website_size_x': fields.integer('Size X'),
         'website_size_y': fields.integer('Size Y'),
         'website_style_ids': fields.many2many('product.style', string='Styles'),
         'website_sequence': fields.integer('Sequence', help="Determine the display order in the Website E-commerce"),
         'website_url': fields.function(_website_url, string="Website url", type="char"),
+        'available_variant_ids': fields.function(_get_available_variant_ids, string='Available Variants'),
+        'public_categ_ids': fields.many2many('product.public.category', string='Public Category', help="Those categories are used to group similar products for e-commerce."),
     }
 
     def _defaults_website_sequence(self, cr, uid, *l, **kwargs):
@@ -106,34 +153,37 @@ class product_template(osv.Model):
         'website_published': False,
     }
 
-    def website_reorder(self, cr, uid, ids, operation=None, context=None):
-        if operation == "top":
-            cr.execute('SELECT MAX(website_sequence) FROM product_template')
-            seq = (cr.fetchone()[0] or 0) + 1
-        if operation == "bottom":
-            cr.execute('SELECT MIN(website_sequence) FROM product_template')
-            seq = (cr.fetchone()[0] or 0) -1
-        if operation == "up":
-            product = self.browse(cr, uid, ids[0], context=context)
-            cr.execute("""  SELECT id, website_sequence FROM product_template
-                            WHERE website_sequence > %s AND website_published = %s ORDER BY website_sequence ASC LIMIT 1""" % (product.website_sequence, product.website_published))
-            prev = cr.fetchone()
-            if prev:
-                self.write(cr, uid, [prev[0]], {'website_sequence': product.website_sequence}, context=context)
-                return self.write(cr, uid, [ids[0]], {'website_sequence': prev[1]}, context=context)
-            else:
-                return self.website_reorder(cr, uid, ids, operation='top', context=context)
-        if operation == "down":
-            product = self.browse(cr, uid, ids[0], context=context)
-            cr.execute("""  SELECT id, website_sequence FROM product_template
-                            WHERE website_sequence < %s AND website_published = %s ORDER BY website_sequence DESC LIMIT 1""" % (product.website_sequence, product.website_published))
-            next = cr.fetchone()
-            if next:
-                self.write(cr, uid, [next[0]], {'website_sequence': product.website_sequence}, context=context)
-                return self.write(cr, uid, [ids[0]], {'website_sequence': next[1]}, context=context)
-            else:
-                return self.website_reorder(cr, uid, ids, operation='bottom', context=context)
-        return self.write(cr, uid, ids, {'website_sequence': seq}, context=context)
+    def set_sequence_top(self, cr, uid, ids, context=None):
+        cr.execute('SELECT MAX(website_sequence) FROM product_template')
+        max_sequence = cr.fetchone()[0] or 0
+        return self.write(cr, uid, ids, {'website_sequence': max_sequence + 1}, context=context)
+
+    def set_sequence_bottom(self, cr, uid, ids, context=None):
+        cr.execute('SELECT MIN(website_sequence) FROM product_template')
+        min_sequence = cr.fetchone()[0] or 0
+        return self.write(cr, uid, ids, {'website_sequence': min_sequence -1}, context=context)
+
+    def set_sequence_up(self, cr, uid, ids, context=None):
+        product = self.browse(cr, uid, ids[0], context=context)
+        cr.execute("""  SELECT id, website_sequence FROM product_template
+                        WHERE website_sequence > %s AND website_published = %s ORDER BY website_sequence ASC LIMIT 1""" % (product.website_sequence, product.website_published))
+        prev = cr.fetchone()
+        if prev:
+            self.write(cr, uid, [prev[0]], {'website_sequence': product.website_sequence}, context=context)
+            return self.write(cr, uid, [ids[0]], {'website_sequence': prev[1]}, context=context)
+        else:
+            return self.set_sequence_top(cr, uid, ids, context=context)
+
+    def set_sequence_down(self, cr, uid, ids, context=None):
+        product = self.browse(cr, uid, ids[0], context=context)
+        cr.execute("""  SELECT id, website_sequence FROM product_template
+                        WHERE website_sequence < %s AND website_published = %s ORDER BY website_sequence DESC LIMIT 1""" % (product.website_sequence, product.website_published))
+        next = cr.fetchone()
+        if next:
+            self.write(cr, uid, [next[0]], {'website_sequence': product.website_sequence}, context=context)
+            return self.write(cr, uid, [ids[0]], {'website_sequence': next[1]}, context=context)
+        else:
+            return self.set_sequence_bottom(cr, uid, ids, context=context)
 
     def img(self, cr, uid, ids, field='image_small', context=None):
         return "/website/image?model=%s&field=%s&id=%s" % (self._name, field, ids[0])
@@ -155,4 +205,17 @@ class product_product(osv.Model):
         temp_id = self.browse(cr, uid, ids[0], context=context).product_tmpl_id.id
         return "/website/image?model=product.template&field=%s&id=%s" % (field, temp_id)
 
-# vim:et:
+class product_attribute(osv.Model):
+    _inherit = "product.attribute"
+    _columns = {
+        'type': fields.selection([('radio', 'Radio'), ('select', 'Select'), ('color', 'Color')], string="Type", type="char"),
+    }
+    _defaults = {
+        'type': lambda *a: 'radio',
+    }
+
+class product_attribute_value(osv.Model):
+    _inherit = "product.attribute.value"
+    _columns = {
+        'color': fields.char("Color for Color Attributes"),
+    }
diff --git a/addons/website_sale/models/res_config.py b/addons/website_sale/models/res_config.py
deleted file mode 100644 (file)
index 4ee2661..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-
-from openerp.osv import osv, fields
-
-class sale_configuration(osv.osv_memory):
-    _inherit = 'sale.config.settings'
-
-    _columns = {
-        'group_product_attributes': fields.boolean("Support custom product attributes",
-            group='base.group_user,base.group_portal,base.group_public',
-            implied_group='product.group_product_attributes',
-            help="Lets you add multiple custom attributes on products, "
-                 "usable to filter and compare them. "
-                 "For example if you sell computers, you could add custom attributes such as RAM size "
-                 "or CPU speed to compare your products"""),
-    }
index 0f4f5af..c1774ff 100644 (file)
@@ -2,13 +2,15 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
 access_product_product_public,product.product.public,product.model_product_product,,1,0,0,0
 access_product_template_public,product.template.public,product.model_product_template,,1,0,0,0
 access_product_category_public,product.category.public,product.model_product_category,,1,0,0,0
-access_product_public_category_public,product.category.public,product.model_product_public_category,,1,0,0,0
+access_product_category_pos_manager,product.public.category manager,model_product_public_category,base.group_sale_manager,1,1,1,1
+access_product_public_category_public,product.category.public,model_product_public_category,,1,0,0,0
 access_product_pricelist_version_public,product.pricelist.version.public,product.model_product_pricelist_version,,1,0,0,0
 access_product_pricelist_public,product.pricelist.public,product.model_product_pricelist,,1,0,0,0
 access_product_pricelist_item_public,product.pricelist.item.public,product.model_product_pricelist_item,,1,0,0,0
 access_product_product_price_type_public,product.price.type.public,product.model_product_price_type,,1,0,0,0
-access_product_attribute,product.attribute.public,website_sale.model_product_attribute,,1,0,0,0
-access_product_attribute_value,product.attribute.value.public,website_sale.model_product_attribute_value,,1,0,0,0
-access_product_attribute_line,product.attribute.line.public,website_sale.model_product_attribute_line,,1,0,0,0
 access_product_style,product.style.public,website_sale.model_product_style,,1,0,0,0
 access_product_supplierinfo,product.supplierinfo.public,product.model_product_supplierinfo,,1,0,0,0
+access_product_attribute_public,product.attribute public,product.model_product_attribute,base.group_public,1,0,0,0
+access_product_attribute_value_public,product.attribute value public,product.model_product_attribute_value,base.group_public,1,0,0,0
+access_product_attribute_price_public,product.attribute price public,product.model_product_attribute_price,base.group_public,1,0,0,0
+access_product_attribute_line_public,product.attribute line public,product.model_product_attribute_line,base.group_public,1,0,0,0
index 3e5e692..5ba5bd0 100644 (file)
 }
 
 /* product detail */
+.css_attribute_color {
+  display: inline-block;
+  border: 1px solid #999999;
+  text-align: center;
+}
+.css_attribute_color input {
+  margin: 8px;
+  height: 13px;
+}
+
+.js_add_cart_variants option.css_not_available {
+  color: #cccccc;
+}
+.js_add_cart_variants label.css_not_available {
+  opacity: 0.3;
+}
+.js_add_cart_variants label.css_not_available input {
+  opacity: 0;
+}
+
 .product_detail_img {
   margin-left: auto;
   margin-right: auto;
index 128b1a2..a5c552b 100644 (file)
 
 /* product detail */
 
+.css_attribute_color
+    display: inline-block
+    border: 1px solid #999999
+    text-align: center
+    input
+        margin: 8px
+        height: 13px
+.js_add_cart_variants
+    option.css_not_available
+        color: #ccc
+    label.css_not_available
+        opacity: 0.3
+        input
+            opacity: 0
+
 .product_detail_img
     margin-left: auto
     margin-right: auto
index d01007d..a173452 100644 (file)
@@ -4,6 +4,40 @@
     var website = openerp.website;
 
     website.Tour.register({
+        id:   'shop_customize',
+        name: "Customize the page and search a product",
+        path: '/shop',
+        mode: 'test',
+        steps: [
+            {
+                title:     "open customize menu",
+                element:   '#customize-menu-button',
+            },
+            {
+                title:     "click on 'Product Attribute's Filters'",
+                element:   "#customize-menu a:contains(Product Attribute's Filters)",
+            },
+            {
+                title:     "select product attribute memory 16 Go",
+                element:   'form.js_attributes label:contains(16 Go) input:not(:checked)',
+            },
+            {
+                title:     "check the selection",
+                waitFor:   'form.js_attributes label:contains(16 Go) input:checked',
+            },
+            {
+                title:     "select ipod",
+                waitNot:   '.oe_website_sale .oe_product_cart:eq(2)',
+                element:   '.oe_product_cart a:contains("iPod")',
+            },
+            {
+                title:     "finish",
+                waitFor:   'label:contains(32 Go) input',
+            }
+        ]
+    });
+
+    website.Tour.register({
         id:   'shop_buy_product',
         name: "Try to buy products",
         path: '/shop',
             },
             {
                 title:     "select ipod 32Go",
-                element:   'input[name="product_id"]:not([checked])',
+                waitFor:   '#product_detail',
+                element:   'label:contains(32 Go) input',
             },
             {
                 title:     "click on add to cart",
-                waitFor:   'input[name="product_id"]:eq(1)[checked]',
+                waitFor:   'label:contains(32 Go) input[checked]',
                 element:   'form[action="/shop/cart/update"] .btn',
             },
             {
             {
                 title:     "add one more iPod",
                 waitFor:   '.my_cart_quantity:contains(2)',
-                element:   '#cart_products tr:contains("iPod - 32 Gb") a.js_add_cart_json:eq(1)',
+                element:   '#cart_products tr:contains("32 Go") a.js_add_cart_json:eq(1)',
             },
             {
                 title:     "remove Headphones",
-                waitFor:   '#cart_products tr:contains("iPod - 32 Gb") input.js_quantity[value=2]',
+                waitFor:   '#cart_products tr:contains("32 Go") input.js_quantity[value=2]',
                 element:   '#cart_products tr:contains("Apple In-Ear Headphones") a.js_add_cart_json:first',
             },
             {
index 6e3102e..35e028d 100644 (file)
@@ -46,59 +46,71 @@ $(document).ready(function () {
     $('.a-submit').on('click', function () {
         $(this).closest('form').submit();
     });
+    $('form.js_attributes input, form.js_attributes select').on('change', function () {
+        $(this).closest("form").submit();
+    });
 
     // change price when they are variants
+    var $price = $(".oe_price .oe_currency_value");
     $('form.js_add_cart_json label').on('mouseup', function (ev) {
         ev.preventDefault();
         var $label = $(ev.currentTarget);
-        var $price = $label.parent("form").find(".oe_price .oe_currency_value");
         if (!$price.data("price")) {
             $price.data("price", parseFloat($price.text()));
         }
-        $price.html($price.data("price")+parseFloat($label.find(".badge span").text() || 0));
+        var value = $price.data("price") + parseFloat($label.find(".badge span").text() || 0);
+        var dec = value % 1;
+        $price.html(value + (dec < 0.01 ? ".00" : (dec < 1 ? "0" : "") ));
     });
 
-    // attributes
+    var $form_var = $('form.js_add_cart_variants');
+    var variant_ids = $form_var.data("attribute_value_ids");
+    $form_var.on('change', 'input, select', function (ev) {
+        var values = [];
+        $form_var.find("label").removeClass("text-muted css_not_available");
+        $form_var.find(".a-submit").removeProp("disabled");
 
-    var js_slider_time = null;
-    var $form = $("form.attributes");
-    $form.on("change", "label input", function () {
-        $form.submit();
-    });
-    $(".js_slider", $form).each(function() {
-        var $slide = $(this);
-        var $slider = $('<div>'+
-                '<input type="hidden" name="att-'+$slide.data("id")+'-minmem" value="'+$slide.data("min")+'"/>'+
-                '<input type="hidden" name="att-'+$slide.data("id")+'-maxmem" value="'+$slide.data("max")+'"/>'+
-            '</div>');
-        var $min = $("<input readonly name='att-"+$slide.data("id")+"-min'/>")
-            .css("border", "0").css("width", "50%")
-            .val($slide.data("min"));
-        var $max = $("<input readonly name='att-"+$slide.data("id")+"-max'/>")
-            .css("border", "0").css("width", "50%").css("text-align", "right")
-            .val($slide.data("max"));
-        $slide.append($min);
-        $slide.append($max);
-        $slide.append($slider);
-        $slider.slider({
-            range: true,
-            min: +$slide.data("min"),
-            max: +$slide.data("max"),
-            values: [
-                $slide.data("value-min") ? +$slide.data("value-min") : +$slide.data("min"),
-                $slide.data("value-max") ? +$slide.data("value-max") : +$slide.data("max")
-            ],
-            change: function( event, ui ) {
-                $min.val( ui.values[ 0 ] );
-                $max.val( ui.values[ 1 ] );
-                $form.submit();
-            },
-            slide: function( event, ui ) {
-                $min.val( ui.values[ 0 ] );
-                $max.val( ui.values[ 1 ] );
+        $form_var.find('input:checked, select').each(function () {
+            values.push(+$(this).val());
+        });
+        var available = false;
+        for (var k in variant_ids) {
+            if (_.isEqual(variant_ids[k][1], values)) {
+                var dec = variant_ids[k][2] % 1;
+                $('input[name="product_id"]').val(variant_ids[k][0]);
+                $price.html(variant_ids[k][2] + (dec < 0.01 ? ".00" : (dec < 1 ? "0" : "") ));
+                available = true;
+                break;
             }
+        }
+
+        $form_var.find("input:radio, select").each(function () {
+            var id = +$(this).val();
+            var values = [id];
+            $form_var.find(">ul>li:not(:has(input[value='" + id + "'])) input:checked, select").each(function () {
+                values.push(+$(this).val());
+            });
+            for (var k in variant_ids) {
+                if (!_.difference(values, variant_ids[k][1]).length) {
+                    return;
+                }
+            }
+            $(this).parents("label:not(.css_attribute_color):first").addClass("text-muted");
+            $(this).parents("label.css_attribute_color:first").addClass("css_not_available");
+            $(this).find("option[value='" + id + "']").addClass("css_not_available");
         });
-        $min.val( $slider.slider( "values", 0 ) );
-        $max.val( $slider.slider( "values", 1 ) );
+
+        if (available) {
+            $(".oe_price_h4").removeClass("hidden");
+            $(".oe_not_available").addClass("hidden");
+        } else {
+            $(".oe_price_h4").addClass("hidden");
+            $(".oe_not_available").removeClass("hidden");
+            $form_var.find('input[name="product_id"]').val(0);
+            $form_var.find(".a-submit").prop("disabled", "disabled");
+        }
     });
+    $form_var.find("input:first").trigger('change');
+
+
 });
index 33e3a3c..b37b514 100644 (file)
@@ -14,6 +14,7 @@ class TestUi(openerp.tests.HttpCase):
         self.phantom_js("/", "openerp.website.Tour.run('shop', 'test')", "openerp.website.Tour.tours.shop", login="admin")
 
     def test_02_admin_checkout(self):
+        self.phantom_js("/", "openerp.website.Tour.run('shop_customize', 'test')", "openerp.website.Tour.tours.shop_customize", login="admin", inject=inject)
         self.phantom_js("/", "openerp.website.Tour.run('shop_buy_product', 'test')", "openerp.website.Tour.tours.shop_buy_product", login="admin", inject=inject)
 
     def test_03_demo_checkout(self):
index b89b4bd..256eab5 100644 (file)
   </xpath>
 </template>
 <template id="search" name="Search hidden fields">
-  <input t-if="attrib" type="hidden" name="filters" t-att-value="attrib"/>
+  <t t-if="attrib_values">
+    <t t-foreach="attrib_values" t-as="a">
+      <input type="hidden" name="attrib" t-att-value="'%s,%s' % (a[0], a[1])"/>
+    </t>
+  </t>
   <input t-if="category" type="hidden" name="category" t-att-value="int(category or 0)"/>
   <div class="input-group">
     <input type="text" name="search" class="search-query form-control" placeholder="Search..." t-att-value="search"/>
     <div class="ribbon btn btn-danger">Sale</div>
   </div>
   <div class="oe_product_image">
-      <a itemprop="url" t-attf-href="/shop/product/{{ slug(product) }}/?{{ keep_query('search', 'filters', category=(category and int(category)), page=(pager['page']['num'] if pager['page']['num']>1 else None)) }}">
+      <a itemprop="url" t-attf-href="/shop/product/{{ slug(product) }}/?{{ keep_query('search', 'attrib', category=(category and int(category)), page=(pager['page']['num'] if pager['page']['num']>1 else None)) }}">
           <img itemprop="image" class="img img-responsive" t-attf-src="/website/image/product.template/#{product.id}/image#{'' if product_image_big else '?max_width=300&amp;max_height=300'}"/>
       </a>
   </div>
   <section>
-      <h5><strong><a itemprop="name" t-attf-href="/shop/product/{{ slug(product) }}/?{{ keep_query('search', 'filters', category=(category and int(category)), page=(pager['page']['num'] if pager['page']['num']>1 else None)) }}" t-field="product.name"/></strong></h5>
+      <h5><strong><a itemprop="name" t-attf-href="/shop/product/{{ slug(product) }}/?{{ keep_query('search', 'attrib', category=(category and int(category)), page=(pager['page']['num'] if pager['page']['num']>1 else None)) }}" t-field="product.name"/></strong></h5>
       <div itemprop="offers" itemscope="itemscope" itemtype="http://schema.org/Offer" class="product_price" t-if="product.product_variant_ids">
           <b>
-              <t t-if="abs(product.product_variant_ids[0].lst_price - product.product_variant_ids[0].price) &gt; 0.2">
-                <del class="text-danger" t-field="product.product_variant_ids[0].lst_price" t-field-options='{ "widget": "monetary", "display_currency": "pricelist.currency_id" }'/>&amp;nbsp;
+              <t t-if="abs(product.lst_price - product.price) &gt; 0.2">
+                <del class="text-danger" t-field="product.lst_price" t-field-options='{ "widget": "monetary", "display_currency": "pricelist.currency_id" }'/>&amp;nbsp;
               </t>
-              <span t-field="product.product_variant_ids[0].price"  t-field-options='{
+              <span t-field="product.price"  t-field-options='{
                    "widget": "monetary",
                    "display_currency": "website.pricelist_id.currency_id"
                }'>
               </span>
-              <span itemprop="price" style="display:none;" t-esc="product.product_variant_ids[0].price"/>
+              <span itemprop="price" style="display:none;" t-esc="product.price"/>
               <span itemprop="priceCurrency" style="display:none;" t-esc="website.pricelist_id.currency_id.name"/>
           </b>
       </div>
   </xpath>
 </template>
 
-<template id="products_attributes" inherit_id="website_sale.products" optional="disabled" name="Product Attribute's Filters" groups="product.group_product_attributes">
+<template id="products_attributes" inherit_id="website_sale.products" optional="disabled" name="Product Attribute's Filters">
   <xpath expr="//div[@id='products_grid_before']" position="inside">
-      <form t-att-action="keep('shop',attrib=0)" class="attributes" method="get">
+      <form class="js_attributes" method="get">
+          <input type="hidden" name="search" t-att-value="search"/>
           <ul class="nav nav-pills nav-stacked mt16">
               <t t-foreach="attributes" t-as="a">
-                  <li t-if="a.value_ids">
-                      <div t-field="a.name"/>
-                      <ul class="nav nav-pills nav-stacked">
+                  <li t-if="a.value_ids and len(a.value_ids) > 1">
+                      <div><strong t-field="a.name"/></div>
+                      <t t-if="a.type == 'select'">
+                        <select class="form-control" name="attrib">
+                          <option value=""/>
                           <t t-foreach="a.value_ids" t-as="v">
-                              <li t-att-class="'active' if v.id in attrib_set else ''">
-                                  <label style="margin: 0 20px;">
-                                      <input type="checkbox" name="attrib" t-att-value="v.id" t-att-checked="'checked' if v.id in attrib_set else ''"/>
-                                      <span style="font-weight: normal" t-field="v.name"/>
-                                  </label>
-                              </li>
+                            <option t-att-value="'%s,%s' % (a.id,v.id)" t-field="v.name" t-att-selected="'selected' if v.id in attrib_set else ''"/>
                           </t>
-                      </ul>
+                        </select>
+                      </t>
+                      <t t-if="a.type == 'radio'">
+                        <ul class="nav nav-pills nav-stacked">
+                            <t t-foreach="a.value_ids" t-as="v">
+                                <li t-att-class="'active' if v.id in attrib_set else ''">
+                                    <label style="margin: 0 20px;">
+                                        <input type="checkbox" name="attrib" t-att-value="'%s,%s' % (a.id,v.id)" t-att-checked="'checked' if v.id in attrib_set else ''"/>
+                                        <span style="font-weight: normal" t-field="v.name"/>
+                                    </label>
+                                </li>
+                            </t>
+                        </ul>
+                      </t>
+                      <t t-if="a.type == 'color'">
+                        <t t-foreach="a.value_ids" t-as="v">
+                          <label class="css_attribute_color"
+                              t-attf-style="background-color:#{v.color or v.name}">
+                              <input type="checkbox"
+                                  name="attrib"
+                                  t-att-value="'%s,%s' % (a.id,v.id)"
+                                  t-att-checked="'checked' if v.id in attrib_set else ''"
+                                  t-att-title="v.name"/>
+                          </label>
+                        </t>
+                      </t>
                   </li>
               </t>
           </ul>
                 <t t-call="website.publish_management">
                   <t t-set="object" t-value="product"/>
                   <t t-set="publish_edit" t-value="True"/>
+                  <t t-set="action" t-value="'product.product_template_action'"/>
                 </t>
             </div>
           </div>
                     <input type="hidden" t-if="len(product.product_variant_ids) == 1" name="product_id" t-att-value="product.product_variant_ids[0].id"/>
                     <t t-if="len(product.product_variant_ids) &gt; 1">
                         <label label-default="label-default" class="radio" t-foreach="product.product_variant_ids" t-as="variant_id">
-                            <input type="radio" name="product_id" t-att-value="variant_id.id" t-att-checked="variant_id == product.product_variant_ids[0] or None"/>
-                            <t t-esc="variant_id.variants or ''">Standard</t>
+                            <input type="radio" name="product_id" t-att-value="variant_id.id"/>
+                            <span t-esc="variant_id.name_get()[0][1]"/>
                             <span class="badge" t-if="variant_id.price_extra">
                                 <t t-esc="variant_id.price_extra > 0 and '+' or ''"/><span t-field="variant_id.price_extra" t-field-options='{ "widget": "monetary", "display_currency": "pricelist.currency_id" }'/>
                             </span>
                         </label>
                     </t>
 
-                    <div itemprop="offers" itemscope="itemscope" itemtype="http://schema.org/Offer" class="product_price mt16" t-if="product.product_variant_ids">
-                        <h4>
-                            <t t-if="product.product_variant_ids[0].lst_price != product.product_variant_ids[0].price">
-                            <span class="text-danger" style="text-decoration: line-through;"
-                              t-field="product.product_variant_ids[0].lst_price"
-                              t-field-options='{ "widget": "monetary", "display_currency": "pricelist.currency_id" }'/><br/>
-                            </t>
-                            <b class="oe_price"
-                              t-field="product.product_variant_ids[0].price"
-                              t-field-options='{ "widget": "monetary", "display_currency": "pricelist.currency_id" }'/>
-                            <span itemprop="price" style="display:none;" t-esc="product.product_variant_ids[0].price"/>
-                            <span itemprop="priceCurrency" style="display:none;" t-esc="website.pricelist_id.currency_id.name"/>
-                        </h4>
-                    </div>
+                    <t t-call="website_sale.product_price"/>
+
                     <a class="btn btn-primary btn-lg mt8 a-submit">Add to Cart</a>
-                    <hr t-if="product.description_sale"/>
-                    <div><p t-field="product.description_sale" class="text-muted"/></div>
-                    <hr/>
-                    <p class="text-muted">
-                        30-day money-back guarantee<br/>
-                        Free Shipping in U.S.<br/>
-                        Buy now, get in 2 days
-                    </p>
                 </form>
+
+                <hr t-if="product.description_sale"/>
+                <div><p t-field="product.description_sale" class="text-muted"/></div>
+                <hr/>
+                <p class="text-muted">
+                    30-day money-back guarantee<br/>
+                    Free Shipping in U.S.<br/>
+                    Buy now, get in 2 days
+                </p>
             </div>
           </div>
         </section>
   </t>
 </template>
 
+<template id="product_price">
+  <div itemprop="offers" itemscope="itemscope" itemtype="http://schema.org/Offer" class="product_price mt16">
+      <h4 class="oe_price_h4">
+          <t t-if="product.lst_price != product.price">
+          <span class="text-danger" style="text-decoration: line-through;"
+            t-field="product.lst_price"
+            t-field-options='{
+               "widget": "monetary",
+               "display_currency": "website.pricelist_id.currency_id"
+           }'/><br/>
+          </t>
+          <b class="oe_price"
+            t-field="product.price"
+            t-field-options='{
+               "widget": "monetary",
+               "display_currency": "website.pricelist_id.currency_id"
+           }'/>
+          <span itemprop="price" style="display:none;" t-esc="product.price"/>
+          <span itemprop="priceCurrency" style="display:none;" t-esc="website.pricelist_id.currency_id.name"/>
+      </h4>
+      <h4 class="hidden oe_not_available bg-warning">Product not available</h4>
+  </div>
+</template>
+
+<template id="product_variants" inherit_id="website_sale.product" optional="enabled" name="Product Variants">
+  <xpath expr="//form[@action='/shop/cart/update']" position="replace">
+    <form action="/shop/cart/update" class="js_add_cart_variants" method="POST" t-att-data-attribute_value_ids="product.available_variant_ids">
+        <input type="hidden" name="product_id" t-att-value="int(product.product_variant_ids[0]) if len(product.product_variant_ids) == 1 else '0'"/>
+        <ul class="nav nav-pills nav-stacked">
+            <t t-foreach="product.attribute_line_ids" t-as="variant_id">
+              <li t-if="len(variant_id.value_ids) > 1">
+
+                <strong t-field="variant_id.attribute_id.name"/>
+
+                <t t-if="variant_id.attribute_id.type == 'select'">
+                  <select class="form-control" t-att-name="'attribute-%s' % variant_id.attribute_id.id">
+                    <t t-foreach="variant_id.value_ids" t-as="value_id">
+                      <option t-att-value="value_id.id">
+                          <span t-field="value_id.name"/>
+                          <span t-if="value_id.price_extra">
+                              <t t-esc="value_id.price_extra > 0 and '+' or ''"/><span t-field="value_id.price_extra" t-field-options='{
+                                           "widget": "monetary",
+                                           "display_currency": "website.pricelist_id.currency_id"
+                                       }'/>
+                          </span>
+                      </option>
+                    </t>
+                  </select>
+                </t>
+
+                <t t-if="variant_id.attribute_id.type == 'radio'">
+                  <ul class="nav nav-pills nav-stacked">
+                      <t t-set="inc" t-value="0"/>
+                      <t t-foreach="variant_id.value_ids" t-as="value_id">
+                          <li t-if="value_id.product_ids" class="form-group js_attribute_value" style="margin: 0;">
+                              <label class="control-label" style="margin: 0 20px;">
+                                  <input type="radio" t-att-checked="'checked' if not inc else ''" t-att-name="'attribute-%s' % variant_id.attribute_id.id" t-att-value="value_id.id" style="vertical-align: top; margin-right: 10px;"/>
+                                  <span t-field="value_id.name"/>
+                                  <span class="badge" t-if="value_id.price_extra">
+                                      <t t-esc="value_id.price_extra > 0 and '+' or ''"/><span t-field="value_id.price_extra" t-field-options='{
+                                                   "widget": "monetary",
+                                                   "display_currency": "website.pricelist_id.currency_id"
+                                               }'/>
+                                  </span>
+                              </label>
+                          </li>
+                          <t t-set="inc" t-value="inc+1"/>
+                      </t>
+                  </ul>
+                </t>
+
+                <t t-if="variant_id.attribute_id.type == 'color'">
+                  <ul class="nav nav-pills nav-stacked">
+                      <t t-set="inc" t-value="0"/>
+                      <t t-foreach="variant_id.value_ids" t-as="value_id">
+                          <label class="css_attribute_color"
+                              t-attf-style="background-color:#{value_id.color or value_id.name}">
+                            <input type="radio"
+                              t-att-checked="'checked' if not inc else ''"
+                              t-att-name="'attribute-%s' % variant_id.attribute_id.id"
+                              t-att-value="value_id.id"
+                              t-att-title="value_id.name"/>
+                          </label>
+                          <t t-set="inc" t-value="inc+1"/>
+                      </t>
+                  </ul>
+                </t>
+
+              </li>
+            </t>
+        </ul>
+
+        <t t-call="website_sale.product_price"/>
+
+        <a class="btn btn-primary btn-lg mt8 a-submit">Add to Cart</a>
+    </form>
+  </xpath>
+</template>
+
 <template id="recommended_products" inherit_id="website_sale.product" optional="enabled" name="Alternative Products">
   <xpath expr="//div[@id='product_full_description']" position="after">
       <div class="container mt32" t-if="product.alternative_product_ids">
   </xpath>
 </template>
 
-<template id="product_attributes" inherit_id="website_sale.product" optional="enabled" name="Product attributes" groups="product.group_product_attributes">
+<template id="product_attributes" inherit_id="website_sale.product" optional="enabled" name="Product attributes">
   <xpath expr="//p[@t-field='product.description_sale']" position="after">
-    <hr t-if="product.attribute_lines"/>
+    <hr t-if="product.attribute_line_ids"/>
     <p class="text-muted">
-      <t t-foreach="product.attribute_lines" t-as="l">
-          <span t-field="l.attribute_id.name"/>: <span t-field="l.value_id.name"/> <br/>
+      <t t-foreach="product.attribute_line_ids" t-as="variant_id">
+        <t t-set="inc" t-value="0"/>
+        <span t-field="variant_id.attribute_id"/>: 
+        <t t-foreach="variant_id.value_ids" t-as="value_id"><t t-if="inc">,</t> <span t-field="value_id.name"/><t t-set="inc" t-value="inc+1"/></t>
+        <br/>
       </t>
     </p>
   </xpath>
 </template>
 
+<!-- Product options: OpenChatter -->
+
 <template id="product_comment" inherit_id="website_sale.product" optional="disabled" name="Discussion">
     <xpath expr="//div[@t-field='product.website_description']" position="after">
         <hr class="mb32"/>
                               <td t-if="line.product_id.product_tmpl_id">
                                   <div>
                                       <a t-attf-href="/shop/product/#{ slug(line.product_id.product_tmpl_id) }">
-                                          <strong t-field="line.name"/>
+                                          <strong t-esc="line.product_id.name_get()[0][1]"/>
                                       </a>
                                   </div>
                                   <div class="text-muted" t-field="line.product_id.description_sale"/>
                       <div class="text-muted" t-field="product.description_sale"/>
                   </td>
                   <td>
-                      <t t-if="abs(product.product_variant_ids[0].lst_price - product.product_variant_ids[0].price) &gt; 0.2">
+                      <t t-if="abs(product.lst_price - product.price) &gt; 0.2">
                         <del class="text-danger"
-                          t-field="product.product_variant_ids[0].lst_price" t-field-options='{
+                          t-field="product.lst_price" t-field-options='{
                                "widget": "monetary",
                                "display_currency": "website.pricelist_id.currency_id"
                           }'/>&amp;nbsp;
                       </t>
-                      <span t-field="product.product_variant_ids[0].price"  t-field-options='{
+                      <span t-field="product.price"  t-field-options='{
                            "widget": "monetary",
                            "display_currency": "website.pricelist_id.currency_id"
                        }'/>
                   </td>
                   <td class="text-center">
                       <form action="/shop/cart/update" method="post">
-                          <input name="product_id" t-att-value="product.product_variant_ids[0].id" type="hidden"/>
+                          <input name="product_id" t-att-value="product.id" type="hidden"/>
                           <a class="btn btn-link a-submit"><strong>Add to Cart</strong></a>
                       </form>
                   </td>
index f85be0e..5a1a931 100644 (file)
@@ -2,42 +2,6 @@
 <openerp>
 <data>
 
-    <record id="view_sales_config_website_sale" model="ir.ui.view">
-        <field name="name">sale settings</field>
-        <field name="model">sale.config.settings</field>
-        <field name="inherit_id" ref="sale.view_sales_config"/>
-        <field name="arch" type="xml">
-            <xpath expr="//group[@name='Product Features']/div" position="inside">
-                <div>
-                    <field name="group_product_attributes" class="oe_inline"/>
-                    <label for="group_product_attributes"/>
-                </div>
-             </xpath>
-        </field>
-    </record>
-
-    <record id="product_normal_form_view" model="ir.ui.view">
-        <field name="name">product.normal.form.inherit</field>
-        <field name="model">product.product</field>
-        <field name="inherit_id" ref="product.product_normal_form_view"/>
-        <field name="arch" type="xml">
-            <!-- add state field in header -->
-            <xpath expr="//sheet/div" position="before">
-                <field name="website_url" invisible="1"/>
-                <field name="website_published" class="pull-right" widget="website_button"/>
-            </xpath>
-
-            <group name="sale" position="inside">
-                <group name="website" string="Website">
-                    <field name="alternative_product_ids" widget="many2many_tags"/>
-                    <field name="accessory_product_ids" widget="many2many_tags"/>
-                    <field name="website_style_ids" widget="many2many_tags"/>
-                    <field name="website_sequence"/>
-                </group>
-            </group>
-        </field>
-    </record>
-
     <record model="ir.ui.view" id="product_pricelist_view">
         <field name="name">product.pricelist.website.form</field>
         <field name="model">product.pricelist</field>
         <field name="inherit_id" ref="product.product_template_form_view"/>
         <field name="arch" type="xml">
             <!-- add state field in header -->
-
-            <xpath expr="//sheet/div" position="before">
-                <field name="website_url" invisible="1"/>
-                <field name="website_published" class="pull-right" widget="website_button"/>
-            </xpath>
-            <xpath expr="//field[@name='description']" position="before">
-                <group colspan="4" string="Website Options">
+            <group name="website_and_pos" position="inside">
+                <group name="website" string="Website">
+                    <field name="website_url" invisible="1"/>
+                    <field name="public_categ_ids" widget="many2many_tags"/>
+                    <field name="website_published" class="pull-right" widget="website_button"/>
                     <field name="alternative_product_ids" widget="many2many_tags"/>
-                    <field name="accessory_product_ids" widget="many2many_tags"/>
                     <field name="website_style_ids" widget="many2many_tags"/>
-                    <field colspan="4" name="attribute_lines" nolabel="1" groups="product.group_product_attributes">
-                        <tree string="Product attributes" editable="bottom">
-                            <field name="attribute_id" on_change="onchange_attribute_id(attribute_id)"/>
-                            <field name="value_id"
-                                context="{'default_attribute_id': attribute_id}"
-                                domain="[('attribute_id', '=', attribute_id)]"/>
-                        </tree>
-                    </field>
+                    <field name="website_sequence"/>
                 </group>
-            </xpath>
+            </group>
+        </field>
+    </record>
+
+    <!-- Product attribute -->
 
+    <record id="variants_template_tree_view" model="ir.ui.view">
+        <field name="name">variants.template.tree</field>
+        <field name="model">product.attribute.value</field>
+        <field name="inherit_id" ref="product.variants_template_tree_view"/>
+        <field name="arch" type="xml">
+            <field name="name" position="after">
+                <field name="color"/>
+            </field>
         </field>
     </record>
 
-    <record model="ir.ui.view" id="view_product_attribute_form">
-      <field name="name">product.attribute.form</field>
-      <field name="model">product.attribute</field>
-      <field name="arch" type="xml">
-        <form string="Product attributes" version="7.0">
-          <group>
-            <field name="name"/>
-          </group>
-        </form>
-      </field>
+    <!-- Product Public Categories -->
+    <record id="product_public_category_form_view" model="ir.ui.view">
+        <field name="name">product.public.category.form</field>
+        <field name="model">product.public.category</field>
+        <field name="arch" type="xml">
+            <form string="Public Categories" version="7.0">
+                <sheet>
+                    <field name="image_medium" widget='image' class="oe_avatar oe_right"/>
+                    <div class="oe_left">
+                        <group>
+                            <field name="name"/>
+                            <field name="parent_id"/>
+                            <field name="sequence"/>
+                        </group>
+                    </div>
+                </sheet>
+            </form>
+        </field>
+    </record>
+    <record id="product_public_category_tree_view" model="ir.ui.view">
+        <field name="name">product.public.category.tree</field>
+        <field name="model">product.public.category</field>
+        <field name="field_parent" eval="False"/>
+        <field name="arch" type="xml">
+            <tree string="Product Product Categories">
+                <field name="sequence" invisible="1"/>
+                <field name="complete_name"/>
+            </tree>
+        </field>
+    </record>
+    <record id="product_public_category_action" model="ir.actions.act_window">
+        <field name="name">Public Product Categories</field>
+        <field name="type">ir.actions.act_window</field>
+        <field name="res_model">product.public.category</field>
+        <field name="view_type">form</field>
+        <field name="view_mode">tree,form</field>
+        <field name="view_id" eval="False"/>
+        <field name="help" type="html">
+          <p class="oe_view_nocontent_create">
+            Click to define a new category.
+          </p><p>
+            Categories are used to browse your products through the
+            touchscreen interface.
+          </p><p>
+            If you put a photo on the category, the layout of the
+            touchscreen interface will automatically. We suggest not to put
+            a photo on categories for small (1024x768) screens.
+          </p>
+        </field>
     </record>
+    <menuitem action="product_public_category_action" id="menu_product_public_category" parent="product.prod_config_main" sequence="10" />
+    <!-- END -->
+
+ </data>
 
-</data>
 </openerp>
index 9204a8b..fef661e 100644 (file)
@@ -1,8 +1,9 @@
 # -*- coding: utf-8 -*-
 import openerp
-from openerp.addons.web import http
-from openerp.addons.web.http import request
+from openerp import http
 from openerp import SUPERUSER_ID
+from openerp.http import request
+import openerp.addons.website_sale.controllers.main
 
 class website_sale(openerp.addons.website_sale.controllers.main.website_sale):
 
diff --git a/checkout.sh b/checkout.sh
deleted file mode 100755 (executable)
index 0955508..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-#/bin/sh
-set -e
-
-ODOO=https://github.com/odoo/odoo.git
-DEV=https://github.com/odoo-dev/odoo.git
-
-usage () {
-cat <<EOF
-Usage: $0 [-m] [COPYNAME]
-
-Checks out and sets up the Odoo git repository for "internal" development.
-
-* Checks out the "production" repository (production branches) as the "odoo"
-  remote
-* Checks out the "development" repository (for employee development branches)
-  as the "dev" repository
-
-By default, the working copy is "odoo"
-
-Options:
--h        displays this help text
--m        includes github's merge refs. These are the pull requests to "odoo"
-          which merge cleanly into the main repository, after having applied
-          them to said repository
-EOF
-}
-
-while getopts :hm opt
-do
-    case $opt in
-        h)
-            usage
-            exit 0
-            ;;
-        m)
-            include_merge=yes
-            ;;
-        *)
-            usage
-            exit 1
-            ;;
-    esac
-done
-
-shift $((OPTIND-1))
-copyname=${1:-"odoo"}
-
-# Collect basic configuration data, ensures correct configuration of that repo
-printf "Enter your full name: "
-read name
-printf "Enter your (work) email: "
-read email
-
-# create & set up repo
-git init $copyname
-cd $copyname
-
-git config user.name "$name"
-git config user.email "$email"
-
-# pre-push script preventing push to odoo repo by default. Git just execs
-# them, so they need a correct shebang and exec bit
-# if things get more extensive, should probably use git init templates
-cat <<EOF > .git/hooks/pre-push
-#!/bin/sh
-remote="\$1"
-url="\$2"
-
-if [ "\$url" != "$ODOO" ]
-then
-    exit 0
-fi
-
-echo "Pushing to the odoo remote ($ODOO) is forbidden, push to the dev remote"
-echo
-echo "See git help push if you really want to push to odoo"
-exit 1
-
-EOF
-chmod +x .git/hooks/pre-push
-
-# add basic repos as remotes
-git remote add odoo $ODOO
-git remote add dev $DEV
-
-if [ $include_merge ]
-then
-    git remote add merge $ODOO
-    git config remote.merge.fetch '+refs/pull/*/merge:refs/remotes/merge/*'
-fi
-
-echo
-git remote update
-
-exit 0
diff --git a/contributing.md b/contributing.md
deleted file mode 100644 (file)
index 0575beb..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-Contributing to Odoo
-====================
-
-Reporting Issues
-----------------
-If possible, always attach a pull request when creating an issue (GitHub will automatically create an issue when submitting the changes). The issues not linked to a pull request or an internal request on odoo.com will be handled with a lower priority.
-
-If later on you create a pull request solving an opened issue, do not forget to reference to it in your pull request (e.g.: "This patch fixes issue #42").
-
-When reporting an issue or creating a pull request, use the following structure:
-
-> **Quantity field is ignored in a sale order**
->
-> Impacted versions:
-> 
->  - 7.0 and above
-> 
-> Steps to reproduce:
-> 
->  1. create a new sale order
->  2. add a line with product 'Service', quantity 2, unit price 10.0
->  3. validate the sale order
-> 
-> Current behavior:
-> 
->  - Total price of 10.0
-> 
-> Expected behavior:
-> 
->  - Total price of 20.0 (2 * 10 = 20)
-
-For web or rendering issues, do not forget to specify the operating system and browser you are using.
-
-Against which version should I submit a patch?
-----------------------------------------------
-Periodically, we forward port the fixes realized in the latest stable version to master and intermediate saas repositories. This means that you should submit your pull request against the lowest supported version. If applying, you should always submit your code against `odoo/7.0`. The `saas-x` versions are intermediate versions between stable versions.
-
-![Submiting against the right version](/doc/_static/pull-request-version.png)
-
-However your change **must** be submitted against `odoo/master` if
-
-* it modifies the database structure (e.g.: adding a new field)
-* it adds a new feature
-
-Why was my fix labeled as blocked?
-----------------------------------
-The label *blocked* is used when an action is required from the submitter. The typical reasons are:
-
-* the fix is incomplete/incorrect and a change is required
-* more information is required
-
-Pull requests with the blocked label will not be processed as long as the label remains. Once the correction done, we will review it and eventually remove the label.
-
-Why was my issue closed without merging?
-----------------------------------------
-A pull request is closed when it will not be merged into odoo. This will typically happens if the fix/issue:
-
-* is not relevant to odoo development (label *invalid*)
-* is not considered as a bug or we have no plan to change the current behavior (label *wontfix*)
-* is a duplicated of another opened issue (label *duplicate*)
-* the pull request should be resubmitted against another version
-
-What is this odoo-dev repository? Should I use it?
---------------------------------------------------
-
-The `odoo-dev/odoo` repository is an internal repository used by the R&D of Odoo to keep the main repository clean. If you are coming from Launchpad, this is the equivalent of the `~openerp-dev` repository.
-
-When forking odoo to submit a patch, always use the `github.com/odoo/odoo` repository. Be also careful of the version you are branching as it will determine the history once the pull request will be realized (e.g.: `git checkout -b 7.0-my-branch odoo/7.0`).
diff --git a/debian/changelog b/debian/changelog
deleted file mode 100644 (file)
index 0ee8e0e..0000000
+++ /dev/null
@@ -1,539 +0,0 @@
-openerp (6.1-1) testing; urgency=low
-
-  * New major version, new packaging.
-
- -- Antony Lesuisse <al@openerp.com>  Sat, 01 Oct 2011 12:31:00 +0100
-
-openerp-server (6.0.2-1) testing; urgency=low
-
-  * Using upstream version 6.0.2
-
- -- Vo Minh Thu <vmt@openerp.com>  Tue, 05 Apr 2011 12:31:00 +0100
-
-openerp-server (6.0.1-1) unstable; urgency=low
-
-  * Translations from Rosetta (only zh_CN today)
-  * Require postgres 8.2, not 8.4
-  * Write changelog (recursive, isn't it?)
-  * Repackage, together with addons fixes
-
- -- P. Christeas <xrg@openerp.com>  Mon, 24 Jan 2011 12:50:00 +0100
-openerp-server (6.0.1-0) testing; urgency=low
-
-  * Update to version 6.0.1
-
- -- P. Christeas <xrg@openerp.com>  Thu, 20 Jan 2011 21:21:00 +0100
-
-openerp-server (6.0.0-0) testing; urgency=low
-
-  * Update to version 6.0.0
-
- -- P. Christeas <xrg@openerp.com>  Wed, 19 Jan 2011 09:12:00 +0100
-
-openerp-server (6.0.0~rc2-0) experimental; urgency=low
-
-  * Upgrade to 6.0.0-rc2, let it build
-
- -- P. Christeas <xrg@openerp.com>  Mon, 17 Jan 2011 14:18:00 +0100
-
-openerp-server (5.0.14-1) experimental; urgency=low
-
-  * Updating to standards version 3.9.1.
-  * Merging upstream version 5.0.14.
-
- -- Daniel Baumann <daniel@debian.org>  Wed, 15 Sep 2010 00:22:00 +0200
-
-openerp-server (5.0.13-1) experimental; urgency=low
-
-  * Merging upstream version 5.0.13.
-
- -- Daniel Baumann <daniel@debian.org>  Mon, 13 Sep 2010 09:14:10 +0200
-
-openerp-server (5.0.12-2) unstable; urgency=low
-
-  * Removing debhelper auto install overrides.
-  * Updating clean target in rules.
-  * Reverting to manual setup.py call, updated for version 5.0.12.
-
- -- Daniel Baumann <daniel@debian.org>  Sat, 14 Aug 2010 18:53:43 +0200
-
-openerp-server (5.0.12-1) unstable; urgency=low
-
-  * Updating standards version to 3.9.0.
-  * Merging upstream version 5.0.12.
-
- -- Daniel Baumann <daniel@debian.org>  Sun, 18 Jul 2010 19:46:39 +0200
-
-openerp-server (5.0.11-1) unstable; urgency=low
-
-  * Merging upstream version 5.0.11.
-  * Adding patch from Timothy E. Harris <maintainer@mepiscommunity.org>
-    to prevents creating a new database if the locale is not a UTF-8 one
-    (Closes: #584976).
-
- -- Daniel Baumann <daniel@debian.org>  Tue, 08 Jun 2010 11:42:23 +0200
-
-openerp-server (5.0.10-1) unstable; urgency=low
-
-  * Merging upstream version 5.0.10.
-
- -- Daniel Baumann <daniel@debian.org>  Fri, 07 May 2010 15:02:31 +0200
-
-openerp-server (5.0.9-1) unstable; urgency=low
-
-  * Merging upstream version 5.0.9.
-
- -- Daniel Baumann <daniel@debian.org>  Fri, 16 Apr 2010 06:47:02 +0200
-
-openerp-server (5.0.8-1) unstable; urgency=low
-
-  * Merging upstream version 5.0.8.
-
- -- Daniel Baumann <daniel@debian.org>  Wed, 14 Apr 2010 20:19:21 +0200
-
-openerp-server (5.0.7-2) unstable; urgency=low
-
-  * Updating python build-depends.
-  * Adding patch to fix bad whatis entry in openerp-server manpage.
-
- -- Daniel Baumann <daniel@debian.org>  Wed, 07 Apr 2010 00:09:23 +0200
-
-openerp-server (5.0.7-1) unstable; urgency=low
-
-  * Merging upstream version 5.0.7 (Closes: #573716):
-  * Updating copyright file.
-  * Resorting the dh call to more common order.
-  * Updating README.source.
-  * Dropping python-lxml patch, went upstream.
-  * Dropping postgresql-8.4.patch, went upstream.
-  * Adding some more python module build-depends to avoid some chicken-
-    egg problem with the new setup.py and quilt.
-  * Adding dependency to remote_fs in init script.
-
- -- Daniel Baumann <daniel@debian.org>  Sat, 13 Mar 2010 13:55:50 +0100
-
-openerp-server (5.0.6-4) unstable; urgency=low
-
-  * Adding explicit debian source version 1.0 until switch to 3.0.
-  * Updating year in copyright file.
-  * Updating to standards 3.8.4.
-  * Adding patch from Toni Mueller <support@oeko.net> to fix SQL for
-    postgresql 8.4 (Closes: #568119).
-
- -- Daniel Baumann <daniel@debian.org>  Sat, 06 Feb 2010 10:22:05 +0100
-
-openerp-server (5.0.6-3) unstable; urgency=low
-
-  [ Daniel Baumann ]
-  * Setting last-translator for German debconf templates to me, no
-    intention do deal with debian-l10n-german in the future anymore.
-
-  [ Mathias Behrle ]
-  * Removing deprecated option -q for PostgreSQL client commands
-    (Closes: #548875).
-
- -- Daniel Baumann <daniel@debian.org>  Sat, 31 Oct 2009 09:20:27 +0100
-
-openerp-server (5.0.6-2) unstable; urgency=low
-
-  * Minimizing rules file.
-
- -- Daniel Baumann <daniel@debian.org>  Sun, 18 Oct 2009 21:19:57 +0200
-
-openerp-server (5.0.6-1) unstable; urgency=low
-
-  * Merging upstream version 5.0.6.
-  * Rediffing python-lxml.patch.
-
- -- Daniel Baumann <daniel@debian.org>  Sat, 17 Oct 2009 08:32:56 +0200
-
-openerp-server (5.0.5-1) unstable; urgency=low
-
-  * Merging upstream version 5.0.5.
-
- -- Daniel Baumann <daniel@debian.org>  Mon, 21 Sep 2009 20:38:00 +0200
-
-openerp-server (5.0.4-1) unstable; urgency=medium
-
-  * Merging upstream version 5.0.4:
-    - fixes a security problem.
-  * No longer calling debconf-updatepo in clean target of rules.
-
- -- Daniel Baumann <daniel@debian.org>  Mon, 21 Sep 2009 00:01:13 +0200
-
-openerp-server (5.0.3-0-2) unstable; urgency=low
-
-  * Adding README.source.
-  * Moving maintainer homepage from control to copyright.
-  * Updating README.source.
-  * Adding patch from upstream to use python-lxml instead of python-xml,
-    thanks to Alan Bell <alan.bell@theopenlearningcentre.com> (Closes:
-    #543947).
-
- -- Daniel Baumann <daniel@debian.org>  Wed, 16 Sep 2009 21:18:30 +0200
-
-openerp-server (5.0.3-0-1) unstable; urgency=low
-
-  * Merging upstream version 5.0.3-0.
-  * Removing xmlrpc.patch, went upstream.
-  * Using dedicated storage directory in /var/lib/openerp-server, that
-    way the addons directory can stay read-only for the unprivileged
-    user.
-  * Commenting out db_name in config (Closes: #542391).
-  * Commenting out port in config (Closes: #542406).
-  * Renaming logfile to openerp-server.log for consistency.
-  * Commenting out pidfile in config (Closes: #542427).
-  * Removing debconf handling in postrm, not possible to do that.
-  * Removing local storage directory on purge.
-
- -- Daniel Baumann <daniel@debian.org>  Mon, 24 Aug 2009 20:16:55 +0200
-
-openerp-server (5.0.2-0-3) unstable; urgency=low
-
-  * Wrapping and sorting depends.
-  * Correcting spelling of Open ERP.
-  * Updating maintainer field.
-  * Updating vcs fields.
-  * Updating to standards version 3.8.3.
-  * Dropping old depends on python-xml (Closes: #543127).
-  * Adding maintainer homepage field to control.
-  * Marking maintainer homepage field to be also included in binary
-    packages and changelog.
-
- -- Daniel Baumann <daniel@debian.org>  Mon, 24 Aug 2009 18:23:54 +0200
-
-openerp-server (5.0.2-0-2) unstable; urgency=high
-
-  * Adding patch from Panos Christeas <p_christ@hol.gr> to forbid RPC
-    calls without credentials. All versions of openerp-server affected.
-
- -- Daniel Baumann <daniel@debian.org>  Thu, 13 Aug 2009 14:45:17 +0200
-
-openerp-server (5.0.2-0-1) unstable; urgency=low
-
-  * Updating standards to 3.8.1.
-  * Rediffing autobuild.patch (Closes: #538625).
-  * Upgrading package to standards version 3.8.2.
-  * Managing setup of unprivileged user account with debconf.
-  * Using more common directory name to store local debian additions.
-  * Updating README.Debian to reflect that the database has to be
-    initialized through the client (Closes: #518675).
-  * Removing package leftovers in postrm script.
-  * Merging upstream version 5.0.2-0.
-
- -- Daniel Baumann <daniel@debian.org>  Thu, 13 Aug 2009 11:24:59 +0200
-
-openerp-server (5.0.1-0-1) unstable; urgency=low
-
-  * Merging upstream version 5.0.1-0.
-  * Correcting path of openerp-server in README.Debian (Closes:
-    #520890).
-  * Correcting user handling in init script and config file (Closes:
-    #513263, #516348).
-  * Setting port to 8070.
-  * Also mentioning debug_mode and price_accuracy in config file
-    (Closes: #513264).
-  * Using correct rfc-2822 date formats in changelog.
-  * Rediffing shebang.patch.
-
- -- Daniel Baumann <daniel@debian.org>  Sat, 30 May 2009 12:53:39 +0200
-
-openerp-server (5.0.0-3-1) unstable; urgency=low
-
-  * Merging upstream version 5.0.0-3.
-  * Improving init call in README.Debian, thanks to David Goodenough
-    <david.goodenough@btconnect.com>.
-  * Fixed wrapping in README.Debian.
-
- -- Daniel Baumann <daniel@debian.org>  Sat, 14 Feb 2009 00:51:00 +0100
-
-openerp-server (5.0.0-2-1) unstable; urgency=low
-
-  * Merging upstream version 5.0.0-2 (Closes: #514920).
-  * Updating README.Debian.
-
- -- Daniel Baumann <daniel@debian.org>  Sat, 14 Feb 2009 00:12:00 +0100
-
-openerp-server (5.0.0-1) unstable; urgency=low
-
-  * Merging upstream version 5.0.0.
-
- -- Daniel Baumann <daniel@debian.org>  Sat, 07 Feb 2009 13:33:00 +0100
-
-openerp-server (5.0.0~rc3-1) unstable; urgency=low
-
-  * Adding note about initializing the database in README.Debian.
-  * Adding changelog for debian version 4.2.3.4-3.
-  * Merging upstream version 5.0.0~rc3.
-  * Using quilt rather than dpatch.
-  * Updating year in copyright file.
-  * Updating python-openssl depends.
-  * Updating lintian overrides.
-
- -- Daniel Baumann <daniel@debian.org>  Fri, 09 Jan 2009 18:31:00 -0500
-
-openerp-server (5.0.0~rc2-1) unstable; urgency=low
-
-  * Updating python xml depends (Closes: #508911).
-  * Merging upstream version 5.0.0~rc2.
-  * New upstream no longer uses embedded copies of pydot, pychart and
-    reportlab (Closes: #468104).
-  * Rediffing shebang.dpatch.
-
- -- Daniel Baumann <daniel@debian.org>  Thu, 25 Dec 2008 15:13:00 +0100
-
-openerp-server (5.0.0~rc1.1-2) unstable; urgency=low
-
-  * Adjusting sed call to correct path in /usr/bin/openerp-server.
-
- -- Daniel Baumann <daniel@debian.org>  Wed, 17 Dec 2008 08:32:00 +0100
-
-openerp-server (5.0.0~rc1.1-1) unstable; urgency=low
-
-  * Merging upstream version 5.0.0~rc1.1.
-
- -- Daniel Baumann <daniel@debian.org>  Tue, 16 Dec 2008 13:08:00 +0100
-
-openerp-server (5.0.0~rc1-1) unstable; urgency=low
-
-  * Merging upstream version 5.0.0~rc1.
-  * Removing openerp.dpatch, went upstream.
-  * Rediffing shebang.dpatch.
-  * Removing workaround for import_xml.rng, not needed anymore.
-
- -- Daniel Baumann <daniel@debian.org>  Tue, 16 Dec 2008 12:51:00 +0100
-
-openerp-server (5.0.0~alpha-3) unstable; urgency=low
-
-  * Adding ghostscript, python-matplotlib, and python-pyopenssl to recommends.
-  * Correcting chown calls in postinst.
-  * Prefixing debhelper files with package name.
-  * Adding changelog for debian version 4.2.3.4-2.
-  * Dropping tinyerp-server transitional package, this allows to have both
-    packages available in unstable.
-
- -- Daniel Baumann <daniel@debian.org>  Sun, 07 Dec 2008 20:13:00 +0100
-
-openerp-server (5.0.0~alpha-2) experimental; urgency=low
-
-  * Renaming tinyerp-server to new upstream openerp-server name.
-
- -- Daniel Baumann <daniel@debian.org>  Sun, 09 Nov 2008 18:59:00 +0100
-
-tinyerp-server (5.0.0~alpha-1) experimental; urgency=low
-
-  * Merging upstream version 5.0.0~alpha.
-  * Rediffing autobuild.dpatch.
-  * Removing shebang.dpatch, not needed anymore.
-  * Removing python2.5.dpatch, not needed anymore.
-  * Rediffing openerp.dpatch.
-  * Rediffing migrate.dpatch.
-  * Not moving server to sbin anymore for the sake of consistency.
-  * Removing unneeded chmod call for tinyerp-server.py.
-  * Sorting build-depends, depends and recommends.
-  * Dropping /etc/default/tinyerp-server in favour of using
-    /etc/tinyerp-server.conf directly.
-  * Updating chmod call in rules to also cope with filenames that embedd
-    whitespaces.
-  * Adding patch to correct shebang in two addon files.
-  * Adding workaround for bug in setup.py that puts import_xml.rng into the
-    wrong location.
-  * Adding symlink for tinyerp_serverrc manpage to tinyerp-server.conf.
-  * Renaming everything except the package name itself from tinyerp-server to
-    openerp-server.
-  * Updating copyright file to current upstream.
-
- -- Daniel Baumann <daniel@debian.org>  Sun, 09 Nov 2008 15:52:00 +0100
-
-tinyerp-server (4.2.3.4-3) unstable; urgency=high
-
-  * Updating python depends (Closes: #506615).
-  * Adding note about initializising the database in README.Debian
-    (Closes: #464557).
-
- -- Daniel Baumann <daniel@debian.org>  Mon, 10 Nov 2008 12:40:00 +0100
-
-tinyerp-server (4.2.3.4-2) unstable; urgency=low
-
-  * Correcting chown calls in postinst.
-
- -- Daniel Baumann <daniel@debian.org>  Mon, 10 Nov 2008 12:40:00 +0100
-
-tinyerp-server (4.2.3.4-1) unstable; urgency=low
-
-  * Merging upstream version 4.2.3.4.
-  * Upgrading package to debhelper 7.
-  * Upgrading package to standards 3.8.0.
-  * Updating homepage field in control file.
-  * Adding vcs fields in control file.
-  * Rewriting copyright file in machine-interpretable format.
-  * Using lintian debhelper to install lintian overrides.
-  * Removing bind-exit.dpatch, went upstream.
-  * Updating default database port.
-  * Adding logfile handling.
-  * Updating postresql recommends.
-  * Reordering and splitting out rules file into individual debhelper files.
-  * Applying some shell cosmetics to init and maintainer scripts.
-  * Adding patch to update homepage location of tinyerp.
-  * Setting ownership of addons directory in postinst (Closes: #487112).
-  * Adding patch from Brian DeRocher <brian@derocher.org> to fix sql syntax in
-    migrate script (Closes: #467517).
-
- -- Daniel Baumann <daniel@debian.org>  Sun, 09 Nov 2008 09:11:00 +0100
-
-tinyerp-server (4.2.2-2) unstable; urgency=medium
-
-  * Readding depends to python-psycopg (Closes: #463079, #493374).
-  * Adding depends to python-tz (Closes: #482359).
-
- -- Daniel Baumann <daniel@debian.org>  Sun, 03 Aug 2008 00:20:00 +0200
-
-tinyerp-server (4.2.2-1) unstable; urgency=low
-
-  * New upstream release (Closes: #477698).
-  * Dropping depends against python-xml (Closes: #468619).
-
- -- Daniel Baumann <daniel@debian.org>  Sat, 26 Apr 2008 16:15:00 +0200
-
-tinyerp-server (4.2.1-1) unstable; urgency=low
-
-  * Maintainer upload from the Zuerich BSP.
-  * New upstream release.
-  * Bumping to new policy.
-  * Using new homepage field in control.
-  * Including documentation for migration and testing (Closes: #445464).
-  * Adjusting 04-bind-exit.dpatch to new upstream release.
-  * Added lintian overrides.
-  * Depending now on python-psycopg2, not python-psycopg anymore
-    (Closes: #445464).
-
- -- Daniel Baumann <daniel@debian.org>  Sat, 12 Jan 2008 15:20:00 +0100
-
-tinyerp-server (4.2.0-1) unstable; urgency=medium
-
-  * New upstream release.
-
- -- Daniel Baumann <daniel@debian.org>  Wed, 31 Oct 2007 21:31:00 +0100
-
-tinyerp-server (4.0.3-3) unstable; urgency=medium
-
-  * Setting database port to 5433 (Closes: #443626).
-  * Applied patch from Aldrin Martoq to make tinyerp-server compatible with
-    python 2.5.
-  * Applied patch from Luca Falavigna <dktrkranz@ubuntu.com> to fix exception
-    raised when address is already in use.
-
- -- Daniel Baumann <daniel@debian.org>  Sat, 29 Sep 2007 17:07:00 +0200
-
-tinyerp-server (4.0.3-2) unstable; urgency=low
-
-  * Check for existence of deluser in postrm (Closes: #431532).
-
- -- Daniel Baumann <daniel@debian.org>  Tue, 03 Jul 2007 11:01:00 +0200
-
-tinyerp-server (4.0.3-1) unstable; urgency=low
-
-  * New upstream release.
-  * Taking package back, Jean-Marc seems to be MIA.
-  * Changed wording of 'listen to all interfaces' paragraph in README.Debian,
-    thanks to Gerfried Fuchs <alfie@debian.org>.
-  * Added lsb header to init script.
-
- -- Daniel Baumann <daniel@debian.org>  Fri, 01 Jun 2007 11:59:00 +0200
-
-tinyerp-server (4.0.2-3) unstable; urgency=low
-
-  * Setting maintainer to Jean-Marc, this time really :)
-
- -- Daniel Baumann <daniel@debian.org>  Wed, 28 Mar 2007 21:48:00 +0100
-
-tinyerp-server (4.0.2-2) unstable; urgency=low
-
-  * Setting maintainer to Jean-Marc.
-
- -- Daniel Baumann <daniel@debian.org>  Wed, 07 Feb 2007 13:41:00 +0100
-
-tinyerp-server (4.0.2-1) unstable; urgency=low
-
-  * New upstream release.
-  * Some minor cleanups.
-
- -- Daniel Baumann <daniel@debian.org>  Thu, 18 Jan 2007 14:19:00 +0100
-
-tinyerp-server (4.0.1-1) unstable; urgency=low
-
-  * New upstream release.
-  * Removed 03-setup.dpatch, went upstream.
-
- -- Daniel Baumann <daniel@debian.org>  Fri, 29 Dec 2006 01:03:00 +0100
-
-tinyerp-server (4.0.0-1) unstable; urgency=low
-
-  * New upstream release.
-  * Added patch to fix a typo in setup.py.
-
- -- Daniel Baumann <daniel@debian.org>  Tue, 05 Dec 2006 17:43:00 +0100
-
-tinyerp-server (4.0.0~rc1-2) unstable; urgency=low
-
-  * Cleaned up build-depends.
-
- -- Daniel Baumann <daniel@debian.org>  Tue, 05 Dec 2006 13:19:00 +0100
-
-tinyerp-server (4.0.0~rc1-1) unstable; urgency=low
-
-  * New upstream release.
-
- -- Daniel Baumann <daniel@debian.org>  Tue, 05 Dec 2006 12:57:00 +0100
-
-tinyerp-server (3.5.0-1) experimental; urgency=low
-
-  * New upstream release.
-
- -- Daniel Baumann <daniel@debian.org>  Mon, 23 Oct 2006 12:23:00 +0200
-
-tinyerp-server (3.4.2-1) unstable; urgency=low
-
-  * New upstream release.
-  * New email address.
-  * Complying with new python policy (Closes: #380973).
-  * Adjusted postgre depends (Closes: #376614).
-
- -- Daniel Baumann <daniel@debian.org>  Mon, 16 Oct 2006 14:45:00 +0200
-
-tinyerp-server (3.3.0-1) unstable; urgency=low
-
-  * New upstream release (Closes: #369769):
-    - fixed installation script to install all needed files (Closes: #355224)
-  * Updated README.Debian (Closes: #352322, #360222, #360223).
-  * Set to architecture to all (Closes: #356962).
-
- -- Daniel Baumann <daniel.baumann@panthera-systems.net>  Sun, 04 Jun 2006 00:50:00 +0100
-
-tinyerp-server (3.2.1-1) unstable; urgency=low
-
-  * New upstream release.
-
- -- Daniel Baumann <daniel.baumann@panthera-systems.net>  Thu, 02 Feb 2006 09:44:00 +0100
-
-tinyerp-server (3.2.0-1) unstable; urgency=low
-
-  * New upstream release.
-  * Adjusted shellbang in bin/addons/base/ir/workflow/pydot/dot_parser.py.
-
- -- Daniel Baumann <daniel.baumann@panthera-systems.net>  Tue, 24 Jan 2006 07:00:00 +0100
-
-tinyerp-server (3.1.99+3.2.0rc1-1) unstable; urgency=low
-
-  * New upstream release.
-
- -- Daniel Baumann <daniel.baumann@panthera-systems.net>  Tue, 27 Dec 2005 20:00:00 +0100
-
-tinyerp-server (3.1.1+debian-1) unstable; urgency=low
-
-  * Initial release (Closes: #301510).
-  * Rebuild orig.tar.gz to remove unnecessary files in upstreams debian/.
-  * Added changelog from website.
-
- -- Daniel Baumann <daniel.baumann@panthera-systems.net>  Sun, 16 Oct 2005 13:35:00 +0200
diff --git a/debian/compat b/debian/compat
deleted file mode 100644 (file)
index 7f8f011..0000000
+++ /dev/null
@@ -1 +0,0 @@
-7
diff --git a/debian/control b/debian/control
deleted file mode 100644 (file)
index 7f7786e..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-Source: openerp
-Section: net
-Priority: optional
-Maintainer: OpenERP SA <al@openerp.com>
-Build-Depends: debhelper (>= 7.0.50~), python, rsync
-Standards-Version: 3.9.1
-Homepage: http://www.openerp.com/
-Vcs-Bzr: https://launchpad.net/openobject
-
-Package: openerp
-Section: net
-Architecture: all
-Depends:
- ${misc:Depends},
- adduser,
- python,
- postgresql-client,
- python-dateutil,
- python-decorator,
- python-docutils,
- python-feedparser,
- python-gdata,
- python-imaging,
- python-jinja2,
- python-ldap,
- python-libxslt1,
- python-lxml,
- python-mako,
- python-mock,
- python-openid,
- python-psutil,
- python-psycopg2,
- python-pybabel,
- python-pychart,
- python-pydot,
- python-pyparsing,
- python-reportlab,
- python-requests,
- python-simplejson,
- python-tz,
- python-unittest2,
- python-vatnumber,
- python-vobject,
- python-webdav,
- python-werkzeug,
- python-xlwt,
- python-yaml,
- python-zsi
-Conflicts: tinyerp-server, openerp-server, openerp-web
-Replaces: tinyerp-server, openerp-server, openerp-web
-Recommends:
- antiword,
- graphviz,
- ghostscript,
- postgresql,
- python-gevent,
- python-matplotlib,
- poppler-utils
-Description: OpenERP Enterprise Resource Management
- OpenERP, previously known as TinyERP, is a complete ERP and CRM. The main
- features are accounting (analytic and financial), stock management, sales and
- purchases management, tasks automation, marketing campaigns, help desk, POS,
- etc. Technical features include a distributed server, flexible workflows, an
- object database, a dynamic GUI, customizable reports, and an XML-RPC
- interface.
-
diff --git a/debian/copyright b/debian/copyright
deleted file mode 100644 (file)
index e477adb..0000000
+++ /dev/null
@@ -1,207 +0,0 @@
-Upstream-Contact: OpenERP <info@openerp.com>
-Upstream-Homepage: http://www.openerp.com/
-Maintainer-Contact: Debian OpenERP Maintainers <gnunet@lists.debian-maintainers.org>
-Maintainer-Homepage: http://open-object.debian-maintainers.org/
-
-Files: *
-Copyright: (C) 2004-2011 OpenERP SA. (www.openerp.com)
-License: GPL-3+
- 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 <http://www.gnu.org/licenses/>.
- .
- On Debian systems, the complete text of the GNU General Public License
- can be found in /usr/share/common-licenses/GPL-3 file.
-
-Files:
- bin/addons/account/report/general_ledger.py
- bin/addons/account/report/general_ledger_landscape.py
- bin/addons/account/wizard/wizard_statement_from_invoice.py
-Copyright: (C) 2005-2008 CamptoCamp
-License: GPL-2+
- 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 2
- 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, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- .
- On Debian systems, the complete text of the GNU General Public License
- can be found in /usr/share/common-licenses/GPL-2 file.
-
-Files: bin/addons/auction/barcode/*
-Copyright: (C) 2000 Tyler C. Sarna <tsarna@sarna.org>
-License: BSD
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- .
- 1. Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright
-    notice, this list of conditions and the following disclaimer in the
-    documentation and/or other materials provided with the distribution.
- 3. All advertising materials mentioning features or use of this software
-    must display the following acknowledgement:
-    This product includes software developed by Tyler C. Sarna.
- 4. Neither the name of the author nor the names of contributors
-    may be used to endorse or promote products derived from this software
-    without specific prior written permission.
- .
- THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-
-Files:
- bin/addons/base_report_designer/wizard/tiny_sxw2rml/normalized_oo2rml.xsl
- bin/addons/base_report_designer/wizard/tiny_sxw2rml/tiny_sxw2rml.py
-Copyright: (C) 2005 Martin Simon
-License: LGPL-2.1
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
- .
- This library 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
- Library General Public License for more details.
- .
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- .
- On Debian systems, the complete text of the GNU Library General Public License
- can be found in /usr/share/common-licenses/LGPL-2.1 file.
-
-Files: bin/addons/document/ftpserver/*
-Copyright:
- (C) 2007 Giampaolo Rodola <g.rodola@gmail.com>
- (C) 2008 Fabien Pinckaers <fp@tinyerp.com>
-License: MIT
- Permission to use, copy, modify, and distribute this software and
- its documentation for any purpose and without fee is hereby
- granted, provided that the above copyright notice appear in all
- copies and that both that copyright notice and this permission
- notice appear in supporting documentation, and that the name of
- Giampaolo Rodola' not be used in advertising or publicity pertaining to
- distribution of the software without specific, written prior
- permission.
- .
- Giampaolo Rodola' DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
- NO EVENT Giampaolo Rodola' BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
- OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
- NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-Files: bin/addons/hr_holidays/*
-Copyright:
- (C) 2004-2008 Tiny.be <info@tiny.be>
- (C) 2005-2006 Axelor SARL. <http://www.axelor.com/>
-License: GPL-2+
- 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 2
- 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, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- .
- On Debian systems, the complete text of the GNU General Public License
- can be found in /usr/share/common-licenses/GPL-2 file.
-
-Files: bin/addons/l10n_uk/*
-Copyright:
- (C) 2004-2008 Tiny.be <info@tiny.be>
- (C) 2004-2008 Seath Solutions Ltd.
-License: GPL-2+
- 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 2
- 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, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- .
- On Debian systems, the complete text of the GNU General Public License
- can be found in /usr/share/common-licenses/GPL-2 file.
-
-Files: bin/tools/threadinglocal.py
-Copyright: (C) 2004-2005 CherryPy Team <team@cherrypy.org>
-License: BSD
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
- .
- * Redistributions of source code must retain the above copyright notice,
-   this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice,
-   this list of conditions and the following disclaimer in the documentation
-   and/or other materials provided with the distribution.
- * Neither the name of the CherryPy Team nor the names of its contributors
-   may be used to endorse or promote products derived from this software
-   without specific prior written permission.
- .
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-Files: bin/tools/decimal.py
-Copyright: (C) 2004 Python Software Foundation.
-License: other
- This file is distributed under the Python Software License
- (http://www.python.org/2.3/license.html).
- .
- Permission to use, copy, modify, and distribute this software and its
- documentation for any purpose and without fee is hereby granted,
- provided that the above copyright notice appear in all copies and that
- both that copyright notice and this permission notice appear in
- supporting documentation, and that the name of Stichting Mathematisch
- Centrum or CWI not be used in advertising or publicity pertaining to
- distribution of the software without specific, written prior
- permission.
-
diff --git a/debian/openerp.init b/debian/openerp.init
deleted file mode 100644 (file)
index 98e6532..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/bin/sh
-
-### BEGIN INIT INFO
-# Provides:            openerp-server
-# Required-Start:      $remote_fs $syslog
-# Required-Stop:       $remote_fs $syslog
-# Should-Start:                $network
-# Should-Stop:         $network
-# Default-Start:       2 3 4 5
-# Default-Stop:                0 1 6
-# Short-Description:   Enterprise Resource Management software
-# Description:         Open ERP is a complete ERP and CRM software.
-### END INIT INFO
-
-PATH=/sbin:/bin:/usr/sbin:/usr/bin
-DAEMON=/usr/bin/openerp-server
-NAME=openerp-server
-DESC=openerp-server
-CONFIG=/etc/openerp/openerp-server.conf
-LOGFILE=/var/log/openerp/openerp-server.log
-USER=openerp
-
-test -x ${DAEMON} || exit 0
-
-set -e
-
-do_start () {
-    echo -n "Starting ${DESC}: "
-    start-stop-daemon --start --quiet --pidfile /var/run/${NAME}.pid --chuid ${USER} --background --make-pidfile --exec ${DAEMON} -- --config=${CONFIG} --logfile=${LOGFILE}
-    echo "${NAME}."
-}
-
-do_stop () {
-    echo -n "Stopping ${DESC}: "
-    start-stop-daemon --stop --quiet --pidfile /var/run/${NAME}.pid --oknodo
-    echo "${NAME}."
-}
-
-case "${1}" in
-    start)
-        do_start
-        ;;
-
-    stop)
-        do_stop
-        ;;
-
-    restart|force-reload)
-        echo -n "Restarting ${DESC}: "
-        do_stop
-        sleep 1
-        do_start
-        ;;
-
-    *)
-        N=/etc/init.d/${NAME}
-        echo "Usage: ${NAME} {start|stop|restart|force-reload}" >&2
-        exit 1
-        ;;
-esac
-
-exit 0
diff --git a/debian/openerp.install b/debian/openerp.install
deleted file mode 100644 (file)
index c632929..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-install/openerp-server.conf /etc/openerp
-README /usr/share/doc/openerp
diff --git a/debian/openerp.postinst b/debian/openerp.postinst
deleted file mode 100644 (file)
index 2eccd51..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/bin/sh
-
-set -e
-
-case "${1}" in
-    configure)
-        if ! getent passwd | grep -q "^openerp:"; then
-            adduser --system --no-create-home --quiet --gecos 'OpenERP' --group openerp
-        fi
-        # Register "openerp" as a postgres superuser 
-        su - postgres -c "createuser -s openerp" 2> /dev/null || true
-        chown openerp:openerp /etc/openerp/openerp-server.conf
-        chmod 0640 /etc/openerp/openerp-server.conf
-        # Creating log file
-        mkdir -p /var/log/openerp/
-        chown openerp:openerp /var/log/openerp
-        chmod 0750 /var/log/openerp
-        # Creating local storage directory
-        mkdir -p /var/lib/openerp/filestore
-        chown openerp:openerp -R /var/lib/openerp
-        # update-python-modules NOW otherwise invoke-rc.d openerp start will fail
-        update-python-modules -p openerp.public
-        ;;
-    *)
-        ;;
-esac
-
-#DEBHELPER#
-
-exit 0
diff --git a/debian/openerp.postrm b/debian/openerp.postrm
deleted file mode 100644 (file)
index bc81ce9..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/sh
-
-set -e
-
-case "${1}" in
-    remove)
-        deluser --quiet --system "openerp" || true
-        delgroup --quiet --system --only-if-empty "openerp" || true
-        find /var/lib/openerp -path '/var/lib/openerp/*' ! -path '/var/lib/openerp/filestore*' -delete
-        ;;
-
-    purge)
-        rm -rf /var/lib/openerp
-        ;;
-
-    upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
-        ;;
-
-esac
-
-#DEBHELPER#
-
-exit 0
diff --git a/debian/rules b/debian/rules
deleted file mode 100755 (executable)
index 57be1d0..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/usr/bin/make -f
-# vim:noet:
-
-%:
-       dh  ${@}
-
-override_dh_pysupport:
-       echo "rsync"
-       sh -c "[ -d debian/openerp/usr/lib/python2.6 ] && rsync -av openerp/ debian/openerp/usr/lib/python2.6/dist-packages/openerp/" || true
-       sh -c "[ -d debian/openerp/usr/lib/python2.7 ] && rsync -av openerp/ debian/openerp/usr/lib/python2.7/dist-packages/openerp/" || true
-       rm -Rf debian/openerp/usr/openerp debian/openerp/usr/lib/python2.6/dist-packages/tests debian/openerp/usr/lib/python2.7/dist-packages/tests
-       dh_pysupport
-       rm -Rf debian/openerp/usr/lib
-
-override_dh_installinit:
-       dh_installinit --update-rcd-params='defaults 21'
-
diff --git a/doc/adding-command.rst b/doc/adding-command.rst
deleted file mode 100644 (file)
index 5a177b0..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-.. _adding-command:
-
-Adding a new command
-====================
-
-``oe`` uses the argparse_ library to implement commands. Each
-command lives in its own ``openerpcommand/<command>.py`` file.
-
-.. _argparse: http://docs.python.org/2.7/library/argparse.html
-
-To create a new command, probably the most simple way to get started is to
-copy/paste an existing command, say ``openerpcommand/initialize.py`` to
-``openerpcommand/foo.py``. In the newly created file, the important bits
-are the ``run(args)`` and ``add_parser(subparsers)`` functions.
-
-``add_parser``'s responsability is to create a (sub-)parser for the command,
-i.e. describe the different options and flags. The last thing it does is to set
-``run`` as the function to call when the command is invoked.
-
-.. code-block:: python
-
-  > def add_parser(subparsers):
-  >     parser = subparsers.add_parser('<command-name>',
-  >         description='...')
-  >     parser.add_argument(...)
-  >     ...
-  >     parser.set_defaults(run=run)
-
-``run(args)`` actually implements the command. It should be kept as simple as
-possible and delegate most of its work to small functions (probably placed at
-the top of the new file). In other words, its responsability is mainly to
-deal with the presence/absence/pre-processing of ``argparse``'s arguments.
-
-Finally, the module must be added to ``openerpcommand/__init__.py``.
diff --git a/doc/commands.rst b/doc/commands.rst
deleted file mode 100644 (file)
index 7a758b1..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-.. _commands:
-
-Available commands
-==================
-
-This page explain some of the available ``oe`` commands. For an overview about
-``oe``, see :doc:`openerp-command`.
-
-Keep in mind that ``oe --help`` and ``oe <command> --help`` already give a lot
-of information about the commands and their options and flags.
-
-``web``
--------
-
-The ``web`` command is used to create a single OpenERP server process to handle
-regular HTTP requests and XML-RPC requests. It is possible to execute such
-process multiple times, possibly on different machines.
-
-It is possible to chose the ``--threaded`` or ``--gevent`` flags. It is
-recommanded to use ``--threaded`` only when running a single process.
-``--gevent`` is experimental; it is planned to use it for the embedded chat
-feature.
-
-Example invocation::
-
-  > oe web --addons ../../addons/trunk:../../web/trunk/addons --threaded
-
-``cron``
---------
-
-The ``cron`` command is used to create a single OpenERP process to execute
-so-called cron jobs, also called scheduled tasks in the OpenERP interface. As
-for the ``web`` command, multiple cron processes can be run side by side.
-
-It is necessary to specify on the command-line which database need to be
-watched by the cron process with the ``--database`` option.
-
-Example invocation::
-
-  > oe cron --addons ../../addons/trunk:../../web/trunk/addons --database production
index d66ca33..1d2eaf5 100644 (file)
@@ -7,8 +7,7 @@ Initializing a working copy
 
 Use the easy-setup shell script::
 
-     curl -O https://raw.githubusercontent.com/odoo/odoo/master/checkout.sh
-     sh checkout.sh
+     curl -O https://raw.githubusercontent.com/odoo/odoo/master/odoo.py | python2
 
 it will will ask a few questions and create a local copy.
 
@@ -26,7 +25,7 @@ repository can have any number of remotes. The setup script creates 2 remotes:
     the official repository and main branches, roughly corresponds to the old
     "mainline" branches in bazaar. You should never need to push to it, and by
     default your local copy is configured to forbid it.
-``dev``
+``odoo-dev``
     a grab-bag of development branches, you can push your work to it so other
     coworkers can work with you.
 
index a61de5c..ad42e41 100644 (file)
@@ -30,16 +30,6 @@ OpenERP Server
    form-view-guidelines
    ir_actions
 
-OpenERP Command
-'''''''''''''''
-
-.. toctree::
-   :maxdepth: 1
-
-   openerp-command.rst
-   commands.rst
-   adding-command.rst
-
 OpenERP Server API
 ''''''''''''''''''
 
diff --git a/doc/openerp-command.rst b/doc/openerp-command.rst
deleted file mode 100644 (file)
index 6ca7b02..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-.. _openerp-command:
-
-The ``oe`` script
-=================
-
-The ``oe`` script provides a set of command-line tools around the OpenERP
-framework. It is meant to replace the older ``openerp-server`` script (which
-is still available).
-
-Using ``oe``
-------------
-
-In contrast to the previous ``openerp-server`` script, ``oe`` defines a few
-commands, each with its own set of flags and options. You can get some
-information for any of them with
-
-::
-
-  > oe <command> --help
-
-For instance::
-
-  > oe run-tests --help
-
-Some ``oe`` options can be provided via environment variables. For instance::
-
-  > export OPENERP_DATABASE=trunk
-  > export OPENERP_HOST=127.0.0.1
-  > export OPENERP_PORT=8069
-
-Depending on your needs, you can group all of the above in one single script;
-for instance here is a, say, ``test-trunk-view-validation.sh`` file::
-
-  COMMAND_REPO=/home/thu/repos/command/trunk/
-  SERVER_REPO=/home/thu/repos/server/trunk
-
-  export PYTHONPATH=$SERVER_REPO:$COMMAND_REPO
-  export PATH=$SERVER_REPO:$COMMAND_REPO:$PATH
-  export OPENERP_DATABASE=trunk
-  export OPENERP_HOST=127.0.0.1
-  export OPENERP_PORT=8069
-
-  # The -d ignored is actually needed by `oe` even though `test_view_validation`
-  # itself does not need it.
-  oe run-tests -d ignored -m openerp.test_view_validation
-
-Available commands
--------------------
-
-See the :doc:`commands` page.
-
-Adding new commands
--------------------
-
-See the :doc:`adding-command` page.
-
-Bash completion
----------------
-
-A preliminary ``oe-bash-completion`` file is provided. After sourcing it,
-
-::
-
-  > . oe-bash-completion
-
-completion (using the TAB character) in Bash should work.
diff --git a/history/Changelog b/history/Changelog
deleted file mode 100644 (file)
index 3c63a7e..0000000
+++ /dev/null
@@ -1,1822 +0,0 @@
-2010-05-05: 5.0.10
-==================
-
-Bugfixes (server)
------------------
-
- * Not linked to a bug report:
-   * Server Actions: Cleaner legend help and error message
-   * use of tail text in preprocessor of report engine
-   * added support for missing Persian/Farsi (official language in Iran), with backport of the translations from trunk for base module
- * https://launchpad.net/bugs/534769
- * https://launchpad.net/bugs/452854
-   * res_currency: revert to correct rounding mechanism
- * https://launchpad.net/bugs/540840
-   * Groups if removed, should remove relavent access rights too
- * https://launchpad.net/bugs/558460
-   * Add the pixmaps and win32 directories in the MANIFEST to have
- * https://launchpad.net/bugs/559346
-   * Copy() of ir_model_fields corected
- * https://launchpad.net/bugs/541545
- * https://launchpad.net/bugs/574394
-   * Workflow : print of workflow should not be broken if there is no flow_stop
- * https://launchpad.net/bugs/552386
-   * _store_function dictionary should  get updated when field changes its type from function to any other storable
- * https://launchpad.net/bugs/535559
-   * Illustration tag beahvior corrected
- * https://launchpad.net/bugs/552457
-   * Raise a detailed exception if the record does not exist in the ir_model_data object
- * https://launchpad.net/bugs/513278
-   * res_currency: revert to correct rounding mechanism
- * https://launchpad.net/bugs/564926
-   * _constraints : Multiple constraints on the same field should be allowed
-
-
-Improvements (server)
----------------------
-
- * setup.cfg: Improve the setup of the server
-
-
-Bugfixes (addons)
------------------
-
- * Not linked to a bug report:
-   * Remove the bad translation files
-   * Rename the oc_OC translation files to oc_FR
-   * l10n_be: intracom declaration compliancy with Intervat 5.1.0
-   * l10n_be: compliancy of belgian vat declaration with Intervat 5.1.0 (from 05 feb 2010)
-   * account: fixed the onchange partner of bank_statement
-   * audittrail: context={} -> context=None in method signature
-   * audittrail: indentation problems
-   * audittrail: wrong class passed to super
- * https://launchpad.net/bugs/515590
- * https://launchpad.net/bugs/552455
-   * Account_analytic_default : Invoice creation from SO corected
- * https://launchpad.net/bugs/546004
-   * Account : Overdue report corrected
- * https://launchpad.net/bugs/552519
-   * account_invoice_layout : Added translation entries
- * https://launchpad.net/bugs/571978
- * https://launchpad.net/bugs/553881
-   * Account : Added a link to view unreconciled receivables/payables from Invoices
- * https://launchpad.net/bugs/566185
-   * Remove the unused translation files
- * https://launchpad.net/bugs/559478
-   * only Grouped field should appear in groupby clause, graph orientation corrected
- * https://launchpad.net/bugs/570652
-   * Locations when M2O,should not be among view type
- * https://launchpad.net/bugs/519133
-   * Account : Added centralization check on write() of move line
- * https://launchpad.net/bugs/532728
-   * sale: UoS qty visible for everyone
- * https://launchpad.net/bugs/559347
-   * Purchase : Product_uom_change should respect fiscal position related to product_id_change
- * https://launchpad.net/bugs/570132
-   * Account : code improved for move line creation
- * https://launchpad.net/bugs/551522
-   * Account : Manual reconcilation should work with the option of Skip Draft Entries of Journal
- * https://launchpad.net/bugs/539408
-   * Audittrail : Correction made to avoid crash on configuration wizard
- * https://launchpad.net/bugs/564530
-   * Account : Copying bank statement should not copy move lines
- * https://launchpad.net/bugs/568537
-   * Account : __compute() optimized a little
- * https://launchpad.net/bugs/461801
- * https://launchpad.net/bugs/568436
-   * Purchase : Merge PO should consider fiscal position
- * https://launchpad.net/bugs/552447
-   * Account : Tax :If type=code,python_compute has to be mandatory;if applicable_type=python_code,python_appliacble has to be mandatory
- * https://launchpad.net/bugs/561318
-   * Account/Document_ICS/MRP_Operations : datetime.datetime.strptime() replaced by mx.DateTime.strptime()
- * https://launchpad.net/bugs/559055
-   * account_payment: Remove the duplicated 'bank_id' field in the payment.line tree view
- * https://launchpad.net/bugs/564779
-   * Mrp_repair : Corrected make invoice process and Quotation report
- * https://launchpad.net/bugs/557501
-   * Account_Voucher : Correction in creating account.move from voucher
- * https://launchpad.net/bugs/519034
-   * Sale : progressbar for picking should be set when SO is picked 100%(including its procurement is done)
- * https://launchpad.net/bugs/569036
-   * mrp_subproduct : Corrected action_confirm method
- * https://launchpad.net/bugs/562803
-   * Membership : Copy() overridden for setting membership lines blank
- * https://launchpad.net/bugs/552503
-   * Account : Raising an exception when journal_id is missing
- * https://launchpad.net/bugs/564486
-   * Base_report_creator : Export method corrected
- * https://launchpad.net/bugs/532073
- * https://launchpad.net/bugs/489239
-   * mrp_operations : starting production order should start work order too.
- * https://launchpad.net/bugs/557373
- * https://launchpad.net/bugs/515507
-   * Support for ftp_server_host for setting the FTP interface for DMS server,
- * https://launchpad.net/bugs/535109
-   * Account:
- * https://launchpad.net/bugs/399817
- * https://launchpad.net/bugs/452854
-   * account: finish fix of generation of account.move.lines from invoice by providing extension hook
-   * account: corrected move balance check - rounding correctly based on price_accuracy
- * https://launchpad.net/bugs/570561
-   * Account_payment : Import of move line should include the date of search due date
- * https://launchpad.net/bugs/567987
-   * Account_analytic_default : Invoice creation from SO corected
- * https://launchpad.net/bugs/563713
-   * account_analytic_plans : Minor correction on a method to unlink entries
- * https://launchpad.net/bugs/513278
-   * account: corrected move balance check - rounding correctly based on price_accuracy
- * https://launchpad.net/bugs/551570
-   * Account_payment : Date will be asked to user while importing payment order into bank statement
- * https://launchpad.net/bugs/550742
-   * Account : Refund invoice wizard should have current_date as default
-
-
-Improvements (addons)
----------------------
-
- * Add the new version of Swiss Localization:
- * sale: unit tests for bug #461801
- * sale: warning instead of error in some unit tests
- * sale: demo tax account type
- * account: test case for bug #452854
- * account: renamed test
- * sale: minor test  changes
- * Account_followup : Domain improved for an act_window from Partner
-
-
-2010-04-06: 5.0.9
-=================
-
-Bugfixes (server)
------------------
-
- * https://launchpad.net/bugs/556634
-   * By pass a missing field in the translation
-
-
-2010-04-02: 5.0.8
-=================
-
-Bugfixes (server)
------------------
-
- * Not linked to a bug report:
-   * res_lang : if value of thousands_sep is not present in language,method will give error- 'moentary' name is not defined [IMP] clear cache of language on write,to be sure to get right value if value of language is changed before cache timeout
-   * bin/tools/convert.py: no need to import time since the eval(domain) is probably going to be removed or wrapped in an exception handler
-   * sql_db: avoid deadlock when releasing leaked cursors
-   * bin/tools/convert.py: reverted revision 2017.1.1: could not eval some strings. Need a dict with uid, active_id, active_ids, ...
-   * bin/tools/convert.py: missing time module
-   * i18n: fr_FR: missing information
-   * In the case we want to generate the RPM package, we change the version
-   * DONT pformat() each RPC request !
-   * reporting: change the way that para style are computed
-   * add cache to res.lang format() function
-   * fixed a bug in copy_data: it now copies the original (not translated) field value as the source value
-   * disabled "code" server action due to the security threat it poses, added --enable-code-actions command-line flag to enable it
-   * only admin can delete ir.property
-   * when deleting ir.property, do not delete the linked field
-   * correct import rng file
-   * 'Partner Manager' group should see the Partner menu
-   * removed python-xml from list of debian packages in doc/INSTALL
-   * remove ubuntu-related pyxml/python-xml hacks from openerp-server.py as pyxml shouldn't be used anywhere anymore
-   * Remove python-xml reference in setup.py
- * https://launchpad.net/bugs/495948
-   * Corrected language code for Slovenian and Danish locales. Renamed corresponding PO files.
- * https://launchpad.net/bugs/531430
-   * Remove the default values on the --no-netrpc and --no-xmlrpc
- * https://launchpad.net/bugs/538399
-   * netrpc: Close the socket if there is a raised exception
- * https://launchpad.net/bugs/532365
-   * Document : It should be allowed to browse through FTP,disregard to --no-databse-list option
- * https://launchpad.net/bugs/531026
-   * Exploit Broken : Search  should have checked access rights of read
- * https://launchpad.net/bugs/513290
-   * Export should honor the current locale(language) settings of the user.
- * https://launchpad.net/bugs/535551
-   * Uninstalling a board_* module removes dashboard action, but user shuold be allowed to login with default action
- * https://launchpad.net/bugs/514273
-   * Remove the libxml2 and libxslt dependencies for the packaging
- * https://launchpad.net/bugs/314973
-   * do not keep connections to template1, template0 and postgres in the connection pool
- * https://launchpad.net/bugs/544087
-   * Behaviour of fields.related corrected for copy() and write() calls
- * https://launchpad.net/bugs/551664
-   * Evaluate domain in act_window element is now possible
- * https://launchpad.net/bugs/528624
-   * Import : Any exception should be raised in well-manner
- * https://launchpad.net/bugs/543521
-   * Export : Correction made when selection field value if False.
- * https://launchpad.net/bugs/516568
-   * retro-compatibility: 'obj' is available in ir.action.server code
- * https://launchpad.net/bugs/380955
-   * setup.py: add the missing librairies for the windows packaging
- * https://launchpad.net/bugs/497364
-   * base: respect the limit and offset arguments of the search method
-
-
-Improvements (server)
----------------------
-
- * sql_db: improve logging
- * The act_window does not show groups.This adds groups and rearranges the view with a notebook to ensure that the addition of this m2m field doesnt introduce a scroll
-
-
-Bugfixes (addons)
------------------
-
- * Not linked to a bug report:
-   * base_contact: res.partner.job: when partner is set, the address is required. Add onchange on partner and on address.
-   * membership: bugfix + improved inheritance of membership_state field.function
-   * Base_contact : search() of job improved
-   * account_payment: added journal_id field in account.move.line.tree view
-   * Sale : Fiscal position from SO for invoice should be priorly taken from SO rather than Partner's properties
-   * Delivery : Better functional computation of weight based on move
-   * sale: move the product_uos_qty and product_uos fields to the
-   * event: made wizard of invoice creating more flexible (use onchange) + code refactoring
-   * audittrail: Check if the object exists or Not and raise an exception if it's not the case'
-   * hr_timesheet_sheet: Add a default value for the context keyword
-   * Improved mrp_jit smoke test in case the sale config wizard was run before installing mrp_jit. There is a side-effect but it's only on demo databases, and we'll fix this test in trunk when we can write better tests.
-   * account: product_id onchange on invoice lines were returning {} when no product_id was given. This was causing problems in other modules (account_analytic_default, account_analytic_plans) that inherited because of a key error 'value'. It now returns {'value':{}}.
-   * l10n_be: adaptation du module de localisation belge conformément à la nouvelle législation TVA pour les services intracom
-   * event: invoice creation from registrations
-   * purchase: security file update: added rights for manager. Fixed rights for user
- * https://launchpad.net/bugs/524521
-   * Account : USer will be notified for unreconciling partial reconcilatins if he tries to cancel the invoice
- * https://launchpad.net/bugs/540128
- * https://launchpad.net/bugs/535098
-   * Account : Only those accounts are eligible to be Parents which have type=View
- * https://launchpad.net/bugs/552455
-   * Sale : Make Invoice wizard should only create invoice for uninvoiced lines
- * https://launchpad.net/bugs/528889
-   * Account : name_search() of account.tax.code overridden for better search
- * https://launchpad.net/bugs/519220
-   * Delivery : Proper Weight calculation of stock picking
- * https://launchpad.net/bugs/535058
-   * Purchase : Seperate packign should not be created if chained locations are used
- * https://launchpad.net/bugs/545032
-   * Stock : Invoice from Stock should respect context for translations.
-   * stock: context lost in invoice wizard
- * https://launchpad.net/bugs/530081
-   * Sale : Sale order's Invoice should have invoice reference of customer Invoice
- * https://launchpad.net/bugs/545868
-   * Sale_crm : proper options set on wizard makesale
- * https://launchpad.net/bugs/467880
-   * MRP : stock.warehouse.orderpoint for qty_multiple check of 0
- * https://launchpad.net/bugs/544287
-   * Invoice object's Partner onchange had wrong parameter
- * https://launchpad.net/bugs/535655
-   * Base_setup : Better display of Currency selection(Name + Code)
- * https://launchpad.net/bugs/532728
-   * sale: Remove the product.group_uos group on the product_uos and product_uos_qty fields.
- * https://launchpad.net/bugs/540443
-   * Sale : Fiscal position value has to be passed when Invoice is created from SO
- * https://launchpad.net/bugs/532673
-   * delivery: replace 'id' with active_id in passing context of order(takes built in function id in webclient).
- * https://launchpad.net/bugs/528871
-   * Account : Dupliacting tax code should not copy move lines
- * https://launchpad.net/bugs/539707
- * https://launchpad.net/bugs/514273
-   * Base_report_designer : Replaced libxslt/libxsml2 code by lxml
- * https://launchpad.net/bugs/540946
-   * Hr_holidays : Constraint corrected for Holidays request(start date cannot be greater than end date)
- * https://launchpad.net/bugs/548494
-   * Account : Account should not be removed/deactivated if it is linked to any property/partner
- * https://launchpad.net/bugs/418080
-   * Document : Browse__files_using_ftp wizard corrected
- * https://launchpad.net/bugs/541006
-   * MRP/Purchase : Seller delay has to be converted into integer for date calculations.
- * https://launchpad.net/bugs/528978
- * https://launchpad.net/bugs/528929
-   * Account : Tax code tree view should have company.
- * https://launchpad.net/bugs/552461
-   * Scrum : Burndown chart was crashing when a taskwork entry is without date
- * https://launchpad.net/bugs/553168
-   * Account : Journal's name_search() did not use context well
- * https://launchpad.net/bugs/494352
-   * Sale : account_invoice_end() corrected/optimized so that it does not create any regression of duplicated pickings for SO
- * https://launchpad.net/bugs/531238
-   * improved regression tests in sale and mrp_jit modules to test separately auto-chained locations. (bug 531238)
-   * mrp: use correct location chaining by calling action_confirm() on stock move instead of directly writing the status (bug 531238).
- * https://launchpad.net/bugs/540151
-   * Event : Notify user before sending an email on confirming event
- * https://launchpad.net/bugs/542379
-   * Account : Terp file had duplicated author,depends keys
- * https://launchpad.net/bugs/539073
-   * account_date_check: If the date of the move line, is not in the
- * https://launchpad.net/bugs/532073
- * https://launchpad.net/bugs/526081
-   * MRP : Ondelete=cascade applied to important fields of stock.warehouse.orderpoint
- * https://launchpad.net/bugs/535642
-   * Stock : Unlink() of Move corrected
-   * Stock :Picking removal should remove moves too
- * https://launchpad.net/bugs/506431
-   * Use the file name instead of the content
- * https://launchpad.net/bugs/531638
-   * Sale_crm : Code improved for partner onchange to take effect on SO
- * https://launchpad.net/bugs/530926
-   * Account : Invoice group was missing access rights for tax and tax code
- * https://launchpad.net/bugs/531416
- * https://launchpad.net/bugs/535601
-   * Account : Proper query generation for computing debit.credit,balance
- * https://launchpad.net/bugs/532365
-   * Document : It should be allowed to browse through FTP,disregard to --no-databse-list option
- * https://launchpad.net/bugs/399817
-   * Sale : Cancelled partial packing should affect Sale order's Shipped field
- * https://launchpad.net/bugs/538064
-   * Sale : Translations for RML texts entered into po/pot
- * https://launchpad.net/bugs/531479
-   * Stock : drop view check added for stock_report_prodlots
- * https://launchpad.net/bugs/504353
-   * Product : Conversion from unmatched categorized UoM now raises exception
- * https://launchpad.net/bugs/532716
-   * MRP : Split production wizard corrected
- * https://launchpad.net/bugs/538419
-
-
-Improvements (addons)
----------------------
-
- * base_contact: res.partner.address: use domain instead of value in context
- * Stock :Layout for  Moves under Picking Improved
- * Account : Fiscalyear and Period now have name_search
- * Product : Duplicated demo data corrected
- * purchase: moved smoke test into separate test dir and renamed demo data for consistency with sale/mrp smoke tests
- * l10n_be: attribution de nouveaux codes plus explicites pour les taxes
- * Account_voucher : Accounting entries should only be available for non-view accounts
- * Account : Better view of Reconciled and Partially Reconciled entried with Entry Lines
- * Account : Setting tax code name translateable (to be consistent with tax name)
-
-
-2010-03-01: 5.0.7
-=================
-
-Bugfixes (server)
------------------
-
- * Not linked to a bug report:
-   * --smtp-ssl is not a dependent on the server ssl mode
-   * bug:504718
-   * orm: ensure the cursor is valid before computing parent_store values
-   * correct ustr. avoid a crash if getlocale() return None
-   * Fields.function : if store={}/True is removed,column should be dropped with cascaded effect
-   * Base.sql : added relation field column to ir_model_feilds
-   * Fields : relational field was not getting written to ir_model_fields,in case of one2many
-   * allow to create menu executing ir.actions.server
-   * orm: bug when browsing _inherits object
-   * Search made working for function/related fields with store=True/{...} or fnct_search=method
-   * _inherits table may delete the record which is parental to other object but not required.
-   * remove the lock on database connections
-   * correct threading problems in cache
-   * Server Action : Email can be sent with non-English characters now
-   * quality_integration_server: if db exits, db should removed on database creation
-   * Currency : Rounding improved
-   * Importation when fails,needs cursor to be rolled back
-   * handle the case of missing "#:" formated comment in po files
-   * custom report xml creation
-   * better locking when accessing to template1 database
-   * remove minidom from report/custom, replace with lxml
-   * leftover call to minidom in ps_form even though minidom isn't imported there anymore
-   * Remove leftover instances of libxslt and libxml2, replace them by lxml
-   * hang in OSX when trying to shutdown server via SIGINT
-   * set absolute path for the config file to avoid the save() method breaking on single file, since os.path.exists('') returns false and you can't create the current directory
-   * quality_integration_server: fixed problem in make link
-   * translation: modify msg id where it contains python code in translations po files
-   * use env for python shebang rather than hardcoding /usr/bin/python
-   * base: wrong fr_FR translation for 'Delete Permission'
-   * db_exist method works as expected
-   * quality_integration_server : fixed bug on make link
-   * quality_integration_server: wrong web-service name
-   * Upgrade could have failed when its a change in name field,added cascade
-   * Expression : Making search easier for 'child_of'- Recursivity on field used as a Left operand
-   * solve problem of importing data from csv with constraints available on object
-   * act_window False domain problem - produce after dom to lxml conversion
-   * On update, fields with only numeric/int/float could have digits
-   * On Update, if only the size of column is changed,it should reflect into DB
-   * quality_integration_server : fixed problem in integration server on translation checking if translation file is changed on base module
-   * Avoid crash when no args
-   * Config : wrong calculation if cached_timeout comes from config file
-   * Expression : domain calculation failes, max. recursion error protected
-   * recursive calls
-   * allow to call write without ids on osv_memory objects
-   * Specify the name of the argument for the context, to avoir a critical bug
-   * <seq> problem Report Engine
-   * Workflow button desactivation regarding user roles
-   * Improved Previous bad commit for pagelayout error
-   * Import : Context of the action/screen passed,taken into consideration while importing
-   * quality_integration_server: ascci encoding problem in quality html log
-   * recursive child_of on one2many and many2many
-   * default context
- * https://launchpad.net/bugs/463415
- * https://launchpad.net/bugs/525962
-   * Ir_model : Made an offensive check of context
- * https://launchpad.net/bugs/430133
-   * Name_search() is having now record limit to be 80 instead of None
- * https://launchpad.net/bugs/407667
-   * Allowed SQL reserved keywords to be used in _order,group by ,etc.[Make sure , your _order should look like _order='to' instead of to]
- * https://launchpad.net/bugs/495636
-   * Warning for reports for header attributes used in .py
- * https://launchpad.net/bugs/523071
-   * Default_get : fields of _inherits for default values should be considered
- * https://launchpad.net/bugs/493548
-   * Ir_actions : Unicode error corrected
- * https://launchpad.net/bugs/409354
-   * Browse with _inherits issue fixed  if more than one M2O to parent objct exists
- * https://launchpad.net/bugs/430805
-   * Import made successful when field is O2M and it has relation under that.
- * https://launchpad.net/bugs/462506
-   * Priority on fields.function with store dictionary made working.
- * https://launchpad.net/bugs/483527
- * https://launchpad.net/bugs/373176
-   * Behavior of server corrected if addons-path is wrong
- * https://launchpad.net/bugs/489355
-   * fields: '_fnct_write' should pass context object to the 'write' method
- * https://launchpad.net/bugs/491867
-   * revert bad fix
-   * fields.related were misbehaving
- * https://launchpad.net/bugs/433886
-   * Update Module : Float8 to float and numeric to float casting made possible
- * https://launchpad.net/bugs/410191
-   * Record rule : domain evaluation problem corrected
- * https://launchpad.net/bugs/519468
-   * Fields : Only one2many fields can have relation_field,avoid checks for others
- * https://launchpad.net/bugs/523971
-   * Missing imports of _ of tools.translate provided
- * https://launchpad.net/bugs/500571
-   * Record Rules : domain_force made working
- * https://launchpad.net/bugs/519204
-   * Base : Country can be searched on Country codes independent to case
- * https://launchpad.net/bugs/493545
-   * Allowed <notebook> to be added into an inherited view(under field)
- * https://launchpad.net/bugs/456978
-   * O2M should check existing relations for its concerned M2O
- * https://launchpad.net/bugs/522227
-   * Fixed error notification on parent_store=true with a column without ondelete=cascade
- * https://launchpad.net/bugs/516030
-   * Export translations + Cache on translations + Resynchronization wizard Corrections
- * https://launchpad.net/bugs/430728
-   * Allowing sql keywords as fields(don't use them in order by clause)
- * https://launchpad.net/bugs/480782
- * https://launchpad.net/bugs/524588
-   * translate: error with workaround about \xa0 in decimal_point and thousands_sep
- * https://launchpad.net/bugs/453269
-   * Amount_To_Text Corrected
-   * Amount to text conversions made better
- * https://launchpad.net/bugs/490604
-   * RAW reports creation corrected
- * https://launchpad.net/bugs/425350
-   * Menu attribute to report/wizard/url made behaving correctly
- * https://launchpad.net/bugs/504584
- * https://launchpad.net/bugs/495948
-   * Corrected language code for Slovenian and Danish locales. Renamed corresponding PO files.
- * https://launchpad.net/bugs/480301
-   * M2M : values filtering on set()
- * https://launchpad.net/bugs/503278
-   * Search : searching translated fields made possible(related,one2many,many2many)
- * https://launchpad.net/bugs/504243
- * https://launchpad.net/bugs/490125
-   * Custom fields should be removed from _columns too
- * https://launchpad.net/bugs/490337
-   * Corrections made when removing a module and updating the module database:                                                                    Entry from ir_model_data should also be removed when moudle is removed
- * https://launchpad.net/bugs/496433
-   * Server Action: Help message of Legend corrected
- * https://launchpad.net/bugs/417023
-   * Installation should alert user if any no pool record found for M2M/M2O.
- * https://launchpad.net/bugs/493657
-   * Custom fields won't disturb anything while updating server
- * https://launchpad.net/bugs/435933
-   * Encoding error corrected for client_action(ir_values-tree view)
- * https://launchpad.net/bugs/514231
-   * M2O : Unfair behavior of M2O for access denial records and normal ones(All records were hidden by access denied if one had failed to meet access rights).
- * https://launchpad.net/bugs/499501
-   * Report : Proper Message notification when RML file is not found
- * https://launchpad.net/bugs/523762
-   * Expression.py corrected when M2O search returns no IDs
- * https://launchpad.net/bugs/420507
-   * Domain was getting failed when trying to work upon M2M,O2M field of object
- * https://launchpad.net/bugs/523123
-   * Not allowing Duplicate shortcuts
- * https://launchpad.net/bugs/516469
-   * Wizard should raise exception to user when writte inside 'choice' type
- * https://launchpad.net/bugs/488234
-   * connection pool when database password is provided (thanks to Syleam Crew)
- * https://launchpad.net/bugs/491365
-   * Translation: Error parsing .po files when application puts comments in a single line
- * https://launchpad.net/bugs/433395
- * https://launchpad.net/bugs/462285
-   * Remove the useless cr.commit() in the get_id() method of the ir.sequence object
- * https://launchpad.net/bugs/356628
-   * allow related fields to point to one2many and many2many fields
- * https://launchpad.net/bugs/460560
-   * Ir_attachment : Context updation corrected on preview
- * https://launchpad.net/bugs/437729
-   * Export Translation : Warning on Non-existing record instead of breaking flow
- * https://launchpad.net/bugs/503445
-   * Partner : Name_get() of res.partner.address corrected
- * https://launchpad.net/bugs/445252
-   * Translation was not getting inserted to DB on write()
- * https://launchpad.net/bugs/497364
-   * revert previous patch about linked bug (lp:497364)
-   * Menu : Search method corrected for the non-Admin user
- * https://launchpad.net/bugs/434341
-   * Export : Selection field gets imported by its external name  if export is not import compatible
- * https://launchpad.net/bugs/489573
-   * Manual object and field creation with searchable
- * https://launchpad.net/bugs/520854
- * https://launchpad.net/bugs/449516
-   * Warning raised for server action with SMS facility
- * https://launchpad.net/bugs/519699
-   * Export translations: module name from path calculations corrected
- * https://launchpad.net/bugs/516965
-   * User / Preferences should always display translatable languages.
- * https://launchpad.net/bugs/516964
-   * default_FIELD from context should not overwrite modified FIELD value while creating record
- * https://launchpad.net/bugs/516044
-   * Graph : report corrected
- * https://launchpad.net/bugs/516962
-   * modifying a cron from client make it run concurrently multiple times
- * https://launchpad.net/bugs/447819
-   * Ir_values : reading of default values correted
- * https://launchpad.net/bugs/510600
-   * Import should raise an uncaught exception if not identified
- * https://launchpad.net/bugs/413121
-   * Related with O2M behavior corrected
- * https://launchpad.net/bugs/487836
-   * Custom Object xml arch needed encoding.
- * https://launchpad.net/bugs/516969
- * https://launchpad.net/bugs/487723
-   * Module informtion was not getting updated on upgrading module
- * https://launchpad.net/bugs/372747
-   * Disable the cache for the ir.rules
- * https://launchpad.net/bugs/478724
-   * Export : M2M field name was missing last character
- * https://launchpad.net/bugs/497423
-   * FormatLang : Dates if specified into String,will be formatted into language-specific format
- * https://launchpad.net/bugs/429519
- * https://launchpad.net/bugs/479915
-   * Added lxml as required module on setup
- * https://launchpad.net/bugs/495374
-   * Partner : titlee can have a choice to be null
- * https://launchpad.net/bugs/509629
-   * Expression : Domain calculation of M2M/O2M corrected
- * https://launchpad.net/bugs/504720
- * https://launchpad.net/bugs/516568
-   * Server Actions: evaluating dict corrected
- * https://launchpad.net/bugs/512682
-   * avoid sql injection in sequences
- * https://launchpad.net/bugs/400614
-   * Use an alternative for the locale.RADIXCHAR if this one doesn't exist
- * https://launchpad.net/bugs/491462
-   * Pickling issue solved with ir_values (get method)
- * https://launchpad.net/bugs/507429
-   * Encoding problm corrected on report contents
-   * If RML contains unicode characters and title in the same <para>,it would have failed.
-
-
-Improvements (server)
----------------------
-
- * orm: allow import and record creation to defer the computation of parent_left/right
- * orm: do not update parent_left/right if the parent haven't been changed
- * Licensing options : Added AGPL-3 and others in choices
- * Groups : Better duplication terminology.
- * sql_db: better logging
- * osv: log (in debug) access errors
- * web_service: remove log (debug) when creating database
- * exported method check_connectivity
- * Sequence : Legend improved to help user understand the usage of %(year)s
- * remove useless comment
- * Launchpad export translation files
- * removal of usages of the deprecated node.getchildren call, better usage of the attributes & tostring ET APIs, style fixes
- * improve usage of the ET API, use SubElement instead of Element/append, kwarg attributes setting instead of node.set
- * add option to disable the database listing
- * quality_integration_server: added net_port option in script
- * better connection pool (global)
- * ir_cron : added active feild on list view
- * Allow to specify the view via the context
- * cron: check the arguments to avoid security issues
- * cron: failed jobs are logged
- * cron: clean code
- * base_quality_interrrogation: put message if the score of quality less then minimal and remove unit test condition
- * quality_integration_server: quality log : add new option to specify qualitylog path to store html pages of log
- * default value for module
- * updated changelog file for 5.0.6 release
-
-
-Bugfixes (addons)
------------------
-
- * Not linked to a bug report:
-   * event: make invoice wizard now creates invoice line with better label
-   * membership:
-   * Sale : Onchange of product/qty corrected when uos is present.Product: Help corrected for uom to uos conversion.
-   * Remove the bad translation files
-   * membership: membership amount field corect name of digits in field defination
-   * audittrail: correct dependencies
-   * audittrail: ensure cursor is closed
-   * invoice: translate the product description only if partner's language is set.
-   * account: avoid a traceback if credit/debit/balance sum can be computed
-   * mrp: fixed demo data when default_code is overridded in a custom module
-   * crm: removed debugging code
-   * document: fixed problem on window on filezilla
-   * sale_crm: CRM->Opportunities: 'convert to quote' now sets the salesman from the partner (or the user if there is none)
-   * sale: onchange on partner_id now set the partner's dedicated salesman as the sale salesman or the user if there is no dedicated salesman on that partner
-   * base_contact: search for a contact in a contact job now searches in firstname and lastname
-   * product: pricelist: ondelete cascade to avoid errors when deleting pricelists and versions ('null value in column "price_version_id" violates not-null constraint')
-   * sale_delivery_report: production lot reference was missing
-   * sale: onchange on partner_id now set the partner's dedicated salesman as the sale salesman
-   * sale_delivery_report: typo in french translation file
-   * Analytic_user_function : Corrected the  Wrong way call to the  method of product.uom
-   * base_contact: search in "Contact's Jobs" now also search in firstname and lastname of contacts
-   * Base_report_creator : ilike query generation problem corrected
-   * account: At the time of invoice cancel it will remove partial reconcile id from entry
-   * Account: Bank statement line,if has write-off entries,should pass write off account to move line
-   * account: set correct journal while opening customer and supplier invoices and refunds
-   * fix a prolem for the wiki content for the indexing
-   * product: Now pricelist objects price get function will pass context to price_get method of product and compute method of currency object
-   * base_module_quality: add import statment for _ and give size to name field on save report wizard so that it can display long name also
-   * Account : Wrong residual amount comes if company currency and invoice currency are different(provided no currency defined on journal)
-   * account: wizard of fiscal year closing fixed: the entries of all previous fiscal years have to be deffered, not only the last one
-   * l10n_be: fixed data of l10n_be module
-   * Analytic account report corrected
-   * Account_Voucher : Reports corrected
-   * Sale_CRM : write() was sending wrong data
-   * MRP : Accounting Entries were duplicated when processing production order with accounting configuration for locations.
-   * base_contact: domain problem on job object
-   * project: extra info tab of task view shouldn't be readonly if the task'state is 'draft'
-   * account_followup: the followup level of a partner which was removed from the proposed partner to remind was still raised although we didn't select him.
-   * change class names for all model in voucher from Account = account_account
-   * Base_report_creator : Wizard is available only for custom query,not for the custom result
-   * Point_of_sale : Receipt report corrected
-   * Account_tax_include : improvements when invoice lines are created prior to invoice
-   * Account_tax_include : Minor modif
-   * account_analytic_plans: analytic distribution are now created on invoice line when confirming sale orders (if a line is matching account analytic default rule)
-   * account: partial reconciliation check was wrongly computed
-   * base_module_quality: get_ids method problem
-   * account: no need to do a call to 'translate', method '_' is sufficient.
-   * base_module_quality: solve translate string error
-   * Stock: Moves have no state 'auto',its 'waiting'
-   * base_module_record second range problem when second is 59
-   * Project_timesheet : Removal of task with task work should affect Analytic lines
-   * Track Incoming / Outgoing products:
-   * account_analytic_default: add stock dependancy
-   * removed print statement
-   * picked in SO
-   * Project : remove unused import causing a DeprecationWarning under Python 2.6
-   * l10n_be: corrected internal type of vat account in l10n_be: set other instead of payable/receivable
-   * Hr_timesheet_sheet : setting type=workflow to 2 buttons
-   * Account: text made translatable
-   * fix the problem of menus uring installation
-   * Regression in SO from Jeroen and Jay, picked state see bug #491375
-   * Stock : Added Product UoS to the Stock Move view
-   * Base_contact : Making Email field of address visible on Address form view
-   * Stock : Added translations
-   * Account_invoice_layout : Reports improved and SXWs made compatible to RML
-   * membership: invoice membership wizard now calculate tax corectly and on product membership fields make readonly to false
-   * membership: change membership product date from and date to value with current year on demo data
-   * membership: solve problem of deleting membership invoice created with old membership product
-   * Account: Wizards were missing translation import statement
-   * Residual amount into invoice is now correct in every case and avoid rounding trouble even if rating has changed
-   * account: avoid translate tool missing import on strictier Python 2.6 versions; bare in mind that mx.Datetime should be eraticated from the surface of the earth
-   * account: removed pdb now that things are claimed fixed (after the commits messages)
-   * account_analytic_plans: Use etree instead of xml.dom
-   * fix the problem that appers in to the account move due to accout voucher
-   * Account_date_check : correction on a method
-   * Account_voucher : Typo corrected for Voucher type.
-   * Account : Corrected the malformed report of Partner Ledger
-   * purchase_manual: Import OSV
-   * python2.6 compatibility
-   * AuditTrail : View Logs should only show logs of current object and resources
-   * fix the problem of the reports account voucher
-   * #TODO: fix me sale module can not be used here,
-   * Import OSV in the wizard
-   * purchase: Use the price_accuracy
-   * Base_Report_Creator : xml record was malformed, corrected
-   * hr_expense: corrected error message
-   * account: avoid ZeroDivisionError
-   * Specify the name of the argument for the context, to avoir a critical bug
-   * CRM : Mailgate script added option -he was conflicting,improved
-   * Account :Invoice report had Partner name displayed at wrong position
-   * bugfix residual computation and multi-currencies
-   * Base_report_creator : Calendar view problems on custom report
-   * typo
-   * workcenter load graph
-   * set the access right
-   * base_module_quality: speed test if read method has exception
-   * account_analytic_plans: avoid encoding errors
- * https://launchpad.net/bugs/528289
-   * membership: printing report crashes on graph view
- * https://launchpad.net/bugs/522696
-   * Stock : Split moves wizard should respect current language
- * https://launchpad.net/bugs/528281
-   * membership: membership state not correctly updated with associated partner
- * https://launchpad.net/bugs/524425
- * https://launchpad.net/bugs/416810
-   * Document: attachment linked with Files
- * https://launchpad.net/bugs/470359
- * https://launchpad.net/bugs/438725
-   * Purchase : Setting the value of payment term while creatying invoice from PO
- * https://launchpad.net/bugs/492793
-   * Project_gtd : Improved fields_view_get() andmade it compatible to stable
- * https://launchpad.net/bugs/525314
-   * membership: membership date from and to required now on product form
- * https://launchpad.net/bugs/453030
-   * Avoid display write-off in pay invoice wizard : take care of partial payment
-   * Avoid display write-off in pay invoice wizard. Put the right date and currency for conversion
- * https://launchpad.net/bugs/448591
-   * Account : Refund wizard wasnt calculating taxes for new invoices
- * https://launchpad.net/bugs/489241
-   * mrp_operations : work order calculation corrected
- * https://launchpad.net/bugs/493704
-   * Small stock tracking problem
- * https://launchpad.net/bugs/518914
-   * Unable to validate supplier invoice/refund with reference greater than 32 characters. The reference is used as reference for the move lines and the analytic account line but the reference of these objects are limited to 32 characters, raising an sql error. It also broke the workflow of the invoice.
- * https://launchpad.net/bugs/481130
-   * Stock: Shipping Address has to be in.po/.pot
- * https://launchpad.net/bugs/427869
-   * Residual amount in invoice when currency rating change
- * https://launchpad.net/bugs/474337
-   * [CRITICAL] warning : missing import statement for "_"
- * https://launchpad.net/bugs/513983
-   * Sale : Order lines should be not editable for non-draft SO.
- * https://launchpad.net/bugs/433898
-   * fix a problem Point of sale create outgoing shipments incl. service items
- * https://launchpad.net/bugs/516746
-   * Account : Bank statements should not be altered/removed when state is confirmed
- * https://launchpad.net/bugs/445267
-   * Mrp_subproduct : Wrong calculation of QTYs corrected(Product qty,UOS qty)
- * https://launchpad.net/bugs/496889
-   * Account : wizard_pay_invoice corrected (Check made to calculate only receivable,payable lines)
-   * Account: Better calculation of invoice amount
- * https://launchpad.net/bugs/428926
-   * account_payment when importing payment lines (currency not set correctly)
- * https://launchpad.net/bugs/502984
-   * Hr_holidays: leaves' calculation corrected on removal of leaves
- * https://launchpad.net/bugs/434628
-   * Account : In bank statements,Move Lines should be imported only once
- * https://launchpad.net/bugs/503741
-   * Purchase : Purchase/user was missing account.tax access rights
- * https://launchpad.net/bugs/457188
-   * Account_analytic_analysis : Summary of Months calculation Corrected
- * https://launchpad.net/bugs/528292
-   * membership: membership cancel date is not updated
- * https://launchpad.net/bugs/351083
-   * Account : Partner Balance report gets printed with respect to the company selected
- * https://launchpad.net/bugs/497365
-   * Account : Supplier Invoices new record creation corrected for web client
- * https://launchpad.net/bugs/435298
-   * Subscription : Disallowed to change the Object linked to the document type.
- * https://launchpad.net/bugs/490883
-   * MRP: Proper context value passed for PO creation from packing via SO
- * https://launchpad.net/bugs/479886
-   * Account : Total field on supplier invoice set to 0.0 to amke it Web-client compatible
- * https://launchpad.net/bugs/398562
-   * MRP : Accounting Entries were duplicated when processing production order with accounting configuration for locations.
- * https://launchpad.net/bugs/445547
-   * Stock: Picking report correction
- * https://launchpad.net/bugs/507694
-   * Properly cancel a draft purchase.order when unlinking it, so correct workflow signals can be propagated to parent workflows if there are any.
- * https://launchpad.net/bugs/460924
-   * Stock : force_assign won't create duplicate entries
- * https://launchpad.net/bugs/516100
-   * Account : Invoice line should display complete name of product from the onchange
-   * Stock : Onchange corrected to have an effect of translations
- * https://launchpad.net/bugs/492174
-   * Base_report_creator : encoding eror corrected on adding filters
- * https://launchpad.net/bugs/446205
-   * CRM : Mailgate script has host as parameter now onwards
- * https://launchpad.net/bugs/501625
-   * Account : General Ledger report in Landscape made transltable
- * https://launchpad.net/bugs/440557
-   * Purchase : POL had a wrong tree view which is unused till now
- * https://launchpad.net/bugs/452854
-   * Correct the validate function for balanced move into account.py (after Fabien Warning)
-   * Use price_accuracy to verify balanced entry insteed of fixed '0,0001'. Add price_accuracy on debit and credit move lines
- * https://launchpad.net/bugs/522532
-   * Stock : Priority assigned to stock.location list view
- * https://launchpad.net/bugs/522629
- * https://launchpad.net/bugs/480035
-   * CRM : action name improved
- * https://launchpad.net/bugs/439469
-   * Product : Pricelist types getting translated on Pricelist
- * https://launchpad.net/bugs/512682
-   * avoid sql injection in sequences
- * https://launchpad.net/bugs/476343
- * https://launchpad.net/bugs/447402
-   * Project_timesheet : Wrong synchro on analytic line creation fro tasks(for name).
- * https://launchpad.net/bugs/490318
-   * Account : Ondelete=cascade added to bank statement line
- * https://launchpad.net/bugs/459027
-   * Sale : SOL's subtotal was missign price-accuracy
- * https://launchpad.net/bugs/509496
-   * Account_tax_include : Refund of invioce was not counting price_type.
- * https://launchpad.net/bugs/366944
-   * Base_vat : Spanish numbers validation corrected
- * https://launchpad.net/bugs/488869
-   * Stock/MRP : Track line wizard improved
- * https://launchpad.net/bugs/474340
-   * Stock : Wizard improvements from Lionel
- * https://launchpad.net/bugs/445306
-   * document: put warning message in module descrition regarding lost files which are exits before installing document
- * https://launchpad.net/bugs/491867
-   * base_contact: fix bad related field
- * https://launchpad.net/bugs/481524
-   * Stock : Forecast report: unicode error corrected
- * https://launchpad.net/bugs/493369
-   * Hr_attendance : Sign out entries were not possible when we 'change work'
- * https://launchpad.net/bugs/438705
-   * Stock : Stock move lines on Production Order well-structured
- * https://launchpad.net/bugs/500096
-   * Base_report_creator : Support of count(*) added
- * https://launchpad.net/bugs/521106
-   * Account : Analytic charts of accounts was raising exception on displaying chart
- * https://launchpad.net/bugs/464578
-   * project_timesheet: analytic entries are fully not updated, when changing task project
- * https://launchpad.net/bugs/483583
-   * Sale/Purcghase : Function fields did not have digits attribute for precision accuracy
- * https://launchpad.net/bugs/461720
-   * Scrum : Wrong view,widgetless fields on scrum view made correct
- * https://launchpad.net/bugs/491898
-   * Purchase : Fields set readonly on done state
- * https://launchpad.net/bugs/480856
-   * Warning : the super of onchange may return {},covered the same
- * https://launchpad.net/bugs/496898
-   * Account : Fields were missing in Account chart template form view
- * https://launchpad.net/bugs/502065
-   * Stock : Product Packaging field was missing domain
- * https://launchpad.net/bugs/351167
- * https://launchpad.net/bugs/459196
-   * Account : Partner Ledger Report formatting problem solved
- * https://launchpad.net/bugs/465010
-   * Stock : Notification Message made translatable
- * https://launchpad.net/bugs/491892
-   * Reconcilation problem corrected when foreign currency rate changes
- * https://launchpad.net/bugs/504781
-   * Project : Task delegation was calling write() wrongly
- * https://launchpad.net/bugs/494245
-   * Services product included on BOM now creates a task on Project
- * https://launchpad.net/bugs/475135
-   * Account : Warning message was missing _ import
- * https://launchpad.net/bugs/467880
-   * MRP : Procurement can only be confirmed when qty>0.0
- * https://launchpad.net/bugs/401801
-   * Sale/Purchase : Worfklow instance had to ve removed while setting record's workflow back to draft state
- * https://launchpad.net/bugs/449583
-   * Sale : Better error message when account is missing from SOL for Invioce
- * https://launchpad.net/bugs/439041
-   * Report_project :wrong average of closing days counting
- * https://launchpad.net/bugs/517018
- * https://launchpad.net/bugs/487641
-   * Purchase : MOQ-pricing problem corrected
- * https://launchpad.net/bugs/500062
-   * Account : On Confirming the statement, Moves shoould have the bank statement line date
- * https://launchpad.net/bugs/525229
-   * call fields_view_get with not specify the context raise an exception on product with stock module installed
- * https://launchpad.net/bugs/441609
-   * Account : Fiscal Position Template was missing a requireed field in form view
- * https://launchpad.net/bugs/483723
-   * CRM : Case form view priority issue resolved
- * https://launchpad.net/bugs/440734
-   * Stock : Picking did not have 'type' field on display(inconsistent behavior from eTiny,koo) to work upon domain.
- * https://launchpad.net/bugs/419720
-   * Sale : Delivery Date delay computation made corrected when days are passed with fractions
- * https://launchpad.net/bugs/439208
-   * Hr_timesheet : Allowing user to enter Analytic Journal if not linked with employee(Working hours tree view)
- * https://launchpad.net/bugs/379118
-   * Stock : Partial Picking wizard was making the back order reference jump to 2 numbers,notification given on packing done.
- * https://launchpad.net/bugs/526930
-   * Account : act_link added for better options of viewing move lines from partner
-   * Account : act_link from partners for account entries should contain only receivable/payable accounts
- * https://launchpad.net/bugs/526417
-   * Sale_delivery_report : Report corrected
- * https://launchpad.net/bugs/450180
-   * Hr_timesheet_invoice : Wrong domain was sent for opening invoices created
- * https://launchpad.net/bugs/446391
-   * Base_report_creator : Allowing to use current userid
- * https://launchpad.net/bugs/519225
- * https://launchpad.net/bugs/522011
-   * fix a problem of 0 amount entries
- * https://launchpad.net/bugs/505697
-   * Account : Analytic check report should consider expenses are debits
- * https://launchpad.net/bugs/519220
-   * Weight on Picking has to be calculated from the Moves
- * https://launchpad.net/bugs/519433
-   * Sale : Invoice from packing should pass proper notes to invoice
- * https://launchpad.net/bugs/500078
- * https://launchpad.net/bugs/527151
-   * CRM_configuration : Menu action for all Unassigned opportunities had wrong domain
- * https://launchpad.net/bugs/486783
-   * Point_of_sale : Report for Reciept corrected
- * https://launchpad.net/bugs/503894
-   * Base_report_crearor :Models with _inherits made working
- * https://launchpad.net/bugs/371681
-   * Residual amount was calculated wrongly when invoice had payment term lines
- * https://launchpad.net/bugs/454536
-   * Warning : Onchange Methods were malfunctioned.Corrected and made messages available for translations
- * https://launchpad.net/bugs/504670
-   * Functional fields should have context as an argument when we use fnct_searc method
- * https://launchpad.net/bugs/507094
- * https://launchpad.net/bugs/396637
-   * account_analytic_analysis : Analytic account functional field methods corrected.
-   * Account : Analytic account functional field methods corrected.
- * https://launchpad.net/bugs/495948
-   * Corrected language code for Slovenian and Danish locales and renamed corresponding PO files.
- * https://launchpad.net/bugs/470815
-   * l10n_chart_uk_minimal : Demo account.tax.code needed negative sign
- * https://launchpad.net/bugs/513240
- * https://launchpad.net/bugs/421636
-   * Account : Restricting Payment term lines percentage insertion from 0 to 1
- * https://launchpad.net/bugs/516636
-   * Project_timesheet: Product_uom supplied to Analytic entries
- * https://launchpad.net/bugs/492211
-   * MRP : procurement does not need cancel button when its Running
- * https://launchpad.net/bugs/401035
-   * Audittrail : Assigned Access Rights to non-admin user.
- * https://launchpad.net/bugs/511198
- * https://launchpad.net/bugs/499120
-   * Stock : While removing the picking,moves should not call picking's write()
- * https://launchpad.net/bugs/438690
-   * Account : Accounts containing moves cannot be deleted
- * https://launchpad.net/bugs/490965
-   * Sale : SO was getting stuck when invoice is cancelled and SOL is with product.
- * https://launchpad.net/bugs/446520
-   * [account_followup] wrong sender for email
- * https://launchpad.net/bugs/528418
-   * membership: all products are considered to be memberships
- * https://launchpad.net/bugs/522862
-   * document: Fixed non-closed Cursor problem
- * https://launchpad.net/bugs/451310
- * https://launchpad.net/bugs/479747
- * https://launchpad.net/bugs/486794
-   * Hr_holidays: Spell mistake corrected
- * https://launchpad.net/bugs/443132
-   * Sale : Passing customer ref. of picking to invoice
- * https://launchpad.net/bugs/481372
-   * Project : If company has no Project time unit,it would have crashed.
- * https://launchpad.net/bugs/476428
-   * Stock : Partial Picking wizard was missing translation import statement
- * https://launchpad.net/bugs/500591
-   * Account: Spell corrected in order to display separator on subscription wizard
-   * Account: Creation of Moves to Subscription entries Corrected
- * https://launchpad.net/bugs/436174
-   * Account: Supplier invoices was not taking product price on onchange of product
- * https://launchpad.net/bugs/488809
-   * Sale : State was written wrongly
- * https://launchpad.net/bugs/490327
-   * Reverted bad commit from Joel@CamptoCamp
- * https://launchpad.net/bugs/383057
-   * Stock-MRP : Split production wizard made individual to mrp if mrp is not installed
- * https://launchpad.net/bugs/440711
-   * Purchase : PO with different pricelists should not be merged
- * https://launchpad.net/bugs/516143
-   * Base_report_designer : Latin-1 encoding replaced by utf-8
- * https://launchpad.net/bugs/525768
-   * membership: now membership state not depends on current date
- * https://launchpad.net/bugs/513230
-   * Product :Uom conversion was made 2 times
- * https://launchpad.net/bugs/522977
-   * Fixed mrp to ensure that mrp_jit can trigger the procurement assignation properly. See bug 522977.
- * https://launchpad.net/bugs/510692
-   * Account : Onchange of product should affect price on supplier invoice line
- * https://launchpad.net/bugs/458415
-   * document_ics : solved accent problem
- * https://launchpad.net/bugs/428873
-   * purchase: chain location does not work
- * https://launchpad.net/bugs/489355
-   * account, invoice, sale: description (product sold, invoice line and account entry line) was not translated
- * https://launchpad.net/bugs/515590
- * https://launchpad.net/bugs/499645
-   * Project_mrp: Better effect for service products creating tasks/projects
- * https://launchpad.net/bugs/466658
-   * Account : Action window of anlytic entries was missing name
- * https://launchpad.net/bugs/510217
-   * Added Missing import statements of translations( from tools.translate import _)
- * https://launchpad.net/bugs/460701
-   * Document : Attachment with document can now be deleted
- * https://launchpad.net/bugs/498047
-   * Account_tax_include : Rounding corrections
- * https://launchpad.net/bugs/435160
-   * [IMP] Correct write-off date, add analytic account, better interface between all way to reconcile
- * https://launchpad.net/bugs/458553
-   * Account : Onchange of amount/base amount of Invocie tax corrected
- * https://launchpad.net/bugs/446681
-   * Account : Refund wuzard malfunctioned with modify invoice option
- * https://launchpad.net/bugs/493444
-   * Account_analytic_default : Analytic Account value set from picking,sale
-   * account_analytic_default: now it will make entry in anayltic account on invoice line when picking done
- * https://launchpad.net/bugs/395160
-   * Project_timesheet : Analytic line creation/edition takes user based information
- * https://launchpad.net/bugs/425671
-   * Stock : Moves offer onchange on UOM to affect UOS
- * https://launchpad.net/bugs/489083
-   * Account :customer refund was displaying supplier invoice view, corrected
- * https://launchpad.net/bugs/499038
-   * CRM_profiling : Segmentation form was missing one field
- * https://launchpad.net/bugs/496991
-   * HR_Timesheet_sheet : timesheet cannot be deleted which have attendance entries encoded
- * https://launchpad.net/bugs/507638
-   * Account : General Ledger report corrected for debit/credit if 0
- * https://launchpad.net/bugs/461801
-   * Sale : Workflow behaviour fixed when order is set to draft
- * https://launchpad.net/bugs/516361
-   * POS : for Invoice created from POS,Consistency should be maintained as SO.
- * https://launchpad.net/bugs/439027
-   * MRP :Arguemnt of context was missing
- * https://launchpad.net/bugs/490342
-   * Account : making the default_get() eTiny compatible
- * https://launchpad.net/bugs/504824
-   * account: credit/debit/balance of consolidated accounts
- * https://launchpad.net/bugs/522632
-   * Sale : Sale order list view should have sum attribute
- * https://launchpad.net/bugs/435178
-   * [CRITICAL]subscription: crash subscription process
- * https://launchpad.net/bugs/522161
-   * base_module_quality: speed_test
- * https://launchpad.net/bugs/487091
-   * Stock :Invoice created from manual picking might miss UoS.
- * https://launchpad.net/bugs/379581
-   * Base_report_creator: Export of custom reports made working
- * https://launchpad.net/bugs/479195
-   * Base_vat : Romania VAT validation corrected
- * https://launchpad.net/bugs/436008
-   * Sale: Passing Contact address for invoices from SO
- * https://launchpad.net/bugs/443069
-   * Project: wrong domain for 'Tasks in Progress' menuitem
- * https://launchpad.net/bugs/518824
-   * Project : 100% completed project should dislay proper message on Gantt chart,instead of getting failed
- * https://launchpad.net/bugs/471052
-   * Product : Pricelist Item cannot use Main pricelist as the other pricelist
- * https://launchpad.net/bugs/458030
-   * Account : Ledger Report Landscape report adjusted for A4.
- * https://launchpad.net/bugs/495933
-   * Account : Made amount field of account.move searchable
- * https://launchpad.net/bugs/440248
-   * Hr_timesheet_invoice : Line once invoiced,should not be invoiced again
- * https://launchpad.net/bugs/491241
-   * Stock : Removal of picking shuold affect product stock
- * https://launchpad.net/bugs/510604
-   * Account: Sequence and main seq. should be different
- * https://launchpad.net/bugs/436651
-   * mrp : workcentre load report had a query malformed
-
-
-Improvements (addons)
----------------------
-
- * Update Translations
- * Don't specify default value for dict, that return None if value doesn't exists
- * Account_payment: showing account feild on move line when importing invoice for payment
- * Account/base_iban : bank and iban displayed on list view of O2M to partner
- * MRP : BOM structure report should follow hierarchy.
- * event_project: change the string on event object all task to remaining task and put the domain on retro planning wizard(open only projects with state=template)
- * Account : Reference allocation to move/move.line improved
- * Launchpad export translation files
- * Added GNU licence
- * Unit Test cases for Sale
- * unit test in base quality module
- * MRP : mrp.routing.workcenter made deletable on cascade effect
- * Account : Entry Line action Name Improved
- * Stock : Improved names of Stock move tree view
- * account: make comment mandatory. Since it has a default value anyway, it doesn't reall y change anything, but makes the reconciliation UI looks consistent accross the whole OpenERP (eg invoice payment)
- * Add support of analytic account into bank statement to be convenient with other method
- * Add account field into bank statement line
- * better python2.5/2.6 compatibility handling
- * base_module_quality: styles on different tests
- * base_module_quality: modify all tests result display for buildpot, use class on tag instead of css file
- * base_module_quality: pylint test result display for buildpot, use class on tag instead of css file
-
-
-2009-09-22: 5.0.6
-=================
-
-Bugfixes (server)
------------------
-
- * https://launchpad.net/bugs/421904
-   * Fields.function : Store value computation corrected
- * https://launchpad.net/bugs/407332
-   * Price Accuracy : rounding made to be based on --price_accuracy option
-
-Bugfixes (addons)
------------------
-
- * Not linked to a bug report:
-   * fixed an "unsupported operand type(s) for +: 'bool' and 'str'" error.
-   * Sale_delivery_report : Delivery order report should take shipping address from picking itself
-   * account: bugfixed the fiscalyear closing wizard:
-   * Purchase_manual : certificate on terp displayed wrong value
- * https://launchpad.net/bugs/431864
-   * hr_timesheet_sheet : casting correction for a view
- * https://launchpad.net/bugs/431871
-   * Account : Move line creation was giving encoding error while automated entries were inserted,corrected
- * https://launchpad.net/bugs/433979
-   * [CRITICAL]document: crash list of directory after rev:hmo@tinyerp.com-20090916110722-4kl5t5q71im6c76i
- * https://launchpad.net/bugs/407332
-   * Account : Rounding problem based on price_accuracy
- * https://launchpad.net/bugs/419720
-   * Sale : Delivery Date delay computation made corrected when days are passed with fractions
- * https://launchpad.net/bugs/423726
-   * Sale : SO Boolean field picked behavior corrected
- * https://launchpad.net/bugs/431821
-   * Account_followup : Sending email while sending follow up corrected.
-
-
-Improvements (addons)
----------------------
-
- * purchase_manual: do not redefine view: add fields by inheritance...
- * purchase: improve views to be directly usable in portals...
-
-
-2009-09-17: 5.0.5
-=================
-
-Bugfixes (server)
------------------
-
- * Not linked to a bug report:
-   * quality_integration_server: fixe problem on make link of extra-module in addons
-   * quality_integration_server : quality log : reduce overwrite last test log in other test logs
-   * base : ir_cron : take minimun next_call from database for job waiting. if database does not has any job, it will take 1 day for job waiting
-   * quality_integration_server: get message from base_quality_module if module can not success to reach minimun score
-   * regression in fields.function computation
-   * better log error, new line
-   * Report: context was missing while printing any report with header in a non-English Language
-   * quality_integration_server: fixe problem on make link of extra-module in addons
- * https://launchpad.net/bugs/425131
-   * Better translation exportation.
- * https://launchpad.net/bugs/379645
-   * Print screen : Correction when text for report is already encoded
- * https://launchpad.net/bugs/421162
-   * Send Mail : Unicode error handled
-   * Send mail : Non-English characters were throwing error.
- * https://launchpad.net/bugs/421137
-   * Base : 'Supplier Partners' menu will open new record with supplier=1,customer=0
- * https://launchpad.net/bugs/425430
-   * Export : Error solved while Exporting O2M records with None value of any field
- * https://launchpad.net/bugs/399208
-   * Translation issue with cache: it needed to restart server,SOLVED
- * https://launchpad.net/bugs/422563
-   * Security Loophole corrected
-
-
-Improvements (server)
----------------------
-
- * quality_integration_server: make link of extra-addons module in addons module automatic on install-module command
- * quality_integration_server: get message from base_quality_module if module can not success to reach minimun score
- * Rng : Accepting Groups under/after/replacing Buttons
- * quality_integration_server : quality html log
- * quality_integration_server: put max_limit in server connection
- * Base : Rate for ARS Added
- * cchange version number
-
-
-Bugfixes (addons)
------------------
-
- * Not linked to a bug report:
-   * Purchase_manual : certificate on terp displayed wrong value
-   * fix the problem of message depending on the partner language
-   * fix a problem for the overdue payment message
-   * fix problem to get the detault message
-   * #416908 computation of invoice lines
-   * Project : Taks hours computed accurately.
-   * base_module_record: avoid duplications
-   * document: do not try to index binary documents
-   * +1 on the lengthmonth returns was too much, removed it
-   * Problem when using hr_holidays Summary Report when entering date 1 jan 2009 for example.
-   * multi currency reconciliations on bank statements weren't properly displayed
-   * multi currency payments weren't correctly computed on invoice's residual amount
-   * Project_gtd : Demo data defined for tasks(inboxes)
-   * Module:product Added report tag for product pricelist reportso that it can be modified using OODesigner
-   * Document : error on create if attachment not specified
- * https://launchpad.net/bugs/422401
-   * project_gtd : timebox field re-arranged
- * https://launchpad.net/bugs/421907
-   * Account : Aged Partner Balance report for Future analysis corrected
- * https://launchpad.net/bugs/427388
-   * Project : task work behavior towards task hours corrected
- * https://launchpad.net/bugs/422408
-   * Project_gtd : Hierarchical timeboxes allowed to open
- * https://launchpad.net/bugs/403972
-   * Account : Reports from Chart of Accounts were not considering contextual value of MOVE(draft,posted)
- * https://launchpad.net/bugs/430577
-   * Sale : Order Lines switches view from tree,form and view
- * https://launchpad.net/bugs/425257
-   * Project_gtd : improved menuitems names to avoid user confusion,domain improved
- * https://launchpad.net/bugs/422078
-   * Account_tax_include : floatdivision error corrected
- * https://launchpad.net/bugs/423585
- * https://launchpad.net/bugs/423581
- * https://launchpad.net/bugs/416807
-   * report_document : Dashboard should not display partner with no files
- * https://launchpad.net/bugs/430522
- * https://launchpad.net/bugs/424214
-   * Account :Residual amount unclear when used with partial payments.
- * https://launchpad.net/bugs/424177
-   * hr_timesheet_sheet : Rounding value problem in float_time widget
- * https://launchpad.net/bugs/415056
- * https://launchpad.net/bugs/421636
-   * added tooltip on tax and payment term
- * https://launchpad.net/bugs/407290
- * https://launchpad.net/bugs/407293
-   * Account : Making account.invoice.tax field language-depenant from account.tax
- * https://launchpad.net/bugs/430043
-   * Hr_timesheet_invoice : Query calculation corrected
- * https://launchpad.net/bugs/379645
-   * Base_report_creator : Print screen report is now available for custom reports
- * https://launchpad.net/bugs/423260
-   * Account : Title of of Move Line widnows renamed
- * https://launchpad.net/bugs/427982
-   * hr_timesheet_invoice : Invoicing analytic entries wizard corrected for product
- * https://launchpad.net/bugs/426243
-   * Account : Context was missing in report
- * https://launchpad.net/bugs/426831
-   * l10n_ch : default_value() of res.partner.bank corrected
- * https://launchpad.net/bugs/430098
-   * Hr_holidays : Workflow actions validations corrected
- * https://launchpad.net/bugs/430516
- * https://launchpad.net/bugs/379191
-   * its better to aply the patch
-   * fix the problem for related fields, related fields act as a many2one fields
- * https://launchpad.net/bugs/429203
-   * CRM : Mailgate script used default uid=3 instead of 1
- * https://launchpad.net/bugs/399817
-   * Fixed Partial deliveries problem
-
-
-Improvements (addons)
----------------------
-
- * Invoice Supplier Control per line/manual
- * add missing file for the followup date
- * changed interval CRM calls to 4 hours instead of one -> efficient connection pooling with cron
- * add inherited view for company
- * add new filed to company object which will store the mesages
- * add new data file which will add over due payment message to company
- * Account : Analytic Account report following parental relationship approach(account with all its children
- * hr_timesheet_invoice : Misleading string on invoice analytic entries' wizard
- * base_module_quality: remove certificate tag from terp test
- * report_dcoument : changed the misleading name of action
-
-
-2009-08-28: 5.0.4
-=================
-
-Bugfixes (server)
------------------
-
- * Not linked to a bug report:
-   * no traceback when access denied
-   * Security fix
-   * remove bad translation files (bad name)
-   * Pagecount problem while all objects print on same page and printing special character on xsl report
- * https://launchpad.net/bugs/415973
-   * import: support "<rel_field>:db_id" , better warning message
- * https://launchpad.net/bugs/415391
-   * Functional fields with M2O relation can be printed on print screen now
- * https://launchpad.net/bugs/415334
-   * ir_cron :function and its arguements are now editable
-
-
-Improvements (server)
----------------------
-
- * replace partner name and address in demo
- * add translation names
- * update translations files
- * new translations
-
-
-Bugfixes (addons)
------------------
-
- * Not linked to a bug report:
-   * Document : error on create if attachment not specified
-   * report_dcoument : changed the misleading name of action
-   * point_of_sale: fixed a wrong domain
-   * sale: bad indentation
- * https://launchpad.net/bugs/416807
-   * report_document : Dashboard should not display partner with no files
- * https://launchpad.net/bugs/401110
-   * Audittrail : Logs set in descending order
- * https://launchpad.net/bugs/418541
-   * Project : Delegated tasks from O2M didnt have project_id
- * https://launchpad.net/bugs/416767
-   * Account_tax_include : onchange of product on invoice line price type issue
-
-
-Improvements (addons)
----------------------
-
- * update translations
- * base_module_quality: make minimal score for all test, add message if the score is below limit,varible for whether to activate the test or not
- * process view node now links to parent document directory if no record selected.
- * purchase: Merge purchases wizard: added keyword='client_action_multi'
- * Auction : improved code
- * Auction : improved auction reports
- * Age Partner Balance report executed 7 queries per partner, reduced this a total of 7 queries in total.
-
-
-2009-08-21: 5.0.3
-=================
-
-Bugfixes (server)
------------------
-
- * Not linked to a bug report:
-   * set_alarm: removed unwanted comment
-   * report engine: context argument was passed at a wrong position. Now it's passed as a named argument.
-   * fields_get check access aginst write or create access
-   * Not allowing only white spaces text to be printed
-   * sequences: avoid an sql error when locking table...
-   * report engine: fixed a bug when the xml tag is empty
-   * bin/workflow: 'stack' variable was not initialized when sql query returned an empty set.
-   * security issue: avoid access to inactive users
-   * security issue: avoid access with 'None' password (Thanks to P. Christeas for the bug report)
-   * avoid a bug when look in stack when translate code strings
- * https://launchpad.net/bugs/415257
-   * import of boolean fields in csv files.
- * https://launchpad.net/bugs/415014
-   * correct translation tgz archive creation
- * https://launchpad.net/bugs/362280
- * https://launchpad.net/bugs/416883
-   * Print screen unicode-decode error solved
- * https://launchpad.net/bugs/400378
-   * partner address search
- * https://launchpad.net/bugs/415972
-   * do not get next sequence in its own cursor
- * https://launchpad.net/bugs/413484
-   * Print Screen :  was not considering field names with superscripted,subscripted characters(ex.m²)
- * https://launchpad.net/bugs/406945
-   * import of boolean fields in csv files.
- * https://launchpad.net/bugs/413586
-   * bug in cache system that altered some arguments passed to cached function
- * https://launchpad.net/bugs/413594
-   * logger: convert the message in unicode before concatenate it with server environment
- * https://launchpad.net/bugs/348217
-   * Secure option on config file
-
-
-Improvements (server)
----------------------
-
- * Makefile and quality_integration_server module for Integration server
- * Speed impprovement: 2x faster for flow: sale -> invoice -> payment
- * Speed improvement in creation of records (4 time faster on partners)
-
-
-Bugfixes (addons)
------------------
-
- * Not linked to a bug report:
-   * Purchase :copy method was not setting stock moves to be null for PO lines
-   * Module:account Fix keyerror in general_ledger report
-   * Access rules stock / worker
-   * mrp: fr_FR.po file had a duplicate message definition
- * https://launchpad.net/bugs/413699
- * https://launchpad.net/bugs/415014
-   * report_task: regenerate translations files
- * https://launchpad.net/bugs/397100
-   * improving commit on report
- * https://launchpad.net/bugs/416296
-   * Base_setup : Country passed in  values only if filled
- * https://launchpad.net/bugs/415218
-   * report_task : report_task_user_pipeline_open was having no uniqueness
-
-
-Improvements (addons)
----------------------
-
- * POS: improved the point_of_sale receipt
-
-
-
-2009-08-12: 5.0.2
-=================
-
-Bugfixes (server)
------------------
-
- * Not Linked to a bug report:
-   * ensure sys is imported
-   * pass the context to check method of 'ir.model.access'
-   * increase size of field "name" of ir.model.data
-   * Corrected bug of expression calculation in previous commit
-   * sql expression: in search, add the time part to datetime field when it's not present
-   * setup.py: py2exe now adds 'zoneinfo' directory in library.zip
-   * Importation problem corrected for unicode.
-   * missing Import
-   * tools.amount_to_text_en: now displays cents
-   * size miss match for page and frame
-   * removed report etree warning of len
-   * security on wokflows bugfixed. The security has to be checked using the current uid, not the one that created the workflow instance!
-   * export window : use context for import compatable option in pass argument instend of added new argemenent
-   * py2exe: pytz on win32: 'zoneinfo' directory now included in library.zip
-   * module installation through -i module -d db --without-demo option corrected
-   * loading module sequence while creating new database
-   * Expression calculation(Query making) corrected for Translateable field
-   * CSV Export : null values handled
-   * sxw and odt reports
-   * Fixed odt2odt reports printing
-   * module:base made name field translatable in action.server (ref:mga)
-   * supply password problem with pg_dump, pg_restore on win32
-   * User with blank password(if so) allowed to log in.
-   * avoid required parameters rule (domain_force)
-   * Fixed oldxml at  python2.6 for Ubuntu 8.0.4,9.04
-   * fix missing tail process and skip unnecessary whitespace characters
-   * ir_attachment preview method corrected
-   * launch signal after action in workflows
-   * Added PageCount tag in report engine
-   * report engine, better spacings -> like preceeding version
-   * fix &,<,> problem for html2html-url report
-   * fix &,<,> problem for html2html report
-   * xml: the tag <delete> delete also the reference to the deleted objects into ir_model_data
-   * translation export: catch the case when a object does not exists in database
-   * browse_record: raise a better exception when the id doesn't exists
-   * Bugfix translations and float/int format in reports
-   * Complete rng files
-   * load the module graph even if it containt only "base"
-   * remove base_setup (moving base_setup to server was a workaround)
-   * expression: correct the generated sql in case of _inherits
-   * the <delete> tag doesn't crash if the referenced id does not exists
-   * closed file pointer
- * https://launchpad.net/bugs/380221
- * https://launchpad.net/bugs/403652
- * https://launchpad.net/bugs/369947
- * https://launchpad.net/bugs/371496
- * https://launchpad.net/bugs/371768
-   * bad tooltip
- * https://launchpad.net/bugs/383938
-   * Mass mailing wizard has a mail body now.
- * https://launchpad.net/bugs/409709
-   * Error reporting : library error corrected
- * https://launchpad.net/bugs/394876
-   * Import : context provided for language translation
- * https://launchpad.net/bugs/390167
-   * Custom report : sorted X-axis values
- * https://launchpad.net/bugs/405921
-   * Expression calculation for Datetime Corrected
- * https://launchpad.net/bugs/393858
-   * ir_model_data : SQL_Constraint failure covered
- * https://launchpad.net/bugs/396955
-   * disallow the deletion of records set as default properties
-   * properties reset to default one correctly
- * https://launchpad.net/bugs/399685
-   * Added sql_constraint on adding field having size<1
- * https://launchpad.net/bugs/385544
-   * ir_translation : corrected entry insertion when adding translation
- * https://launchpad.net/bugs/392187
-   * xml encoding in header for &.<.>
- * https://launchpad.net/bugs/310918
-   * RuntimeError in the cache system
- * https://launchpad.net/bugs/362280
-   * _inherits was misbehaving on search
- * https://launchpad.net/bugs/385299
-   * Report Engine Regression
-   * Report Engine regression
- * https://launchpad.net/bugs/407637
-   * Print screen now displays the report as per WYSIWYG
- * https://launchpad.net/bugs/408550
-   * default_xxx in context was passed to relational fields,corrected.
- * https://launchpad.net/bugs/385297
-   * bug in report engine
- * https://launchpad.net/bugs/381204
-   * Character Truncation problem on updation solved
- * https://launchpad.net/bugs/355491
-   * CSV Import : Accepting 'Value' of selection field from[(key,value)]
- * https://launchpad.net/bugs/409343
-   * Login : Login and password accepting accented characters
- * https://launchpad.net/bugs/376945
-   * Translation : Text with prefix '_' from py files included for exports.
- * https://launchpad.net/bugs/385664
-   * Account Module : Typo corrected
- * https://launchpad.net/bugs/405721
-   * DB operations(backup,restore) process corrected,were blocked if db_port was supplied
- * https://launchpad.net/bugs/410186
- * https://launchpad.net/bugs/355493
-   * SQL Constraint failure error on particular record while importing
- * https://launchpad.net/bugs/392052
-   * Certificate in non-digit format will not be accepted
- * https://launchpad.net/bugs/357045
-   * upgrade doesn't try to delete modules
- * https://launchpad.net/bugs/404733
-   * ir_model : context key deletion
- * https://launchpad.net/bugs/386273
-   * fields.related (m2o poiting to M2M/O2M should be skipped during write.
- * https://launchpad.net/bugs/406489
-   * Accented characters are displayed on footer now
- * https://launchpad.net/bugs/409861
-   * Context passed on copy()
- * https://launchpad.net/bugs/389795
-   * Property : Removed old referenced values from property
- * https://launchpad.net/bugs/384959
-   * ORM: Defult_field name in context belongs to curent object only, not to its relationals anymore
- * https://launchpad.net/bugs/399811
-   * Print screen reports will behave acc. to locale for date,datetime
- * https://launchpad.net/bugs/357945
-   * Export will consider float values as float and char as char
- * https://launchpad.net/bugs/406945
-   * Importation problem for bool fields corrected
- * https://launchpad.net/bugs/382352
-   * GIF image is previewed
-
-
-Improvements (server)
----------------------
-
- * Logger notification improved
- * update po(t) files
- * new method that allow the server to return a message that will be display on login page
- * import/export : added Database ID, ID
- * attributes of barcode
- * ir_model_data: convert assert to sql constraint + exception
- * Added new function called get_environment which will return the current environment of the System on which user is using OpenERP
- * better error message
- * added style for the url which are as text
- * new method "exists" that verify that a given id exists in database (or in memory for osv_memory objects)
- * maintenance: complete the remarks with the database name
- * email_send: when debuging, output to the logger
-
-
-Bugfixes (addons)
------------------
-
- * Not linked to a bug report:
-   * DMS directory not translatable + translations improvement
-   * Project : Searching active=no was failing, corrected
-   * problem with ncftp client
-   * stock_move auto_init function override but not return super clas result
-   * partner wasn't mandatory on sale_order, which lead to problems everywhere (stocks, shippings...) if a partner with sales was deleted. Added required=True on it to set the database field as 'not null'
-   * Product : Pricelist report corrected for suitable columns
-   * Stock : default value calculation corrected for stock move
-   * product price was wrong when margin is not set
-   * handle context when it equals None
-   * Product : Pricelist report corrected
-   * module:base_module_record fixed unicode string problem
-   * state name modified for the method - close
-   * explicit type cast for report.attendance
-   * explicit type cast
-   * module:account_voucher added confition for opening balance
-   * document: set default address to '' instead of 'localhost'
-   * fix ftp host address on Windows Vista
-   * document: better ip address detection (especially on win32)
-   * product: po file had duplicates
-   * sale_crm: typo in module description
-   * point_of_sale: if pickings are split because the sale order is not complete, invoices could not be created
-   * sale, stock: wrong translation
-   * point_of_sale: salesman_id: defaults to connected user
-   * point_of_sale: partner should be copied when creating a refund
-   * price unit calculation from context (web client issue).
-   * file attachment bug in x_object
-   * variants with extra on product list view
-   * [point_of_sale] security was not set for config/default_journal menu and pos.config.journal object
-   * fixed a bug when trying to search lines between 2 dates.
-   * on very big data, the query was way too long to execute. Speed is now greatly improved.
-   * point_of_sale: Sales of the day menu did not worked because the query did not matched any lines
-   * account: create move lines with date provide in wizard (bug reported by Alexis Deméaulte)
-   * Scheduler fix, introduced 5 days ago
-   * Translated Absences by Leaves
-   * multi-company modifs
-   * Account : Taxes Report Corrected
-   * Module: scrum,stock create task wizard in scrum and unreceived product wizard create new entry in stock
-   * typo
-   * general ledget report wizard (missing a field in view).
-   * soldeinit problem
-   * point_of_sale (receipt report): User and Date was lost
-   * changed size of receipt to fit cash register
-   * point_of_sale: invoice report should use the account.invoice object
-   * base_module_record: avoid a crash when calling a method with less than 6 arguments
-   * point_of_sale
-   * hr_holidays: wrong character in po files
-   * event: wrong character in po files
-   * work order orders
-   * stock value computation
-   * analytic account on advance invoices
-   * Analytic Analysis Stats
-   * layout of general ledger landscape
-   * bugfix in lot assignation on moves, bad signature
-   * hr_timesheet_invoice module : account_analytic_profit report sxw file--author-name= vra
-   * hr_timesheet_invoice module : account_analytic_profit report --author-name= vra
-   * crm rule : watcher email
-   * fix bug on crm rule to put proper wacher email
-   * Bug of referencing variable on split in production lot
-   * new cases should be created with the 'draft' state.
-   * account_balance Module : Fix the Total problem and Put Indentation in Reports.C
-   * onchange of product_id on stock move corrected
-   * correct display of pyflakes result quality module
- * https://launchpad.net/bugs/310458
-   * Simplify Migrations
- * https://launchpad.net/bugs/382641
-   * _get_stock corrected
- * https://launchpad.net/bugs/382000
-   * remove except block from try..finally whioch is not supported in python2.4
- * https://launchpad.net/bugs/379767
-   * Base_report_creator :Corrected Add filter wizard(ref:ACH)
- * https://launchpad.net/bugs/373203
- * https://launchpad.net/bugs/388346
-   * l10n_ch module : Improved Code.
-   * l10n_ch : corrected default_value method
- * https://launchpad.net/bugs/399485
-   * point_of_sale : Pikcing display partner made from POS order.
- * https://launchpad.net/bugs/388438
-   * Report_task : Corrected malfunctioned .po files
- * https://launchpad.net/bugs/380480
- * https://launchpad.net/bugs/386297
-   * purchase module : order report.
-   * Purchase: Corrected report and translation
- * https://launchpad.net/bugs/356922
-   * Base_vat : VAT validation for Portugal,Bulgaria
- * https://launchpad.net/bugs/397100
-   * Acccount,Account_invoice_layout : Minor necessary changes.
- * https://launchpad.net/bugs/388347
-   * account_payment module : payment order report.
-   * account_payment : report corrected
- * https://launchpad.net/bugs/407241
-   * sum() in query was returning null,corrected
- * https://launchpad.net/bugs/387006
-   * Stock : context for address field on picking corrected
- * https://launchpad.net/bugs/364010
-   * base_vat :sweden vat validation corrected
- * https://launchpad.net/bugs/393798
-   * hr_timesheet_sheet : date interval corrected for attendances
- * https://launchpad.net/bugs/409337
- * https://launchpad.net/bugs/387029
-   * Account : Correction of search method arguements of account.analytic.line
- * https://launchpad.net/bugs/394277
-   * Purchase,Product :description of POL made widen,partner_ref changes
- * https://launchpad.net/bugs/394275
-   * Account : Charts of accounts - Tax reports corected
-   * Account : Charts of accounts - target move options corrected
- * https://launchpad.net/bugs/404155
-   * point_of_sale :Partner info available for move line from POS,only draft/cancelled POS lines can be deleted
- * https://launchpad.net/bugs/399824
-   * Sale : Weight field for SOL displayed
- * https://launchpad.net/bugs/393824
-   * report_task : .po files corrected
- * https://launchpad.net/bugs/394640
-   * Sale : sale order report corrected for translation
- * https://launchpad.net/bugs/386513
-   * Purchase : stock moves assigned to purchase line
- * https://launchpad.net/bugs/358302
-   * Account : Corrected bank journal code creation from template
- * https://launchpad.net/bugs/402263
-   * Account : Invoice Lines will not be grouped if there are different maturity dates
- * https://launchpad.net/bugs/394436
-   * Project : Xml record corrected for view
- * https://launchpad.net/bugs/398805
- * https://launchpad.net/bugs/338329
-   * availability of prodlot check when assigning a prodlot to a move: non optimal location_id control
- * https://launchpad.net/bugs/391673
-   * Account :'note' field on Fiscal position,added on invoice report
- * https://launchpad.net/bugs/391106
-   * Process : Corrected xml record
- * https://launchpad.net/bugs/405891
-   * Module:purchase corrected delay time in picking
- * https://launchpad.net/bugs/389540
-   * Account : Added Configuration wizard to make overdue payment report message configurable on company
- * https://launchpad.net/bugs/400210
-   * Stock : partial packign wizard values made translated
- * https://launchpad.net/bugs/377614
- * https://launchpad.net/bugs/406827
-   * CRM : Mailgate script improved to have as much information on History.
- * https://launchpad.net/bugs/404975
-   * document : create doc of any resource model with black name
- * https://launchpad.net/bugs/401184
-   * module base_module_record Fixed when object has _rec_name
- * https://launchpad.net/bugs/399642
- * https://launchpad.net/bugs/393756
-   * Sale : Removed unused code
- * https://launchpad.net/bugs/400326
-   * document : if name/dirname does not has value, dirname will be display like <objectname><id>
-   * document : use '=' operator instend of 'like' on serach directory nodes into DMS
- * https://launchpad.net/bugs/383940
-   * Document : Logging enabled for abstracted_fs
- * https://launchpad.net/bugs/403964
-   * STock : Locations structure wizard improved
-   * Stock: Location analysis wizard improved,date replaced by datetime field on wizard
- * https://launchpad.net/bugs/385664
-   * Account Module : Typo corrected
- * https://launchpad.net/bugs/380473
- * https://launchpad.net/bugs/376804
-   * account_analytic_analysis : Months sorted
- * https://launchpad.net/bugs/393840
-   * Account_tax_include corrected to resolve conflict with account_invoice_layout
- * https://launchpad.net/bugs/405441
-   * delivery : context passed on picking form view
- * https://launchpad.net/bugs/388901
-   * Product : Onchange on pricelist item corrected
- * https://launchpad.net/bugs/395173
-   * Account : Corrected journal check on move line creation
- * https://launchpad.net/bugs/388404
-   * report_crm,document_ics,account : Access Rules assigned
-   * Report_timesheet : Access rules
- * https://launchpad.net/bugs/396254
-   * Account : Cancelled invoice will not be listed under unpaid state
- * https://launchpad.net/bugs/404142
-   * point_of_sale :Partner info available for move line from POS,only draft/cancelled POS lines can be deleted
- * https://launchpad.net/bugs/410779
-   * Document : made uninstallable
- * https://launchpad.net/bugs/411469
-   * Wiki : Made uninstallable
- * https://launchpad.net/bugs/394733
- * https://launchpad.net/bugs/400093
-   * stock : Stock Valuation Entries Don't Adjust with UoM
- * https://launchpad.net/bugs/395046
-   * Product : Corrected template view
- * https://launchpad.net/bugs/407327
-   * CRM : Due to rules, duplicate watcher(CC) ids were entered.
- * https://launchpad.net/bugs/389015
-   * Project : Copy Method corrected
- * https://launchpad.net/bugs/411329
-   * module:mrp added on_change on bom_id for selecting routing
-
-
-Improvements (addons)
----------------------
-
- * update po(t) files
- * Module:account Api changes def _refund_cleanup_lines(self, lines): added cr,uid arguments
- * pyflakes test display result improve on base_module_quality
- * crm: allow to put case description in action mail
- * Account : Move line form view from MOVE shows date for better user readability
- * mrp: pep8
- * use inheritance instead of wrapping when changing behavior of services
- * Module:Purchase Api change in inv_line_create added cr,uid parameters
- * Improved views
- * base_module_quality : gives warning to the user if pylint or pyflakes not installed
- * stock: wizard_invoice_onshipping.py: pep8
- * add base_module_quality module
- * Sale : state name display corected
- * Directory structure is translated to the users preference language in FTP Client
- * reformated the wizard message
- * account: invoice view: hide some fields to non employee users (portal i.e.)
- * account_voucher : report voucher.
- * mrp module : bom_structure.
- * account module : Analytic reports.
- * stock module : picking report.
- * mrp Module : Production order report.
- * account module : Tax Report.
- * stock Module : reports.
- * sale_delivery_report Module : Report Changes.
- * event_certificate module : for Certificate report.
- * purchase Module : order report and revert Changes : sale order Report.
- * purchase,sale : order report.
- * stock module : report improvement.
- * stock,purchase module : report improvement.
- * account_balance module : Improved Landscape report.
- * account_balance Module : Report changes.
- * account_balance Module : Minor report Change.
- * account_balance Module : Modified reports.
- * point_of_sale: receipt report: better date formatting
- * point_of_sale: receipt report: Salesman instead of User
- * module:stock improved views
- * improved translations for crm_configuration
-
-
-
-2009-05-26: 5.0.1
-=================
-
-TODO
-
-2009-02-12: 5.0.0-3
-===================
-
-TODO
-
-2009-02-08: 5.0.0-2
-===================
-
-TODO
-
-2009-02-06: 5.0.0
-=================
-
-TODO
-
-2009-01-03: 5.0.0-rc3
-=====================
-
-TODO
-
-2008-12-22: 5.0.0-rc2
-=====================
-
-TODO
-
-2008-12-01: 5.0.0-rc1.1
-=======================
-
-TODO
-
-2008-11-28: 5.0.0-rc1
-=====================
-
-TODO
-
-2008-11-03: 5.0.0-alpha
-=======================
-
-TODO
-
diff --git a/history/Changelog-4.x b/history/Changelog-4.x
deleted file mode 100644 (file)
index d884fe8..0000000
+++ /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/history/Changelog-6.x b/history/Changelog-6.x
deleted file mode 100644 (file)
index 05b5f58..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-2010-07-XX: 6.0.0
-=================
-
-Improvements (server)
----------------------
-
- * support of 'ref' attribute for importing 'reference' field values, as for many2one fields.
- * experimental xml2yml script in /tools for conversion of XML data/test files to the new YAML format
-
-
diff --git a/history/INSTALL b/history/INSTALL
deleted file mode 100644 (file)
index 254b7e7..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-OpenERP Quick Installation Guide
----------------------------------
-
-This file contains a quick guide to configure and install the OpenERP server.
-
-Required dependencies:
----------------------
-
-You need the following software installed:
-
-    * Python 2.5 or 2.6
-    * Postgresql 8.2 or above
-    * Psycopg2 python module 
-    * Reportlab pdf generation library for python
-    * lxml python module
-    * pytz python module
-    * PyYaml python module (install with: easy_install PyYaml)
-
-Some dependencies are only required for specific purposes:
-
-for rendering workflows graphs, you need:
-    * graphviz
-    * pyparsing
-
-For Luxembourg localization, you also need:
-    * pdftk (http://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/)
-
-for generating reports using non .jpg images, you need:
-    * Python Imaging Library for python
-
-For Debian-based distributions, the required packages can be installed with the 
-following command:
-
-  #> apt-get install -y postgresql graphviz python-psycopg2 python-lxml python-tz python-imaging
-
-For Fedora 
-if they are not installed, install:
-python and postgresql
-
-uses yum or you can recover required packages on fedora web site in "core" or "extra" repository :
-postgresql-python
-python-lxml
-python-imaging
-python-psycopg2
-python-reportlab
-graphviz
-You can find pyparsing at http://pyparsing.sourceforge.net/ 
-
-1. Check that all the required dependencies are installed.
-
-2. Launch the program "python ./bin/openerp-server.py -r db_user -w db_password --db_host 127.0.0.1".
-See the man page for more information about options.
-
-3. Connect to the server using the GUI client. And follow the instructions to create a new database.
-
diff --git a/history/README.urpmi b/history/README.urpmi
deleted file mode 100644 (file)
index ce8fb70..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-Installation Steps
-------------------
-
-1. Check that all the required dependencies are installed.
-
-2. Create a postgresql database.
-
-The default database name is "terp". If you want to use another name, you
-will need to provide it when launching the server (by using the commandline
-option --database).
-
-To create a postgresql database named "terp" using the following command:
-    $ createdb --encoding=UNICODE terp
-
-If it is the first time you use postgresql you might need to create a new user
-to the postgres system using the following commands (where myusername is your
-unix user name):
-
-    $ su -
-    # su - postgres
-    $ createuser openerp
-    Shall the new user be allowed to create databases? (y/n) y
-    Shall the new user be allowed to create more new users? (y/n) y
-    CREATE USER
-    $ logout
-    # logout
-
-3. Launch service daemon by "service openerp-server start".
-
-The first time it is run, the server will initialise the database with all the default values.
-
-4. Connect to the server using the GUI client.
-
-There are two accounts by default:
-    * login: admin, password:admin
-    * login: demo, password:demo
diff --git a/history/README.userchange b/history/README.userchange
deleted file mode 100644 (file)
index f6cc0ab..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-Important note for OpenERP build >= 5.0.1-11xrg:
-
-THE USERNAME HAS CHANGED!!
-
-Former user "tinyerp" is now called "openerp".
-
-
-For that, you will have to make sure the following files are chowned
-to the new user:
-
-/var/log/openerp
-/var/spool/openerp
-/var/run/openerp
-/etc/openerp
-/etc/openerp/cert.cfg
-/etc/openerp-server.conf
-/etc/logrotate.d/openerp-server
-
-Then, rename the user in the postgres database:
-
- psql -U postgres postgres
- ALTER ROLE tinyerp RENAME TO openerp;
-Then, edit your openerp-server.conf to depict the change:
-- db_user = tinyerp
-+ db_user = openerp
-
-Good luck!
-
-
diff --git a/history/change-loglevel.sh b/history/change-loglevel.sh
deleted file mode 100755 (executable)
index 88c8c1d..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/bin/bash
-
-ADMIN_PASSWD='admin'
-method_1() {
-    cat '-' << EOF
-<xml>
-<methodCall>
-    <methodName>set_loglevel</methodName>
-    <params>
-        <param><value><string>$ADMIN_PASSWD</string></value>
-        </param>
-        <param>
-        <value><string>$1</string></value>
-        </param>
-    </params>
-</methodCall>
-EOF
-}
-LEVEL=10
-
-if [ -n "$1" ] ; then LEVEL=$1 ; fi
-
-method_1 $LEVEL | POST -c 'text/xml' http://localhost:8069/xmlrpc/common
-#eof
diff --git a/history/check_profile_l10n_all.py b/history/check_profile_l10n_all.py
deleted file mode 100644 (file)
index e7b391a..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#    
-#    OpenERP, Open Source Management Solution
-#    Copyright (C) 2004-2009 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/>.     
-#
-##############################################################################
-
-#
-# This script will automatically test all profiles, localisations and language
-# packs You must start the OpenERP server and not have a test database. You
-# may also have to change some data in the top of this file.
-#
-
-import xmlrpclib
-import time
-import base64
-
-url = 'http://localhost:8069/xmlrpc'
-profiles = [
-    'profile_accounting',
-    'profile_service',
-    'profile_manufacturing'
-]
-l10n_charts = [
-    'l10n_uk',
-    False,
-    'l10n_be',
-    'l10n_fr'
-]
-dbname = 'test'
-admin_passwd = 'admin'
-lang = False          # List of langs of False for all
-
-
-sock = xmlrpclib.ServerProxy(url+'/object')
-sock2 = xmlrpclib.ServerProxy(url+'/db')
-sock3 = xmlrpclib.ServerProxy(url+'/common')
-sock4 = xmlrpclib.ServerProxy(url+'/wizard')
-demos =  [True]
-
-langs = lang or (map(lambda x: x[0], sock2.list_lang()) + ['en_US'])
-
-def wait(id):
-    progress=0.0
-    while not progress==1.0:
-        time.sleep(3)
-        progress,users = sock2.get_progress(admin_passwd, id)
-        time.sleep(3)
-    return True
-
-def wizard_run(wizname, fieldvalues=None, endstate='end'):
-    if fieldvalues is None:
-        fieldvalues = {}
-    wiz_id = sock4.create(dbname, uid, 'admin', wizname)
-    state = 'init'
-    datas = {'form':{}}
-    while state!=endstate:
-        res = sock4.execute(dbname, uid, 'admin', wiz_id, datas, state, {})
-        if 'datas' in res:
-            datas['form'].update( res['datas'] )
-        if res['type']=='form':
-            for field in res['fields'].keys():
-                datas['form'][field] = res['fields'][field].get('value', False)
-            state = res['state'][-1][0]
-            datas['form'].update(fieldvalues)
-        elif res['type']=='state':
-            state = res['state']
-    return True
-
-for demo in demos:
-    for l10n in l10n_charts:
-        print 'Testing localisation', l10n, '...'
-        for prof in profiles:
-            print '\tTesting profile', prof, '...'
-            id = sock2.create(admin_passwd, dbname, demo, lang)
-            wait(id)
-            uid = sock3.login(dbname, 'admin','admin')
-
-            idprof = sock.execute(dbname, uid, 'admin', 'ir.module.module', 'search', [('name','=',prof)])
-            if l10n:
-                idl10n = sock.execute(dbname, uid, 'admin', 'ir.module.module', 'search', [('name','=',l10n)])
-            else:
-                idl10n = [-1]
-            wizard_run('base_setup.base_setup', {
-                'profile': idprof[0],
-                'charts': idl10n[0],
-            }, 'menu')
-            for lang in langs:
-                print '\t\tTesting Language', lang, '...'
-                wizard_run('module.lang.install', {'lang': lang})
-
-            ok = False
-            range = 4
-            while (not ok) and range:
-                try:
-                    time.sleep(2)
-                    id = sock2.drop(admin_passwd, dbname)
-                    ok = True
-                except:
-                    range -= 1
-            time.sleep(2)
-
-
-
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-
diff --git a/history/clean-model.sql b/history/clean-model.sql
deleted file mode 100644 (file)
index 59b492a..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-
-SELECT model, res_id, module FROM ir_model_data 
-       WHERE model = 'ir.actions.act_window' 
-         AND NOT EXISTS (SELECT 1 FROM ir_act_window WHERE id = ir_model_data.res_id);
-
-
-SELECT model, res_id, module FROM ir_model_data 
-       WHERE model = 'ir.ui.menu' 
-         AND NOT EXISTS (SELECT 1 FROM ir_ui_menu WHERE id = ir_model_data.res_id);
-
-SELECT model, res_id, module FROM ir_model_data 
-       WHERE model = 'ir.ui.view' 
-         AND NOT EXISTS (SELECT 1 FROM ir_ui_view WHERE id = ir_model_data.res_id);
-
-DONT DELETE FROM ir_model_data 
-       WHERE model = 'ir.actions.act_window' 
-         AND NOT EXISTS (SELECT 1 FROM ir_act_window WHERE id = ir_model_data.res_id);
-         
-DONT DELETE FROM ir_model_data 
-       WHERE model = 'ir.ui.menu' 
-         AND NOT EXISTS (SELECT 1 FROM ir_ui_menu WHERE id = ir_model_data.res_id);
--- Other cleanups:
--- DELETE from ir_model_data where module = 'audittrail' AND model = 'ir.ui.view' AND NOT EXISTS( SELECT 1 FROM ir_ui_view WHERE ir_ui_view.id = ir_model_data.res_id);
--- DELETE from ir_model_data where module = 'audittrail' AND model = 'ir.ui.menu' AND NOT EXISTS( SELECT 1 FROM ir_ui_menu WHERE id = ir_model_data.res_id);
\ No newline at end of file
diff --git a/history/gen_graph.sh b/history/gen_graph.sh
deleted file mode 100755 (executable)
index 7be31ed..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/bin/bash
-##############################################################################
-#
-# Copyright (c) 2004-2009 TINY SPRL. (http://tiny.be)
-#
-# $Id$
-#
-# WARNING: This program as such is intended to be used by professional
-# programmers who take the whole responsability of assessing all potential
-# consequences resulting from its eventual inadequacies and bugs
-# End users who are looking for a ready-to-use solution with commercial
-# garantees and support are strongly adviced to contact a Free Software
-# Service Company
-#
-# 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 2
-# 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, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-#
-##############################################################################
-
-`dirname $0`/module_graph.py $@ | dot -Tpng -o > module_graph.png
-
diff --git a/history/get-srvstats.sh b/history/get-srvstats.sh
deleted file mode 100755 (executable)
index 931d575..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/bin/bash
-
-# ADMIN_PASSWD='admin'
-method_1() {
-    cat '-' << EOF
-<xml>
-<methodCall>
-    <methodName>get_stats</methodName>
-    <params>
-    </params>
-</methodCall>
-EOF
-}
-LEVEL=10
-
-if [ -n "$1" ] ; then LEVEL=$1 ; fi
-
-method_1 $LEVEL | POST -c 'text/xml' http://localhost:8069/xmlrpc/common
-#eof
diff --git a/history/list-services.sh b/history/list-services.sh
deleted file mode 100755 (executable)
index a90e584..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/bash
-
-# ADMIN_PASSWD='admin'
-method_1() {
-    cat '-' << EOF
-<xml>
-<methodCall>
-    <methodName>list_http_services</methodName>
-    <params>
-    </params>
-</methodCall>
-EOF
-}
-
-method_1 | POST -c 'text/xml' http://localhost:8069/xmlrpc/common
-#eof
diff --git a/history/migrate/3.3.0-3.4.0/README b/history/migrate/3.3.0-3.4.0/README
deleted file mode 100644 (file)
index 10cf834..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-This document describes the steps to follow to migrate from a version 3.3.0 of Tiny ERP server to a version 3.4.0
-
-Warning: the migration scripts involved in this migration are only meant for 
-a standard Tiny ERP installation. It might not work or even break some data 
-if you added or modified some code to the default Tiny ERP distribution.
-
-To migrate a 3.3.0 server to version 3.4.0 you should:
-
-- stop Tiny ERP server 3.3.0
-
-- backup your database
-       For example: pg_dump terp330 > backup330.sql
-
-- run the pre.py script (located in this directory)
-       You might need to pass it some optional arguments so that it can connect 
-       to the database.
-
-       For example: python pre.py -d terp330
-
-- run TinyERP server 3.4.0 with "-u all" in the parameters
-       For example: ./tinyerp-server.py -d terp330 -u all
-
-- stop TinyERP server 3.4.0
-
-- run the post.py script (located in this directory)
-
-       You might need to pass it some optional arguments so that it can connect 
-       to the database.
-
-       For example: python post.py -d terp330
-
-- run TinyERP server 3.4.0 again with "-u all" in the parameters
-       For example: ./tinyerp-server.py -d terp330 -u all
-
-- you are ready to work with the new version.
diff --git a/history/migrate/3.3.0-3.4.0/post.py b/history/migrate/3.3.0-3.4.0/post.py
deleted file mode 100644 (file)
index bdbd719..0000000
+++ /dev/null
@@ -1,146 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#    
-#    OpenERP, Open Source Management Solution
-#    Copyright (C) 2004-2009 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/>.     
-#
-##############################################################################
-
-__author__ = 'Gaetan de Menten, <ged@tiny.be>'
-__version__ = '0.1.0'
-
-import psycopg
-import optparse
-import ConfigParser
-
-# -----
-
-parser = optparse.OptionParser(version="Tiny ERP server migration script " + __version__)
-
-parser.add_option("-c", "--config", dest="config", help="specify path to Tiny ERP config file")
-
-group = optparse.OptionGroup(parser, "Database related options")
-group.add_option("--db_host", dest="db_host", help="specify the database host") 
-group.add_option("--db_port", dest="db_port", help="specify the database port") 
-group.add_option("-d", "--database", dest="db_name", help="specify the database name")
-group.add_option("-r", "--db_user", dest="db_user", help="specify the database user name")
-group.add_option("-w", "--db_password", dest="db_password", help="specify the database password") 
-parser.add_option_group(group)
-
-options = optparse.Values()
-options.db_name = 'terp' # default value
-parser.parse_args(values=options)
-
-if hasattr(options, 'config'):
-    configparser = ConfigParser.ConfigParser()
-    configparser.read([options.config])
-    for name, value in configparser.items('options'):
-        if not (hasattr(options, name) and getattr(options, name)):
-            if value in ('true', 'True'):
-                value = True
-            if value in ('false', 'False'):
-                value = False
-            setattr(options, name, value)
-
-# -----
-
-host = hasattr(options, 'db_host') and "host=%s" % options.db_host or ''
-port = hasattr(options, 'db_port') and "port=%s" % options.db_port or ''
-name = "dbname=%s" % options.db_name
-user = hasattr(options, 'db_user') and "user=%s" % options.db_user or ''
-password = hasattr(options, 'db_password') and "password=%s" % options.db_password or ''
-
-db = psycopg.connect('%s %s %s %s %s' % (host, port, name, user, password), serialize=0)
-cr = db.cursor()
-
-# ------------------------------------------- #
-# convert partner payment terms to properties #
-# ------------------------------------------- #
-
-# setup
-
-cr.execute("select id from ir_model_fields where name='property_payment_term' and model='res.partner'")
-fields_id = cr.fetchone()[0]
-
-cr.execute("select company_id from res_users where company_id is not null limit 1")
-company_id = cr.fetchone()[0]
-
-# get partners
-cr.execute("SELECT c.relname FROM pg_class c, pg_attribute a WHERE c.relname='res_partner' AND a.attname='payment_term' AND c.oid=a.attrelid")
-partners=[]
-drop_payment_term=False
-if cr.rowcount:
-    drop_payment_term=True
-    cr.execute("select id, payment_term from res_partner where payment_term is not null")
-    partners = cr.dictfetchall()
-
-# loop over them
-
-for partner in partners:
-    value = 'account.payment.term,%d' % partner['payment_term']
-    res_id = 'res.partner,%d' % partner['id']
-    cr.execute(
-        "insert into ir_property(name, value, res_id, company_id, fields_id) "\
-        "values(%s, %s, %s, %d, %d)", 
-        ('property_payment_term', value, res_id, company_id, fields_id))
-
-# remove the field
-if drop_payment_term:
-    cr.execute("alter table res_partner drop column payment_term")
-cr.execute("delete from ir_model_fields where model = 'res.partner' and name = 'payment_term'")
-
-cr.commit()
-
-# ------------------------ #
-# remove duplicate reports #
-# ------------------------ #
-
-cr.execute("select model, report_name from ir_act_report_xml group by model, report_name having count(*)>1")
-reports_wh_duplicates = cr.dictfetchall()
-
-cr.execute("select res_id from ir_model_data where model='ir.actions.report.xml'")
-registered_reports = cr.fetchall()
-reg_reports_ids = ','.join([str(id) for (id,) in registered_reports])
-
-for report in reports_wh_duplicates:
-    cr.execute("select id from ir_act_report_xml where model=%s and report_name=%s and id not in ("+reg_reports_ids+")", (report['model'], report['report_name']))
-    (id,) = cr.fetchone()
-    cr.execute("delete from ir_act_report_xml where id=%d", (id,))
-    cr.execute("delete from ir_values where value='ir.actions.report.xml,%d'", (id,))
-
-cr.commit()
-
-# ------------------------------------- #
-# remove duplicate workflow transitions #
-# ------------------------------------- #
-
-# this removes all transitions which are not registered in ir_model_data
-
-cr.execute("delete from wkf_transition where id not in (select res_id from ir_model_data where model='workflow.transition')")
-cr.commit()
-
-# -------------------------------- #
-# remove bad "default" menu action #
-# -------------------------------- #
-
-cr.execute("delete from ir_values where key='action' and model='ir.ui.menu' and res_id is null")
-cr.commit()
-
-cr.close()
-
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-
diff --git a/history/migrate/3.3.0-3.4.0/pre.py b/history/migrate/3.3.0-3.4.0/pre.py
deleted file mode 100644 (file)
index db8ec6d..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#    
-#    OpenERP, Open Source Management Solution
-#    Copyright (C) 2004-2009 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/>.     
-#
-##############################################################################
-
-__author__ = 'Gaetan de Menten, <ged@tiny.be>'
-__version__ = '0.1.0'
-
-import psycopg
-import optparse
-import ConfigParser
-
-# -----
-
-parser = optparse.OptionParser(version="Tiny ERP server migration script " + __version__)
-
-parser.add_option("-c", "--config", dest="config", help="specify path to Tiny ERP config file")
-
-group = optparse.OptionGroup(parser, "Database related options")
-group.add_option("--db_host", dest="db_host", help="specify the database host") 
-group.add_option("--db_port", dest="db_port", help="specify the database port") 
-group.add_option("-d", "--database", dest="db_name", help="specify the database name")
-group.add_option("-r", "--db_user", dest="db_user", help="specify the database user name")
-group.add_option("-w", "--db_password", dest="db_password", help="specify the database password") 
-parser.add_option_group(group)
-
-options = optparse.Values()
-options.db_name = 'terp' # default value
-parser.parse_args(values=options)
-
-if hasattr(options, 'config'):
-    configparser = ConfigParser.ConfigParser()
-    configparser.read([options.config])
-    for name, value in configparser.items('options'):
-        if not (hasattr(options, name) and getattr(options, name)):
-            if value in ('true', 'True'):
-                value = True
-            if value in ('false', 'False'):
-                value = False
-            setattr(options, name, value)
-
-# -----
-
-host = hasattr(options, 'db_host') and "host=%s" % options.db_host or ''
-port = hasattr(options, 'db_port') and "port=%s" % options.db_port or ''
-name = "dbname=%s" % options.db_name
-user = hasattr(options, 'db_user') and "user=%s" % options.db_user or ''
-password = hasattr(options, 'db_password') and "password=%s" % options.db_password or ''
-
-db = psycopg.connect('%s %s %s %s %s' % (host, port, name, user, password), serialize=0)
-cr = db.cursor()
-
-# ------------------------- #
-# change some columns types #
-# ------------------------- #
-
-def change_column(cr, table, column, new_type, copy):
-    commands = [
-        "ALTER TABLE %s RENAME COLUMN %s TO temp_column" % (table, column),
-        "ALTER TABLE %s ADD COLUMN %s %s" % (table, column, new_type),
-        "ALTER TABLE %s DROP COLUMN temp_column" % table
-    ]
-    if copy:
-        commands.insert(
-            2, 
-            "UPDATE %s SET %s=temp_column::%s" % (table, column, new_type))
-
-    for command in commands:
-        cr.execute(command)
-
-change_column(cr, 'account_account_type', 'code_from', 'varchar(10)', False)
-change_column(cr, 'account_account_type', 'code_to', 'varchar(10)', False)
-cr.commit()
-
-# ----------------------------------------------------- #
-# add some fields (which cannot be added automatically) #
-# ----------------------------------------------------- #
-
-for line in (
-        "alter table ir_model_fields add group_name varchar(64)",
-        "alter table ir_model_fields add view_load boolean",
-        "alter table ir_model_fields alter group_name set default ''",
-        "alter table ir_model_fields alter view_load set default False",
-        "delete from ir_values where value like '%,False'",
-    ):
-    try:
-        cr.execute(line)
-    except psycopg.ProgrammingError, e:
-        cr.commit()
-        print e
-
-cr.commit()
-cr.close()
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-
diff --git a/history/migrate/3.4.0-4.0.0/README b/history/migrate/3.4.0-4.0.0/README
deleted file mode 100644 (file)
index 6f8d73d..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-This document describes the steps to follow to migrate from a version 3.4.0 of Tiny ERP server to a version 4.0.0
-
-Warning: the migration scripts involved in this migration are only meant for 
-a standard Tiny ERP installation. It might not work or even break some data 
-if you added or modified some code to the default Tiny ERP distribution.
-
-To migrate a 3.4.0 server to version 4.0.0 you should:
-
-- stop Tiny ERP server 3.4.0
-
-- backup your database
-       For example: pg_dump terp340 > backup340.sql
-
-- run the pre.py script (located in this directory)
-       You might need to pass it some optional arguments so that it can connect 
-       to the database.
-
-       For example: python pre.py -d terp340
-
-- run TinyERP server 4.0.0 with "-d terp340 -u all" in the parameters
-       For example: ./tinyerp-server.py -d terp340 -u all
-
-- stop TinyERP server 4.0.0
-
-- run the post.py script (located in this directory)
-       You might need to pass it some optional arguments so that it can connect 
-       to the database.
-
-- you are ready to work with the new version.
diff --git a/history/migrate/3.4.0-4.0.0/post-tiny.py b/history/migrate/3.4.0-4.0.0/post-tiny.py
deleted file mode 100644 (file)
index f4d299f..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#    
-#    OpenERP, Open Source Management Solution
-#    Copyright (C) 2004-2009 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/>.     
-#
-##############################################################################
-
-__author__ = 'Gaetan de Menten, <ged@tiny.be>'
-__version__ = '0.1.0'
-
-import psycopg
-import optparse
-import ConfigParser
-
-# -----
-
-parser = optparse.OptionParser(version="Tiny ERP server migration script " + __version__)
-
-parser.add_option("-c", "--config", dest="config", help="specify path to Tiny ERP config file")
-
-group = optparse.OptionGroup(parser, "Database related options")
-group.add_option("--db_host", dest="db_host", help="specify the database host") 
-group.add_option("--db_port", dest="db_port", help="specify the database port") 
-group.add_option("-d", "--database", dest="db_name", help="specify the database name")
-group.add_option("-r", "--db_user", dest="db_user", help="specify the database user name")
-group.add_option("-w", "--db_password", dest="db_password", help="specify the database password") 
-parser.add_option_group(group)
-
-options = optparse.Values()
-options.db_name = 'terp' # default value
-parser.parse_args(values=options)
-
-if hasattr(options, 'config'):
-    configparser = ConfigParser.ConfigParser()
-    configparser.read([options.config])
-    for name, value in configparser.items('options'):
-        if not (hasattr(options, name) and getattr(options, name)):
-            if value in ('true', 'True'):
-                value = True
-            if value in ('false', 'False'):
-                value = False
-            setattr(options, name, value)
-
-# -----
-
-host = hasattr(options, 'db_host') and "host=%s" % options.db_host or ''
-port = hasattr(options, 'db_port') and "port=%s" % options.db_port or ''
-name = "dbname=%s" % options.db_name
-user = hasattr(options, 'db_user') and "user=%s" % options.db_user or ''
-password = hasattr(options, 'db_password') and "password=%s" % options.db_password or ''
-
-db = psycopg.connect('%s %s %s %s %s' % (host, port, name, user, password), serialize=0)
-cr = db.cursor()
-
-# --------------- #
-# remove old menu #
-# --------------- #
-
-cr.execute("delete from ir_ui_menu where (id not in (select parent_id from ir_ui_menu where parent_id is not null)) and (id not in (select res_id from ir_values where model='ir.ui.menu'))")
-cr.commit()
-
-# --------------- #
-# remove ir_value #
-# --------------- #
-
-cr.execute("delete from ir_values where model = 'ir.ui.menu' and res_id is null")
-cr.commit()
-
-cr.close()
-
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-
diff --git a/history/migrate/3.4.0-4.0.0/post.py b/history/migrate/3.4.0-4.0.0/post.py
deleted file mode 100644 (file)
index 2abb06d..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#    
-#    OpenERP, Open Source Management Solution
-#    Copyright (C) 2004-2009 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/>.     
-#
-##############################################################################
-
-__author__ = 'Gaetan de Menten, <ged@tiny.be>'
-__version__ = '0.1.0'
-
-import psycopg
-import optparse
-import ConfigParser
-
-# -----
-
-parser = optparse.OptionParser(version="Tiny ERP server migration script " + __version__)
-
-parser.add_option("-c", "--config", dest="config", help="specify path to Tiny ERP config file")
-
-group = optparse.OptionGroup(parser, "Database related options")
-group.add_option("--db_host", dest="db_host", help="specify the database host") 
-group.add_option("--db_port", dest="db_port", help="specify the database port") 
-group.add_option("-d", "--database", dest="db_name", help="specify the database name")
-group.add_option("-r", "--db_user", dest="db_user", help="specify the database user name")
-group.add_option("-w", "--db_password", dest="db_password", help="specify the database password") 
-parser.add_option_group(group)
-
-options = optparse.Values()
-options.db_name = 'terp' # default value
-parser.parse_args(values=options)
-
-if hasattr(options, 'config'):
-    configparser = ConfigParser.ConfigParser()
-    configparser.read([options.config])
-    for name, value in configparser.items('options'):
-        if not (hasattr(options, name) and getattr(options, name)):
-            if value in ('true', 'True'):
-                value = True
-            if value in ('false', 'False'):
-                value = False
-            setattr(options, name, value)
-
-# -----
-
-host = hasattr(options, 'db_host') and "host=%s" % options.db_host or ''
-port = hasattr(options, 'db_port') and "port=%s" % options.db_port or ''
-name = "dbname=%s" % options.db_name
-user = hasattr(options, 'db_user') and "user=%s" % options.db_user or ''
-password = hasattr(options, 'db_password') and "password=%s" % options.db_password or ''
-
-db = psycopg.connect('%s %s %s %s %s' % (host, port, name, user, password), serialize=0)
-cr = db.cursor()
-
-# ---------------------------------------------------------------- #
-# move user id from hr_analytic_timesheet to account_analytic_line #
-# ---------------------------------------------------------------- #
-
-cr.execute("UPDATE account_analytic_line SET user_id = hr_analytic_timesheet.user_id FROM hr_analytic_timesheet WHERE hr_analytic_timesheet.line_id = account_analytic_line.id")
-cr.commit()
-
-# --------------- #
-# remove old menu #
-# --------------- #
-
-while True:
-    cr.execute("select id from ir_ui_menu where (id not in (select parent_id from ir_ui_menu where parent_id is not null)) and (id not in (select res_id from ir_values where model='ir.ui.menu'))")
-    if not cr.rowcount:
-        break
-    cr.execute("delete from ir_ui_menu where (id not in (select parent_id from ir_ui_menu where parent_id is not null)) and (id not in (select res_id from ir_values where model='ir.ui.menu'))")
-cr.commit()
-
-# ----------------------------------------- #
-# add default value for discount in invoice #
-# ----------------------------------------- #
-
-cr.execute("update account_invoice_line set discount=0.0 where discount is null;")
-cr.commit()
-
-
-# -------------------------------------------------------------------------- #
-# update constraint account_invoice_line_uos_id_fkey on account_invoice_line #
-# -------------------------------------------------------------------------- #
-
-cr.execute("ALTER TABLE account_invoice_line DROP CONSTRAINT account_invoice_line_uos_id_fkey")
-cr.execute("ALTER TABLE account_invoice_line ADD FOREIGN KEY (uos_id) REFERENCES product_uom(id) ON DELETE SET NULL")
-cr.commit()
-
-print """
-WARNING: account_uos has been replaced by product_uom.
-It is not possible to migrate the data automatically so you need to create the old account_uos in the new product_uom.
-And then update the field uos_id of the table account_invoice to match the new id of product_uom.
-
-EXAMPLE:
-    UPDATE account_invoice SET uos_id = new_id WHERE uos_id = old_id;
-"""
-
-cr.close()
-
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-
diff --git a/history/migrate/3.4.0-4.0.0/pre-tiny.py b/history/migrate/3.4.0-4.0.0/pre-tiny.py
deleted file mode 100644 (file)
index 1001957..0000000
+++ /dev/null
@@ -1,145 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#    
-#    OpenERP, Open Source Management Solution
-#    Copyright (C) 2004-2009 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/>.     
-#
-##############################################################################
-
-__author__ = 'Gaetan de Menten, <ged@tiny.be>'
-__version__ = '0.1.0'
-
-import psycopg
-import optparse
-import ConfigParser
-
-# -----
-
-parser = optparse.OptionParser(version="Tiny ERP server migration script " + __version__)
-
-parser.add_option("-c", "--config", dest="config", help="specify path to Tiny ERP config file")
-
-group = optparse.OptionGroup(parser, "Database related options")
-group.add_option("--db_host", dest="db_host", help="specify the database host") 
-group.add_option("--db_port", dest="db_port", help="specify the database port") 
-group.add_option("-d", "--database", dest="db_name", help="specify the database name")
-group.add_option("-r", "--db_user", dest="db_user", help="specify the database user name")
-group.add_option("-w", "--db_password", dest="db_password", help="specify the database password") 
-parser.add_option_group(group)
-
-options = optparse.Values()
-options.db_name = 'terp' # default value
-parser.parse_args(values=options)
-
-if hasattr(options, 'config'):
-    configparser = ConfigParser.ConfigParser()
-    configparser.read([options.config])
-    for name, value in configparser.items('options'):
-        if not (hasattr(options, name) and getattr(options, name)):
-            if value in ('true', 'True'):
-                value = True
-            if value in ('false', 'False'):
-                value = False
-            setattr(options, name, value)
-
-# -----
-
-host = hasattr(options, 'db_host') and "host=%s" % options.db_host or ''
-port = hasattr(options, 'db_port') and "port=%s" % options.db_port or ''
-name = "dbname=%s" % options.db_name
-user = hasattr(options, 'db_user') and "user=%s" % options.db_user or ''
-password = hasattr(options, 'db_password') and "password=%s" % options.db_password or ''
-
-db = psycopg.connect('%s %s %s %s %s' % (host, port, name, user, password), serialize=0)
-cr = db.cursor()
-
-# ------------------------- #
-# change some columns types #
-# ------------------------- #
-
-def change_column(cr, table, column, new_type, copy):
-    commands = [
-        "ALTER TABLE %s RENAME COLUMN %s TO temp_column" % (table, column),
-        "ALTER TABLE %s ADD COLUMN %s %s" % (table, column, new_type),
-        "ALTER TABLE %s DROP COLUMN temp_column" % table
-    ]
-    if copy:
-        commands.insert(
-            2, 
-            "UPDATE %s SET %s=temp_column::%s" % (table, column, new_type))
-
-    for command in commands:
-        cr.execute(command)
-
-#change_column(cr, 'crm_case', 'date_closed', 'timestamp', True)
-cr.commit()
-
-# -------------------- #
-# add module if needed #
-# -------------------- #
-
-cr.execute("SELECT name FROM ir_module_module")
-if not cr.rowcount:
-    for module in set(['base', 'marketing', 'subscription', 'account', 'base_partner_relation', 'audittrail', 'account_followup', 'product', 'hr', 'l10n_simple', 'crm', 'stock', 'hr_timesheet', 'purchase', 'report_purchase', 'mrp', 'sale', 'report_sale', 'delivery', 'project', 'sale_crm', 'hr_timesheet_project', 'scrum', 'report_project',
-'account_followup',
-'account',
-'audittrail',
-'base_partner_relation',
-'crm',
-'delivery',
-'edi',
-'hr_evaluation',
-'hr_expense',
-'hr',
-'hr_timesheet_invoice',
-'hr_timesheet_project',
-'hr_timesheet',
-'l10n_simple',
-'marketing',
-'mrp',
-'network',
-'product',
-'project',
-'purchase',
-'report_crm',
-'report_project',
-'report_purchase',
-'report_sale',
-'sale_crm',
-'sale',
-'sandwich',
-'scrum',
-'stock']):
-        cr.execute("INSERT INTO ir_module_module (name, state) VALUES ('%s', 'installed')" % module)
-    cr.commit()
-
-
-# ----------------------------------------------------- #
-# add some fields (which cannot be added automatically) #
-# ----------------------------------------------------- #
-
-for line in (
-        "ALTER TABLE ir_module_module ADD demo BOOLEAN DEFAULT False",
-        "delete from ir_values where value like '%,False'",
-        """UPDATE ir_ui_view set arch='<?xml version="1.0"?><tree string="Menu" toolbar="1"><field icon="icon" name="name"/></tree>' where name='ir.ui.menu.tree' and type='tree' and field_parent='child_id'""",
-    ):
-    cr.execute(line)
-
-cr.commit()
-cr.close()
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-
diff --git a/history/migrate/3.4.0-4.0.0/pre.py b/history/migrate/3.4.0-4.0.0/pre.py
deleted file mode 100644 (file)
index 3e9f2bb..0000000
+++ /dev/null
@@ -1,127 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#    
-#    OpenERP, Open Source Management Solution
-#    Copyright (C) 2004-2009 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/>.     
-#
-##############################################################################
-
-__author__ = 'Gaetan de Menten, <ged@tiny.be>'
-__version__ = '0.1.0'
-
-import psycopg
-import optparse
-import ConfigParser
-
-# -----
-
-parser = optparse.OptionParser(version="Tiny ERP server migration script " + __version__)
-
-parser.add_option("-c", "--config", dest="config", help="specify path to Tiny ERP config file")
-
-group = optparse.OptionGroup(parser, "Database related options")
-group.add_option("--db_host", dest="db_host", help="specify the database host") 
-group.add_option("--db_port", dest="db_port", help="specify the database port") 
-group.add_option("-d", "--database", dest="db_name", help="specify the database name")
-group.add_option("-r", "--db_user", dest="db_user", help="specify the database user name")
-group.add_option("-w", "--db_password", dest="db_password", help="specify the database password") 
-parser.add_option_group(group)
-
-options = optparse.Values()
-options.db_name = 'terp' # default value
-parser.parse_args(values=options)
-
-if hasattr(options, 'config'):
-    configparser = ConfigParser.ConfigParser()
-    configparser.read([options.config])
-    for name, value in configparser.items('options'):
-        if not (hasattr(options, name) and getattr(options, name)):
-            if value in ('true', 'True'):
-                value = True
-            if value in ('false', 'False'):
-                value = False
-            setattr(options, name, value)
-
-# -----
-
-host = hasattr(options, 'db_host') and "host=%s" % options.db_host or ''
-port = hasattr(options, 'db_port') and "port=%s" % options.db_port or ''
-name = "dbname=%s" % options.db_name
-user = hasattr(options, 'db_user') and "user=%s" % options.db_user or ''
-password = hasattr(options, 'db_password') and "password=%s" % options.db_password or ''
-
-db = psycopg.connect('%s %s %s %s %s' % (host, port, name, user, password), serialize=0)
-cr = db.cursor()
-
-# ------------------------- #
-# change some columns types #
-# ------------------------- #
-
-def change_column(cr, table, column, new_type, copy):
-    commands = [
-        "ALTER TABLE %s RENAME COLUMN %s TO temp_column" % (table, column),
-        "ALTER TABLE %s ADD COLUMN %s %s" % (table, column, new_type),
-        "ALTER TABLE %s DROP COLUMN temp_column" % table
-    ]
-    if copy:
-        commands.insert(
-            2, 
-            "UPDATE %s SET %s=temp_column::%s" % (table, column, new_type))
-
-    for command in commands:
-        cr.execute(command)
-
-change_column(cr, 'crm_case', 'date_closed', 'timestamp', True)
-cr.commit()
-
-# -------------------- #
-# add module if needed #
-# -------------------- #
-
-cr.execute("SELECT name FROM ir_module_module")
-if not cr.rowcount:
-    for module in ('base', 'marketing', 'subscription', 'account', 'base_partner_relation', 'audittrail', 'account_followup', 'product', 'hr', 'l10n_simple', 'crm', 'stock', 'hr_timesheet', 'purchase', 'report_purchase', 'mrp', 'sale', 'report_sale', 'delivery', 'project', 'sale_crm', 'hr_timesheet_project', 'scrum', 'report_project'):
-        cr.execute("INSERT INTO ir_module_module (name, state) VALUES ('%s', 'installed')" % module)
-    cr.commit()
-
-# --------------- #
-# remove old menu #
-# --------------- #
-
-while True:
-    cr.execute("select id from ir_ui_menu where id not in (select parent_id from ir_ui_menu where parent_id is not null) and id not in (select res_id from ir_model_data where model='ir.ui.menu')")
-    if not cr.rowcount:
-        break
-    cr.execute("delete from ir_ui_menu where id not in (select parent_id from ir_ui_menu where parent_id is not null) and id not in (select res_id from ir_model_data where model='ir.ui.menu')")
-cr.commit()
-
-# ----------------------------------------------------- #
-# add some fields (which cannot be added automatically) #
-# ----------------------------------------------------- #
-
-for line in (
-        "ALTER TABLE ir_module_module ADD demo BOOLEAN",
-        "ALTER TABLE ir_module_module SET demo DEFAULT False",
-        "DELETE FROM ir_values WHERE VALUE LIKE '%,False'",
-        """UPDATE ir_ui_view set arch='<?xml version="1.0"?><tree string="Menu" toolbar="1"><field icon="icon" name="name"/></tree>' where name='ir.ui.menu.tree' and type='tree' and field_parent='child_id'""",
-    ):
-    cr.execute(line)
-
-cr.commit()
-cr.close()
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-
diff --git a/history/migrate/4.0.0-4.2.0/pre.py b/history/migrate/4.0.0-4.2.0/pre.py
deleted file mode 100644 (file)
index a8080ee..0000000
+++ /dev/null
@@ -1,247 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#    
-#    OpenERP, Open Source Management Solution
-#    Copyright (C) 2004-2009 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/>.     
-#
-##############################################################################
-
-__author__ = 'Cédric Krier, <ced@tinyerp.com>'
-__version__ = '0.1.0'
-
-import psycopg
-import optparse
-import ConfigParser
-
-# -----
-
-parser = optparse.OptionParser(version="Tiny ERP server migration script " + __version__)
-
-parser.add_option("-c", "--config", dest="config", help="specify path to Tiny ERP config file")
-
-group = optparse.OptionGroup(parser, "Database related options")
-group.add_option("--db_host", dest="db_host", help="specify the database host") 
-group.add_option("--db_port", dest="db_port", help="specify the database port") 
-group.add_option("-d", "--database", dest="db_name", help="specify the database name")
-group.add_option("-r", "--db_user", dest="db_user", help="specify the database user name")
-group.add_option("-w", "--db_password", dest="db_password", help="specify the database password") 
-parser.add_option_group(group)
-
-options = optparse.Values()
-options.db_name = 'terp' # default value
-parser.parse_args(values=options)
-
-if hasattr(options, 'config'):
-    configparser = ConfigParser.ConfigParser()
-    configparser.read([options.config])
-    for name, value in configparser.items('options'):
-        if not (hasattr(options, name) and getattr(options, name)):
-            if value in ('true', 'True'):
-                value = True
-            if value in ('false', 'False'):
-                value = False
-            setattr(options, name, value)
-
-# -----
-
-host = hasattr(options, 'db_host') and "host=%s" % options.db_host or ''
-port = hasattr(options, 'db_port') and "port=%s" % options.db_port or ''
-name = "dbname=%s" % options.db_name
-user = hasattr(options, 'db_user') and "user=%s" % options.db_user or ''
-password = hasattr(options, 'db_password') and "password=%s" % options.db_password or ''
-
-db = psycopg.connect('%s %s %s %s %s' % (host, port, name, user, password), serialize=0)
-cr = db.cursor()
-
-# ------------------------ #
-# change currency rounding #
-# ------------------------ #
-
-cr.execute("""SELECT c.relname,a.attname,a.attlen,a.atttypmod,a.attnotnull,a.atthasdef,t.typname,CASE WHEN a.attlen=-1 THEN a.atttypmod-4 ELSE a.attlen END as size FROM pg_class c,pg_attribute a,pg_type t WHERE c.relname='res_currency' AND a.attname='rounding' AND c.oid=a.attrelid AND a.atttypid=t.oid""")
-res = cr.dictfetchall()
-if res[0]['typname'] != 'numeric':
-    for line in (
-        "ALTER TABLE res_currency RENAME rounding TO rounding_bak",
-        "ALTER TABLE res_currency ADD rounding NUMERIC(12,6)",
-        "UPDATE res_currency SET rounding = power(10, - rounding_bak)",
-        "ALTER TABLE res_currency DROP rounding_bak",
-        ):
-        cr.execute(line)
-cr.commit()
-
-# ----------------------------- #
-# drop constraint on ir_ui_view #
-# ----------------------------- #
-
-cr.execute('SELECT conname FROM pg_constraint where conname = \'ir_ui_view_type\'')
-if cr.fetchall():
-    cr.execute('ALTER TABLE ir_ui_view DROP CONSTRAINT ir_ui_view_type')
-cr.commit()
-
-# ------------------------ #
-# update res.partner.bank  #
-# ------------------------ #
-
-cr.execute('SELECT a.attname FROM pg_class c, pg_attribute a WHERE c.relname = \'res_partner_bank\' AND a.attname = \'iban\' AND c.oid = a.attrelid')
-if cr.fetchall():
-    cr.execute('ALTER TABLE res_partner_bank RENAME iban TO acc_number')
-cr.commit()
-
-# ------------------------------------------- #
-# Add perm_id to ir_model and ir_model_fields #
-# ------------------------------------------- #
-
-cr.execute('SELECT a.attname FROM pg_class c, pg_attribute a WHERE c.relname = \'ir_model\' AND a.attname = \'perm_id\' AND c.oid = a.attrelid')
-if not cr.fetchall():
-    cr.execute("ALTER TABLE ir_model ADD perm_id int references perm on delete set null")
-cr.commit()
-
-cr.execute('SELECT a.attname FROM pg_class c, pg_attribute a WHERE c.relname = \'ir_model_fields\' AND a.attname = \'perm_id\' AND c.oid = a.attrelid')
-if not cr.fetchall():
-    cr.execute("ALTER TABLE ir_model_fields ADD perm_id int references perm on delete set null")
-cr.commit()
-
-
-# --------------------------------- #
-# remove name for all ir_act_window #
-# --------------------------------- #
-
-cr.execute("UPDATE ir_act_window SET name = ''")
-cr.commit()
-
-# ------------------------------------------------------------------------ #
-# Create a "allow none" default access to keep the behaviour of the system #
-# ------------------------------------------------------------------------ #
-
-cr.execute('SELECT model_id FROM ir_model_access')
-res= cr.fetchall()
-for r in res:
-    cr.execute('SELECT id FROM ir_model_access WHERE model_id = %d AND group_id IS NULL', (r[0],))
-    if not cr.fetchall():
-        cr.execute("INSERT into ir_model_access (name,model_id,group_id) VALUES ('Auto-generated access by migration',%d,NULL)",(r[0],))
-cr.commit()
-
-# ------------------------------------------------- #
-# Drop view report_account_analytic_line_to_invoice #
-# ------------------------------------------------- #
-
-cr.execute('SELECT viewname FROM pg_views WHERE viewname = \'report_account_analytic_line_to_invoice\'')
-if cr.fetchall():
-    cr.execute('DROP VIEW report_account_analytic_line_to_invoice')
-cr.commit()
-
-# --------------------------- #
-# Drop state from hr_employee #
-# --------------------------- #
-
-cr.execute('SELECT * FROM pg_class c, pg_attribute a WHERE c.relname=\'hr_employee\' AND a.attname=\'state\' AND c.oid=a.attrelid')
-if cr.fetchall():
-    cr.execute('ALTER TABLE hr_employee DROP state')
-cr.commit()
-
-# ------------ #
-# Add timezone #
-# ------------ #
-
-cr.execute('SELECT id FROM ir_values where model=\'res.users\' AND key=\'meta\' AND name=\'tz\'')
-if not cr.fetchall():
-    import pytz, pickle
-    meta = pickle.dumps({'type':'selection', 'string':'Timezone', 'selection': [(x, x) for x in pytz.all_timezones]})
-    value = pickle.dumps(False)
-    cr.execute('INSERT INTO ir_values (name, key, model, meta, key2, object, value) VALUES (\'tz\', \'meta\', \'res.users\', %s, \'tz\', %s, %s)', (meta,False, value))
-cr.commit()
-
-# ------------------------- #
-# change product_uom factor #
-# ------------------------- #
-
-cr.execute('SELECT a.attname FROM pg_class c, pg_attribute a, pg_type t WHERE c.relname = \'product_uom\' AND a.attname = \'factor\' AND c.oid = a.attrelid AND a.atttypid = t.oid AND t.typname = \'float8\'')
-if cr.fetchall():
-    cr.execute('SELECT viewname FROM pg_views WHERE viewname = \'report_account_analytic_planning_stat_account\'')
-    if cr.fetchall():
-        cr.execute('DROP VIEW report_account_analytic_planning_stat_account')
-    cr.execute('SELECT viewname FROM pg_views WHERE viewname = \'report_account_analytic_planning_stat\'')
-    if cr.fetchall():
-        cr.execute('DROP VIEW report_account_analytic_planning_stat')
-    cr.execute('SELECT viewname FROM pg_views WHERE viewname = \'report_account_analytic_planning_stat_user\'')
-    if cr.fetchall():
-        cr.execute('DROP VIEW report_account_analytic_planning_stat_user')
-    cr.execute('SELECT viewname FROM pg_views WHERE viewname = \'report_purchase_order_product\'')
-    if cr.fetchall():
-        cr.execute('DROP VIEW report_purchase_order_product')
-    cr.execute('SELECT viewname FROM pg_views WHERE viewname = \'report_purchase_order_category\'')
-    if cr.fetchall():
-        cr.execute('DROP VIEW report_purchase_order_category')
-    cr.execute('SELECT viewname FROM pg_views WHERE viewname = \'report_sale_order_product\'')
-    if cr.fetchall():
-        cr.execute('DROP VIEW report_sale_order_product')
-    cr.execute('SELECT viewname FROM pg_views WHERE viewname = \'report_sale_order_category\'')
-    if cr.fetchall():
-        cr.execute('DROP VIEW report_sale_order_category')
-    cr.execute('SELECT viewname FROM pg_views WHERE viewname = \'report_hr_timesheet_invoice_journal\'')
-    if cr.fetchall():
-        cr.execute('DROP VIEW report_hr_timesheet_invoice_journal')
-
-    cr.execute('ALTER TABLE product_uom RENAME COLUMN factor to temp_column')
-    cr.execute('ALTER TABLE product_uom ADD COLUMN factor NUMERIC(12,6)')
-    cr.execute('UPDATE product_uom SET factor = temp_column')
-    cr.execute('ALTER TABLE product_uom ALTER factor SET NOT NULL')
-    cr.execute('ALTER TABLE product_uom DROP COLUMN temp_column')
-cr.commit()
-
-
-# ------------------------------------------------- #
-# Drop name_uniq constraint on stock_production_lot #
-# ------------------------------------------------- #
-
-cr.execute('SELECT conname FROM pg_constraint where conname = \'stock_production_lot_name_uniq\'')
-if cr.fetchall():
-    cr.execute('ALTER TABLE stock_production_lot DROP CONSTRAINT stock_production_lot_name_uniq')
-cr.commit()
-
-# ------------------------------------ #
-# Put country/state code in upper case #
-# ------------------------------------ #
-
-cr.execute('UPDATE res_country SET code = UPPER(code)')
-cr.execute('UPDATE res_country_state SET code = UPPER(code)')
-cr.commit()
-
-# --------------------------------------------- #
-# Add primary key on tables inherits ir_actions #
-# --------------------------------------------- #
-
-cr.execute('SELECT indexname FROm pg_indexes WHERE indexname = \'ir_act_report_xml_pkey\' and tablename = \'ir_act_report_xml\'')
-if not cr.fetchall():
-    cr.execute('ALTER TABLE ir_act_report_xml ADD PRIMARY KEY (id)')
-cr.execute('SELECT indexname FROm pg_indexes WHERE indexname = \'ir_act_report_custom_pkey\' and tablename = \'ir_act_report_custom\'')
-if not cr.fetchall():
-    cr.execute('ALTER TABLE ir_act_report_custom ADD PRIMARY KEY (id)')
-cr.execute('SELECT indexname FROm pg_indexes WHERE indexname = \'ir_act_group_pkey\' and tablename = \'ir_act_group\'')
-if not cr.fetchall():
-    cr.execute('ALTER TABLE ir_act_group ADD PRIMARY KEY (id)')
-cr.execute('SELECT indexname FROm pg_indexes WHERE indexname = \'ir_act_execute_pkey\' and tablename = \'ir_act_execute\'')
-if not cr.fetchall():
-    cr.execute('ALTER TABLE ir_act_execute ADD PRIMARY KEY (id)')
-cr.execute('SELECT indexname FROm pg_indexes WHERE indexname = \'ir_act_wizard_pkey\' and tablename = \'ir_act_wizard\'')
-if not cr.fetchall():
-    cr.execute('ALTER TABLE ir_act_wizard ADD PRIMARY KEY (id)')
-cr.commit()
-
-cr.close
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-
diff --git a/history/migrate/4.0.0-4.2.0/tiny/README b/history/migrate/4.0.0-4.2.0/tiny/README
deleted file mode 100644 (file)
index 36f1290..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Those scripts are provide as example of customization of migration scripts
diff --git a/history/migrate/4.0.0-4.2.0/tiny/pre-tiny.py b/history/migrate/4.0.0-4.2.0/tiny/pre-tiny.py
deleted file mode 100644 (file)
index f2485a2..0000000
+++ /dev/null
@@ -1,188 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#    
-#    OpenERP, Open Source Management Solution
-#    Copyright (C) 2004-2009 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/>.     
-#
-##############################################################################
-
-__author__ = 'Cédric Krier, <ced@tinyerp.com>'
-__version__ = '0.1.0'
-
-import psycopg
-import optparse
-import ConfigParser
-
-# -----
-
-parser = optparse.OptionParser(version="Tiny ERP server migration script " + __version__)
-
-parser.add_option("-c", "--config", dest="config", help="specify path to Tiny ERP config file")
-
-group = optparse.OptionGroup(parser, "Database related options")
-group.add_option("--db_host", dest="db_host", help="specify the database host") 
-group.add_option("--db_port", dest="db_port", help="specify the database port") 
-group.add_option("-d", "--database", dest="db_name", help="specify the database name")
-group.add_option("-r", "--db_user", dest="db_user", help="specify the database user name")
-group.add_option("-w", "--db_password", dest="db_password", help="specify the database password") 
-parser.add_option_group(group)
-
-options = optparse.Values()
-options.db_name = 'terp' # default value
-parser.parse_args(values=options)
-
-if hasattr(options, 'config'):
-    configparser = ConfigParser.ConfigParser()
-    configparser.read([options.config])
-    for name, value in configparser.items('options'):
-        if not (hasattr(options, name) and getattr(options, name)):
-            if value in ('true', 'True'):
-                value = True
-            if value in ('false', 'False'):
-                value = False
-            setattr(options, name, value)
-
-raise Exception('This script is provided as an example, you must custom it before')
-
-# -----
-
-host = hasattr(options, 'db_host') and "host=%s" % options.db_host or ''
-port = hasattr(options, 'db_port') and "port=%s" % options.db_port or ''
-name = "dbname=%s" % options.db_name
-user = hasattr(options, 'db_user') and "user=%s" % options.db_user or ''
-password = hasattr(options, 'db_password') and "password=%s" % options.db_password or ''
-
-db = psycopg.connect('%s %s %s %s %s' % (host, port, name, user, password), serialize=0)
-cr = db.cursor()
-
-# fix country
-
-
-cr.execute('SELECT code from res_country where code is not null group by code')
-res = cr.fetchall()
-
-for c in res:
-    cr.execute('SELECT max(id) from res_country where code = %s group by code', (c[0],))
-    res2 = cr.fetchone()
-    cr.execute('SELECT id from res_country where code = %s', (c[0],))
-    ids = ','.join(map(lambda x: str(x[0]), cr.fetchall()))
-    cr.execute('UPDATE res_partner_address set country_id = %d where country_id in ('+ids+')', (res2[0],))
-    cr.execute('DELETE FROM res_country WHERE code = %s and id <> %d', (c[0], res2[0],))
-cr.commit()
-
-
-cr.execute('SELECT viewname FROM pg_views WHERE viewname = \'report_account_analytic_planning_stat\'')
-if cr.fetchall():
-    cr.execute('DROP VIEW report_account_analytic_planning_stat')
-cr.commit()
-
-
-cr.execute('SELECT name from ( SELECT name, count(name) AS n FROM res_partner GROUP BY name ) AS foo WHERE n > 1')
-res = cr.fetchall()
-
-
-for p in res:
-    cr.execute('SELECT max(id) FROM res_partner WHERE name = %s GROUP BY name', (p[0],))
-    res2 = cr.fetchone()
-    cr.execute('UPDATE res_partner set active = False WHERE name = %s and id <> %d', (p[0], res2[0],))
-    cr.execute('SELECT id FROM res_partner WHERE name = %s AND id <> %d', (p[0], res2[0],))
-    res3 = cr.fetchall()
-    i = 0
-    for id in res3:
-        name = p[0]+' old'
-        if i:
-            name = name + ' ' + str(i)
-        cr.execute('UPDATE res_partner set name = %s WHERE id = %d', (name, id[0]))
-        i += 1
-cr.commit()
-
-cr.execute('SELECT viewname FROM pg_views WHERE viewname = \'report_account_analytic_line_to_invoice\'')
-if cr.fetchall():
-    cr.execute('DROP VIEW report_account_analytic_line_to_invoice')
-cr.execute('SELECT viewname FROM pg_views WHERE viewname = \'report_timesheet_invoice\'')
-if cr.fetchall():
-    cr.execute('drop VIEW report_timesheet_invoice')
-cr.execute('SELECT viewname FROM pg_views WHERE viewname = \'report_purchase_order_category\'')
-if cr.fetchall():
-    cr.execute('drop VIEW report_purchase_order_category')
-cr.execute('SELECT viewname FROM pg_views WHERE viewname = \'report_purchase_order_product\'')
-if cr.fetchall():
-    cr.execute('drop VIEW report_purchase_order_product')
-cr.execute('SELECT viewname FROM pg_views WHERE viewname = \'report_sale_order_category\'')
-if cr.fetchall():
-    cr.execute('drop VIEW report_sale_order_category')
-cr.execute('SELECT viewname FROM pg_views WHERE viewname = \'report_sale_order_product\'')
-if cr.fetchall():
-    cr.execute('drop VIEW report_sale_order_product')
-cr.execute('SELECT viewname FROM pg_views WHERE viewname = \'report_timesheet_user\'')
-if cr.fetchall():
-    cr.execute('drop VIEW report_timesheet_user')
-cr.execute('SELECT viewname FROM pg_views WHERE viewname = \'report_task_user_pipeline_open\'')
-if cr.fetchall():
-    cr.execute('drop VIEW report_task_user_pipeline_open')
-cr.execute('SELECT viewname FROM pg_views WHERE viewname = \'hr_timesheet_sheet_sheet_day\'')
-if cr.fetchall():
-    cr.execute('drop VIEW hr_timesheet_sheet_sheet_day')
-cr.execute('SELECT viewname FROM pg_views WHERE viewname = \'hr_timesheet_sheet_sheet_account\'')
-if cr.fetchall():
-    cr.execute('drop VIEW hr_timesheet_sheet_sheet_account')
-cr.execute('SELECT viewname from pg_views where viewname = \'sale_journal_sale_stats\'')
-if cr.fetchall():
-    cr.execute('drop VIEW sale_journal_sale_stats')
-cr.execute('SELECT viewname from pg_views where viewname = \'sale_journal_picking_stats\'')
-if cr.fetchall():
-    cr.execute('drop VIEW sale_journal_picking_stats')
-cr.execute('SELECT viewname from pg_views where viewname = \'sale_journal_invoice_type_stats\'')
-if cr.fetchall():
-    cr.execute('drop VIEW sale_journal_invoice_type_stats')
-
-cr.execute('ALTER TABLE product_template ALTER list_price TYPE numeric(16,2)')
-cr.execute('ALTER TABLE product_template ALTER standard_price TYPE numeric(16,2)')
-cr.execute('ALTER TABLE product_product ALTER price_extra TYPE numeric(16,2)')
-cr.execute('ALTER TABLE product_product ALTER price_margin TYPE numeric(16,2)')
-cr.execute('ALTER TABLE pricelist_partnerinfo ALTER price TYPE numeric(16,2)')
-cr.execute('ALTER TABLE account_invoice_line ALTER price_unit TYPE numeric(16,2)')
-cr.execute('ALTER TABLE purchase_order_line ALTER price_unit TYPE numeric(16,2)')
-cr.execute('ALTER TABLE sale_order_line ALTER price_unit TYPE numeric(16,2)')
-cr.commit()
-
-
-cr.execute('SELECT tablename FROM pg_tables WHERE tablename = \'subscription_document_fields\'')
-if cr.fetchall():
-    cr.execute('DROP TABLE subscription_document_fields')
-cr.execute('SELECT tablename FROM pg_tables WHERE tablename = \'subscription_document\'')
-if cr.fetchall():
-    cr.execute('DROP TABLE subscription_document')
-cr.execute('SELECT tablename FROM pg_tables WHERE tablename = \'subscription_subscription_history\'')
-if cr.fetchall():
-    cr.execute('DROP TABLE subscription_subscription_history')
-cr.commit()
-
-# -------------------- #
-# Change currency rate #
-# -------------------- #
-
-cr.execute('SELECT a.attname FROM pg_class c, pg_attribute a WHERE c.relname = \'res_currency_rate\' AND a.attname = \'rate_old\' AND c.oid = a.attrelid')
-if not cr.fetchall():
-    cr.execute('ALTER TABLE res_currency_rate ADD rate_old NUMERIC(12,6)')
-    cr.execute('UPDATE res_currency_rate SET rate_old = rate')
-    cr.execute('UPDATE res_currency_rate SET rate = (1 / rate_old)')
-cr.commit()
-
-cr.close
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-
diff --git a/history/migrate/4.2.0-4.4.0/pre.py b/history/migrate/4.2.0-4.4.0/pre.py
deleted file mode 100644 (file)
index 5c45982..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#    
-#    OpenERP, Open Source Management Solution
-#    Copyright (C) 2004-2009 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/>.     
-#
-##############################################################################
-
-__version__ = '0.1.0'
-
-import psycopg
-import optparse
-import ConfigParser
-
-# -----
-
-parser = optparse.OptionParser(version="Tiny ERP server migration script " + __version__)
-
-parser.add_option("-c", "--config", dest="config", help="specify path to Tiny ERP config file")
-
-group = optparse.OptionGroup(parser, "Database related options")
-group.add_option("--db_host", dest="db_host", help="specify the database host") 
-group.add_option("--db_port", dest="db_port", help="specify the database port") 
-group.add_option("-d", "--database", dest="db_name", help="specify the database name")
-group.add_option("-r", "--db_user", dest="db_user", help="specify the database user name")
-group.add_option("-w", "--db_password", dest="db_password", help="specify the database password") 
-parser.add_option_group(group)
-
-options = optparse.Values()
-options.db_name = 'terp' # default value
-parser.parse_args(values=options)
-
-if hasattr(options, 'config'):
-    configparser = ConfigParser.ConfigParser()
-    configparser.read([options.config])
-    for name, value in configparser.items('options'):
-        if not (hasattr(options, name) and getattr(options, name)):
-            if value in ('true', 'True'):
-                value = True
-            if value in ('false', 'False'):
-                value = False
-            setattr(options, name, value)
-
-# -----
-
-host = hasattr(options, 'db_host') and "host=%s" % options.db_host or ''
-port = hasattr(options, 'db_port') and "port=%s" % options.db_port or ''
-name = "dbname=%s" % options.db_name
-user = hasattr(options, 'db_user') and "user=%s" % options.db_user or ''
-password = hasattr(options, 'db_password') and "password=%s" % options.db_password or ''
-
-db = psycopg.connect('%s %s %s %s %s' % (host, port, name, user, password), serialize=0)
-cr = db.cursor()
-
-# ------------------------------ #
-# drop not null on ir_attachment #
-# ------------------------------ #
-
-cr.execute('ALTER TABLE ir_attachment \
-        ALTER COLUMN res_model DROP NOT NULL, \
-        ALTER COLUMN res_id DROP NOT NULL')
-cr.commit()
-
-# ---------------------------------- #
-# change case date_deadline rounding #
-# ---------------------------------- #
-
-cr.execute("""SELECT
-c.relname,a.attname,a.attlen,a.atttypmod,a.attnotnull,a.atthasdef,t.typname,CASE
-WHEN a.attlen=-1 THEN a.atttypmod-4 ELSE a.attlen END as size FROM pg_class
-c,pg_attribute a,pg_type t WHERE c.relname='crm_case' AND
-a.attname='date_deadline' AND c.oid=a.attrelid AND a.atttypid=t.oid""")
-
-res = cr.dictfetchall()
-if res[0]['typname'] != 'timestamp':
-    for line in (
-        "ALTER TABLE crm_case RENAME date_deadline TO date_deadline_bak",
-        "ALTER TABLE crm_case ADD date_deadline timestamp",
-        "UPDATE crm_case SET date_deadline = date_deadline_bak",
-        "ALTER TABLE crm_case DROP date_deadline_bak",
-        ):
-        cr.execute(line)
-cr.commit()
-
-cr.execute('drop view report_task_user_pipeline_open');
-cr.commit()
-
-cr.execute('alter table ir_model_fields add state varchar(26)')
-cr.execute('alter table ir_model_fields add select_level varchar(3)')
-cr.execute('alter table ir_act_wizard add primary key(id)')
-cr.commit()
-
-
-cr.close()
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-
diff --git a/history/module_graph.py b/history/module_graph.py
deleted file mode 100755 (executable)
index b29bd31..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-##############################################################################
-#
-#    OpenERP, Open Source Management Solution
-#    Copyright (C) 2004-2009 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/>.
-#
-##############################################################################
-
-# TODO handle the case of zip modules
-
-import os
-import optparse
-import sys
-import glob
-
-# TODO use the same function provided in openerp.modules
-def load_information_from_description_file(module):
-    """
-    :param module: The name of the module (sale, purchase, ...)
-    """
-    for filename in ['__openerp__.py', '__terp__.py']:
-        description_file = os.path.join(module, filename)
-        if os.path.isfile(description_file):
-            return eval(file(description_file).read())
-
-    return {}
-
-def get_valid_path(paths, module):
-    for path in paths:
-        full = os.path.join(path, module)
-        if os.path.exists(full):
-            return full
-    return None
-
-parser = optparse.OptionParser(usage="%prog [options] [module1 [module2 ...]]")
-parser.add_option("-p", "--addons-path", dest="path", help="addons directory", action="append")
-(opt, args) = parser.parse_args()
-
-modules = []
-if not opt.path:
-    opt.path = ["."]
-
-if not args:
-    for path in opt.path:
-        modules += map(os.path.dirname, glob.glob(os.path.join(path, '*', '__openerp__.py')))
-        modules += map(os.path.dirname, glob.glob(os.path.join(path, '*', '__terp__.py')))
-else:
-    for module in args:
-        valid_path = get_valid_path(opt.path, module)
-        if valid_path:
-            modules.append(valid_path)
-
-all_modules = set(map(os.path.basename, modules))
-print 'digraph G {'
-while len(modules):
-    f = modules.pop(0)
-    module_name = os.path.basename(f)
-    all_modules.add(module_name)
-    info = load_information_from_description_file(f)
-    if info.get('installable', True):
-        for name in info.get('depends',[]):
-            valid_path = get_valid_path(opt.path, name)
-            if name not in all_modules:
-                if valid_path:
-                    modules.append(valid_path)
-                else:
-                    all_modules.add(name)
-                    print '\t%s [color=red]' % (name,)
-            print '\t%s -> %s;' % (module_name, name)
-print '}'
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-
diff --git a/history/run_all_with_tests.sh b/history/run_all_with_tests.sh
deleted file mode 100755 (executable)
index ef879db..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/usr/bin/env bash
-DATABASE=trunk
-dropdb ${DATABASE}
-REPOSITORIES=../../addons/trunk
-MODULES=`python -c "import os; print ','.join(list(set(os.listdir('${REPOSITORIES}')) - set(['document_ftp'])))"`
-createdb ${DATABASE}
-rm openerp-server.log
-./openerp-server \
-    --log-level=debug \
-    --addons=${REPOSITORIES},../../web/trunk/addons \
-    -d ${DATABASE} \
-    -i ${MODULES} \
-    --stop-after-init \
-    --no-xmlrpc \
-    --no-xmlrpcs \
-    --test-enable \
-    --logfile=openerp-server.log 
diff --git a/history/xml2yml.py b/history/xml2yml.py
deleted file mode 100644 (file)
index 8344d5f..0000000
+++ /dev/null
@@ -1,347 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#
-#    OpenERP, Open Source Management Solution
-#    Copyright (C) 2004-2010 OpenERP SA (<http://openerp.com>).
-#
-#    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/>.
-#
-##############################################################################
-
-"""
-Experimental script for conversion between OpenERP's XML serialization format
-and the new YAML serialization format introduced in OpenERP 6.0.
-Intended to be used as a quick preprocessor for converting data/test files, then
-to be fine-tuned manually.
-"""
-
-import yaml
-import logging
-from lxml import etree
-
-__VERSION__ = '0.0.2'
-
-def toString(value):
-    value='"' + value + '"'
-    return value
-
-class XmlTag(etree.ElementBase):
-    def _to_yaml(self):
-        child_tags = []
-        for node in self:
-            if hasattr(node, '_to_yaml'):
-                child_tags.append(node._to_yaml())
-        return self.tag(attrib=self.attrib, child_tags=child_tags)
-
-class YamlTag(object):
-    """
-    Superclass for constructors of custom tags defined in yaml file.
-    """
-    def __init__(self, **kwargs):
-        self.__dict__.update(kwargs)
-        self.attrib = self.__dict__.get('attrib', {})
-        self.child_tags = self.__dict__.get('child_tags', '')
-    def __getitem__(self, key):
-        return getattr(self, key)
-    def __getattr__(self, attr):
-        return None
-    def __repr__(self):
-        for k,v in self.attrib.iteritems():
-            if str(v) and str(v)[0] in ['[', '{', '#', '*', '(']:
-                self.attrib[k] = toString(self.attrib[k]).replace("'", '')
-        st = self.yaml_tag + ' ' + str(self.attrib)
-        return st
-
-# attrib tags
-class ref(YamlTag):
-    yaml_tag = u'!ref'
-    def __init__(self, expr="False"):
-        self.expr = expr
-    def __repr__(self):
-        return "'%s'"%str(self.expr)
-
-class Eval(YamlTag):
-    yaml_tag = u'!eval'
-    def __init__(self, expr="False"):
-        self.expr = expr
-    def __repr__(self):
-        value=str(self.expr)
-        if value.find("6,") != -1:
-            value = eval(str(eval(value)))
-            value=value[0][2]
-            value = [[value]]
-        else:
-            try:
-                value=int(value)
-            except:
-                if value and value[0] in ['[', '{', '#', '*', '(']:
-                    value = value.replace('"', r'\"')
-                    value = toString(value)
-                else:
-                    try:
-                        value = eval(value)
-                    except Exception:
-                        pass
-        return value
-
-class Search(YamlTag):
-    yaml_tag = u'!ref'
-
-# test tag
-class xml_test(XmlTag):
-    def _to_yaml(self):
-        expr = self.attrib.get('expr')
-        text = self.text
-        if text:
-            expr = expr + ' == ' + '"%s"'%text
-        return [[expr]]
-
-class xml_data(etree.ElementBase):
-    def _to_yaml(self):
-        value = self.attrib.get('noupdate', "0")
-        return data(value)
-
-# field tag:
-class xml_field(etree.ElementBase):
-    def _to_yaml(self):
-        field = '  ' + self.attrib.pop('name','unknown')
-
-        if self.attrib.get('search', None):
-            value = Search(attrib=self.attrib, child_tags='').__repr__()
-        else:
-            attr = (self.attrib.get('ref', None) and 'ref') or (self.attrib.get('eval', None) and 'eval') or 'None'
-            value = Eval(self.attrib.get(attr, self.text)).__repr__() or ''
-        return {field: value}
-
-# value tag
-class xml_value(etree.ElementBase):
-    def _to_yaml(self):
-
-        if self.attrib.get('eval', None):
-            key, val = 'eval', '"'+self.attrib.get('eval')+'"'
-        elif self.attrib.get('model', None):
-            key, val = 'model', self.attrib.get('model')
-        val=val.replace("'",'""')
-        self.attrib.pop(key)
-        d={}
-        for k,v in self.attrib.iteritems():
-            if k == 'search':
-                v = '"' + v + '"'
-            k='--' + k
-            v=v.replace("'",'""')
-            d[k] = v
-        if d:
-            ls=[[{key:val},dict(d)]]
-        else:
-            ls=[[{key:val}]]
-        return ls
-
-# data tag
-class data(YamlTag):
-    yaml_tag = u'!context'
-    def __init__(self, noupdate="0"):
-        self.child_tags = {'    noupdate':noupdate}
-    def __repr__(self):
-        return "!!context"
-
-# Record tag
-class Record(YamlTag):
-    yaml_tag = u'!record'
-class xml_record(XmlTag):
-    tag=Record
-    def _to_yaml(self):
-        child_tags = {}
-        for node in self:
-            if hasattr(node, '_to_yaml'):
-                child_tags.update(node._to_yaml())
-        return Record(attrib=self.attrib, child_tags=child_tags)
-
-# ir_set tag
-class Ir_Set(YamlTag):
-    yaml_tag = u'!ir_set'
-    def __repr__(self):
-        st = self.yaml_tag
-        return st
-class xml_ir_set(XmlTag):
-    tag=Ir_Set
-    def _to_yaml(self):
-        child_tags = {}
-        for node in self:
-            if hasattr(node, '_to_yaml'):
-                child_tags.update(node._to_yaml())
-        return Ir_Set(attrib=self.attrib, child_tags=child_tags)
-
-# workflow tag
-class Workflow(YamlTag):
-    yaml_tag = u'!workflow'
-class xml_workflow(XmlTag):
-    tag=Workflow
-
-# function tag
-class Function(YamlTag):
-    yaml_tag = u'!function'
-class xml_function(XmlTag):
-    tag=Function
-
-# function tag
-class Assert(YamlTag):
-    yaml_tag = u'!assert'
-class xml_assert(XmlTag):
-    tag=Assert
-
-# menuitem tagresult.append(yaml.safe_dump(obj, default_flow_style=False, allow_unicode=True).replace("'",''))
-class MenuItem(YamlTag):
-    yaml_tag = u'!menuitem'
-class xml_menuitem(XmlTag):
-    tag=MenuItem
-
-# act_window tag
-class ActWindow(YamlTag):
-    yaml_tag = u'!act_window'
-class xml_act_window(XmlTag):
-    tag=ActWindow
-
-# report tag
-class Report(YamlTag):
-    yaml_tag = u'!report'
-class xml_report(XmlTag):
-    tag=Report
-
-# deletes tag
-class Delete(YamlTag):
-    yaml_tag = u'!delete'
-class xml_delete(XmlTag):
-    tag=Delete
-
-# python tag
-class Python(YamlTag):
-    yaml_tag = u'!python'
-class xml_python(XmlTag):
-    tag=Python
-
-# context tag
-class Context(YamlTag):
-    yaml_tag = u'!context'
-class xml_context(XmlTag):
-    tag=Context
-
-# url tag
-class Url(YamlTag):
-    yaml_tag = u'!url'
-class xml_url(XmlTag):
-    tag=Url
-
-# delete tag
-class Delete(YamlTag):
-    yaml_tag = u'!delete'
-class xml_delete(XmlTag):
-    tag=Delete
-
-def represent_data(dumper, data):
-        return dumper.represent_mapping(u'tag:yaml.org,2002:map', [('!'+str(data), data.child_tags)])
-
-yaml.SafeDumper.add_representer(Record, represent_data)
-yaml.SafeDumper.add_representer(data, represent_data)
-yaml.SafeDumper.add_representer(Workflow, represent_data)
-yaml.SafeDumper.add_representer(Function, represent_data)
-yaml.SafeDumper.add_representer(Assert, represent_data)
-yaml.SafeDumper.add_representer(MenuItem, represent_data)
-yaml.SafeDumper.add_representer(Ir_Set, represent_data)
-yaml.SafeDumper.add_representer(Python, represent_data)
-yaml.SafeDumper.add_representer(Context, represent_data)
-
-class MyLookup(etree.CustomElementClassLookup):
-    def lookup(self, node_type, document, namespace, name):
-        if node_type=='element':
-            return {
-                'data': xml_data,
-                'record': xml_record,
-                'field': xml_field,
-                'workflow': xml_workflow,
-                'function': xml_function,
-                'value': xml_value,
-                'assert': xml_assert,
-                'test': xml_test,
-                'menuitem': xml_menuitem,
-                'act_window': xml_act_window,
-                'report': xml_report,
-                'delete': xml_delete,
-                'python': xml_python,
-                'context': xml_context,
-                'url': xml_url,
-                'ir_set': xml_ir_set,
-            }.get(name, None)
-        elif node_type=='comment':
-            return None#xml_comment
-        return None
-
-class xml_parse(object):
-    def __init__(self):
-        self.context = {}
-    def parse(self, fname):
-        parser = etree.XMLParser()
-        parser.setElementClassLookup(MyLookup())
-        result = []
-        self.root = etree.XML(file(fname).read(), parser)
-        for data in self.root:
-            if hasattr(data, '_to_yaml'):
-                obj = data._to_yaml()
-                if obj.yaml_tag == '!context':
-                    result.append(yaml.dump(str(obj)).replace("'",'').split('\n')[0])
-                    result.append(yaml.dump(obj.child_tags, default_flow_style=False).replace("'",''))
-                else:
-                    result.append(yaml.safe_dump(obj, default_flow_style=False, allow_unicode=True).replace("'",''))
-            self.context.update(data.attrib)
-            for tag in data:
-                if tag.tag == etree.Comment:
-                    result.append(tag)
-                else:
-                    if hasattr(tag, '_to_yaml'):
-                        obj = tag._to_yaml()
-                        if not obj.child_tags:
-                            result.append(yaml.dump('!'+str(obj), default_flow_style=False, allow_unicode=True, width=999).replace("'",''))
-                        else:
-                            result.append(yaml.safe_dump(obj, default_flow_style=False, allow_unicode=True, width=999).replace('\n:', ':\n').replace("'",''))
-        print "# Experimental OpenERP xml-to-yml conversion! (v%s)"%__VERSION__
-        print "# Please use this as a first conversion/preprocessing step,"
-        print "# not as a production-ready tool!"
-        for record in result:
-            if type(record) != type(''):
-                record=str(record)
-                l= record.split("\n")
-                for line in l:
-                    print '#' + str(line)
-                continue
-            record=str(record)
-            record = record.replace('- --','  ')        #for value tag
-            record = record.replace('!!', '- \n  !')    #for all parent tags
-            record = record.replace('- - -', '    -')   #for many2many fields
-            record = record.replace('? ', '')           #for long expressions
-            record = record.replace('""', "'")          #for string-value under value tag
-            print record
-
-if __name__=='__main__':
-    import optparse
-    import sys
-    parser = optparse.OptionParser(
-        usage = '%s file.xml' % sys.argv[0])
-    (opt, args) = parser.parse_args()
-    if len(args) != 1:
-        parser.error("incorrect number of arguments")
-    fname = sys.argv[1]
-    p = xml_parse()
-    p.parse(fname)
-
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/install/openerp-header.bmp b/install/openerp-header.bmp
deleted file mode 100644 (file)
index 61226b9..0000000
Binary files a/install/openerp-header.bmp and /dev/null differ
diff --git a/install/openerp-header.png b/install/openerp-header.png
deleted file mode 100644 (file)
index 22c1df4..0000000
Binary files a/install/openerp-header.png and /dev/null differ
diff --git a/install/openerp-icon.ico b/install/openerp-icon.ico
deleted file mode 100644 (file)
index 89ed393..0000000
Binary files a/install/openerp-icon.ico and /dev/null differ
diff --git a/install/openerp-icon.png b/install/openerp-icon.png
deleted file mode 100644 (file)
index 9057d12..0000000
Binary files a/install/openerp-icon.png and /dev/null differ
diff --git a/install/openerp-intro.bmp b/install/openerp-intro.bmp
deleted file mode 100644 (file)
index a7e21ab..0000000
Binary files a/install/openerp-intro.bmp and /dev/null differ
diff --git a/install/openerp-server.1 b/install/openerp-server.1
deleted file mode 100644 (file)
index 6529e73..0000000
+++ /dev/null
@@ -1,218 +0,0 @@
-.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.36.
-.TH OPENERP "1" "December 2010" "OpenERP Server 6.0.0-rc1" "User Commands"
-.SH NAME
-OpenERP \- manual page for OpenERP Server 6.0.0-rc1
-.SH SYNOPSIS
-.B openerp-server.py
-[\fIoptions\fR]
-.SH OPTIONS
-.TP
-\fB\-\-version\fR
-show program's version number and exit
-.TP
-\fB\-h\fR, \fB\-\-help\fR
-show this help message and exit
-.TP
-\fB\-c\fR CONFIG, \fB\-\-config\fR=\fICONFIG\fR
-specify alternate config file
-.TP
-\fB\-s\fR, \fB\-\-save\fR
-save configuration to ~/.openerp_serverrc
-.TP
-\fB\-\-pidfile\fR=\fIPIDFILE\fR
-file where the server pid will be stored
-.TP
-\fB\-i\fR INIT, \fB\-\-init\fR=\fIINIT\fR
-init a module (use "all" for all modules)
-.TP
-\fB\-\-without\-demo\fR=\fIWITHOUT_DEMO\fR
-load demo data for a module (use "all" for all
-modules)
-.TP
-\fB\-u\fR UPDATE, \fB\-\-update\fR=\fIUPDATE\fR
-update a module (use "all" for all modules)
-.TP
-\fB\-\-cache\-timeout\fR=\fICACHE_TIMEOUT\fR
-set the timeout for the cache system
-.TP
-\fB\-t\fR TIMEZONE, \fB\-\-timezone\fR=\fITIMEZONE\fR
-specify reference timezone for the server (e.g.
-Europe/Brussels
-.TP
-\fB\-\-stop\-after\-init\fR
-stop the server after it initializes
-.TP
-\fB\-\-debug\fR
-enable debug mode
-.TP
-\fB\-\-assert\-exit\-level\fR=\fIASSERT_EXIT_LEVEL\fR
-specify the level at which a failed assertion will
-stop the server. Accepted values: ['info',
-\&'debug_rpc', 'warn', 'test', 'critical', 'debug_sql',
-\&'error', 'debug', 'debug_rpc_answer', 'notset']
-.IP
-XML\-RPC Configuration:
-.TP
-\fB\-\-xmlrpc\-interface\fR=\fIXMLRPC_INTERFACE\fR
-specify the TCP IP address for the XML\-RPC protocol
-.TP
-\fB\-\-xmlrpc\-port\fR=\fIXMLRPC_PORT\fR
-specify the TCP port for the XML\-RPC protocol
-.TP
-\fB\-\-no\-xmlrpc\fR
-disable the XML\-RPC protocol
-.IP
-XML\-RPC Secure Configuration:
-.TP
-\fB\-\-xmlrpcs\-interface\fR=\fIXMLRPCS_INTERFACE\fR
-specify the TCP IP address for the XML\-RPC Secure
-protocol
-.TP
-\fB\-\-xmlrpcs\-port\fR=\fIXMLRPCS_PORT\fR
-specify the TCP port for the XML\-RPC Secure protocol
-.TP
-\fB\-\-no\-xmlrpcs\fR
-disable the XML\-RPC Secure protocol
-.TP
-\fB\-\-cert\-file\fR=\fISECURE_CERT_FILE\fR
-specify the certificate file for the SSL connection
-.TP
-\fB\-\-pkey\-file\fR=\fISECURE_PKEY_FILE\fR
-specify the private key file for the SSL connection
-.IP
-Static HTTP service:
-.TP
-\fB\-\-static\-http\-enable\fR
-enable static HTTP service for serving plain HTML
-files
-.TP
-\fB\-\-static\-http\-document\-root\fR=\fISTATIC_HTTP_DOCUMENT_ROOT\fR
-specify the directory containing your static HTML
-files (e.g '/var/www/')
-.TP
-\fB\-\-static\-http\-url\-prefix\fR=\fISTATIC_HTTP_URL_PREFIX\fR
-specify the URL root prefix where you want web
-browsers to access your static HTML files (e.g '/')
-.IP
-Testing Configuration:
-.TP
-\fB\-\-test\-file\fR=\fITEST_FILE\fR
-Launch a YML test file.
-.TP
-\fB\-\-test\-report\-directory\fR=\fITEST_REPORT_DIRECTORY\fR
-If set, will save sample of all reports in this
-directory.
-.TP
-\fB\-\-test\-disable\fR
-Disable loading test files.
-.TP
-\fB\-\-test\-commit\fR
-Commit database changes performed by tests.
-.IP
-Logging Configuration:
-.TP
-\fB\-\-logfile\fR=\fILOGFILE\fR
-file where the server log will be stored
-.TP
-\fB\-\-no\-logrotate\fR
-do not rotate the logfile
-.TP
-\fB\-\-syslog\fR
-Send the log to the syslog server
-.TP
-\fB\-\-log\-level\fR=\fILOG_LEVEL\fR
-specify the level of the logging. Accepted values:
-['info', 'debug_rpc', 'warn', 'test', 'critical',
-\&'debug_sql', 'error', 'debug', 'debug_rpc_answer',
-\&'notset']
-.IP
-SMTP Configuration:
-.TP
-\fB\-\-email\-from\fR=\fIEMAIL_FROM\fR
-specify the SMTP email address for sending email
-.TP
-\fB\-\-smtp\fR=\fISMTP_SERVER\fR
-specify the SMTP server for sending email
-.TP
-\fB\-\-smtp\-port\fR=\fISMTP_PORT\fR
-specify the SMTP port
-.TP
-\fB\-\-smtp\-ssl\fR
-specify the SMTP server support SSL or not
-.TP
-\fB\-\-smtp\-user\fR=\fISMTP_USER\fR
-specify the SMTP username for sending email
-.TP
-\fB\-\-smtp\-password\fR=\fISMTP_PASSWORD\fR
-specify the SMTP password for sending email
-.IP
-Database related options:
-.TP
-\fB\-d\fR DB_NAME, \fB\-\-database\fR=\fIDB_NAME\fR
-specify the database name
-.TP
-\fB\-r\fR DB_USER, \fB\-\-db_user\fR=\fIDB_USER\fR
-specify the database user name
-.TP
-\fB\-w\fR DB_PASSWORD, \fB\-\-db_password\fR=\fIDB_PASSWORD\fR
-specify the database password
-.TP
-\fB\-\-pg_path\fR=\fIPG_PATH\fR
-specify the pg executable path
-.TP
-\fB\-\-db_host\fR=\fIDB_HOST\fR
-specify the database host
-.TP
-\fB\-\-db_port\fR=\fIDB_PORT\fR
-specify the database port
-.TP
-\fB\-\-db_maxconn\fR=\fIDB_MAXCONN\fR
-specify the the maximum number of physical connections
-to posgresql
-.TP
-\fB\-P\fR IMPORT_PARTIAL, \fB\-\-import\-partial\fR=\fIIMPORT_PARTIAL\fR
-Use this for big data importation, if it crashes you
-will be able to continue at the current state. Provide
-a filename to store intermediate importation states.
-.IP
-Internationalisation options:
-.IP
-Use these options to translate OpenERP to another language.See i18n
-section of the user manual. Option '\-d' is mandatory.Option '\-l' is
-mandatory in case of importation
-.TP
-\fB\-l\fR LANGUAGE, \fB\-\-language\fR=\fILANGUAGE\fR
-specify the language of the translation file. Use it
-with \fB\-\-i18n\-export\fR or \fB\-\-i18n\-import\fR
-.TP
-\fB\-\-i18n\-export\fR=\fITRANSLATE_OUT\fR
-export all sentences to be translated to a CSV file, a
-PO file or a TGZ archive and exit
-.TP
-\fB\-\-i18n\-import\fR=\fITRANSLATE_IN\fR
-import a CSV or a PO file with translations and exit.
-The '\-l' option is required.
-.TP
-\fB\-\-modules\fR=\fITRANSLATE_MODULES\fR
-specify modules to export. Use in combination with
-\fB\-\-i18n\-export\fR
-.TP
-\fB\-\-addons\-path\fR=\fIADDONS_PATH\fR
-specify an alternative addons path.
-.IP
-Security\-related options:
-.TP
-\fB\-\-no\-database\-list\fR
-disable the ability to return the list of databases
-.SH "SEE ALSO"
-The full documentation for
-.B OpenERP
-is maintained as a Texinfo manual.  If the
-.B info
-and
-.B OpenERP
-programs are properly installed at your site, the command
-.IP
-.B info OpenERP
-.PP
-should give you access to the complete manual.
diff --git a/install/openerp-server.conf b/install/openerp-server.conf
deleted file mode 100644 (file)
index ead261e..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-[options]
-; This is the password that allows database operations:
-; admin_passwd = admin
-db_host = False
-db_port = False
-db_user = openerp
-db_password = False
diff --git a/install/openerp-server.init b/install/openerp-server.init
deleted file mode 100644 (file)
index 41efb5c..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-#!/bin/bash
-# openerp-server        This shell script takes care of starting and stopping
-#                       OpenERP server
-#
-# chkconfig: 345 95 05
-# description: OpenERP server
-#
-# pidfile: /var/run/openerp-server.pid
-# config: /etc/openerp-server.conf
-
-### BEGIN INIT INFO
-# Provides: openerp-server
-# Required-Start: postgresql
-# Required-Stop: postgresql
-# Should-Start: $network harddrake
-# Default-Start: 345
-# Short-Description: Launches the OpenERP server.
-# Description: This startup script launches the OpenERP server.
-### END INIT INFO
-
-# Source function library.
-. /etc/rc.d/init.d/functions
-
-PIDFILE=/var/run/openerp/openerp-server.pid
-LOCKFILE=/var/lock/subsys/openerp-server
-LOGFILE=/var/log/openerp/openerp-server.log
-
-OPTS="--pidfile=$PIDFILE --logfile=$LOGFILE"
-
-prog="openerp-server"
-desc="OpenERP Server Daemon"
-
-# check if the openerp-server conf file is present, then use it
-if [ -f /etc/openerp-server.conf ]; then
-    OPTS="$OPTS -c /etc/openerp-server.conf"
-fi
-
-# Source function library
-if [ -f /etc/init.d/functions ] ; then
-    . /etc/init.d/functions
-elif [ -f /etc/rc.d/init.d/functions ] ; then
-    . /etc/rc.d/init.d/functions
-else
- exit 0
-fi
-
-# check the existence of the openerp-server script
-[ -z "/usr/bin/openerp-server" ] && exit 0
-
-RETVAL=0
-
-start() {
-    if [ -d /etc/openerp/start.d ] ; then
-        echo -n $"Preparing $desc: "
-        run-parts --exit-on-error /etc/openerp/start.d
-        RETVAL=$?
-        echo
-        [ $RETVAL -ne 0 ] && return $RETVAL
-    fi
-    
-    echo -n $"Starting $desc ($prog): "
-    daemon --user openerp --check openerp-server \
-    "/usr/bin/setsid /usr/bin/openerp-server \
-    -c /etc/openerp-server.conf \
-    --pidfile=$PIDFILE \
-    --logfile=$LOGFILE &"
-
-    RETVAL=$?
-    echo
-    [ $RETVAL -eq 0 ] && touch $LOCKFILE
-    return $RETVAL
-}
-
-stop() {
-    echo -n $"Stopping $desc ($prog): "
-    kill -TERM `cat $PIDFILE` > /dev/null 2>&1
-    RETVAL=$?
-    if [ $RETVAL -eq 0 ] ; then
-        rm -f $LOCKFILE
-
-        echo_success
-        echo
-    else
-        echo_failure
-        echo
-    fi
-    if [ -d /etc/openerp/stop.d ] ; then
-        echo -n $"Clearing $desc: "
-        run-parts /etc/openerp/stop.d
-        echo
-    fi
-    return $RETVAL
-}
-
-restart() {
-    stop
-    start
-}    
-
-condrestart() {
-    [ -e $LOCKFILE ] && restart || :
-}
-
-status() { 
-    if [ -f $PIDFILE ] ; then
-        checkpid `cat $PIDFILE`
-        RETVAL=$?
-        if [ $RETVAL -eq 0 ] ; then
-            echo  $"$prog is running..."
-        else
-            echo  $"$prog is stopped"
-        fi
-    else
-        echo  $"$prog is stopped"
-    fi
-    return $RETVAL
-}
-
-case "$1" in
-start)
-    start
-    ;;
-
-stop)
-    stop
-    ;;
-
-restart|reload)
-    restart
-    ;;
-
-condrestart)
-    condrestart
-    ;;
-
-status)
-    status
-    ;;
-
-probe)
-    exit 0
-    ;;
-
-*)
-    echo $"Usage: $0 {start|stop|status|restart|condrestart|reload}"
-    exit 1
-esac
diff --git a/install/openerp-server.logrotate b/install/openerp-server.logrotate
deleted file mode 100644 (file)
index e1f7f80..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-/var/log/openerp/*.log {
-    copytruncate
-    missingok
-    notifempty
-}
diff --git a/install/openerp-slogan.bmp b/install/openerp-slogan.bmp
deleted file mode 100644 (file)
index a3cffd1..0000000
Binary files a/install/openerp-slogan.bmp and /dev/null differ
diff --git a/install/openerp.ico b/install/openerp.ico
deleted file mode 100644 (file)
index cde3e96..0000000
Binary files a/install/openerp.ico and /dev/null differ
diff --git a/install/openerp.png b/install/openerp.png
deleted file mode 100644 (file)
index 20da496..0000000
Binary files a/install/openerp.png and /dev/null differ
diff --git a/install/openerp_serverrc.5 b/install/openerp_serverrc.5
deleted file mode 100644 (file)
index e43f9b5..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-.TH openerp_serverrc 5
-
-.SH NAME
-openerp_serverrc \- configuration file for OpenERP
-
-.SH SYNOPSIS
-[options]
-.br
-$option\ =\ " someValue "
-.br
- ...
-
-.SH DESCRIPTION
-A setup file consists of a section, lead by a "[options]" header,
-.br
-and followed by "option_name = value" entries, with continuations and such in
-.br
-the style of RFC 822.
-
-.SH OPTIONS
-.TP
-.IR verbose
-Enable the debugging mode
-.br
-(default False)
-.TP
-.IR pidfile
-The file where the server pid will be stored
-.br
-(default False)
-.TP
-.IR logfile
-The file where the server log will be stored
-.br
-(default False)
-.TP
-.IR interface
-The IP address on which the server will bind.
-.br
-If empty, it will bind on all interfaces (default empty)
-.TP
-.IR port
-The TCP port on which the server will listen.
-.br
-(default 8069)
-.TP
-.IR debug_mode
-Enable debug mode
-.br
-(default False)
-.TP
-.IR secure
-Launch server over https instead of http.
-.br
-(default False)
-.TP
-.IR smtp_server
-Specify the SMTP server for sending email.
-.br
-(default localhost)
-.TP
-.IR smtp_user
-Specify the SMTP user for sending email.
-.br
-(default False)
-.TP
-.IR smtp_password
-Specify the SMTP password for sending email.
-.br
-(default False)
-.TP
-.IR db_name
-Specify the database name.
-.TP
-.IR db_user
-Specify the database user name.
-.br
-(default None)
-.TP
-.IR db_password
-Specify the database password for db_user.
-.br
-(default None)
-.TP
-.IR pg_path
-Specify the PostgreSQL executable path.
-.br
-(default None)
-.TP
-.IR db_host
-Specify the database host.
-.br
-(default localhost)
-.TP
-.IR db_port
-Specify the database port.
-.br
-(default None)
-.TP
-.IR price_accuracy
-Specify the price accuracy.
-.br
-
-.SH AUTHORS
-
-OpenERP is a product of \fBTiny.be\fR (\fIhttp://www.tiny.be\fR)
-
-.SH SEE ALSO
-openerp-server(1)
-.br
-\fIhttp://www.openerp.com\fR : Open ERP official website
-.br
-\fIhttp://doc.openerp.com\fR : Open ERP documentation
diff --git a/install/setup.nsi b/install/setup.nsi
deleted file mode 100644 (file)
index 859ebdb..0000000
+++ /dev/null
@@ -1,379 +0,0 @@
-#####################################################################################\r
-#\r
-# Copyright (c) 2004-TODAY OpenERP S.A. (http://www.openerp.com) All Rights Reserved.\r
-#\r
-# WARNING: This program as such is intended to be used by professional\r
-# programmers who take the whole responsability of assessing all potential\r
-# consequences resulting from its eventual inadequacies and bugs\r
-# End users who are looking for a ready-to-use solution with commercial\r
-# garantees and support are strongly adviced to contract a Free Software\r
-# Service Company\r
-#\r
-# This program is Free Software; you can redistribute it and/or\r
-# modify it under the terms of the GNU General Public License\r
-# as published by the Free Software Foundation; either version 3\r
-# of the License, or (at your option) any later version.\r
-#\r
-# This program is distributed in the hope that it will be useful,\r
-# but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
-# GNU General Public License for more details.\r
-#\r
-# You should have received a copy of the GNU General Public License\r
-# along with this program; if not, write to the Free Software\r
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r
-#####################################################################################\r
-\r
-!include 'MUI2.nsh'\r
-!include 'FileFunc.nsh'\r
-!include 'LogicLib.nsh'\r
-!include 'Sections.nsh'\r
-\r
-!define PUBLISHER 'OpenERP S.A.'\r
-\r
-!ifndef VERSION\r
-    !define VERSION '0'\r
-!endif\r
-#!define VERSION "${MAJOR_VERSION}.${MINOR_VERSION}.${REVISION_VERSION}"\r
-\r
-!define PRODUCT_NAME "OpenERP Server"\r
-!define DISPLAY_NAME "${PRODUCT_NAME} ${VERSION}"\r
-\r
-!define UNINSTALL_REGISTRY_ROOT HKLM\r
-!define UNINSTALL_REGISTRY_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${DISPLAY_NAME}"\r
-\r
-!define REGISTRY_KEY "Software\${DISPLAY_NAME}"\r
-\r
-!define DEFAULT_POSTGRESQL_HOSTNAME 'localhost'\r
-!define DEFAULT_POSTGRESQL_PORT 5432\r
-!define DEFAULT_POSTGRESQL_USERNAME 'openpg'\r
-!define DEFAULT_POSTGRESQL_PASSWORD 'openpgpwd'\r
-\r
-Name '${DISPLAY_NAME}'\r
-Caption "${PRODUCT_NAME} ${VERSION} Setup"\r
-OutFile "openerp-server-setup-${VERSION}.exe"\r
-SetCompressor /final /solid lzma\r
-SetCompress auto\r
-ShowInstDetails show\r
-\r
-XPStyle on\r
-\r
-InstallDir "$PROGRAMFILES\OpenERP ${VERSION}"\r
-InstallDirRegKey HKCU "${REGISTRY_KEY}" ""\r
-\r
-BrandingText '${PRODUCT_NAME} ${VERSION}'\r
-\r
-RequestExecutionLevel admin\r
-\r
-#VIAddVersionKey "ProductName" "${PRODUCT_NAME}"\r
-#VIAddVersionKey "CompanyName" "${PUBLISHER}"\r
-#VIAddVersionKey "FileDescription" "Installer of ${DISPLAY_NAME}" \r
-#VIAddVersionKey "LegalCopyright" "${PUBLISHER}"\r
-#VIAddVersionKey "LegalTrademark" "OpenERP is a trademark of ${PUBLISHER}"\r
-#VIAddVersionKey "FileVersion" "${MAJOR_VERSION}.${MINOR_VERSION}.${REVISION_VERSION}"\r
-#VIProductVersion "${MAJOR_VERSION}.${MINOR_VERSION}.${REVISION_VERSION}"\r
-\r
-!insertmacro GetParameters\r
-!insertmacro GetOptions\r
-\r
-Var Option_AllInOne\r
-Var HasPostgreSQL\r
-Var cmdLineParams\r
-\r
-Var TextPostgreSQLHostname\r
-Var TextPostgreSQLPort\r
-Var TextPostgreSQLUsername\r
-Var TextPostgreSQLPassword\r
-\r
-Var HWNDPostgreSQLHostname\r
-Var HWNDPostgreSQLPort\r
-Var HWNDPostgreSQLUsername\r
-Var HWNDPostgreSQLPassword\r
-\r
-Var MUI_TEMP\r
-Var STARTMENU_FOLDER\r
-\r
-!define MUI_ABORTWARNING\r
-!define MUI_ICON ".\install\openerp-icon.ico"\r
-\r
-!define MUI_WELCOMEFINISHPAGE_BITMAP ".\install\openerp-intro.bmp"\r
-!define MUI_UNWELCOMEFINISHPAGE_BITMAP ".\install\openerp-intro.bmp"\r
-!define MUI_HEADERIMAGE\r
-!define MUI_HEADERIMAGE_BITMAP ".\install\openerp-slogan.bmp"\r
-!define MUI_HEADERIMAGE_BITMAP_NOSTRETCH\r
-!define MUI_HEADER_TRANSPARENT_TEXT ""\r
-\r
-!insertmacro MUI_PAGE_WELCOME\r
-!insertmacro MUI_PAGE_LICENSE ".\LICENSE"\r
-!define MUI_COMPONENTSPAGE_SMALLDESC\r
-!insertmacro MUI_PAGE_DIRECTORY\r
-Page Custom ShowPostgreSQL LeavePostgreSQL\r
-\r
-!define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKLM" \r
-!define MUI_STARTMENUPAGE_REGISTRY_KEY "${REGISTRY_KEY}"\r
-!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "${DISPLAY_NAME}"\r
-\r
-!insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER\r
-!insertmacro MUI_PAGE_INSTFILES\r
-\r
-!define MUI_FINISHPAGE_NOAUTOCLOSE\r
-!define MUI_FINISHPAGE_LINK $(DESC_FinishPage_Link) \r
-!define MUI_FINISHPAGE_LINK_LOCATION "http://www.openerp.com/contact"\r
-!insertmacro MUI_PAGE_FINISH\r
-\r
-!insertmacro MUI_UNPAGE_WELCOME\r
-!insertmacro MUI_UNPAGE_CONFIRM\r
-!insertmacro MUI_UNPAGE_INSTFILES\r
-!insertmacro MUI_UNPAGE_FINISH\r
-\r
-!insertmacro MUI_LANGUAGE "English"\r
-!insertmacro MUI_LANGUAGE "French"\r
-!insertmacro MUI_RESERVEFILE_LANGDLL\r
-\r
-!macro CreateInternetShortcut FILENAME URL\r
-       WriteINIStr "${FILENAME}.url" "InternetShortcut" "URL" "${URL}"\r
-!macroend\r
-\r
-; English\r
-LangString DESC_FinishPage_Link ${LANG_ENGLISH} "Contact OpenERP for Partnership and/or Support"\r
-LangString WARNING_HostNameIsEmpty ${LANG_ENGLISH} "The hostname for the connection to the PostgreSQL Server is empty"\r
-LangString WARNING_UserNameIsEmpty ${LANG_ENGLISH} "The username for the connection to the PostgreSQL Server is empty"\r
-LangString WARNING_PasswordIsEmpty ${LANG_ENGLISH} "The password for the connection to the PostgreSQL Server is empty"\r
-LangString WARNING_PortIsWrong ${LANG_ENGLISH} "The port for the connexion to the PostgreSQL Server is wrong (default: 5432)"\r
-LangString DESC_PostgreSQLPage ${LANG_ENGLISH} "Configure the information for the PostgreSQL connection"\r
-LangString DESC_PostgreSQL_Hostname ${LANG_ENGLISH} "Hostname"\r
-LangString DESC_PostgreSQL_Port ${LANG_ENGLISH} "Port"\r
-LangString DESC_PostgreSQL_Username ${LANG_ENGLISH} "Username"\r
-LangString DESC_PostgreSQL_Password ${LANG_ENGLISH} "Password"\r
-\r
-\r
-; French\r
-LangString DESC_FinishPage_Link ${LANG_FRENCH} "Contactez OpenERP pour un Partenariat et/ou du Support"\r
-LangString WARNING_HostNameIsEmpty ${LANG_FRENCH} "L'adresse pour la connection au serveur PostgreSQL est vide"\r
-LangString WARNING_UserNameIsEmpty ${LANG_FRENCH} "Le nom d'utilisateur pour la connection au serveur PostgreSQL est vide"\r
-LangString WARNING_PasswordIsEmpty ${LANG_FRENCH} "Le mot de passe pour la connection au serveur PostgreSQL est vide"\r
-LangString WARNING_PortIsWrong ${LANG_FRENCH} "Le port pour la connection au serveur PostgreSQL est erron? (d?faut: 5432)"\r
-LangString DESC_PostgreSQLPage ${LANG_FRENCH} "Configurez les informations de connection pour le serveur PostgreSQL"\r
-LangString DESC_PostgreSQL_Hostname ${LANG_FRENCH} "H?te"\r
-LangString DESC_PostgreSQL_Port ${LANG_FRENCH} "Port"\r
-LangString DESC_PostgreSQL_Username ${LANG_FRENCH} "Utilisateur"\r
-LangString DESC_PostgreSQL_Password ${LANG_FRENCH} "Mot de passe"\r
-\r
-Section -StopService\r
-    nsExec::Exec "net stop openerp-server-7.0"\r
-    sleep 2\r
-SectionEnd\r
-\r
-Section OpenERP_Server SectionOpenERP_Server\r
-    SetOutPath '$INSTDIR\server'\r
-\r
-    File /r "dist\*"\r
-    File /r "win32\wkhtmltopdf\*"\r
-\r
-    SetOutPath "$INSTDIR\service"\r
-    File /r "win32\dist\*"\r
-    File "win32\start.bat"\r
-    File "win32\stop.bat"\r
-\r
-    !insertmacro MUI_STARTMENU_WRITE_BEGIN Application\r
-        ;Create shortcuts\r
-        CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER"\r
-        !insertmacro CreateInternetShortcut "$SMPROGRAMS\$STARTMENU_FOLDER\OpenERP" "http://localhost:8069/"\r
-    !insertmacro MUI_STARTMENU_WRITE_END\r
-\r
-\r
-    FileOpen $9 '$INSTDIR\install.log' w\r
-    FileWrite $9 "INSTDIR $INSTDIR$\r$\n"\r
-    FileWrite $9 "Hostname $TextPostgreSQLHostname$\r$\n"\r
-    FileWrite $9 "Port $TextPostgreSQLPort$\r$\n"\r
-    FileWrite $9 "Username $TextPostgreSQLUsername$\r$\n"\r
-    FileWrite $9 "Password $TextPostgreSQLPassword$\r$\n"\r
-    FileClose $9\r
-\r
-# If there is a previous install of the OpenERP Server, keep the login/password from the config file\r
-    WriteIniStr "$INSTDIR\server\openerp-server.conf" "options" "db_host" $TextPostgreSQLHostname\r
-    WriteIniStr "$INSTDIR\server\openerp-server.conf" "options" "db_user" $TextPostgreSQLUsername\r
-    WriteIniStr "$INSTDIR\server\openerp-server.conf" "options" "db_password" $TextPostgreSQLPassword\r
-    WriteIniStr "$INSTDIR\server\openerp-server.conf" "options" "db_port" $TextPostgreSQLPort\r
-    WriteIniStr "$INSTDIR\server\openerp-server.conf" "options" "pg_path" "$INSTDIR\PostgreSQL\bin"\r
-\r
-    nsExec::Exec '"$INSTDIR\server\openerp-server.exe" --stop-after-init --logfile "$INSTDIR\server\openerp-server.log" -s'\r
-    nsExec::Exec '"$INSTDIR\service\OpenERPServerService.exe" -auto -install'\r
-SectionEnd\r
-\r
-Section -RestartServer\r
-    nsExec::Exec "net start openerp-server-7.0"\r
-    sleep 2\r
-SectionEnd\r
-\r
-Section -Post\r
-    WriteRegExpandStr HKLM "${UNINSTALL_REGISTRY_KEY}" "UninstallString" "$INSTDIR\server\Uninstall.exe"\r
-    WriteRegExpandStr HKLM "${UNINSTALL_REGISTRY_KEY}" "InstallLocation" "$INSTDIR"\r
-    WriteRegStr HKLM       "${UNINSTALL_REGISTRY_KEY}" "DisplayName" "${DISPLAY_NAME}"\r
-    WriteRegStr HKLM       "${UNINSTALL_REGISTRY_KEY}" "DisplayVersion" "${VERSION}"\r
-    WriteRegStr HKLM       "${UNINSTALL_REGISTRY_KEY}" "Publisher" "${PUBLISHER}"\r
-;    WriteRegDWORD HKLM     "${UNINSTALL_REGISTRY_KEY}" "Version" "${VERSION}"\r
-;    WriteRegDWORD HKLM     "${UNINSTALL_REGISTRY_KEY}" "VersionMajor" "${MAJOR_VERSION}.${MINOR_VERSION}"\r
-;    WriteRegDWORD HKLM     "${UNINSTALL_REGISTRY_KEY}" "VersionMinor" "${REVISION_VERSION}"\r
-    WriteRegStr HKLM       "${UNINSTALL_REGISTRY_KEY}" "HelpLink" "support@openerp.com"\r
-    WriteRegStr HKLM       "${UNINSTALL_REGISTRY_KEY}" "HelpTelephone" "+32.81.81.37.00"\r
-    WriteRegStr HKLM       "${UNINSTALL_REGISTRY_KEY}" "URLInfoAbout" "http://www.openerp.com"\r
-    WriteRegStr HKLM       "${UNINSTALL_REGISTRY_KEY}" "Contact" "sales@openerp.com"\r
-    WriteRegDWORD HKLM     "${UNINSTALL_REGISTRY_KEY}" "NoModify" "1"\r
-    WriteRegDWORD HKLM     "${UNINSTALL_REGISTRY_KEY}" "NoRepair" "1"\r
-    WriteUninstaller "$INSTDIR\server\Uninstall.exe"\r
-SectionEnd\r
-\r
-Section "Uninstall"\r
-    ; Stop the NT Service\r
-    nsExec::Exec "net stop openerp-server-7.0"\r
-    sleep 2\r
-\r
-    ; Uninstall the OpenERP Service\r
-    nsExec::Exec '"$INSTDIR\..\service\OpenERPServerService.exe" -remove'\r
-    sleep 2\r
-\r
-    Rmdir /r "$INSTDIR\service"\r
-    Rmdir /r "$INSTDIR\server"\r
-\r
-    !insertmacro MUI_STARTMENU_GETFOLDER Application $MUI_TEMP\r
-\r
-    Delete "$SMPROGRAMS\$MUI_TEMP\OpenERP.url"\r
-    ;\r
-    ;Delete empty start menu parent diretories\r
-    StrCpy $MUI_TEMP "$SMPROGRAMS\$MUI_TEMP"\r
\r
-    startMenuDeleteLoop:\r
-        ClearErrors\r
-        RMDir $MUI_TEMP\r
-        GetFullPathName $MUI_TEMP "$MUI_TEMP\.."\r
-\r
-        IfErrors startMenuDeleteLoopDone\r
-\r
-        StrCmp $MUI_TEMP $SMPROGRAMS startMenuDeleteLoopDone startMenuDeleteLoop\r
-\r
-    startMenuDeleteLoopDone:\r
-\r
-    ; Clean the Registry\r
-    DeleteRegKey HKLM "${UNINSTALL_REGISTRY_KEY}"\r
-SectionEnd\r
-\r
-Function .onInit\r
-    Push $R0\r
-\r
-    ${GetParameters} $cmdLineParams\r
-    ClearErrors\r
-\r
-    Pop $R0\r
-\r
-    StrCpy $Option_AllInOne 0\r
-    StrCpy $HasPostgreSQL 0\r
-\r
-    StrCpy $TextPostgreSQLHostname ${DEFAULT_POSTGRESQL_HOSTNAME}\r
-    StrCpy $TextPostgreSQLPort ${DEFAULT_POSTGRESQL_PORT}\r
-    StrCpy $TextPostgreSQLUsername ${DEFAULT_POSTGRESQL_USERNAME}\r
-    StrCpy $TextPostgreSQLPassword ${DEFAULT_POSTGRESQL_PASSWORD}\r
-\r
-    Push $R0\r
-    ${GetOptions} $cmdLineParams '/allinone' $R0\r
-    IfErrors +2 0\r
-    StrCpy $Option_AllInOne 1\r
-    Pop $R0\r
-\r
-    StrCmp $Option_AllInOne 1 AllInOneMode\r
-    StrCmp $Option_AllInOne 0 NoAllInOneMode\r
-\r
-    AllInOneMode:\r
-        MessageBox MB_OK|MB_ICONINFORMATION "All In One"\r
-\r
-    NoAllInOneMode:\r
-    \r
-    !insertmacro MUI_LANGDLL_DISPLAY\r
-\r
-    ClearErrors\r
-    EnumRegKey $0 HKLM "SOFTWARE\PostgreSQL\Installations" 0\r
-    IfErrors DoInstallPostgreSQL 0\r
-    StrCmp $0 "" DoInstallPostgreSQL\r
-    StrCpy $HasPostgreSQL 1\r
-\r
-    DoInstallPostgreSQL:\r
-FunctionEnd\r
-\r
-Function PostgreSQLOnBack\r
-FunctionEnd\r
-\r
-Function ShowPostgreSQL\r
-    SectionGetFlags ${SectionOpenERP_Server} $0\r
-    IntOp $0 $0 & ${SF_SELECTED}\r
-    IntCmp $0 ${SF_SELECTED} LaunchPostgreSQLConfiguration\r
-    Abort\r
-    LaunchPostgreSQLConfiguration:\r
-\r
-    nsDialogs::Create /NOUNLOAD 1018\r
-    Pop $0\r
-\r
-    ${If} $0 == error\r
-        Abort\r
-    ${EndIf}\r
-\r
-    GetFunctionAddress $0 PostgreSQLOnBack\r
-    nsDialogs::OnBack $0\r
-\r
-    ${NSD_CreateLabel} 0 0 100% 10u $(DESC_PostgreSQLPage)\r
-    Pop $0\r
-\r
-    ${NSD_CreateLabel} 0 45 60u 12u $(DESC_PostgreSQL_Hostname)\r
-    Pop $0\r
-    ${NSD_CreateText} 100 45 150u 12u $TextPostgreSQLHostname\r
-    Pop $HWNDPostgreSQLHostname\r
-\r
-    ${NSD_CreateLabel} 0 75 60u 12u $(DESC_PostgreSQL_Port)\r
-    Pop $0\r
-    ${NSD_CreateNumber} 100 75 150u 12u $TextPostgreSQLPort\r
-    Pop $HWNDPostgreSQLPort\r
-    ${NSD_CreateLabel} 0 105 60u 12u $(DESC_PostgreSQL_Username)\r
-    Pop $0\r
-    ${NSD_CreateText} 100 105 150u 12u $TextPostgreSQLUsername\r
-    Pop $HWNDPostgreSQLUsername\r
-    ${NSD_CreateLabel} 0 135 60u 12u $(DESC_PostgreSQL_Password)\r
-    Pop $0\r
-    ${NSD_CreateText} 100 135 150u 12u $TextPostgreSQLPassword\r
-    Pop $HWNDPostgreSQLPassword\r
-\r
-    nsDialogs::Show\r
-FunctionEnd\r
-\r
-Function LeavePostgreSQL\r
-    # Before to leave the PostgreSQL configuration screen, we check the values\r
-    # from the inputs, to be sure we have the right values\r
-\r
-    ${NSD_GetText} $HWNDPostgreSQLHostname $TextPostgreSQLHostname\r
-    ${NSD_GetText} $HWNDPostgreSQLPort $TextPostgreSQLPort\r
-    ${NSD_GetText} $HWNDPostgreSQLUsername $TextPostgreSQLUsername\r
-    ${NSD_GetText} $HWNDPostgreSQLPassword $TextPostgreSQLPassword\r
-\r
-    StrLen $1 $TextPostgreSQLHostname\r
-    ${If} $1 == 0\r
-        MessageBox MB_ICONEXCLAMATION|MB_OK $(WARNING_HostNameIsEmpty)\r
-        Abort\r
-    ${EndIf}\r
-\r
-    ${If} $TextPostgreSQLPort <= 0\r
-    ${OrIf} $TextPostgreSQLPort > 65535\r
-        MessageBox MB_ICONEXCLAMATION|MB_OK $(WARNING_PortIsWrong)\r
-        Abort\r
-    ${EndIf}\r
-\r
-    StrLen $1 $TextPostgreSQLUsername\r
-    ${If} $1 == 0\r
-        MessageBox MB_ICONEXCLAMATION|MB_OK $(WARNING_UserNameIsEmpty)\r
-        Abort\r
-    ${EndIf}\r
-\r
-    StrLen $1 $TextPostgreSQLPassword\r
-    ${If} $1 == 0\r
-        MessageBox MB_ICONEXCLAMATION|MB_OK $(WARNING_PasswordIsEmpty)\r
-        Abort\r
-    ${EndIf}\r
-FunctionEnd\r
-\r
diff --git a/install/ssl-cert.cfg b/install/ssl-cert.cfg
deleted file mode 100644 (file)
index 08ca7b5..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-# X.509 Certificate options
-#
-# DN options
-
-# The organization of the subject.
-organization = "Some organization."
-
-# The organizational unit of the subject.
-unit = "ERP dept."
-
-# The locality of the subject.
-# locality =
-
-# The state of the certificate owner.
-state = "State"
-
-# The country of the subject. Two letter code.
-country = BE
-
-# The common name of the certificate owner.
-cn = "Some company"
-
-# A user id of the certificate owner.
-#uid = "clauper"
-
-# If the supported DN OIDs are not adequate you can set
-# any OID here.
-# For example set the X.520 Title and the X.520 Pseudonym
-# by using OID and string pairs.
-#dn_oid = "2.5.4.12" "Dr." "2.5.4.65" "jackal"
-
-# This is deprecated and should not be used in new
-# certificates.
-# pkcs9_email = "none@none.org"
-
-# The serial number of the certificate
-serial = 001
-
-# In how many days, counting from today, this certificate will expire.
-expiration_days = 700
-
-# X.509 v3 extensions
-
-# A dnsname in case of a WWW server.
-#dns_name = "www.none.org"
-#dns_name = "www.morethanone.org"
-
-# An IP address in case of a server.
-#ip_address = "192.168.1.1"
-
-# An email in case of a person
-email = "none@none.org"
-
-# An URL that has CRLs (certificate revocation lists)
-# available. Needed in CA certificates.
-#crl_dist_points = "http://www.getcrl.crl/getcrl/"
-
-# Whether this is a CA certificate or not
-#ca
-
-# Whether this certificate will be used for a TLS client
-#tls_www_client
-
-# Whether this certificate will be used for a TLS server
-tls_www_server
-
-# Whether this certificate will be used to sign data (needed
-# in TLS DHE ciphersuites).
-#signing_key
-
-# Whether this certificate will be used to encrypt data (needed
-# in TLS RSA ciphersuites). Note that it is prefered to use different
-# keys for encryption and signing.
-encryption_key
-
-# Whether this key will be used to sign other certificates.
-#cert_signing_key
-
-# Whether this key will be used to sign CRLs.
-#crl_signing_key
-
-# Whether this key will be used to sign code.
-#code_signing_key
-
-# Whether this key will be used to sign OCSP data.
-#ocsp_signing_key
-
-# Whether this key will be used for time stamping.
-#time_stamping_key
diff --git a/install/win32/OpenERPServerService.py b/install/win32/OpenERPServerService.py
deleted file mode 100644 (file)
index 8b3c117..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#
-#    OpenERP, Open Source Management Solution
-#    Copyright (C) 2004-2009 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/>.
-#
-##############################################################################
-
-import win32serviceutil
-import win32service
-import win32api
-import win32process
-import servicemanager
-
-import sys
-import subprocess
-import os
-
-try:
-    import meta
-except ImportError:
-    if hasattr(sys, 'frozen'):
-        raise
-    from setup import generate_files
-    generate_files()
-    import meta     # noqa
-
-class OpenERPServerService(win32serviceutil.ServiceFramework):
-    # required info
-    _svc_name_ = meta.nt_service_name
-    _svc_display_name_ = "%s %s" % (meta.description, meta.serie)
-
-    def __init__(self, args):
-        win32serviceutil.ServiceFramework.__init__(self, args)
-        # a reference to the server's process
-        self.terpprocess = None
-
-    def SvcStop(self):
-        # Before we do anything, tell the SCM we are starting the stop process.
-        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
-        # stop the running OpenERP Server: say it's a normal exit
-        win32api.TerminateProcess(int(self.terpprocess._handle), 0)
-        servicemanager.LogInfoMsg("OpenERP Server stopped correctly")
-
-    def StartTERP(self):
-        # The server finds now its configuration automatically on Windows
-        # We start the ERP Server as an independent process, but we keep its handle
-        # The server's binary must be one directory above the service's binary (when py2exe'd the python libraries shouldn' mix)
-        service_dir = os.path.dirname(sys.argv[0])
-        server_dir = os.path.split(service_dir)[0]
-        server_path = os.path.join(server_dir, 'server', 'openerp-server.exe')
-        self.terpprocess = subprocess.Popen([server_path], cwd=server_dir, creationflags=win32process.CREATE_NO_WINDOW)
-
-    def SvcDoRun(self):
-        self.StartTERP()
-        servicemanager.LogInfoMsg("OpenERP Server up and running")
-        # exit with same exit code as OpenERP process
-        sys.exit(self.terpprocess.wait())
-
-
-def option_handler(opts):
-    # configure the service to auto restart on failures...
-    subprocess.call(['sc', 'failure', meta.nt_service_name, 'reset=', '0', 'actions=', 'restart/0/restart/0/restart/0'])
-
-if __name__ == '__main__':
-    # Do with the service whatever option is passed in the command line
-    win32serviceutil.HandleCommandLine(OpenERPServerService, customOptionHandler=option_handler)
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/install/win32/setup.py b/install/win32/setup.py
deleted file mode 100644 (file)
index b0b36b5..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-# -*- 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/>.
-#
-##############################################################################
-
-import os
-import glob
-from distutils.core import setup
-import py2exe
-
-
-meta = {}
-execfile(os.path.join(os.path.dirname(__file__), '..', 'openerp', 'release.py'), meta)
-
-def generate_files():
-    actions = {
-        'start': ['stop', 'start'],
-        'stop': ['stop'],
-    }
-
-    files = []
-    if os.name == 'nt':
-        files.append(("Microsoft.VC90.CRT", glob.glob('C:\Microsoft.VC90.CRT\*.*')))
-    for action, steps in actions.items():
-        fname = action + '.bat'
-        files.append(fname)
-        with open(fname, 'w') as fp:
-            fp.write('@PATH=%WINDIR%\system32;%WINDIR%;%WINDIR%\System32\Wbem;.\n')
-            for step in steps:
-                fp.write('@net %s %s\n' % (step, meta['nt_service_name']))
-
-    files.append('meta.py')
-    with open('meta.py', 'w') as fp:
-        for m in 'description serie nt_service_name'.split():
-            fp.write("%s = %r\n" % (m, meta[m],))
-
-    return files
-
-excludes = "Tkconstants Tkinter tcl _imagingtk PIL._imagingtk ImageTk PIL.ImageTk FixTk".split()
-
-setup(service      = ["OpenERPServerService"],
-      version      = meta['version'],
-      license      = meta['license'],
-      url          = meta['url'],
-      author       = meta['author'],
-      author_email = meta['author_email'],
-      data_files   = generate_files(),
-      options      = {"py2exe": {
-                        "excludes": excludes,
-                        "skip_archive": 1,
-                        "optimize": 2,
-                     }},
-      )
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/odoo.py b/odoo.py
new file mode 100755 (executable)
index 0000000..cafd13c
--- /dev/null
+++ b/odoo.py
@@ -0,0 +1,159 @@
+#!/usr/bin/env python2
+#----------------------------------------------------------
+# odoo cli
+#
+# To install your odoo development environement type:
+#
+# wget -O- https://raw.githubusercontent.com/odoo/odoo/master/odoo.py | python
+#
+# The setup_* subcommands used to boostrap odoo are defined here inline and may
+# only depends on the python 2.7 stdlib
+#
+# The rest of subcommands are defined in odoo/cli or in <module>/cli by
+# subclassing the Command object
+#
+# https://raw.githubusercontent.com/odoo-dev/odoo/master-odoo-cmd-fme/odoo.py
+#
+#----------------------------------------------------------
+import os
+import re
+import sys
+import subprocess
+
+GIT_HOOKS_PRE_PUSH = """
+#!/usr/bin/env python2
+import re
+import sys
+if re.search('github.com[:/]odoo/odoo.git$', sys.argv[2]):
+    print "Pushing to /odoo/odoo.git is forbidden, please push to odoo-dev, use --no-verify to override"
+    sys.exit(1)
+"""
+
+def printf(f,*l):
+    print "odoo:" + f % l
+
+def run(*l):
+    if isinstance(l[0], list):
+        l = l[0]
+    printf("running %s", " ".join(l))
+    subprocess.check_call(l)
+
+def git_locate():
+    # Locate git dir
+    # TODO add support for os.environ.get('GIT_DIR')
+
+    # check for an odoo child
+    if os.path.isfile('odoo/.git/config'):
+        os.chdir('odoo')
+
+    path = os.getcwd()
+    while path != '/':
+        gitconfig_path = os.path.join(path, '.git/config')
+        if os.path.isfile(gitconfig_path):
+            release_py = os.path.join(path, 'openerp/release.py')
+            if os.path.isfile(release_py):
+                break
+        path = os.path.dirname(path)
+    if path == '/':
+        path = None
+    return path
+
+def cmd_setup_git_init():
+    git_dir = git_locate()
+    if git_dir:
+        printf('git repo found at %s',git_dir)
+    else:
+        run("git", "init", "odoo")
+        os.chdir('odoo')
+        git_dir = os.getcwd()
+    if git_dir:
+        # sane push config for git < 2.0
+        run('git','config','push.default','simple')
+        # merge bzr style
+        run('git','config','merge.ff','no')
+        run('git','config','merge.commit','no')
+        # push hooks
+        pre_push_path = os.path.join(git_dir, '.git/hooks/pre-push')
+        open(pre_push_path,'w').write(GIT_HOOKS_PRE_PUSH.strip())
+        os.chmod(pre_push_path, 0755)
+        # setup odoo remote
+        run('git','config','remote.odoo.url','https://github.com/odoo/odoo.git')
+        run('git','config','remote.odoo.pushurl','git@github.com:odoo/odoo.git')
+        run('git','config','--add','remote.odoo.fetch','dummy')
+        run('git','config','--unset-all','remote.odoo.fetch')
+        run('git','config','--add','remote.odoo.fetch','+refs/heads/*:refs/remotes/odoo/heads/*')
+        # setup odoo-dev remote
+        run('git','config','remote.odoo-dev.url','https://github.com/odoo-dev/odoo.git')
+        run('git','config','remote.odoo-dev.pushurl','git@github.com:odoo-dev/odoo.git')
+        run('git','remote','update')
+        # setup master branch
+        run('git','config','branch.master.remote','odoo')
+        run('git','config','branch.master.merge','refs/heads/master')
+        run('git','checkout','master')
+    else:
+        printf('no git repo found')
+
+def cmd_setup_git_dev():
+    git_dir = git_locate()
+    if git_dir:
+        # setup odoo-dev remote
+        run('git','config','--add','remote.odoo-dev.fetch','dummy')
+        run('git','config','--unset-all','remote.odoo-dev.fetch')
+        run('git','config','--add','remote.odoo-dev.fetch','+refs/heads/*:refs/remotes/odoo-dev/heads/*')
+        run('git','config','--add','remote.odoo-dev.fetch','+refs/pull/*:refs/remotes/odoo-dev/pull/*')
+        run('git','remote','update')
+
+def cmd_setup_git_review():
+    git_dir = git_locate()
+    if git_dir:
+        # setup odoo-dev remote
+        run('git','config','--add','remote.odoo.fetch','dummy')
+        run('git','config','--unset-all','remote.odoo.fetch')
+        run('git','config','--add','remote.odoo.fetch','+refs/heads/*:refs/remotes/odoo/heads/*')
+        run('git','config','--add','remote.odoo.fetch','+refs/tags/*:refs/remotes/odoo/tags/*')
+        run('git','config','--add','remote.odoo.fetch','+refs/pull/*:refs/remotes/odoo/pull/*')
+
+def setup_deps_debian(git_dir):
+    debian_control_path = os.path.join(git_dir, 'setup/debian/control')
+    debian_control = open(debian_control_path).read()
+    debs = re.findall('python-[0-9a-z]+',debian_control)
+    proc = subprocess.Popen(['sudo','apt-get','install'] + debs, stdin=open('/dev/tty'))
+    proc.communicate()
+
+def cmd_setup_deps():
+    git_dir = git_locate()
+    if git_dir:
+        if os.path.isfile('/etc/debian_version'):
+            setup_deps_debian(git_dir)
+
+def setup_pg_debian(git_dir):
+    cmd = ['sudo','su','-','postgres','-c','createuser -s %s' % os.environ['USER']]
+    subprocess.call(cmd)
+
+def cmd_setup_pg():
+    git_dir = git_locate()
+    if git_dir:
+        if os.path.isfile('/etc/debian_version'):
+            setup_pg_debian(git_dir)
+
+def cmd_setup():
+    cmd_setup_git_init()
+    cmd_setup_deps()
+    cmd_setup_pg()
+
+def main():
+    # regsitry of commands
+    g = globals()
+    cmds = dict([(i[4:],g[i]) for i in g if i.startswith('cmd_')])
+    # if curl URL | python2 then use command setup
+    if len(sys.argv) == 1 and __file__ == '<stdin>':
+        cmd_setup()
+    elif len(sys.argv) == 2 and sys.argv[1] in cmds:
+        cmds[sys.argv[1]]()
+    else:
+        import openerp
+        openerp.cli.main()
+
+if __name__ == "__main__":
+    main()
+
diff --git a/oe b/oe
deleted file mode 100755 (executable)
index 03c037b..0000000
--- a/oe
+++ /dev/null
@@ -1,8 +0,0 @@
-#! /usr/bin/env python2
-
-if __name__ == '__main__':
-    import sys
-    if len(sys.argv) > 1 and sys.argv[1] == 'run-tests':
-        sys.exit(0)
-    import openerpcommand.main
-    openerpcommand.main.run()
index 8f1c5c6..1651b0c 100644 (file)
Binary files a/openerp/addons/base/static/img/main_partner-image.png and b/openerp/addons/base/static/img/main_partner-image.png differ
diff --git a/openerpcommand/__init__.py b/openerpcommand/__init__.py
deleted file mode 100644 (file)
index b713191..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-import argparse
-import textwrap
-
-from .call import Call
-from .client import Open, Show, ConsumeNothing, ConsumeMemory, LeakMemory, ConsumeCPU
-from .benchmarks import Bench, BenchRead, BenchFieldsViewGet, BenchDummy, BenchLogin
-from .bench_sale_mrp import BenchSaleMrp
-from . import common
-
-from . import conf # Not really server-side (in the `for` below).
-from . import cron
-from . import drop
-from . import initialize
-from . import model
-from . import module
-from . import read
-from . import scaffold
-from . import uninstall
-from . import update
-from . import web
-from . import grunt_tests
-
-command_list_server = (conf, cron, drop, initialize, model, module, read,
-                       scaffold, uninstall, update, web, grunt_tests, )
-
-command_list_client = (Call, Open, Show, ConsumeNothing, ConsumeMemory,
-                       LeakMemory, ConsumeCPU, Bench, BenchRead,
-                       BenchFieldsViewGet, BenchDummy, BenchLogin,
-                       BenchSaleMrp, )
-
-def main_parser():
-    parser = argparse.ArgumentParser(
-        usage=argparse.SUPPRESS,
-        description=textwrap.fill(textwrap.dedent("""\
-                    OpenERP Command provides a set of command-line tools around
-                    the OpenERP framework: openobject-server. All the tools are
-                    sub-commands of a single oe executable.""")),
-        epilog="""Use <command> --help to get information about the command.""",
-        formatter_class=argparse.RawDescriptionHelpFormatter,
-    )
-    description = []
-    for x in command_list_server:
-        description.append(x.__name__[len(__package__)+1:])
-        if x.__doc__:
-            description.extend([
-                ":\n",
-                textwrap.fill(str(x.__doc__).strip(),
-                              subsequent_indent='  ',
-                              initial_indent='  '),
-            ])
-        description.append("\n\n")
-    subparsers = parser.add_subparsers(
-        title="Available commands",
-        help=argparse.SUPPRESS,
-        description="".join(description[:-1]),
-    )
-    # Server-side commands.
-    for x in command_list_server:
-        x.add_parser(subparsers)
-    # Client-side commands. TODO one per .py file.
-    for x in command_list_client:
-        x(subparsers)
-    return parser
diff --git a/openerpcommand/addons/bench_sale_mrp/__init__.py b/openerpcommand/addons/bench_sale_mrp/__init__.py
deleted file mode 100644 (file)
index 99ae05e..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-# -*- coding: utf-8 -*-
-# Nothing here, the module provides only data.
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/openerpcommand/addons/bench_sale_mrp/__openerp__.py b/openerpcommand/addons/bench_sale_mrp/__openerp__.py
deleted file mode 100644 (file)
index 3d87819..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-# -*- coding: utf-8 -*-
-{
-    'name': 'bench_sale_mrp',
-    'version': '0.1',
-    'category': 'Benchmarks',
-    'description': """Prepare some data to run a benchmark.""",
-    'author': 'OpenERP SA',
-    'maintainer': 'OpenERP SA',
-    'website': 'http://www.openerp.com',
-    'depends': ['base', 'sale_mrp'],
-    'data': ['data.yml'],
-    'installable': True,
-    'auto_install': False,
-}
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/openerpcommand/addons/bench_sale_mrp/data.yml b/openerpcommand/addons/bench_sale_mrp/data.yml
deleted file mode 100644 (file)
index 419492e..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
--
-  This is a subset of `sale_mrp/test/sale_mrp.yml`.
--
-  I define a product category `Mobile Products Sellable`.
--
-  !record {model: product.category, id: my_product_category_0}:
-    name: Mobile Products Sellable
--
-  I define a product `Slider Mobile`
--
-  !record {model: product.product, id:  my_slider_mobile_0}:
-    categ_id: my_product_category_0
-    cost_method: standard
-    list_price: 200.0
-    mes_type: fixed
-    name: Slider Mobile
-    procure_method: make_to_order
-    seller_delay: '1'
-    seller_ids:
-      - delay: 1
-        name: base.res_partner_agrolait
-        min_qty: 2.0
-        qty: 5.0
-    standard_price: 189.0
-    supply_method: produce
-    type: product
-    uom_id: product.product_uom_unit
-    uom_po_id: product.product_uom_unit
--
-  I create a Bill of Material for the `Slider Mobile` product.
--
-  !record {model: mrp.bom, id: mrp_bom_slidermobile0}:
-    company_id: base.main_company
-    name: Slider Mobile
-    product_efficiency: 1.0
-    product_id: my_slider_mobile_0
-    product_qty: 1.0
-    product_uom: product.product_uom_unit
-    product_uos_qty: 0.0
-    sequence: 0.0
-    type: normal
diff --git a/openerpcommand/bench_sale_mrp.py b/openerpcommand/bench_sale_mrp.py
deleted file mode 100644 (file)
index 60e5303..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-"""
-Benchmark based on the `sale_mrp` addons (in `sale_mrp/test/sale_mrp.yml`).
-"""
-
-import time
-
-from .benchmarks import Bench
-
-class BenchSaleMrp(Bench):
-    """\
-    Similar to `sale_mrp/test/sale_mrp.yml`.
-
-    This benchmarks the OpenERP server `sale_mrp` module by creating and
-    confirming a sale order. As it creates data in the server, it is necessary
-    to ensure unique names for the newly created data. You can use the --seed
-    argument to give a lower bound to those names. (The number of generated
-    names is --jobs * --samples.)
-    """
-
-    command_name = 'bench-sale-mrp'
-    bench_name = '`sale_mrp/test/sale_mrp.yml`'
-
-    def measure_once(self, i):
-        if self.worker >= 0:
-            i = int(self.args.seed) + i + (self.worker * int(self.args.samples))
-        else:
-            i = int(self.args.seed) + i
-
-        # Resolve a few external-ids (this has little impact on the running
-        # time of the whole method).
-        product_uom_unit = self.execute('ir.model.data', 'get_object_reference', 'product', 'product_uom_unit')[1]
-        my_slider_mobile_0 = self.execute('ir.model.data', 'get_object_reference', 'bench_sale_mrp', 'my_slider_mobile_0')[1]
-        res_partner_4 = self.execute('ir.model.data', 'get_object_reference', 'base', 'res_partner_4')[1]
-        res_partner_address_7 = self.execute('ir.model.data', 'get_object_reference', 'base', 'res_partner_address_7')[1]
-        list0 = self.execute('ir.model.data', 'get_object_reference', 'product', 'list0')[1]
-        shop = self.execute('ir.model.data', 'get_object_reference', 'sale', 'shop')[1]
-
-        # Create a sale order for the product `Slider Mobile`.
-        data = {
-            'client_order_ref': 'ref_xxx_' + str(i).rjust(6, '0'),
-            'date_order': time.strftime('%Y-%m-%d'),
-            'invoice_quantity': 'order',
-            'name': 'sale_order_ref_xxx_' + str(i).rjust(6, '0'),
-            'order_line': [(0, 0, {
-                'name': 'Slider Mobile',
-                'price_unit': 2,
-                'product_uom': product_uom_unit,
-                'product_uom_qty': 5.0,
-                'state': 'draft',
-                'delay': 7.0,
-                'product_id': my_slider_mobile_0,
-                'product_uos_qty': 5,
-                'type': 'make_to_order',
-            })],
-            'order_policy': 'manual',
-            'partner_id': res_partner_4,
-            'partner_invoice_id': res_partner_address_7,
-            'partner_order_id': res_partner_address_7,
-            'partner_shipping_id': res_partner_address_7,
-            'picking_policy': 'direct',
-            'pricelist_id': list0,
-            'shop_id': shop,
-        }
-        sale_order_id = self.execute('sale.order', 'create', data, {})
-
-        # Confirm the sale order.
-        self.object_proxy.exec_workflow(self.database, self.uid, self.password, 'sale.order', 'order_confirm', sale_order_id, {})
-
diff --git a/openerpcommand/benchmarks.py b/openerpcommand/benchmarks.py
deleted file mode 100644 (file)
index 401ce07..0000000
+++ /dev/null
@@ -1,166 +0,0 @@
-"""
-Define a base class for client-side benchmarking.
-"""
-import hashlib
-import multiprocessing
-import sys
-import time
-
-from .client import Client
-
-class Bench(Client):
-    """
-    Base class for concurrent benchmarks. The measure_once() method must be
-    overriden.
-
-    Each sub-benchmark will be run in its own process then a report is done
-    with all the results (shared with the main process using a
-    `multiprocessing.Array`).
-    """
-
-    def __init__(self, subparsers=None):
-        super(Bench, self).__init__(subparsers)
-        self.parser.add_argument('-n', '--samples', metavar='INT',
-            default=100, help='number of measurements to take')
-            # TODO if -n <int>s is given (instead of -n <int>), run the
-            # benchmark for <int> seconds and return the number of iterations.
-        self.parser.add_argument('-o', '--output', metavar='PATH',
-            required=True, help='path to save the generated report')
-        self.parser.add_argument('--append', action='store_true',
-            default=False, help='append the report to an existing file')
-        self.parser.add_argument('-j', '--jobs', metavar='JOBS',
-            default=1, help='number of concurrent workers')
-        self.parser.add_argument('--seed', metavar='SEED',
-            default=0, help='a value to ensure different runs can create unique data')
-        self.worker = -1
-
-    def work(self, iarr=None):
-        if iarr:
-            # If an array is given, it means we are a worker process...
-            self.work_slave(iarr)
-        else:
-            # ... else we are the main process and we will spawn workers,
-            # passing them an array.
-            self.work_master()
-
-    def work_master(self):
-        N = int(self.args.samples)
-        self.arrs = [(i, multiprocessing.Array('f', range(N)))
-            for i in xrange(int(self.args.jobs))]
-        ps = [multiprocessing.Process(target=self.run, args=(arr,))
-            for arr in self.arrs]
-        [p.start() for p in ps]
-        [p.join() for p in ps]
-
-        self.report_html()
-
-    def work_slave(self, iarr):
-        j, arr = iarr
-        self.worker = j
-        N = int(self.args.samples)
-        total_t0 = time.time()
-        for i in xrange(N):
-            t0 = time.time()
-            self.measure_once(i)
-            t1 = time.time()
-            arr[i] = t1 - t0
-            print >> sys.stdout, '\r%s' % ('|' * (i * 60 / N)),
-            print >> sys.stdout, '%s %s%%' % \
-                (' ' * (60 - (i * 60 / N)), int(float(i+1)/N*100)),
-            sys.stdout.flush()
-        total_t1 = time.time()
-        print '\nDone in %ss.' % (total_t1 - total_t0)
-
-    def report_html(self):
-        series = []
-        for arr in self.arrs:
-            serie = """{
-                data: %s,
-                points: { show: true }
-            }""" % ([[x, i] for i, x in enumerate(arr)],)
-            series.append(serie)
-        chart_id = hashlib.md5(" ".join(sys.argv)).hexdigest()
-        HEADER = """<!doctype html>
-<title>Benchmarks</title>
-<meta charset=utf-8>
-<script type="text/javascript" src="js/jquery.min.js"></script>
-<script type="text/javascript" src="js/jquery.flot.js"></script>
-"""
-
-        CONTENT = """<h1>%s</h1>
-%s
-<div id='chart_%s' style='width:400px;height:300px;'>...</div>
-<script type="text/javascript">
-$.plot($("#chart_%s"), [%s],
-  {yaxis: { ticks: false }});
-</script>""" % (self.bench_name, ' '.join(sys.argv), chart_id, chart_id,
-        ','.join(series))
-        if self.args.append:
-            with open(self.args.output, 'a') as f:
-                f.write(CONTENT,)
-        else:
-            with open(self.args.output, 'w') as f:
-                f.write(HEADER + CONTENT,)
-
-    def measure_once(self, i):
-        """
-        The `measure_once` method is called --jobs times. A `i` argument is
-        supplied to allow to create unique values for each execution (e.g. to
-        supply fresh identifiers to a `create` method.
-        """
-        pass
-
-class BenchRead(Bench):
-    """Read a record repeatedly."""
-
-    command_name = 'bench-read'
-    bench_name = 'res.users.read(1)'
-
-    def __init__(self, subparsers=None):
-        super(BenchRead, self).__init__(subparsers)
-        self.parser.add_argument('-m', '--model', metavar='MODEL',
-            required=True, help='the model')
-        self.parser.add_argument('-i', '--id', metavar='RECORDID',
-            required=True, help='the record id')
-
-    def measure_once(self, i):
-        self.execute(self.args.model, 'read', [self.args.id], [])
-
-class BenchFieldsViewGet(Bench):
-    """Read a record's fields and view architecture repeatedly."""
-
-    command_name = 'bench-view'
-    bench_name = 'res.users.fields_view_get(1)'
-
-    def __init__(self, subparsers=None):
-        super(BenchFieldsViewGet, self).__init__(subparsers)
-        self.parser.add_argument('-m', '--model', metavar='MODEL',
-            required=True, help='the model')
-        self.parser.add_argument('-i', '--id', metavar='RECORDID',
-            required=True, help='the record id')
-
-    def measure_once(self, i):
-        self.execute(self.args.model, 'fields_view_get', self.args.id)
-
-class BenchDummy(Bench):
-    """Dummy (call test.limits.model.consume_nothing())."""
-
-    command_name = 'bench-dummy'
-    bench_name = 'test.limits.model.consume_nothing()'
-
-    def __init__(self, subparsers=None):
-        super(BenchDummy, self).__init__(subparsers)
-        self.parser.add_argument('-a', '--args', metavar='ARGS',
-            default='', help='some arguments to serialize')
-
-    def measure_once(self, i):
-        self.execute('test.limits.model', 'consume_nothing')
-
-class BenchLogin(Bench):
-    """Login (update res_users.date)."""
-
-    command_name = 'bench-login'
-    bench_name = 'res.users.login(1)'
-
-    def measure_once(self, i):
-        self.common_proxy.login(self.database, self.user, self.password)
diff --git a/openerpcommand/call.py b/openerpcommand/call.py
deleted file mode 100644 (file)
index b4f9e95..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-"""
-Call an arbitrary model's method.
-"""
-import ast
-import os
-import pprint
-import sys
-import time
-import xmlrpclib
-
-import client
-
-class Call(client.Client):
-    """\
-    Call an arbitrary model's method.
-
-    Example:
-      > oe call res.users.read '[1, 3]' '[]' -u 1 -p admin
-    """
-    # TODO The above docstring is completely borked in the
-    # --help message.
-
-    command_name = 'call'
-
-    def __init__(self, subparsers=None):
-        super(Call, self).__init__(subparsers)
-        self.parser.add_argument('call', metavar='MODEL.METHOD',
-            help='the model and the method to call, using the '
-            '<model>.<method> format.')
-        self.parser.add_argument('args', metavar='ARGUMENT',
-            nargs='+',
-            help='the argument for the method call, must be '
-            '`ast.literal_eval` compatible. Can be repeated.')
-
-    def work(self):
-        try:
-            model, method = self.args.call.rsplit('.', 1)
-        except:
-            print "Invalid syntax `%s` must have the form <model>.<method>."
-            sys.exit(1)
-        args = tuple(map(ast.literal_eval, self.args.args)) if self.args.args else ()
-        x = self.execute(model, method, *args)
-        pprint.pprint(x, indent=4)
-
diff --git a/openerpcommand/client.py b/openerpcommand/client.py
deleted file mode 100644 (file)
index 87586b6..0000000
+++ /dev/null
@@ -1,137 +0,0 @@
-"""
-Define a few common arguments for client-side command-line tools.
-"""
-import os
-import sys
-import time
-import xmlrpclib
-
-import common
-
-class Client(common.Command):
-    """
-    Base class for XML-RPC command-line clients. It must be inherited and the
-    work() method overriden.
-    """
-
-    def __init__(self, subparsers=None):
-        super(Client, self).__init__(subparsers)
-        required_or_default = common.required_or_default
-        self.parser.add_argument('-H', '--host', metavar='HOST',
-            **required_or_default('HOST', 'the server host'))
-        self.parser.add_argument('-P', '--port', metavar='PORT',
-            **required_or_default('PORT', 'the server port'))
-
-    def execute(self, *args):
-        return self.object_proxy.execute(self.database, self.uid, self.password, *args)
-
-    def initialize(self):
-        self.host = self.args.host
-        self.port = int(self.args.port)
-        self.database = self.args.database
-        self.user = self.args.user
-        self.password = self.args.password
-
-        self.url = 'http://%s:%d/xmlrpc/' % (self.host, self.port)
-        self.common_proxy = xmlrpclib.ServerProxy(self.url + 'common')
-        self.object_proxy = xmlrpclib.ServerProxy(self.url + 'object')
-
-        try:
-            self.uid = int(self.user)
-        except ValueError, e:
-            self.uid = self.common_proxy.login(self.database, self.user, self.password)
-
-    def run(self, *args):
-        self.initialize()
-        self.work(*args)
-
-    def work(self, *args):
-        pass
-
-class Open(Client):
-    """Get the web client's URL to view a specific model."""
-
-    command_name = 'open'
-
-    def __init__(self, subparsers=None):
-        super(Open, self).__init__(subparsers)
-        self.parser.add_argument('-m', '--model', metavar='MODEL',
-            required=True, help='the view type')
-        self.parser.add_argument('-v', '--view-mode', metavar='VIEWMODE',
-            default='tree', help='the view mode')
-
-    def work(self):
-        ids = self.execute('ir.actions.act_window', 'search', [
-            ('res_model', '=', self.args.model),
-            ('view_mode', 'like', self.args.view_mode),
-            ])
-        xs = self.execute('ir.actions.act_window', 'read', ids, [])
-        for x in xs:
-            print x['id'], x['name']
-            d = {}
-            d['host'] = self.host
-            d['port'] = self.port
-            d['action_id'] = x['id']
-            print "  http://%(host)s:%(port)s/web/webclient/home#action_id=%(action_id)s" % d
-
-class Show(Client):
-    """Display a record."""
-
-    command_name = 'show'
-
-    def __init__(self, subparsers=None):
-        super(Show, self).__init__(subparsers)
-        self.parser.add_argument('-m', '--model', metavar='MODEL',
-            required=True, help='the model')
-        self.parser.add_argument('-i', '--id', metavar='RECORDID',
-            required=True, help='the record id')
-
-    def work(self):
-        xs = self.execute(self.args.model, 'read', [self.args.id], [])
-        if xs:
-            x = xs[0]
-            print x['name']
-        else:
-            print "Record not found."
-
-class ConsumeNothing(Client):
-    """Call test.limits.model.consume_nothing()."""
-
-    command_name = 'consume-nothing'
-
-    def work(self):
-        xs = self.execute('test.limits.model', 'consume_nothing')
-
-class ConsumeMemory(Client):
-    """Call test.limits.model.consume_memory()."""
-
-    command_name = 'consume-memory'
-
-    def __init__(self, subparsers=None):
-        super(ConsumeMemory, self).__init__(subparsers)
-        self.parser.add_argument('--size', metavar='SIZE',
-            required=True, help='size of the list to allocate')
-
-    def work(self):
-        xs = self.execute('test.limits.model', 'consume_memory', int(self.args.size))
-
-class LeakMemory(ConsumeMemory):
-    """Call test.limits.model.leak_memory()."""
-
-    command_name = 'leak-memory'
-
-    def work(self):
-        xs = self.execute('test.limits.model', 'leak_memory', int(self.args.size))
-
-class ConsumeCPU(Client):
-    """Call test.limits.model.consume_cpu_time()."""
-
-    command_name = 'consume-cpu'
-
-    def __init__(self, subparsers=None):
-        super(ConsumeCPU, self).__init__(subparsers)
-        self.parser.add_argument('--seconds', metavar='INT',
-            required=True, help='how much CPU time to consume')
-
-    def work(self):
-        xs = self.execute('test.limits.model', 'consume_cpu_time', int(self.args.seconds))
diff --git a/openerpcommand/common.py b/openerpcommand/common.py
deleted file mode 100644 (file)
index 7572bb4..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-"""
-Define a few common arguments for server-side command-line tools.
-"""
-import argparse
-import os
-try:
-    from setproctitle import setproctitle
-except ImportError:
-    setproctitle = lambda x: None
-import sys
-
-def add_addons_argument(parser):
-    """
-    Add a common --addons argument to a parser.
-    """
-    parser.add_argument('--addons', metavar='ADDONS',
-        **required_or_default('ADDONS',
-                              'colon-separated list of paths to addons'))
-def set_addons(args):
-    """
-    Turn args.addons into a list instead of a column-separated strings.
-    Set openerp.toools.config accordingly.
-    """
-    import openerp.tools.config
-    config = openerp.tools.config
-
-    assert hasattr(args, 'addons')
-    if args.addons:
-        args.addons = args.addons.split(':')
-    else:
-        args.addons = []
-
-    config['addons_path'] = ','.join(args.addons)
-
-def get_addons_from_paths(paths, exclude):
-    """
-    Build a list of available modules from a list of addons paths.
-    """
-    exclude = exclude or []
-    module_names = []
-    for p in paths:
-        if os.path.exists(p):
-            names = [n for n in os.listdir(p) if os.path.isfile(os.path.join(p, n, '__openerp__.py')) and not n.startswith('.') and n not in exclude]
-            names = filter(lambda a: os.path.isdir(os.path.join(p, a)), names)
-            names = filter(lambda a: os.path.exists(os.path.join(p, a, '__openerp__.py')), names)
-            module_names.extend(names)
-        else:
-            print "The addons path `%s` doesn't exist." % p
-            sys.exit(1)
-    return module_names
-
-def required_or_default(name, h):
-    """
-    Helper to define `argparse` arguments. If the name is the environment,
-    the argument is optional and draw its value from the environment if not
-    supplied on the command-line. If it is not in the environment, make it
-    a mandatory argument.
-    """
-    if os.environ.get('OPENERP_' + name.upper()):
-        d = {'default': os.environ['OPENERP_' + name.upper()]}
-    else:
-        d = {'required': True}
-    d['help'] = h + '. The environment variable OPENERP_' + \
-                name.upper() + ' can be used instead.'
-    return d
-
-class Command(object):
-    """
-    Base class to create command-line tools. It must be inherited and the
-    run() method overriden.
-    """
-
-    command_name = 'stand-alone'
-
-    def __init__(self, subparsers=None):
-        if subparsers:
-            self.parser = parser = subparsers.add_parser(self.command_name,
-               description=self.__class__.__doc__)
-        else:
-            self.parser = parser = argparse.ArgumentParser(
-                description=self.__class__.__doc__)
-
-        parser.add_argument('-d', '--database', metavar='DATABASE',
-            **required_or_default('DATABASE', 'the database to connect to'))
-        parser.add_argument('-u', '--user', metavar='USER',
-            **required_or_default('USER', 'the user login or ID. When using '
-            'RPC, providing an ID avoid the login() step'))
-        parser.add_argument('-p', '--password', metavar='PASSWORD',
-            **required_or_default('PASSWORD', 'the user password')) # TODO read it from the command line or from file.
-
-        parser.set_defaults(run=self.run_with_args)
-
-    def run_with_args(self, args):
-        self.args = args
-        self.run()
-
-    def run(self):
-        print 'Stub Command.run().'
-
-    @classmethod
-    def stand_alone(cls):
-        """
-        A single Command object is a complete command-line program. See
-        `openerp-command/stand-alone` for an example.
-        """
-        command = cls()
-        args = command.parser.parse_args()
-        args.run(args)
diff --git a/openerpcommand/conf.py b/openerpcommand/conf.py
deleted file mode 100644 (file)
index 98237ea..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-"""
-Display the currently used configuration. The configuration for any
-sub-command is normally given by options. But some options can be specified
-using environment variables. This sub-command shows those variables.
-A `set` sub-command should be provided when the configuration is in a real
-configuration file instead of environment variables.
-"""
-import os
-import sys
-import textwrap
-
-def run(args):
-    for x in ('database', 'addons', 'host', 'port'):
-        x_ = ('openerp_' + x).upper()
-        if x_ in os.environ:
-            print '%s: %s' % (x, os.environ[x_])
-        else:
-            print '%s: <not set>' % (x, )
-    os.environ['OPENERP_DATABASE'] = 'yeah'
-
-def add_parser(subparsers):
-    parser = subparsers.add_parser('conf',
-        description='Display the currently used configuration.')
-
-    parser.set_defaults(run=run)
diff --git a/openerpcommand/cron.py b/openerpcommand/cron.py
deleted file mode 100644 (file)
index abfe127..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-"""
-Run an OpenERP cron process.
-"""
-
-import os
-
-import common
-
-def run(args):
-    import openerp
-    import openerp.cli.server
-    import openerp.tools.config
-    import openerp.service.cron
-    config = openerp.tools.config
-
-    os.environ["TZ"] = "UTC"
-    common.set_addons(args)
-    args.database = args.database or []
-
-    config['log_handler'] = [':WARNING', 'openerp.addons.base.ir.ir_cron:DEBUG']
-
-    openerp.multi_process = True
-    common.setproctitle('openerp-cron [%s]' % ', '.join(args.database))
-
-    openerp.cli.server.check_root_user()
-    openerp.netsvc.init_logger()
-    #openerp.cli.server.report_configuration()
-    openerp.cli.server.setup_signal_handlers(openerp.cli.server.signal_handler)
-    import openerp.addons.base
-    if args.database:
-        for db in args.database:
-            openerp.cli.server.preload_registry(db)
-        openerp.service.cron.start_service()
-        openerp.cli.server.quit_on_signals()
-    else:
-        print "No database given."
-
-
-def add_parser(subparsers):
-    parser = subparsers.add_parser('cron',
-        description='Run an OpenERP cron process.')
-    common.add_addons_argument(parser)
-    parser.add_argument('--database', action='append',
-        help='Database for which cron jobs are processed (can be repeated)')
-
-    parser.set_defaults(run=run)
diff --git a/openerpcommand/drop.py b/openerpcommand/drop.py
deleted file mode 100644 (file)
index b644427..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-"""
-Drop a database.
-"""
-
-import common
-
-# TODO turn template1 in a parameter
-# This should be exposed from openerp (currently in
-# openerp/service/web_services.py).
-def drop_database(database_name):
-    import openerp
-    openerp.netsvc.init_logger()
-    db = openerp.sql_db.db_connect('template1')
-    cr = db.cursor()
-    cr.autocommit(True) # avoid transaction block
-    try:
-        # TODO option for doing this.
-        # Try to terminate all other connections that might prevent
-        # dropping the database
-
-        # PostgreSQL 9.2 renamed pg_stat_activity.procpid to pid:
-        # http://www.postgresql.org/docs/9.2/static/release-9-2.html#AEN110389
-        pid_col = 'pid' if cr._cnx.server_version >= 90200 else 'procpid'
-        try:
-            cr.execute("""SELECT pg_terminate_backend(%(pid_col)s)
-                          FROM pg_stat_activity
-                          WHERE datname = %%s AND 
-                                %(pid_col)s != pg_backend_pid()""" % {'pid_col': pid_col},
-                       (database_name,))
-        except Exception:
-            pass
-
-        try:
-            cr.execute('DROP DATABASE "%s"' % database_name, log_exceptions=False)
-        except Exception, e:
-            print "Can't drop %s" % (database_name,)
-    finally:
-        cr.close()
-
-def run(args):
-    assert args.database
-    drop_database(args.database)
-
-def add_parser(subparsers):
-    parser = subparsers.add_parser('drop',
-        description='Drop a database.')
-    parser.add_argument('-d', '--database', metavar='DATABASE',
-        **common.required_or_default('DATABASE', 'the database to create'))
-
-    parser.set_defaults(run=run)
diff --git a/openerpcommand/grunt_tests.py b/openerpcommand/grunt_tests.py
deleted file mode 100644 (file)
index db2513f..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-"""
-Search for Gruntfile.js files in all the addons and launch them using the 'grunt test' command.
-"""
-
-import common
-import fnmatch
-import os
-import re
-import sys
-import subprocess
-
-def grunt_tester(directories, log = sys.stdout):
-    result = 0
-
-    matches = []
-    for direc in directories:
-        for root, dirnames, filenames in os.walk(direc):
-            for filename in fnmatch.filter(filenames, 'Gruntfile.js'):
-                full = os.path.join(root, filename)
-                if re.match(r"(^.*?/node_modules/.*$)|(^.*?/lib/.*$)", full):
-                    continue
-                matches.append(full)
-
-    for file_ in matches:
-        folder = os.path.dirname(file_)
-        p = subprocess.Popen(['npm', 'install'], cwd=folder)
-        if p.wait() != 0:
-            raise Exception("Failed to install dependencies for Gruntfile located in folder %s" % folder)
-
-        p = subprocess.Popen(['grunt', 'test', '--no-color'], cwd=folder, stdout=log, stderr=log)
-        if p.wait() != 0:
-            result = 1
-
-    return result
-
-def run(args):
-    if args.addons:
-        args.addons = args.addons.split(':')
-    else:
-        args.addons = []
-    result = grunt_tester(args.addons)
-    if result != 0:
-        sys.exit(result)
-
-def add_parser(subparsers):
-    parser = subparsers.add_parser('grunt-tests',
-        description='Run the tests contained in Gruntfile.js files.')
-    common.add_addons_argument(parser)
-
-    parser.set_defaults(run=run)
diff --git a/openerpcommand/initialize.py b/openerpcommand/initialize.py
deleted file mode 100644 (file)
index cf4e54b..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-"""
-Install OpenERP on a new (by default) database.
-"""
-import contextlib
-import errno
-import os
-import sys
-import time
-
-import common
-
-# From http://code.activestate.com/recipes/576572/
-@contextlib.contextmanager
-def lock_file(path, wait_delay=.1, max_try=600):
-    attempt = 0
-    while True:
-        attempt += 1
-        if attempt > max_try:
-            raise IOError("Could not lock file %s." % path)
-        try:
-            fd = os.open(path, os.O_CREAT | os.O_EXCL | os.O_RDWR)
-        except OSError, e:
-            if e.errno != errno.EEXIST:
-                raise
-            time.sleep(wait_delay)
-            continue
-        else:
-            break
-    try:
-        yield fd
-    finally:
-        os.close(fd)
-        os.unlink(path)
-
-def run(args):
-    assert args.database
-    assert not (args.module and args.all_modules)
-
-    import openerp
-
-    config = openerp.tools.config
-    config['db_name'] = args.database
-
-    if args.tests:
-        config['log_handler'] = [':INFO']
-        config['test_enable'] = True
-        config['without_demo'] = False
-        if args.port:
-            config['xmlrpc_port'] = int(args.port)
-    else:
-        config['log_handler'] = [':CRITICAL']
-        config['test_enable'] = False
-        config['without_demo'] = True
-
-    if args.addons:
-        args.addons = args.addons.split(':')
-    else:
-        args.addons = []
-    config['addons_path'] = ','.join(args.addons)
-
-    if args.all_modules:
-        module_names = common.get_addons_from_paths(args.addons, args.exclude)
-    elif args.module:
-        module_names = args.module
-    else:
-        module_names = ['base']
-    config['init'] = dict.fromkeys(module_names, 1)
-
-    if args.coverage:
-        import coverage
-        # Without the `include` kwarg, coverage generates 'memory:0xXXXXX'
-        # filenames (which do not exist) and cause it to crash. No idea why.
-        cov = coverage.coverage(branch=True, include='*.py')
-        cov.start()
-    openerp.netsvc.init_logger()
-
-    if not args.no_create:
-        with lock_file('/tmp/global_openerp_create_database.lock'):
-            openerp.service.db._create_empty_database(args.database)
-
-    config['workers'] = False
-
-    rc = openerp.service.server.start(preload=[args.database], stop=True)
-
-    if args.coverage:
-        cov.stop()
-        cov.html_report(directory='coverage')
-        # If we wanted the report on stdout:
-        # cov.report()
-
-    sys.exit(rc)
-
-def add_parser(subparsers):
-    parser = subparsers.add_parser('initialize',
-        description='Create and initialize a new OpenERP database.')
-    parser.add_argument('-d', '--database', metavar='DATABASE',
-        **common.required_or_default('DATABASE', 'the database to create'))
-    common.add_addons_argument(parser)
-    parser.add_argument('-P', '--port', metavar='PORT',
-        **common.required_or_default('PORT', 'the server port'))
-    parser.add_argument('--module', metavar='MODULE', action='append',
-        help='specify a module to install'
-        ' (this option can be repeated)')
-    parser.add_argument('--all-modules', action='store_true',
-        help='install all visible modules (not compatible with --module)')
-    parser.add_argument('--no-create', action='store_true',
-        help='do not create the database, only initialize it')
-    parser.add_argument('--exclude', metavar='MODULE', action='append',
-        help='exclude a module from installation'
-        ' (this option can be repeated)')
-    parser.add_argument('--tests', action='store_true',
-        help='run the tests as modules are installed'
-        ' (use the `run-tests` command to choose specific'
-        ' tests to run against an existing database).'
-        ' Demo data are installed.')
-    parser.add_argument('--coverage', action='store_true',
-        help='report code coverage (particularly useful with --tests).'
-        ' The report is generated in a coverage directory and you can'
-        ' then point your browser to coverage/index.html.')
-
-    parser.set_defaults(run=run)
diff --git a/openerpcommand/main.py b/openerpcommand/main.py
deleted file mode 100644 (file)
index f5a1b03..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-import openerpcommand
-
-def run():
-    """ Main entry point for the openerp-command tool."""
-    parser = openerpcommand.main_parser()
-    args = parser.parse_args()
-    args.run(args)
diff --git a/openerpcommand/model.py b/openerpcommand/model.py
deleted file mode 100644 (file)
index ccd3ae7..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-"""
-Display information about a given model.
-"""
-import os
-import sys
-import textwrap
-
-def run(args):
-    assert args.database
-    assert args.model
-    import openerp
-    openerp.tools.config['log_level'] = 100
-    openerp.netsvc.init_logger()
-    registry = openerp.modules.registry.RegistryManager.get(
-        args.database, update_module=False)
-    model = registry[args.model]
-    longest_k = 1
-    longest_string = 1
-    columns = model._columns
-
-    if args.field and args.field not in columns:
-        print "No such field."
-        sys.exit(1)
-        
-    if args.field:
-        columns = { args.field: columns[args.field] }
-    else:
-        print "Fields (model `%s`, database `%s`):" % (args.model, args.database)
-
-    for k, v in columns.items():
-        longest_k = len(k) if longest_k < len(k) else longest_k
-        longest_string = len(v.string) \
-            if longest_string < len(v.string) else longest_string
-    for k, v in sorted(columns.items()):
-        attr = []
-        if v.required:
-            attr.append("Required")
-        if v.readonly:
-            attr.append("Read-only")
-        attr = '/'.join(attr)
-        attr = '(' + attr + ')' if attr else attr
-        if args.verbose:
-            print v.string, '-- ' + k + ', ' + v._type, attr
-        else:
-            print k.ljust(longest_k + 2), v._type, attr
-        if args.verbose and v.help:
-            print textwrap.fill(v.help, initial_indent='    ', subsequent_indent='    ')
-
-def add_parser(subparsers):
-    parser = subparsers.add_parser('model',
-        description='Display information about a given model for an existing database.')
-    parser.add_argument('-d', '--database', metavar='DATABASE', required=True,
-        help='the database to connect to')
-    parser.add_argument('-m', '--model', metavar='MODEL', required=True,
-        help='the model for which information should be displayed')
-    parser.add_argument('-v', '--verbose', action='store_true',
-        help='display more information')
-    parser.add_argument('-f', '--field', metavar='FIELD',
-        help='display information only for this particular field')
-
-    parser.set_defaults(run=run)
diff --git a/openerpcommand/module.py b/openerpcommand/module.py
deleted file mode 100644 (file)
index 284c018..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-"""
-Show module information for a given database or from the file-system.
-"""
-import os
-import sys
-import textwrap
-
-from . import common
-
-# TODO provide a --rpc flag to use XML-RPC (with a specific username) instead
-# of server-side library.
-def run(args):
-    assert args.database
-    import openerp
-
-    config = openerp.tools.config
-    config['log_handler'] = [':CRITICAL']
-    if args.addons:
-        args.addons = args.addons.split(':')
-    else:
-        args.addons = []
-    config['addons_path'] = ','.join(args.addons)
-    openerp.netsvc.init_logger()
-
-    if args.filesystem:
-        module_names = common.get_addons_from_paths(args.addons, [])
-        print "Modules (addons path %s):" % (', '.join(args.addons),)
-        for x in sorted(module_names):
-            print x
-    else:
-        registry = openerp.modules.registry.RegistryManager.get(
-            args.database, update_module=False)
-        xs = []
-        ir_module_module = registry.get('ir.module.module')
-        with registry.cursor() as cr:
-            ids = ir_module_module.search(cr, openerp.SUPERUSER_ID, [], {})
-            xs = ir_module_module.read(cr, openerp.SUPERUSER_ID, ids, [], {})
-        if xs:
-            print "Modules (database `%s`):" % (args.database,)
-            for x in xs:
-                if args.short:
-                    print '%3d %s' % (x['id'], x['name'])
-                else:
-                    print '%3d %s %s' % (x['id'], x['name'], {'installed': '(installed)'}.get(x['state'], ''))
-        else:
-            print "No module found (database `%s`)." % (args.database,)
-
-def add_parser(subparsers):
-    parser = subparsers.add_parser('module',
-        description='Display modules known from a given database or on file-system.')
-    parser.add_argument('-d', '--database', metavar='DATABASE',
-        **common.required_or_default('DATABASE', 'the database to modify'))
-    common.add_addons_argument(parser)
-    parser.add_argument('-m', '--module', metavar='MODULE', required=False,
-        help='the module for which information should be shown')
-    parser.add_argument('-v', '--verbose', action='store_true',
-        help='display more information')
-    parser.add_argument('--short', action='store_true',
-        help='display less information')
-    parser.add_argument('-f', '--filesystem', action='store_true',
-        help='display module in the addons path, not in db')
-
-    parser.set_defaults(run=run)
diff --git a/openerpcommand/oe-bash-completion b/openerpcommand/oe-bash-completion
deleted file mode 100644 (file)
index 57a4391..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-_oe()
-{
-    local cur prev opts
-    COMPREPLY=()
-    cur="${COMP_WORDS[COMP_CWORD]}"
-    prev="${COMP_WORDS[COMP_CWORD-1]}"
-
-    cmd="${COMP_WORDS[0]}"
-    subcmd=""
-    if [[ ${COMP_CWORD} > 0 ]] ; then
-        subcmd="${COMP_WORDS[1]}"
-    fi
-
-    # oe
-
-    opts="initialize model read run-tests scaffold update \
-        call open show consume-nothing consume-memory leak-memory \
-        consume-cpu bench-read bench-fields-view-get bench-dummy bench-login \
-        bench-sale-mrp --help"
-
-    if [[ ${prev} == oe && ${cur} != -* ]] ; then
-        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
-        return 0
-    fi
-
-    # oe call
-
-    opts="--database --user --password --host --port --help"
-
-    if [[ ${subcmd} == call ]] ; then
-        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
-        return 0
-    fi
-
-    # oe initialize
-
-    opts="--database --addons --all-modules --exclude --no-create --help"
-
-    if [[ ${subcmd} == initialize ]] ; then
-        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
-        return 0
-    fi
-
-    # oe model
-
-    opts="--database --model --field --verbose --help"
-
-    if [[ ${subcmd} == model ]] ; then
-        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
-        return 0
-    fi
-
-    # oe read
-
-    opts="--database --model --id --field --verbose --short --help"
-
-    if [[ ${subcmd} == read ]] ; then
-        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
-        return 0
-    fi
-
-    # oe run-tests
-
-    opts="--database --addons --module --dry-run --help"
-
-    if [[ ${subcmd} == run-tests ]] ; then
-        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
-        return 0
-    fi
-
-    # oe scaffold
-
-    opts="--help"
-
-    if [[ ${subcmd} == scaffold ]] ; then
-        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
-        return 0
-    fi
-
-    # fallback for unimplemented completion
-
-    opts="--help"
-
-    if [[ true ]] ; then
-        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
-        return 0
-    fi
-}
-complete -F _oe oe
diff --git a/openerpcommand/read.py b/openerpcommand/read.py
deleted file mode 100644 (file)
index 61c0511..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-"""
-Read a record.
-"""
-import os
-import sys
-import textwrap
-
-import common
-
-# TODO provide a --rpc flag to use XML-RPC (with a specific username) instead
-# of server-side library.
-def run(args):
-    assert args.database
-    assert args.model
-    import openerp
-    config = openerp.tools.config
-    config['log_handler'] = [':CRITICAL']
-    common.set_addons(args)
-    openerp.netsvc.init_logger()
-    registry = openerp.modules.registry.RegistryManager.get(
-        args.database, update_module=False)
-    model = registry[args.model]
-    field_names = [args.field] if args.field else []
-    if args.short:
-        # ignore --field
-        field_names = ['name']
-    with registry.cursor() as cr:
-        xs = model.read(cr, 1, args.id, field_names, {})
-
-    if xs:
-        print "Records (model `%s`, database `%s`):" % (args.model, args.database)
-        x = xs[0]
-        if args.short:
-            print str(x['id']) + '.', x['name']
-        else:
-            longest_k = 1
-            for k, v in x.items():
-                longest_k = len(k) if longest_k < len(k) else longest_k
-            for k, v in sorted(x.items()):
-                print (k + ':').ljust(longest_k + 2), v
-    else:
-        print "Record not found."
-
-def add_parser(subparsers):
-    parser = subparsers.add_parser('read',
-        description='Display a record.')
-    parser.add_argument('-d', '--database', metavar='DATABASE',
-        **common.required_or_default('DATABASE', 'the database to connect to'))
-    common.add_addons_argument(parser)
-    parser.add_argument('-m', '--model', metavar='MODEL', required=True,
-        help='the model for which a record should be read')
-    parser.add_argument('-i', '--id', metavar='RECORDID', required=True,
-        help='the record id')
-    parser.add_argument('-v', '--verbose', action='store_true',
-        help='display more information')
-    parser.add_argument('--short', action='store_true',
-        help='display less information')
-    parser.add_argument('-f', '--field', metavar='FIELD',
-        help='display information only for this particular field')
-
-    parser.set_defaults(run=run)
diff --git a/openerpcommand/scaffold.py b/openerpcommand/scaffold.py
deleted file mode 100644 (file)
index 4713f73..0000000
+++ /dev/null
@@ -1,131 +0,0 @@
-"""
-Generate an OpenERP module skeleton.
-"""
-
-import functools
-import keyword
-import os
-import re
-import sys
-
-import jinja2
-
-# FIXME: add logging
-def run(args):
-    env = jinja2.Environment(loader=jinja2.PackageLoader(
-        'openerpcommand', 'templates'))
-    env.filters['snake'] = snake
-    args.dependency = 'web' if args.controller else 'base'
-
-    module_name = snake(args.module)
-    module = functools.partial(
-        os.path.join, args.modules_dir, module_name)
-
-    if args.controller is True:
-        args.controller = module_name
-
-    if args.model is True:
-        args.model = module_name
-
-    if os.path.exists(module()):
-        message = "The path `%s` already exists." % module()
-        die(message)
-
-    dump(env, '__openerp__.jinja2', module('__openerp__.py'), config=args)
-    dump(env, '__init__.jinja2', module('__init__.py'), modules=[
-        args.controller and 'controllers',
-        args.model and 'models'
-    ])
-    dump(env, 'ir.model.access.jinja2', module('security', 'ir.model.access.csv'), config=args)
-
-    if args.controller:
-        controller_module = snake(args.controller)
-        dump(env, '__init__.jinja2', module('controllers', '__init__.py'), modules=[controller_module])
-        dump(env, 'controllers.jinja2',
-             module('controllers', '%s.py' % controller_module),
-             config=args)
-
-    if args.model:
-        model_module = snake(args.model)
-        dump(env, '__init__.jinja2', module('models', '__init__.py'), modules=[model_module])
-        dump(env, 'models.jinja2', module('models', '%s.py' % model_module), config=args)
-
-def add_parser(subparsers):
-    parser = subparsers.add_parser('scaffold',
-        description='Generate an OpenERP module skeleton.')
-    parser.add_argument('module', metavar='MODULE',
-        help='the name of the generated module')
-    parser.add_argument('modules_dir', metavar='DIRECTORY', type=directory,
-        help="Modules directory in which the new module should be generated")
-
-    controller = parser.add_mutually_exclusive_group()
-    controller.add_argument('--controller', type=identifier,
-        help="The name of the controller to generate")
-    controller.add_argument('--no-controller', dest='controller',
-        action='store_const', const=None, help="Do not generate a controller")
-
-    model = parser.add_mutually_exclusive_group()
-    model.add_argument('--model', type=identifier,
-       help="The name of the model to generate")
-    model.add_argument('--no-model', dest='model',
-       action='store_const', const=None, help="Do not generate a model")
-
-    mod = parser.add_argument_group("Module information",
-        "these are added to the module metadata and displayed on e.g. "
-        "apps.openerp.com. For company-backed modules, the company "
-        "information should be used")
-    mod.add_argument('--name', dest='author_name', default="",
-                     help="Name of the module author")
-    mod.add_argument('--website', dest='author_website', default="",
-                     help="Website of the module author")
-    mod.add_argument('--category', default="Uncategorized",
-        help="Broad categories to which the module belongs, used for "
-             "filtering within OpenERP and on apps.openerp.com."
-             "Defaults to %(default)s")
-    mod.add_argument('--summary', default="",
-        help="Short (1 phrase/line) summary of the module's purpose, used as "
-             "subtitle on modules listing or apps.openerp.com")
-
-    parser.set_defaults(run=run, controller=True, model=True)
-
-def snake(s):
-    """ snake cases ``s``
-
-    :param str s:
-    :return: str
-    """
-    # insert a space before each uppercase character preceded by a
-    # non-uppercase letter
-    s = re.sub(r'(?<=[^A-Z])\B([A-Z])', r' \1', s)
-    # lowercase everything, split on whitespace and join
-    return '_'.join(s.lower().split())
-
-def dump(env, template, dest, **kwargs):
-    outdir = os.path.dirname(dest)
-    if not os.path.exists(outdir):
-        os.makedirs(outdir)
-    env.get_template(template).stream(**kwargs).dump(dest)
-    # add trailing newline which jinja removes
-    with open(dest, 'a') as f:
-        f.write('\n')
-
-def identifier(s):
-    if keyword.iskeyword(s):
-        die("%s is a Python keyword and can not be used as a name" % s)
-    if not re.match('[A-Za-z_][A-Za-z0-9_]*', s):
-        die("%s is not a valid Python identifier" % s)
-    return s
-
-def directory(p):
-    expanded = os.path.abspath(
-        os.path.expanduser(
-            os.path.expandvars(p)))
-    if not os.path.exists(expanded):
-        os.makedirs(expanded)
-    if not os.path.isdir(expanded):
-        die("%s exists but is not a directory" % p)
-    return expanded
-
-def die(message, code=1):
-    print >>sys.stderr, message
-    sys.exit(code)
diff --git a/openerpcommand/templates/__init__.jinja2 b/openerpcommand/templates/__init__.jinja2
deleted file mode 100644 (file)
index 0124cdd..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-# -*- coding: utf-8 -*-
-{% for module in modules if module -%}
-import {{ module }}
-{% endfor %}
diff --git a/openerpcommand/templates/__openerp__.jinja2 b/openerpcommand/templates/__openerp__.jinja2
deleted file mode 100644 (file)
index d37a6f3..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-# -*- coding: utf-8 -*-
-{
-    'name': "{{ config.module }}",
-    # short description, used as subtitles on modules listings
-    'summary': "{{ config.summary }}",
-    # long description of module purpose
-    'description': """
-""",
-    # Who you are
-    'author': "{{ config.author_name }}",
-    'website': "{{ config.author_website }}",
-
-    # categories can be used to filter modules in modules listing
-    'category': '{{ config.category }}',
-    'version': '0.1',
-
-    # any module necessary for this one to work correctly
-    'depends': ['{{ config.dependency }}'],
-    'data': [
-        {{- "'security/ir.model.access.csv'" if config.model -}}
-    ],
-    'tests': [
-    ],
-}
diff --git a/openerpcommand/templates/controllers.jinja2 b/openerpcommand/templates/controllers.jinja2
deleted file mode 100644 (file)
index 3cc4736..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from openerp import http
-from openerp.addons.web.controllers import main
-
-class {{ config.controller }}(main.Home):
-    @http.route('/', auth='none')
-    def index(self):
-        return "Hello, world!"
diff --git a/openerpcommand/templates/ir.model.access.jinja2 b/openerpcommand/templates/ir.model.access.jinja2
deleted file mode 100644 (file)
index e5e2fb3..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
-{% if config.model -%}
-access_{{ config.module|snake }}_{{ config.model|snake }},{{- '' -}}
-access_{{ config.module|snake }}_{{ config.model|snake }},{{- '' -}}
-model_{{ config.module|snake }}_{{ config.model|snake }},,1,0,0,0
-{%- endif %}
diff --git a/openerpcommand/templates/models.jinja2 b/openerpcommand/templates/models.jinja2
deleted file mode 100644 (file)
index 878bf9b..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-# -*- coding: utf-8 -*-
-from openerp.osv import orm, fields
-
-class {{ config.model }}(orm.Model):
-    _name = "{{ config.module|snake }}.{{ config.model|snake }}"
-
-    _columns = {
-        'name': fields.char(),
-    }
diff --git a/openerpcommand/uninstall.py b/openerpcommand/uninstall.py
deleted file mode 100644 (file)
index 244b057..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-"""
-Install OpenERP on a new (by default) database.
-"""
-import os
-import sys
-
-import common
-
-# TODO turn template1 in a parameter
-# This should be exposed from openerp (currently in
-# openerp/service/web_services.py).
-def create_database(database_name):
-    import openerp
-    db = openerp.sql_db.db_connect('template1')
-    cr = db.cursor() # TODO `with db as cr:`
-    try:
-        cr.autocommit(True)
-        cr.execute("""CREATE DATABASE "%s"
-            ENCODING 'unicode' TEMPLATE "template1" """ \
-            % (database_name,))
-    finally:
-        cr.close()
-
-def run(args):
-    assert args.database
-    assert args.module
-
-    import openerp
-
-    config = openerp.tools.config
-    config['log_handler'] = [':CRITICAL']
-    if args.addons:
-        args.addons = args.addons.split(':')
-    else:
-        args.addons = []
-    config['addons_path'] = ','.join(args.addons)
-    openerp.netsvc.init_logger()
-
-    # Install the import hook, to import openerp.addons.<module>.
-    openerp.modules.module.initialize_sys_path()
-
-    registry = openerp.modules.registry.RegistryManager.get(
-        args.database, update_module=False)
-
-    ir_module_module = registry.get('ir.module.module')
-    with registry.cursor() as cr:
-        ids = ir_module_module.search(cr, openerp.SUPERUSER_ID, [('name', 'in', args.module), ('state', '=', 'installed')], {})
-        if len(ids) == len(args.module):
-            ir_module_module.button_immediate_uninstall(cr, openerp.SUPERUSER_ID, ids, {})
-        else:
-            print "At least one module not found (database `%s`)." % (args.database,)
-
-def add_parser(subparsers):
-    parser = subparsers.add_parser('uninstall',
-        description='Uninstall some modules from an OpenERP database.')
-    parser.add_argument('-d', '--database', metavar='DATABASE',
-        **common.required_or_default('DATABASE', 'the database to modify'))
-    common.add_addons_argument(parser)
-    parser.add_argument('--module', metavar='MODULE', action='append',
-        help='specify a module to uninstall'
-        ' (this option can be repeated)')
-
-    parser.set_defaults(run=run)
diff --git a/openerpcommand/update.py b/openerpcommand/update.py
deleted file mode 100644 (file)
index 66a47dc..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-"""
-Update an existing OpenERP database.
-"""
-
-def run(args):
-    assert args.database
-    import openerp
-    config = openerp.tools.config
-    config['update']['all'] = 1
-    openerp.modules.registry.RegistryManager.get(
-        args.database, update_module=True)
-
-def add_parser(subparsers):
-    parser = subparsers.add_parser('update',
-        description='Update an existing OpenERP database.')
-    parser.add_argument('-d', '--database', metavar='DATABASE', required=True,
-        help='the database to update')
-
-    parser.set_defaults(run=run)
diff --git a/openerpcommand/web.py b/openerpcommand/web.py
deleted file mode 100644 (file)
index 5d9d429..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-"""
-Run a normal OpenERP HTTP process.
-"""
-
-import logging
-import os
-import signal
-
-import common
-
-_logger = logging.getLogger(__name__)
-
-def mk_signal_handler(server):
-    def signal_handler(sig, frame):
-        """
-        Specialized signal handler for the evented process.
-        """
-        print "\n\n\nStopping gevent HTTP server...\n\n\n"
-        server.stop()
-    return signal_handler
-
-def setup_signal_handlers(signal_handler):
-    SIGNALS = (signal.SIGINT, signal.SIGTERM)
-    map(lambda sig: signal.signal(sig, signal_handler), SIGNALS)
-
-def run(args):
-    # Note that gevent monkey patching must be done before importing the
-    # `threading` module, see http://stackoverflow.com/questions/8774958/.
-    if args.gevent:
-        import gevent
-        import gevent.monkey
-        import gevent.wsgi
-        import psycogreen.gevent
-        gevent.monkey.patch_all()
-        psycogreen.gevent.patch_psycopg()
-    import threading
-    import openerp
-    import openerp.cli.server
-    import openerp.service.wsgi_server
-    import openerp.tools.config
-    config = openerp.tools.config
-
-    os.environ["TZ"] = "UTC"
-    common.set_addons(args)
-
-    openerp.multi_process = True
-    common.setproctitle('openerp-web')
-
-    openerp.cli.server.check_root_user()
-    openerp.netsvc.init_logger()
-    #openerp.cli.server.report_configuration()
-
-    target = openerp.service.wsgi_server.serve
-    if not args.gevent:
-        openerp.evented = False
-        openerp.cli.server.setup_signal_handlers(openerp.cli.server.signal_handler)
-        # TODO openerp.multi_process with a multi-threaded process probably
-        # doesn't work very well (e.g. waiting for all threads to complete
-        # before killing the process is not implemented).
-        arg = (args.interface, int(args.port), args.threaded)
-        threading.Thread(target=target, args=arg).start()
-        openerp.cli.server.quit_on_signals()
-    else:
-        openerp.evented = True
-
-        app = openerp.service.wsgi_server.application
-        server = gevent.wsgi.WSGIServer((args.interface, int(args.port)), app)
-        setup_signal_handlers(mk_signal_handler(server))
-        try:
-            server.serve_forever()
-        except KeyboardInterrupt:
-            try:
-                server.stop()
-                gevent.shutdown()
-            except KeyboardInterrupt:
-                sys.stderr.write("Forced shutdown.\n")
-                gevent.shutdown()
-
-def add_parser(subparsers):
-    parser = subparsers.add_parser('web',
-        description='Run a normal OpenERP HTTP process. By default a '
-        'singly-threaded Werkzeug server is used.')
-    common.add_addons_argument(parser)
-    parser.add_argument('--interface', default='0.0.0.0',
-        help='HTTP interface to listen on (default is %(default)s)')
-    parser.add_argument('--port', metavar='INT', default=8069,
-        help='HTTP port to listen on (default is %(default)s)')
-    parser.add_argument('--threaded', action='store_true',
-        help='Use a multithreaded Werkzeug server (incompatible with --gevent)')
-    parser.add_argument('--gevent', action='store_true',
-        help="Use gevent's WSGI server (incompatible with --threaded)")
-
-    parser.set_defaults(run=run)
diff --git a/setup.cfg b/setup.cfg
deleted file mode 100644 (file)
index 7693a84..0000000
--- a/setup.cfg
+++ /dev/null
@@ -1,10 +0,0 @@
-[general]
-
-[sdist]
-formats=gztar
-
-[bdist]
-formats=rpm
-
-[bdist_rpm]
-install_script=setup_rpm.sh
diff --git a/setup.py b/setup.py
deleted file mode 100644 (file)
index 353239a..0000000
--- a/setup.py
+++ /dev/null
@@ -1,197 +0,0 @@
-# -*- 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/>.
-#
-##############################################################################
-
-import glob, os, re, setuptools, sys
-from os.path import join
-
-# List all data files
-def data():
-    r = {}
-    for root, dirnames, filenames in os.walk('openerp'):
-        for filename in filenames:
-            if not re.match(r'.*(\.pyc|\.pyo|\~)$', filename):
-                r.setdefault(root, []).append(os.path.join(root, filename))
-
-    if os.name == 'nt':
-        r["Microsoft.VC90.CRT"] = glob.glob('C:\Microsoft.VC90.CRT\*.*')
-
-        import babel
-        # Add data, but also some .py files py2exe won't include automatically.
-        # TODO This should probably go under `packages`, instead of `data`,
-        # but this will work fine (especially since we don't use the ZIP file
-        # approach).
-        r["babel/localedata"] = glob.glob(os.path.join(os.path.dirname(babel.__file__), "localedata", '*'))
-        others = ['global.dat', 'numbers.py', 'support.py', 'plural.py']
-        r["babel"] = map(lambda f: os.path.join(os.path.dirname(babel.__file__), f), others)
-        others = ['frontend.py', 'mofile.py']
-        r["babel/messages"] = map(lambda f: os.path.join(os.path.dirname(babel.__file__), "messages", f), others)
-
-        import pytz
-        tzdir = os.path.dirname(pytz.__file__)
-        for root, _, filenames in os.walk(os.path.join(tzdir, "zoneinfo")):
-            base = os.path.join('pytz', root[len(tzdir) + 1:])
-            r[base] = [os.path.join(root, f) for f in filenames]
-
-        import docutils
-        dudir = os.path.dirname(docutils.__file__)
-        for root, _, filenames in os.walk(dudir):
-            base = os.path.join('docutils', root[len(dudir) + 1:])
-            r[base] = [os.path.join(root, f) for f in filenames if not f.endswith(('.py', '.pyc', '.pyo'))]
-
-    return r.items()
-
-def gen_manifest():
-    file_list="\n".join(data())
-    open('MANIFEST','w').write(file_list)
-
-if os.name == 'nt':
-    sys.path.append("C:\Microsoft.VC90.CRT")
-
-def py2exe_options():
-    if os.name == 'nt':
-        import py2exe
-        return {
-            "console" : [ { "script": "openerp-server", "icon_resources": [(1, join("install","openerp-icon.ico"))], },
-                          { "script": "openerp-gevent" },
-                          { "script": "oe" },
-            ],
-            'options' : {
-                "py2exe": {
-                    "skip_archive": 1,
-                    "optimize": 0, # keep the assert running, because the integrated tests rely on them.
-                    "dist_dir": 'dist',
-                    "packages": [
-                        "HTMLParser",
-                        "PIL",
-                        "asynchat", "asyncore",
-                        "commands",
-                        "dateutil",
-                        "decimal",
-                        "docutils",
-                        "email",
-                        "encodings",
-                        "imaplib",
-                        "jinja2",
-                        "lxml", "lxml._elementpath", "lxml.builder", "lxml.etree", "lxml.objectify",
-                        "mako",
-                        "markupsafe",   # dependence of jinja2 and mako
-                        "mock",
-                        "openerp",
-                        "poplib",
-                        "psutil",
-                        "pychart",
-                        "pydot",
-                        "pyparsing",
-                        "pytz",
-                        "reportlab",
-                        "requests",
-                        "select",
-                        "simplejson",
-                        "smtplib",
-                        "uuid",
-                        "vatnumber",
-                        "vobject",
-                        "win32service", "win32serviceutil",
-                        "xlwt",
-                        "xml", "xml.dom",
-                        "yaml",
-                    ],
-                    "excludes" : ["Tkconstants","Tkinter","tcl"],
-                }
-            }
-        }
-    else:
-        return {}
-
-execfile(join(os.path.dirname(__file__), 'openerp', 'release.py'))
-
-# Notes for OpenERP developer on windows:
-#
-# To setup a windows developer evironement install python2.7 then pip and use
-# "pip install <depencey>" for every dependency listed below.
-#
-# Dependecies that requires DLLs are not installable with pip install, for
-# them we added comments with links where you can find the installers.
-#
-# OpenERP on windows also require the pywin32, the binary can be found at
-# http://pywin32.sf.net
-#
-# Both python2.7 32bits and 64bits are known to work.
-
-setuptools.setup(
-      name             = 'openerp',
-      version          = version,
-      description      = description,
-      long_description = long_desc,
-      url              = url,
-      author           = author,
-      author_email     = author_email,
-      classifiers      = filter(None, classifiers.split("\n")),
-      license          = license,
-      scripts          = ['openerp-server', 'openerp-gevent', 'oe'],
-      data_files       = data(),
-      packages         = setuptools.find_packages(),
-      dependency_links = ['http://download.gna.org/pychart/'],
-      #include_package_data = True,
-      install_requires = [
-          'pychart', # not on pypi, use: pip install http://download.gna.org/pychart/PyChart-1.39.tar.gz
-          'babel >= 1.0',
-          'docutils',
-          'feedparser',
-          'gdata',
-          'gevent',
-          'psycogreen',
-          'Jinja2',
-          'lxml', # windows binary http://www.lfd.uci.edu/~gohlke/pythonlibs/
-          'mako',
-          'mock',
-          'pillow', # windows binary http://www.lfd.uci.edu/~gohlke/pythonlibs/
-          'psutil', # windows binary code.google.com/p/psutil/downloads/list
-          'psycopg2 >= 2.2',
-          'pydot',
-          'pyparsing < 2',
-          'pyserial',
-          'python-dateutil < 2',
-          'python-ldap', # optional
-          'python-openid',
-          'pytz',
-          'pyusb >= 1.0.0b1',
-          'pywebdav < 0.9.8',
-          'pyyaml',
-          'qrcode',
-          'reportlab', # windows binary pypi.python.org/pypi/reportlab
-          'requests',
-          'simplejson',
-          'unittest2',
-          'vatnumber',
-          'vobject',
-          'werkzeug',
-          'xlwt',
-      ],
-      extras_require = {
-          'SSL' : ['pyopenssl'],
-      },
-      tests_require = ['unittest2', 'mock'],
-      **py2exe_options()
-)
-
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/setup/MANIFEST.in b/setup/MANIFEST.in
new file mode 100644 (file)
index 0000000..e5cb508
--- /dev/null
@@ -0,0 +1,9 @@
+graft debian
+graft doc
+graft setup
+graft openerp
+include README.md
+include LICENSE
+include openerp-*
+include odoo*
+global-exclude *pyc *~    # Exclude possible garbage from previous graft.
diff --git a/setup/README.urpmi b/setup/README.urpmi
new file mode 100644 (file)
index 0000000..ce8fb70
--- /dev/null
@@ -0,0 +1,36 @@
+Installation Steps
+------------------
+
+1. Check that all the required dependencies are installed.
+
+2. Create a postgresql database.
+
+The default database name is "terp". If you want to use another name, you
+will need to provide it when launching the server (by using the commandline
+option --database).
+
+To create a postgresql database named "terp" using the following command:
+    $ createdb --encoding=UNICODE terp
+
+If it is the first time you use postgresql you might need to create a new user
+to the postgres system using the following commands (where myusername is your
+unix user name):
+
+    $ su -
+    # su - postgres
+    $ createuser openerp
+    Shall the new user be allowed to create databases? (y/n) y
+    Shall the new user be allowed to create more new users? (y/n) y
+    CREATE USER
+    $ logout
+    # logout
+
+3. Launch service daemon by "service openerp-server start".
+
+The first time it is run, the server will initialise the database with all the default values.
+
+4. Connect to the server using the GUI client.
+
+There are two accounts by default:
+    * login: admin, password:admin
+    * login: demo, password:demo
diff --git a/setup/debian/changelog b/setup/debian/changelog
new file mode 100644 (file)
index 0000000..0ee8e0e
--- /dev/null
@@ -0,0 +1,539 @@
+openerp (6.1-1) testing; urgency=low
+
+  * New major version, new packaging.
+
+ -- Antony Lesuisse <al@openerp.com>  Sat, 01 Oct 2011 12:31:00 +0100
+
+openerp-server (6.0.2-1) testing; urgency=low
+
+  * Using upstream version 6.0.2
+
+ -- Vo Minh Thu <vmt@openerp.com>  Tue, 05 Apr 2011 12:31:00 +0100
+
+openerp-server (6.0.1-1) unstable; urgency=low
+
+  * Translations from Rosetta (only zh_CN today)
+  * Require postgres 8.2, not 8.4
+  * Write changelog (recursive, isn't it?)
+  * Repackage, together with addons fixes
+
+ -- P. Christeas <xrg@openerp.com>  Mon, 24 Jan 2011 12:50:00 +0100
+openerp-server (6.0.1-0) testing; urgency=low
+
+  * Update to version 6.0.1
+
+ -- P. Christeas <xrg@openerp.com>  Thu, 20 Jan 2011 21:21:00 +0100
+
+openerp-server (6.0.0-0) testing; urgency=low
+
+  * Update to version 6.0.0
+
+ -- P. Christeas <xrg@openerp.com>  Wed, 19 Jan 2011 09:12:00 +0100
+
+openerp-server (6.0.0~rc2-0) experimental; urgency=low
+
+  * Upgrade to 6.0.0-rc2, let it build
+
+ -- P. Christeas <xrg@openerp.com>  Mon, 17 Jan 2011 14:18:00 +0100
+
+openerp-server (5.0.14-1) experimental; urgency=low
+
+  * Updating to standards version 3.9.1.
+  * Merging upstream version 5.0.14.
+
+ -- Daniel Baumann <daniel@debian.org>  Wed, 15 Sep 2010 00:22:00 +0200
+
+openerp-server (5.0.13-1) experimental; urgency=low
+
+  * Merging upstream version 5.0.13.
+
+ -- Daniel Baumann <daniel@debian.org>  Mon, 13 Sep 2010 09:14:10 +0200
+
+openerp-server (5.0.12-2) unstable; urgency=low
+
+  * Removing debhelper auto install overrides.
+  * Updating clean target in rules.
+  * Reverting to manual setup.py call, updated for version 5.0.12.
+
+ -- Daniel Baumann <daniel@debian.org>  Sat, 14 Aug 2010 18:53:43 +0200
+
+openerp-server (5.0.12-1) unstable; urgency=low
+
+  * Updating standards version to 3.9.0.
+  * Merging upstream version 5.0.12.
+
+ -- Daniel Baumann <daniel@debian.org>  Sun, 18 Jul 2010 19:46:39 +0200
+
+openerp-server (5.0.11-1) unstable; urgency=low
+
+  * Merging upstream version 5.0.11.
+  * Adding patch from Timothy E. Harris <maintainer@mepiscommunity.org>
+    to prevents creating a new database if the locale is not a UTF-8 one
+    (Closes: #584976).
+
+ -- Daniel Baumann <daniel@debian.org>  Tue, 08 Jun 2010 11:42:23 +0200
+
+openerp-server (5.0.10-1) unstable; urgency=low
+
+  * Merging upstream version 5.0.10.
+
+ -- Daniel Baumann <daniel@debian.org>  Fri, 07 May 2010 15:02:31 +0200
+
+openerp-server (5.0.9-1) unstable; urgency=low
+
+  * Merging upstream version 5.0.9.
+
+ -- Daniel Baumann <daniel@debian.org>  Fri, 16 Apr 2010 06:47:02 +0200
+
+openerp-server (5.0.8-1) unstable; urgency=low
+
+  * Merging upstream version 5.0.8.
+
+ -- Daniel Baumann <daniel@debian.org>  Wed, 14 Apr 2010 20:19:21 +0200
+
+openerp-server (5.0.7-2) unstable; urgency=low
+
+  * Updating python build-depends.
+  * Adding patch to fix bad whatis entry in openerp-server manpage.
+
+ -- Daniel Baumann <daniel@debian.org>  Wed, 07 Apr 2010 00:09:23 +0200
+
+openerp-server (5.0.7-1) unstable; urgency=low
+
+  * Merging upstream version 5.0.7 (Closes: #573716):
+  * Updating copyright file.
+  * Resorting the dh call to more common order.
+  * Updating README.source.
+  * Dropping python-lxml patch, went upstream.
+  * Dropping postgresql-8.4.patch, went upstream.
+  * Adding some more python module build-depends to avoid some chicken-
+    egg problem with the new setup.py and quilt.
+  * Adding dependency to remote_fs in init script.
+
+ -- Daniel Baumann <daniel@debian.org>  Sat, 13 Mar 2010 13:55:50 +0100
+
+openerp-server (5.0.6-4) unstable; urgency=low
+
+  * Adding explicit debian source version 1.0 until switch to 3.0.
+  * Updating year in copyright file.
+  * Updating to standards 3.8.4.
+  * Adding patch from Toni Mueller <support@oeko.net> to fix SQL for
+    postgresql 8.4 (Closes: #568119).
+
+ -- Daniel Baumann <daniel@debian.org>  Sat, 06 Feb 2010 10:22:05 +0100
+
+openerp-server (5.0.6-3) unstable; urgency=low
+
+  [ Daniel Baumann ]
+  * Setting last-translator for German debconf templates to me, no
+    intention do deal with debian-l10n-german in the future anymore.
+
+  [ Mathias Behrle ]
+  * Removing deprecated option -q for PostgreSQL client commands
+    (Closes: #548875).
+
+ -- Daniel Baumann <daniel@debian.org>  Sat, 31 Oct 2009 09:20:27 +0100
+
+openerp-server (5.0.6-2) unstable; urgency=low
+
+  * Minimizing rules file.
+
+ -- Daniel Baumann <daniel@debian.org>  Sun, 18 Oct 2009 21:19:57 +0200
+
+openerp-server (5.0.6-1) unstable; urgency=low
+
+  * Merging upstream version 5.0.6.
+  * Rediffing python-lxml.patch.
+
+ -- Daniel Baumann <daniel@debian.org>  Sat, 17 Oct 2009 08:32:56 +0200
+
+openerp-server (5.0.5-1) unstable; urgency=low
+
+  * Merging upstream version 5.0.5.
+
+ -- Daniel Baumann <daniel@debian.org>  Mon, 21 Sep 2009 20:38:00 +0200
+
+openerp-server (5.0.4-1) unstable; urgency=medium
+
+  * Merging upstream version 5.0.4:
+    - fixes a security problem.
+  * No longer calling debconf-updatepo in clean target of rules.
+
+ -- Daniel Baumann <daniel@debian.org>  Mon, 21 Sep 2009 00:01:13 +0200
+
+openerp-server (5.0.3-0-2) unstable; urgency=low
+
+  * Adding README.source.
+  * Moving maintainer homepage from control to copyright.
+  * Updating README.source.
+  * Adding patch from upstream to use python-lxml instead of python-xml,
+    thanks to Alan Bell <alan.bell@theopenlearningcentre.com> (Closes:
+    #543947).
+
+ -- Daniel Baumann <daniel@debian.org>  Wed, 16 Sep 2009 21:18:30 +0200
+
+openerp-server (5.0.3-0-1) unstable; urgency=low
+
+  * Merging upstream version 5.0.3-0.
+  * Removing xmlrpc.patch, went upstream.
+  * Using dedicated storage directory in /var/lib/openerp-server, that
+    way the addons directory can stay read-only for the unprivileged
+    user.
+  * Commenting out db_name in config (Closes: #542391).
+  * Commenting out port in config (Closes: #542406).
+  * Renaming logfile to openerp-server.log for consistency.
+  * Commenting out pidfile in config (Closes: #542427).
+  * Removing debconf handling in postrm, not possible to do that.
+  * Removing local storage directory on purge.
+
+ -- Daniel Baumann <daniel@debian.org>  Mon, 24 Aug 2009 20:16:55 +0200
+
+openerp-server (5.0.2-0-3) unstable; urgency=low
+
+  * Wrapping and sorting depends.
+  * Correcting spelling of Open ERP.
+  * Updating maintainer field.
+  * Updating vcs fields.
+  * Updating to standards version 3.8.3.
+  * Dropping old depends on python-xml (Closes: #543127).
+  * Adding maintainer homepage field to control.
+  * Marking maintainer homepage field to be also included in binary
+    packages and changelog.
+
+ -- Daniel Baumann <daniel@debian.org>  Mon, 24 Aug 2009 18:23:54 +0200
+
+openerp-server (5.0.2-0-2) unstable; urgency=high
+
+  * Adding patch from Panos Christeas <p_christ@hol.gr> to forbid RPC
+    calls without credentials. All versions of openerp-server affected.
+
+ -- Daniel Baumann <daniel@debian.org>  Thu, 13 Aug 2009 14:45:17 +0200
+
+openerp-server (5.0.2-0-1) unstable; urgency=low
+
+  * Updating standards to 3.8.1.
+  * Rediffing autobuild.patch (Closes: #538625).
+  * Upgrading package to standards version 3.8.2.
+  * Managing setup of unprivileged user account with debconf.
+  * Using more common directory name to store local debian additions.
+  * Updating README.Debian to reflect that the database has to be
+    initialized through the client (Closes: #518675).
+  * Removing package leftovers in postrm script.
+  * Merging upstream version 5.0.2-0.
+
+ -- Daniel Baumann <daniel@debian.org>  Thu, 13 Aug 2009 11:24:59 +0200
+
+openerp-server (5.0.1-0-1) unstable; urgency=low
+
+  * Merging upstream version 5.0.1-0.
+  * Correcting path of openerp-server in README.Debian (Closes:
+    #520890).
+  * Correcting user handling in init script and config file (Closes:
+    #513263, #516348).
+  * Setting port to 8070.
+  * Also mentioning debug_mode and price_accuracy in config file
+    (Closes: #513264).
+  * Using correct rfc-2822 date formats in changelog.
+  * Rediffing shebang.patch.
+
+ -- Daniel Baumann <daniel@debian.org>  Sat, 30 May 2009 12:53:39 +0200
+
+openerp-server (5.0.0-3-1) unstable; urgency=low
+
+  * Merging upstream version 5.0.0-3.
+  * Improving init call in README.Debian, thanks to David Goodenough
+    <david.goodenough@btconnect.com>.
+  * Fixed wrapping in README.Debian.
+
+ -- Daniel Baumann <daniel@debian.org>  Sat, 14 Feb 2009 00:51:00 +0100
+
+openerp-server (5.0.0-2-1) unstable; urgency=low
+
+  * Merging upstream version 5.0.0-2 (Closes: #514920).
+  * Updating README.Debian.
+
+ -- Daniel Baumann <daniel@debian.org>  Sat, 14 Feb 2009 00:12:00 +0100
+
+openerp-server (5.0.0-1) unstable; urgency=low
+
+  * Merging upstream version 5.0.0.
+
+ -- Daniel Baumann <daniel@debian.org>  Sat, 07 Feb 2009 13:33:00 +0100
+
+openerp-server (5.0.0~rc3-1) unstable; urgency=low
+
+  * Adding note about initializing the database in README.Debian.
+  * Adding changelog for debian version 4.2.3.4-3.
+  * Merging upstream version 5.0.0~rc3.
+  * Using quilt rather than dpatch.
+  * Updating year in copyright file.
+  * Updating python-openssl depends.
+  * Updating lintian overrides.
+
+ -- Daniel Baumann <daniel@debian.org>  Fri, 09 Jan 2009 18:31:00 -0500
+
+openerp-server (5.0.0~rc2-1) unstable; urgency=low
+
+  * Updating python xml depends (Closes: #508911).
+  * Merging upstream version 5.0.0~rc2.
+  * New upstream no longer uses embedded copies of pydot, pychart and
+    reportlab (Closes: #468104).
+  * Rediffing shebang.dpatch.
+
+ -- Daniel Baumann <daniel@debian.org>  Thu, 25 Dec 2008 15:13:00 +0100
+
+openerp-server (5.0.0~rc1.1-2) unstable; urgency=low
+
+  * Adjusting sed call to correct path in /usr/bin/openerp-server.
+
+ -- Daniel Baumann <daniel@debian.org>  Wed, 17 Dec 2008 08:32:00 +0100
+
+openerp-server (5.0.0~rc1.1-1) unstable; urgency=low
+
+  * Merging upstream version 5.0.0~rc1.1.
+
+ -- Daniel Baumann <daniel@debian.org>  Tue, 16 Dec 2008 13:08:00 +0100
+
+openerp-server (5.0.0~rc1-1) unstable; urgency=low
+
+  * Merging upstream version 5.0.0~rc1.
+  * Removing openerp.dpatch, went upstream.
+  * Rediffing shebang.dpatch.
+  * Removing workaround for import_xml.rng, not needed anymore.
+
+ -- Daniel Baumann <daniel@debian.org>  Tue, 16 Dec 2008 12:51:00 +0100
+
+openerp-server (5.0.0~alpha-3) unstable; urgency=low
+
+  * Adding ghostscript, python-matplotlib, and python-pyopenssl to recommends.
+  * Correcting chown calls in postinst.
+  * Prefixing debhelper files with package name.
+  * Adding changelog for debian version 4.2.3.4-2.
+  * Dropping tinyerp-server transitional package, this allows to have both
+    packages available in unstable.
+
+ -- Daniel Baumann <daniel@debian.org>  Sun, 07 Dec 2008 20:13:00 +0100
+
+openerp-server (5.0.0~alpha-2) experimental; urgency=low
+
+  * Renaming tinyerp-server to new upstream openerp-server name.
+
+ -- Daniel Baumann <daniel@debian.org>  Sun, 09 Nov 2008 18:59:00 +0100
+
+tinyerp-server (5.0.0~alpha-1) experimental; urgency=low
+
+  * Merging upstream version 5.0.0~alpha.
+  * Rediffing autobuild.dpatch.
+  * Removing shebang.dpatch, not needed anymore.
+  * Removing python2.5.dpatch, not needed anymore.
+  * Rediffing openerp.dpatch.
+  * Rediffing migrate.dpatch.
+  * Not moving server to sbin anymore for the sake of consistency.
+  * Removing unneeded chmod call for tinyerp-server.py.
+  * Sorting build-depends, depends and recommends.
+  * Dropping /etc/default/tinyerp-server in favour of using
+    /etc/tinyerp-server.conf directly.
+  * Updating chmod call in rules to also cope with filenames that embedd
+    whitespaces.
+  * Adding patch to correct shebang in two addon files.
+  * Adding workaround for bug in setup.py that puts import_xml.rng into the
+    wrong location.
+  * Adding symlink for tinyerp_serverrc manpage to tinyerp-server.conf.
+  * Renaming everything except the package name itself from tinyerp-server to
+    openerp-server.
+  * Updating copyright file to current upstream.
+
+ -- Daniel Baumann <daniel@debian.org>  Sun, 09 Nov 2008 15:52:00 +0100
+
+tinyerp-server (4.2.3.4-3) unstable; urgency=high
+
+  * Updating python depends (Closes: #506615).
+  * Adding note about initializising the database in README.Debian
+    (Closes: #464557).
+
+ -- Daniel Baumann <daniel@debian.org>  Mon, 10 Nov 2008 12:40:00 +0100
+
+tinyerp-server (4.2.3.4-2) unstable; urgency=low
+
+  * Correcting chown calls in postinst.
+
+ -- Daniel Baumann <daniel@debian.org>  Mon, 10 Nov 2008 12:40:00 +0100
+
+tinyerp-server (4.2.3.4-1) unstable; urgency=low
+
+  * Merging upstream version 4.2.3.4.
+  * Upgrading package to debhelper 7.
+  * Upgrading package to standards 3.8.0.
+  * Updating homepage field in control file.
+  * Adding vcs fields in control file.
+  * Rewriting copyright file in machine-interpretable format.
+  * Using lintian debhelper to install lintian overrides.
+  * Removing bind-exit.dpatch, went upstream.
+  * Updating default database port.
+  * Adding logfile handling.
+  * Updating postresql recommends.
+  * Reordering and splitting out rules file into individual debhelper files.
+  * Applying some shell cosmetics to init and maintainer scripts.
+  * Adding patch to update homepage location of tinyerp.
+  * Setting ownership of addons directory in postinst (Closes: #487112).
+  * Adding patch from Brian DeRocher <brian@derocher.org> to fix sql syntax in
+    migrate script (Closes: #467517).
+
+ -- Daniel Baumann <daniel@debian.org>  Sun, 09 Nov 2008 09:11:00 +0100
+
+tinyerp-server (4.2.2-2) unstable; urgency=medium
+
+  * Readding depends to python-psycopg (Closes: #463079, #493374).
+  * Adding depends to python-tz (Closes: #482359).
+
+ -- Daniel Baumann <daniel@debian.org>  Sun, 03 Aug 2008 00:20:00 +0200
+
+tinyerp-server (4.2.2-1) unstable; urgency=low
+
+  * New upstream release (Closes: #477698).
+  * Dropping depends against python-xml (Closes: #468619).
+
+ -- Daniel Baumann <daniel@debian.org>  Sat, 26 Apr 2008 16:15:00 +0200
+
+tinyerp-server (4.2.1-1) unstable; urgency=low
+
+  * Maintainer upload from the Zuerich BSP.
+  * New upstream release.
+  * Bumping to new policy.
+  * Using new homepage field in control.
+  * Including documentation for migration and testing (Closes: #445464).
+  * Adjusting 04-bind-exit.dpatch to new upstream release.
+  * Added lintian overrides.
+  * Depending now on python-psycopg2, not python-psycopg anymore
+    (Closes: #445464).
+
+ -- Daniel Baumann <daniel@debian.org>  Sat, 12 Jan 2008 15:20:00 +0100
+
+tinyerp-server (4.2.0-1) unstable; urgency=medium
+
+  * New upstream release.
+
+ -- Daniel Baumann <daniel@debian.org>  Wed, 31 Oct 2007 21:31:00 +0100
+
+tinyerp-server (4.0.3-3) unstable; urgency=medium
+
+  * Setting database port to 5433 (Closes: #443626).
+  * Applied patch from Aldrin Martoq to make tinyerp-server compatible with
+    python 2.5.
+  * Applied patch from Luca Falavigna <dktrkranz@ubuntu.com> to fix exception
+    raised when address is already in use.
+
+ -- Daniel Baumann <daniel@debian.org>  Sat, 29 Sep 2007 17:07:00 +0200
+
+tinyerp-server (4.0.3-2) unstable; urgency=low
+
+  * Check for existence of deluser in postrm (Closes: #431532).
+
+ -- Daniel Baumann <daniel@debian.org>  Tue, 03 Jul 2007 11:01:00 +0200
+
+tinyerp-server (4.0.3-1) unstable; urgency=low
+
+  * New upstream release.
+  * Taking package back, Jean-Marc seems to be MIA.
+  * Changed wording of 'listen to all interfaces' paragraph in README.Debian,
+    thanks to Gerfried Fuchs <alfie@debian.org>.
+  * Added lsb header to init script.
+
+ -- Daniel Baumann <daniel@debian.org>  Fri, 01 Jun 2007 11:59:00 +0200
+
+tinyerp-server (4.0.2-3) unstable; urgency=low
+
+  * Setting maintainer to Jean-Marc, this time really :)
+
+ -- Daniel Baumann <daniel@debian.org>  Wed, 28 Mar 2007 21:48:00 +0100
+
+tinyerp-server (4.0.2-2) unstable; urgency=low
+
+  * Setting maintainer to Jean-Marc.
+
+ -- Daniel Baumann <daniel@debian.org>  Wed, 07 Feb 2007 13:41:00 +0100
+
+tinyerp-server (4.0.2-1) unstable; urgency=low
+
+  * New upstream release.
+  * Some minor cleanups.
+
+ -- Daniel Baumann <daniel@debian.org>  Thu, 18 Jan 2007 14:19:00 +0100
+
+tinyerp-server (4.0.1-1) unstable; urgency=low
+
+  * New upstream release.
+  * Removed 03-setup.dpatch, went upstream.
+
+ -- Daniel Baumann <daniel@debian.org>  Fri, 29 Dec 2006 01:03:00 +0100
+
+tinyerp-server (4.0.0-1) unstable; urgency=low
+
+  * New upstream release.
+  * Added patch to fix a typo in setup.py.
+
+ -- Daniel Baumann <daniel@debian.org>  Tue, 05 Dec 2006 17:43:00 +0100
+
+tinyerp-server (4.0.0~rc1-2) unstable; urgency=low
+
+  * Cleaned up build-depends.
+
+ -- Daniel Baumann <daniel@debian.org>  Tue, 05 Dec 2006 13:19:00 +0100
+
+tinyerp-server (4.0.0~rc1-1) unstable; urgency=low
+
+  * New upstream release.
+
+ -- Daniel Baumann <daniel@debian.org>  Tue, 05 Dec 2006 12:57:00 +0100
+
+tinyerp-server (3.5.0-1) experimental; urgency=low
+
+  * New upstream release.
+
+ -- Daniel Baumann <daniel@debian.org>  Mon, 23 Oct 2006 12:23:00 +0200
+
+tinyerp-server (3.4.2-1) unstable; urgency=low
+
+  * New upstream release.
+  * New email address.
+  * Complying with new python policy (Closes: #380973).
+  * Adjusted postgre depends (Closes: #376614).
+
+ -- Daniel Baumann <daniel@debian.org>  Mon, 16 Oct 2006 14:45:00 +0200
+
+tinyerp-server (3.3.0-1) unstable; urgency=low
+
+  * New upstream release (Closes: #369769):
+    - fixed installation script to install all needed files (Closes: #355224)
+  * Updated README.Debian (Closes: #352322, #360222, #360223).
+  * Set to architecture to all (Closes: #356962).
+
+ -- Daniel Baumann <daniel.baumann@panthera-systems.net>  Sun, 04 Jun 2006 00:50:00 +0100
+
+tinyerp-server (3.2.1-1) unstable; urgency=low
+
+  * New upstream release.
+
+ -- Daniel Baumann <daniel.baumann@panthera-systems.net>  Thu, 02 Feb 2006 09:44:00 +0100
+
+tinyerp-server (3.2.0-1) unstable; urgency=low
+
+  * New upstream release.
+  * Adjusted shellbang in bin/addons/base/ir/workflow/pydot/dot_parser.py.
+
+ -- Daniel Baumann <daniel.baumann@panthera-systems.net>  Tue, 24 Jan 2006 07:00:00 +0100
+
+tinyerp-server (3.1.99+3.2.0rc1-1) unstable; urgency=low
+
+  * New upstream release.
+
+ -- Daniel Baumann <daniel.baumann@panthera-systems.net>  Tue, 27 Dec 2005 20:00:00 +0100
+
+tinyerp-server (3.1.1+debian-1) unstable; urgency=low
+
+  * Initial release (Closes: #301510).
+  * Rebuild orig.tar.gz to remove unnecessary files in upstreams debian/.
+  * Added changelog from website.
+
+ -- Daniel Baumann <daniel.baumann@panthera-systems.net>  Sun, 16 Oct 2005 13:35:00 +0200
diff --git a/setup/debian/compat b/setup/debian/compat
new file mode 100644 (file)
index 0000000..7f8f011
--- /dev/null
@@ -0,0 +1 @@
+7
diff --git a/setup/debian/control b/setup/debian/control
new file mode 100644 (file)
index 0000000..ced6043
--- /dev/null
@@ -0,0 +1,65 @@
+Source: openerp
+Section: net
+Priority: optional
+Maintainer: OpenERP SA <al@openerp.com>
+Build-Depends: debhelper (>= 7.0.50~), python, rsync
+Standards-Version: 3.9.1
+Homepage: http://www.openerp.com/
+Vcs-Bzr: https://launchpad.net/openobject
+
+Package: openerp
+Section: net
+Architecture: all
+Depends:
+ ${misc:Depends},
+ adduser,
+ python,
+ postgresql-client,
+ python-dateutil,
+ python-decorator,
+ python-docutils,
+ python-feedparser,
+ python-gdata,
+ python-imaging,
+ python-jinja2,
+ python-ldap,
+ python-libxslt1,
+ python-lxml,
+ python-mako,
+ python-mock,
+ python-openid,
+ python-psutil,
+ python-psycopg2,
+ python-pybabel,
+ python-pychart,
+ python-pydot,
+ python-pyparsing,
+ python-reportlab,
+ python-requests,
+ python-simplejson,
+ python-tz,
+ python-unittest2,
+ python-vatnumber,
+ python-vobject,
+ python-webdav,
+ python-werkzeug,
+ python-xlwt,
+ python-yaml,
+ python-zsi
+Conflicts: tinyerp-server, openerp-server, openerp-web
+Replaces: tinyerp-server, openerp-server, openerp-web
+Recommends:
+ antiword,
+ graphviz,
+ ghostscript,
+ postgresql,
+ python-gevent,
+ poppler-utils
+Description: OpenERP Enterprise Resource Management
+ OpenERP, previously known as TinyERP, is a complete ERP and CRM. The main
+ features are accounting (analytic and financial), stock management, sales and
+ purchases management, tasks automation, marketing campaigns, help desk, POS,
+ etc. Technical features include a distributed server, flexible workflows, an
+ object database, a dynamic GUI, customizable reports, and an XML-RPC
+ interface.
+
diff --git a/setup/debian/copyright b/setup/debian/copyright
new file mode 100644 (file)
index 0000000..b596794
--- /dev/null
@@ -0,0 +1,24 @@
+Upstream-Contact: OpenERP <info@openerp.com>
+Upstream-Homepage: http://www.openerp.com/
+Maintainer-Contact: Debian OpenERP Maintainers <gnunet@lists.debian-maintainers.org>
+Maintainer-Homepage: http://www.odoo.com/
+
+Files: *
+Copyright: (C) 2004-2011 OpenERP SA. (www.openerp.com)
+License: GPL-3+
+ 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 <http://www.gnu.org/licenses/>.
+ .
+ On Debian systems, the complete text of the GNU General Public License
+ can be found in /usr/share/common-licenses/GPL-3 file.
+
diff --git a/setup/debian/openerp-server.conf b/setup/debian/openerp-server.conf
new file mode 100644 (file)
index 0000000..ead261e
--- /dev/null
@@ -0,0 +1,7 @@
+[options]
+; This is the password that allows database operations:
+; admin_passwd = admin
+db_host = False
+db_port = False
+db_user = openerp
+db_password = False
diff --git a/setup/debian/openerp.init b/setup/debian/openerp.init
new file mode 100644 (file)
index 0000000..98e6532
--- /dev/null
@@ -0,0 +1,62 @@
+#!/bin/sh
+
+### BEGIN INIT INFO
+# Provides:            openerp-server
+# Required-Start:      $remote_fs $syslog
+# Required-Stop:       $remote_fs $syslog
+# Should-Start:                $network
+# Should-Stop:         $network
+# Default-Start:       2 3 4 5
+# Default-Stop:                0 1 6
+# Short-Description:   Enterprise Resource Management software
+# Description:         Open ERP is a complete ERP and CRM software.
+### END INIT INFO
+
+PATH=/sbin:/bin:/usr/sbin:/usr/bin
+DAEMON=/usr/bin/openerp-server
+NAME=openerp-server
+DESC=openerp-server
+CONFIG=/etc/openerp/openerp-server.conf
+LOGFILE=/var/log/openerp/openerp-server.log
+USER=openerp
+
+test -x ${DAEMON} || exit 0
+
+set -e
+
+do_start () {
+    echo -n "Starting ${DESC}: "
+    start-stop-daemon --start --quiet --pidfile /var/run/${NAME}.pid --chuid ${USER} --background --make-pidfile --exec ${DAEMON} -- --config=${CONFIG} --logfile=${LOGFILE}
+    echo "${NAME}."
+}
+
+do_stop () {
+    echo -n "Stopping ${DESC}: "
+    start-stop-daemon --stop --quiet --pidfile /var/run/${NAME}.pid --oknodo
+    echo "${NAME}."
+}
+
+case "${1}" in
+    start)
+        do_start
+        ;;
+
+    stop)
+        do_stop
+        ;;
+
+    restart|force-reload)
+        echo -n "Restarting ${DESC}: "
+        do_stop
+        sleep 1
+        do_start
+        ;;
+
+    *)
+        N=/etc/init.d/${NAME}
+        echo "Usage: ${NAME} {start|stop|restart|force-reload}" >&2
+        exit 1
+        ;;
+esac
+
+exit 0
diff --git a/setup/debian/openerp.install b/setup/debian/openerp.install
new file mode 100644 (file)
index 0000000..94d4cfe
--- /dev/null
@@ -0,0 +1,2 @@
+debian/openerp-server.conf /etc/openerp
+README.md /usr/share/doc/openerp
diff --git a/setup/debian/openerp.logrotate b/setup/debian/openerp.logrotate
new file mode 100644 (file)
index 0000000..e1f7f80
--- /dev/null
@@ -0,0 +1,5 @@
+/var/log/openerp/*.log {
+    copytruncate
+    missingok
+    notifempty
+}
diff --git a/setup/debian/openerp.postinst b/setup/debian/openerp.postinst
new file mode 100644 (file)
index 0000000..2eccd51
--- /dev/null
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+set -e
+
+case "${1}" in
+    configure)
+        if ! getent passwd | grep -q "^openerp:"; then
+            adduser --system --no-create-home --quiet --gecos 'OpenERP' --group openerp
+        fi
+        # Register "openerp" as a postgres superuser 
+        su - postgres -c "createuser -s openerp" 2> /dev/null || true
+        chown openerp:openerp /etc/openerp/openerp-server.conf
+        chmod 0640 /etc/openerp/openerp-server.conf
+        # Creating log file
+        mkdir -p /var/log/openerp/
+        chown openerp:openerp /var/log/openerp
+        chmod 0750 /var/log/openerp
+        # Creating local storage directory
+        mkdir -p /var/lib/openerp/filestore
+        chown openerp:openerp -R /var/lib/openerp
+        # update-python-modules NOW otherwise invoke-rc.d openerp start will fail
+        update-python-modules -p openerp.public
+        ;;
+    *)
+        ;;
+esac
+
+#DEBHELPER#
+
+exit 0
diff --git a/setup/debian/openerp.postrm b/setup/debian/openerp.postrm
new file mode 100644 (file)
index 0000000..bc81ce9
--- /dev/null
@@ -0,0 +1,23 @@
+#!/bin/sh
+
+set -e
+
+case "${1}" in
+    remove)
+        deluser --quiet --system "openerp" || true
+        delgroup --quiet --system --only-if-empty "openerp" || true
+        find /var/lib/openerp -path '/var/lib/openerp/*' ! -path '/var/lib/openerp/filestore*' -delete
+        ;;
+
+    purge)
+        rm -rf /var/lib/openerp
+        ;;
+
+    upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
+        ;;
+
+esac
+
+#DEBHELPER#
+
+exit 0
diff --git a/setup/debian/rules b/setup/debian/rules
new file mode 100755 (executable)
index 0000000..57be1d0
--- /dev/null
@@ -0,0 +1,17 @@
+#!/usr/bin/make -f
+# vim:noet:
+
+%:
+       dh  ${@}
+
+override_dh_pysupport:
+       echo "rsync"
+       sh -c "[ -d debian/openerp/usr/lib/python2.6 ] && rsync -av openerp/ debian/openerp/usr/lib/python2.6/dist-packages/openerp/" || true
+       sh -c "[ -d debian/openerp/usr/lib/python2.7 ] && rsync -av openerp/ debian/openerp/usr/lib/python2.7/dist-packages/openerp/" || true
+       rm -Rf debian/openerp/usr/openerp debian/openerp/usr/lib/python2.6/dist-packages/tests debian/openerp/usr/lib/python2.7/dist-packages/tests
+       dh_pysupport
+       rm -Rf debian/openerp/usr/lib
+
+override_dh_installinit:
+       dh_installinit --update-rcd-params='defaults 21'
+
diff --git a/setup/debian/run_all_with_tests.sh b/setup/debian/run_all_with_tests.sh
new file mode 100755 (executable)
index 0000000..ef879db
--- /dev/null
@@ -0,0 +1,17 @@
+#!/usr/bin/env bash
+DATABASE=trunk
+dropdb ${DATABASE}
+REPOSITORIES=../../addons/trunk
+MODULES=`python -c "import os; print ','.join(list(set(os.listdir('${REPOSITORIES}')) - set(['document_ftp'])))"`
+createdb ${DATABASE}
+rm openerp-server.log
+./openerp-server \
+    --log-level=debug \
+    --addons=${REPOSITORIES},../../web/trunk/addons \
+    -d ${DATABASE} \
+    -i ${MODULES} \
+    --stop-after-init \
+    --no-xmlrpc \
+    --no-xmlrpcs \
+    --test-enable \
+    --logfile=openerp-server.log 
diff --git a/setup/package.py b/setup/package.py
new file mode 100755 (executable)
index 0000000..4567031
--- /dev/null
@@ -0,0 +1,264 @@
+#!/usr/bin/env python2
+import glob
+import os
+import optparse
+import signal
+import shutil
+import socket
+import subprocess
+import time
+import xmlrpclib
+
+#----------------------------------------------------------
+# Utils
+#----------------------------------------------------------
+join = os.path.join
+
+def mkdir(d):
+    if not os.path.isdir(d):
+        os.makedirs(d)
+
+def system(l,chdir=None):
+    print l
+    if chdir:
+        cwd = os.getcwd()
+        os.chdir(chdir)
+    if isinstance(l,list):
+        rc=os.spawnvp(os.P_WAIT, l[0], l)
+    elif isinstance(l,str):
+        tmp=['sh','-c',l]
+        rc=os.spawnvp(os.P_WAIT, tmp[0], tmp)
+    if chdir:
+        os.chdir(cwd)
+    return rc
+
+#----------------------------------------------------------
+# Stages
+#----------------------------------------------------------
+
+def rsync(o):
+    pre = 'rsync -a --exclude .bzr --exclude .git --exclude *.pyc'
+    cmd = pre.split(' ')
+    system(cmd + ['%s/'%o.root, o.build])
+    for i in glob.glob(join(o.build,'addons/*')):
+        shutil.move(i, join(o.build,'openerp/addons'))
+    for i in glob.glob(join(o.build,'setup/*')):
+        shutil.move(i, join(o.build))
+    open(join(o.build,'openerp','release.py'),'a').write('version = "%s-%s"\n'%(o.version,o.timestamp))
+
+def publish_move(o,srcs,dest):
+    for i in srcs:
+        shutil.move(i,dest)
+        # do the symlink
+        bn = os.path.basename(i)
+        latest = bn.replace(o.timestamp,'latest')
+        latest_full = join(dest,latest)
+        if bn != latest:
+            if os.path.islink(latest_full):
+                os.unlink(latest_full)
+            os.symlink(bn,latest_full)
+
+def sdist(o):
+    cmd=['python2','setup.py', '--quiet', 'sdist']
+    system(cmd,o.build)
+    #l = glob.glob(join(o.pkg,'*%s*.tar.gz'%o.timestamp))
+    #publish_move(o,l,join(o.pub,'src'))
+
+def bdist_rpm(o):
+    cmd=['python2','setup.py', '--quiet', 'bdist_rpm']
+    system(cmd,o.build)
+    #l = glob.glob(join(o.build,'dist/*%s-1*.rpm'%o.timestamp.replace('-','_')))
+    #publish_move(o,l,join(o.pub,'rpm'))
+
+def debian(o):
+    cmd=['sed','-i','1s/^.*$/openerp (%s-%s-1) testing; urgency=low/'%(o.version,o.timestamp),'debian/changelog']
+    system(cmd,o.build)
+    cmd=['dpkg-buildpackage','-rfakeroot']
+    system(cmd,o.build)
+
+    #l = glob.glob(join(o.pkg,'*_*%s-1*'%o.timestamp))
+    #publish_move(o,l,join(o.pub,'deb'))
+    #system('dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz',join(o.pub,'deb'))
+
+class KVM(object):
+    def __init__(self, o, image, ssh_key='', login='openerp'):
+        self.o = o
+        self.image = image
+        self.ssh_key = ssh_key
+        self.login = login
+
+    def timeout(self,signum,frame):
+        print "vm timeout kill",self.pid
+        os.kill(self.pid,15)
+
+    def start(self):
+        l="kvm -net nic -net user,hostfwd=tcp:127.0.0.1:10022-:22,hostfwd=tcp:127.0.0.1:18069-:8069,hostfwd=tcp:127.0.0.1:15432-:5432 -drive".split(" ")
+        #l.append('file=%s,if=virtio,index=0,boot=on,snapshot=on'%self.image)
+        l.append('file=%s,snapshot=on'%self.image)
+        #l.extend(['-vnc','127.0.0.1:1'])
+        l.append('-nographic')
+        print " ".join(l)
+        self.pid=os.spawnvp(os.P_NOWAIT, l[0], l)
+        time.sleep(10)
+        signal.alarm(2400)
+        signal.signal(signal.SIGALRM, self.timeout)
+        try:
+            self.run()
+        finally:
+            signal.signal(signal.SIGALRM, signal.SIG_DFL)
+            os.kill(self.pid,15)
+            time.sleep(10)
+
+    def ssh(self,cmd):
+        l=['ssh','-o','UserKnownHostsFile=/dev/null','-o','StrictHostKeyChecking=no','-p','10022','-i',self.ssh_key,'%s@127.0.0.1'%self.login,cmd]
+        system(l)
+
+    def rsync(self,args,options='--delete --exclude .bzrignore'):
+        cmd ='rsync -rt -e "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -p 10022 -i %s" %s %s' % (self.ssh_key, options, args)
+        system(cmd)
+
+    def run(self):
+        pass
+
+class KVMDebianTestTgz(KVM):
+    def run(self):
+        l = glob.glob(join(self.o.pkg,'*%s.tar.gz'%self.o.timestamp))
+        self.rsync('%s openerp@127.0.0.1:src/'%l[0])
+        script = """
+            tar xzvf src/*.tar.gz
+            cd openerp*
+            sudo python setup.py install
+            sudo su - postgres -c "createuser -s $USER"
+            createdb t1
+            openerp-server --stop-after-init -d t1 -i ` python -c "import os;print ','.join([i for i in os.listdir('openerp/addons') if i not in ['auth_openid','caldav','document_ftp','base_gengo', 'im', 'im_livechat'] and not i.startswith('hw_')]),;" `
+        """
+        self.ssh(script)
+        self.ssh('nohup openerp-server >/dev/null 2>&1 &')
+        time.sleep(5)
+        l = xmlrpclib.ServerProxy('http://127.0.0.1:18069/xmlrpc/object').execute('t1',1,'admin','ir.module.module','search',[('state','=','installed')])
+        i = len(l)
+        if i >= 190:
+            print "Tgz install: ",i," module installed"
+        else:
+            raise Exception("Tgz install failed only %s installed"%i)
+        time.sleep(2)
+
+class KVMDebianTestDeb(KVM):
+    def run(self):
+        l = glob.glob(join(self.o.pkg,'*%s*.deb'%self.o.timestamp))
+        self.rsync('%s openerp@127.0.0.1:deb/'%l[0])
+        script = """
+            sudo dpkg -i deb/*
+            sudo su - postgres -c "createuser -s $USER"
+            createdb t1
+            openerp-server --stop-after-init -d t1 -i base
+        """
+        #` python -c "import os;print ','.join([i for i in os.listdir('/usr/share/pyshared/openerp/addons') if i not in ['auth_openid','caldav','document_ftp', 'base_gengo'] and not i.startswith('hw_')]),;" `
+        self.ssh(script)
+        time.sleep(5)
+        l = xmlrpclib.ServerProxy('http://127.0.0.1:18069/xmlrpc/object').execute('t1',1,'admin','ir.module.module','search',[('state','=','installed')])
+        i = len(l)
+        if i >= 1:
+            print "Deb install: ",i," module installed"
+        else:
+            raise Exception("Tgz install failed only %s installed"%i)
+        time.sleep(2)
+
+class KVMWinBuildExe(KVM):
+    def run(self):
+        self.ssh("mkdir -p build")
+        self.rsync('%s/ %s@127.0.0.1:build/server/' % (self.o.build, self.login))
+        with open('windows/Makefile.version', 'w') as f:
+            f.write("VERSION=%s\n" % self.o.version_full)
+        with open('windows/Makefile.python', 'w') as f:
+            f.write("PYTHON_VERSION=%s\n" % self.o.vm_win_python_version.replace('.', ''))
+        self.rsync('windows/ %s@127.0.0.1:build/windows/' % self.login)
+        self.rsync('windows/wkhtmltopdf/ %s@127.0.0.1:build/server/win32/wkhtmltopdf/' % self.login)
+        self.ssh("cd build/windows;time make allinone;")
+        self.rsync('%s@127.0.0.1:build/windows/files/ %s/' % (self.login, self.o.pkg), '')
+        print "KVMWinBuildExe.run(): done"
+
+class KVMWinTestExe(KVM):
+    def run(self):
+        setuppath = "%s/openerp-allinone-setup-%s.exe" % (self.o.pkg, self.o.version_full)
+        setuplog = setuppath.replace('exe','log')
+        self.rsync('"%s" %s@127.0.0.1:' % (setuppath, self.login))
+        self.ssh("TEMP=/tmp ./openerp-allinone-setup-%s.exe /S" % self.o.version_full)
+        self.ssh('ls /cygdrive/c/"Program Files"/"OpenERP %s"/' % self.o.version_full)
+        self.rsync('"repo/lpopenerp_openobject-addons_7.0/" %s@127.0.0.1:/cygdrive/c/Program?Files/OpenERP?%s/Server/server/openerp/addons/' % (self.login, self.o.version_full), options='--exclude .bzrignore --exclude .bzr')
+        self.ssh('ls /cygdrive/c/"Program Files"/"OpenERP %s"/Server/server/openerp/addons/' % self.o.version_full)
+
+        self.ssh('PGPASSWORD=openpgpwd /cygdrive/c/"Program Files"/"OpenERP %s"/PostgreSQL/bin/createdb.exe -e -U openpg pack' % self.o.version_full)
+        self.ssh('net stop "PostgreSQL_For_OpenERP"')
+        self.ssh('net start "PostgreSQL_For_OpenERP"')
+        self.ssh('mkdir test-reports')
+
+        self.ssh('/cygdrive/c/"Program Files"/"OpenERP %s"/Server/server/openerp-server.exe -d pack -i base,report_webkit,product --stop-after-init --test-enable --log-level=test --test-report-directory=test-reports'%self.o.version_full)
+        self.rsync('%s@127.0.0.1:/cygdrive/c/Program?Files/OpenERP?%s/Server/server/openerp-server.log "%s"' % (self.login, self.o.version_full, setuplog))
+        self.rsync('%s@127.0.0.1:test-reports/ "%s"' % (self.login, self.o.pkg), options='')
+
+#----------------------------------------------------------
+# Options and Main
+#----------------------------------------------------------
+
+def options():
+    op = optparse.OptionParser()
+    timestamp = time.strftime("%Y%m%d-%H%M%S",time.gmtime())
+    root = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
+    build = "%s-%s" % (root, timestamp)
+
+    op.add_option("-b", "--build", default=build, help="build directory (%default)", metavar="DIR")
+    op.add_option("-p", "--pub", default=None, help="pub directory (%default)", metavar="DIR")
+    op.add_option("-v", "--version", default='7.0', help="version (%default)")
+
+    op.add_option("", "--vm-debian-image", default='/home/odoo/vm/debian6/debian6.vmdk', help="%default")
+    op.add_option("", "--vm-debian-ssh-key", default='/home/odoo/vm/debian6/debian6_id_rsa', help="%default")
+    op.add_option("", "--vm-debian-login", default='openerp', help="Debian login (%default)")
+
+    op.add_option("", "--vm-winxp-image", default='/home/odoo/vm/winxp26/winxp26.vdi', help="%default")
+    op.add_option("", "--vm-winxp-ssh-key", default='/home/odoo/vm/winxp26/id_rsa', help="%default")
+    op.add_option("", "--vm-win-login", default='Naresh', help="Windows login (%default)")
+    op.add_option("", "--vm-win-python-version", default='2.6', help="Windows Python version installed in the VM (default: %default)")
+
+    op.add_option("", "--no-debian", action="store_true", help="don't build the debian package")
+    op.add_option("", "--no-rpm", action="store_true", help="don't build the rpm package")
+    op.add_option("", "--no-tarball", action="store_true", help="don't build the tarball")
+    op.add_option("", "--no-windows", action="store_true", help="don't build the windows package")
+
+    (o, args) = op.parse_args()
+    # derive other options
+    o.root = root
+    o.timestamp = timestamp
+    o.version_full = '%s-%s'%(o.version,o.timestamp)
+    return o
+
+def main():
+    o = options()
+    rsync(o)
+    try:
+        # tgz
+        sdist(o)
+        if os.path.isfile(o.vm_debian_image):
+            KVMDebianTestTgz(o, o.vm_debian_image, o.vm_debian_ssh_key, o.vm_debian_login).start()
+
+        # deb
+        debian(o)
+        if os.path.isfile(o.vm_debian_image):
+            KVMDebianTestDeb(o, o.vm_debian_image, o.vm_debian_ssh_key, o.vm_debian_login).start()
+
+        # exe
+        if os.path.isfile(o.vm_winxp_image):
+            KVMWinBuildExe(o, o.vm_winxp_image, o.vm_winxp_ssh_key, o.vm_win_login).start()
+            KVMWinTestExe(o, o.vm_winxp_image, o.vm_winxp_ssh_key, o.vm_win_login).start()
+            l = glob.glob(join(o.pkg,'*all*%s*.exe'%o.timestamp))
+            publish_move(o,l,join(o.pub,'exe'))
+
+        # rpm
+        bdist_rpm(o)
+
+    finally:
+        #shutil.rmtree(o.build)
+        pass
+
+if __name__ == '__main__':
+    main()
diff --git a/setup/setup.cfg b/setup/setup.cfg
new file mode 100644 (file)
index 0000000..7693a84
--- /dev/null
@@ -0,0 +1,10 @@
+[general]
+
+[sdist]
+formats=gztar
+
+[bdist]
+formats=rpm
+
+[bdist_rpm]
+install_script=setup_rpm.sh
diff --git a/setup/setup.py b/setup/setup.py
new file mode 100644 (file)
index 0000000..f26abc2
--- /dev/null
@@ -0,0 +1,196 @@
+# -*- 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/>.
+#
+##############################################################################
+
+import glob, os, re, setuptools, sys
+from os.path import join
+
+# List all data files
+def data():
+    r = {}
+    for root, dirnames, filenames in os.walk('openerp'):
+        for filename in filenames:
+            if not re.match(r'.*(\.pyc|\.pyo|\~)$', filename):
+                r.setdefault(root, []).append(os.path.join(root, filename))
+
+    if os.name == 'nt':
+        r["Microsoft.VC90.CRT"] = glob.glob('C:\Microsoft.VC90.CRT\*.*')
+
+        import babel
+        # Add data, but also some .py files py2exe won't include automatically.
+        # TODO This should probably go under `packages`, instead of `data`,
+        # but this will work fine (especially since we don't use the ZIP file
+        # approach).
+        r["babel/localedata"] = glob.glob(os.path.join(os.path.dirname(babel.__file__), "localedata", '*'))
+        others = ['global.dat', 'numbers.py', 'support.py', 'plural.py']
+        r["babel"] = map(lambda f: os.path.join(os.path.dirname(babel.__file__), f), others)
+        others = ['frontend.py', 'mofile.py']
+        r["babel/messages"] = map(lambda f: os.path.join(os.path.dirname(babel.__file__), "messages", f), others)
+
+        import pytz
+        tzdir = os.path.dirname(pytz.__file__)
+        for root, _, filenames in os.walk(os.path.join(tzdir, "zoneinfo")):
+            base = os.path.join('pytz', root[len(tzdir) + 1:])
+            r[base] = [os.path.join(root, f) for f in filenames]
+
+        import docutils
+        dudir = os.path.dirname(docutils.__file__)
+        for root, _, filenames in os.walk(dudir):
+            base = os.path.join('docutils', root[len(dudir) + 1:])
+            r[base] = [os.path.join(root, f) for f in filenames if not f.endswith(('.py', '.pyc', '.pyo'))]
+
+    return r.items()
+
+def gen_manifest():
+    file_list="\n".join(data())
+    open('MANIFEST','w').write(file_list)
+
+if os.name == 'nt':
+    sys.path.append("C:\Microsoft.VC90.CRT")
+
+def py2exe_options():
+    if os.name == 'nt':
+        import py2exe
+        return {
+            "console" : [ { "script": "openerp-server", "icon_resources": [(1, join("install","openerp-icon.ico"))], },
+                          { "script": "openerp-gevent" },
+                          { "script": "odoo.py" },
+            ],
+            'options' : {
+                "py2exe": {
+                    "skip_archive": 1,
+                    "optimize": 0, # keep the assert running, because the integrated tests rely on them.
+                    "dist_dir": 'dist',
+                    "packages": [
+                        "HTMLParser",
+                        "PIL",
+                        "asynchat", "asyncore",
+                        "commands",
+                        "dateutil",
+                        "decimal",
+                        "docutils",
+                        "email",
+                        "encodings",
+                        "imaplib",
+                        "jinja2",
+                        "lxml", "lxml._elementpath", "lxml.builder", "lxml.etree", "lxml.objectify",
+                        "mako",
+                        "markupsafe",   # dependence of jinja2 and mako
+                        "mock",
+                        "openerp",
+                        "poplib",
+                        "psutil",
+                        "pychart",
+                        "pydot",
+                        "pyparsing",
+                        "pytz",
+                        "reportlab",
+                        "requests",
+                        "select",
+                        "simplejson",
+                        "smtplib",
+                        "uuid",
+                        "vatnumber",
+                        "vobject",
+                        "win32service", "win32serviceutil",
+                        "xlwt",
+                        "xml", "xml.dom",
+                        "yaml",
+                    ],
+                    "excludes" : ["Tkconstants","Tkinter","tcl"],
+                }
+            }
+        }
+    else:
+        return {}
+
+execfile(join(os.path.dirname(__file__), 'openerp', 'release.py'))
+
+# Notes for OpenERP developer on windows:
+#
+# To setup a windows developer evironement install python2.7 then pip and use
+# "pip install <depencey>" for every dependency listed below.
+#
+# Dependecies that requires DLLs are not installable with pip install, for
+# them we added comments with links where you can find the installers.
+#
+# OpenERP on windows also require the pywin32, the binary can be found at
+# http://pywin32.sf.net
+#
+# Both python2.7 32bits and 64bits are known to work.
+
+setuptools.setup(
+      name             = 'openerp',
+      version          = version,
+      description      = description,
+      long_description = long_desc,
+      url              = url,
+      author           = author,
+      author_email     = author_email,
+      classifiers      = filter(None, classifiers.split("\n")),
+      license          = license,
+      scripts          = ['openerp-server', 'openerp-gevent', 'odoo.py'],
+      data_files       = data(),
+      packages         = setuptools.find_packages(),
+      dependency_links = ['http://download.gna.org/pychart/'],
+      #include_package_data = True,
+      install_requires = [
+          'pychart', # not on pypi, use: pip install http://download.gna.org/pychart/PyChart-1.39.tar.gz
+          'babel >= 1.0',
+          'docutils',
+          'feedparser',
+          'gdata',
+          'gevent',
+          'psycogreen',
+          'Jinja2',
+          'lxml', # windows binary http://www.lfd.uci.edu/~gohlke/pythonlibs/
+          'mako',
+          'mock',
+          'pillow', # windows binary http://www.lfd.uci.edu/~gohlke/pythonlibs/
+          'psutil', # windows binary code.google.com/p/psutil/downloads/list
+          'psycopg2 >= 2.2',
+          'pydot',
+          'pyparsing < 2',
+          'pyserial',
+          'python-dateutil < 2',
+          'python-ldap', # optional
+          'python-openid',
+          'pytz',
+          'pyusb >= 1.0.0b1',
+          'pyyaml',
+          'qrcode',
+          'reportlab', # windows binary pypi.python.org/pypi/reportlab
+          'requests',
+          'simplejson',
+          'unittest2',
+          'vatnumber',
+          'vobject',
+          'werkzeug',
+          'xlwt',
+      ],
+      extras_require = {
+          'SSL' : ['pyopenssl'],
+      },
+      tests_require = ['unittest2', 'mock'],
+      **py2exe_options()
+)
+
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/setup/setup_rpm.sh b/setup/setup_rpm.sh
new file mode 100644 (file)
index 0000000..510655f
--- /dev/null
@@ -0,0 +1,18 @@
+#
+# This file is used by 'python setup.py bdist_rpm'
+# You should not execute/call this file yourself.
+#
+# This script is used as the 'install' part of the RPM .spec file.
+#
+# Need to overwrite the install-part of the RPM to append the
+# compression-suffix onto the filenames for the man-pages.
+#
+python -c "import compileall, os; compileall.compile_dir(os.path.join(os.environ['PWD'], 'doc'), force=True)"
+python -O -c "import compileall, os; compileall.compile_dir(os.path.join(os.environ['PWD'], 'doc'), force=True)"
+python setup.py install --optimize 1 --root=$RPM_BUILD_ROOT --record=INSTALLED_FILES
+
+SUFFIX=gz
+sed "s!\(/share/man/.*\)!\1.$SUFFIX!" -i INSTALLED_FILES
+
+# quote files with a space
+sed 's/\(.* .*\)/"\1"/' -i INSTALLED_FILES
diff --git a/setup/win32/OpenERPServerService.py b/setup/win32/OpenERPServerService.py
new file mode 100644 (file)
index 0000000..8b3c117
--- /dev/null
@@ -0,0 +1,82 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+#    OpenERP, Open Source Management Solution
+#    Copyright (C) 2004-2009 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/>.
+#
+##############################################################################
+
+import win32serviceutil
+import win32service
+import win32api
+import win32process
+import servicemanager
+
+import sys
+import subprocess
+import os
+
+try:
+    import meta
+except ImportError:
+    if hasattr(sys, 'frozen'):
+        raise
+    from setup import generate_files
+    generate_files()
+    import meta     # noqa
+
+class OpenERPServerService(win32serviceutil.ServiceFramework):
+    # required info
+    _svc_name_ = meta.nt_service_name
+    _svc_display_name_ = "%s %s" % (meta.description, meta.serie)
+
+    def __init__(self, args):
+        win32serviceutil.ServiceFramework.__init__(self, args)
+        # a reference to the server's process
+        self.terpprocess = None
+
+    def SvcStop(self):
+        # Before we do anything, tell the SCM we are starting the stop process.
+        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
+        # stop the running OpenERP Server: say it's a normal exit
+        win32api.TerminateProcess(int(self.terpprocess._handle), 0)
+        servicemanager.LogInfoMsg("OpenERP Server stopped correctly")
+
+    def StartTERP(self):
+        # The server finds now its configuration automatically on Windows
+        # We start the ERP Server as an independent process, but we keep its handle
+        # The server's binary must be one directory above the service's binary (when py2exe'd the python libraries shouldn' mix)
+        service_dir = os.path.dirname(sys.argv[0])
+        server_dir = os.path.split(service_dir)[0]
+        server_path = os.path.join(server_dir, 'server', 'openerp-server.exe')
+        self.terpprocess = subprocess.Popen([server_path], cwd=server_dir, creationflags=win32process.CREATE_NO_WINDOW)
+
+    def SvcDoRun(self):
+        self.StartTERP()
+        servicemanager.LogInfoMsg("OpenERP Server up and running")
+        # exit with same exit code as OpenERP process
+        sys.exit(self.terpprocess.wait())
+
+
+def option_handler(opts):
+    # configure the service to auto restart on failures...
+    subprocess.call(['sc', 'failure', meta.nt_service_name, 'reset=', '0', 'actions=', 'restart/0/restart/0/restart/0'])
+
+if __name__ == '__main__':
+    # Do with the service whatever option is passed in the command line
+    win32serviceutil.HandleCommandLine(OpenERPServerService, customOptionHandler=option_handler)
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/setup/win32/setup.py b/setup/win32/setup.py
new file mode 100644 (file)
index 0000000..b0b36b5
--- /dev/null
@@ -0,0 +1,71 @@
+# -*- 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/>.
+#
+##############################################################################
+
+import os
+import glob
+from distutils.core import setup
+import py2exe
+
+
+meta = {}
+execfile(os.path.join(os.path.dirname(__file__), '..', 'openerp', 'release.py'), meta)
+
+def generate_files():
+    actions = {
+        'start': ['stop', 'start'],
+        'stop': ['stop'],
+    }
+
+    files = []
+    if os.name == 'nt':
+        files.append(("Microsoft.VC90.CRT", glob.glob('C:\Microsoft.VC90.CRT\*.*')))
+    for action, steps in actions.items():
+        fname = action + '.bat'
+        files.append(fname)
+        with open(fname, 'w') as fp:
+            fp.write('@PATH=%WINDIR%\system32;%WINDIR%;%WINDIR%\System32\Wbem;.\n')
+            for step in steps:
+                fp.write('@net %s %s\n' % (step, meta['nt_service_name']))
+
+    files.append('meta.py')
+    with open('meta.py', 'w') as fp:
+        for m in 'description serie nt_service_name'.split():
+            fp.write("%s = %r\n" % (m, meta[m],))
+
+    return files
+
+excludes = "Tkconstants Tkinter tcl _imagingtk PIL._imagingtk ImageTk PIL.ImageTk FixTk".split()
+
+setup(service      = ["OpenERPServerService"],
+      version      = meta['version'],
+      license      = meta['license'],
+      url          = meta['url'],
+      author       = meta['author'],
+      author_email = meta['author_email'],
+      data_files   = generate_files(),
+      options      = {"py2exe": {
+                        "excludes": excludes,
+                        "skip_archive": 1,
+                        "optimize": 2,
+                     }},
+      )
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/setup/windows/LICENSE b/setup/windows/LICENSE
new file mode 100644 (file)
index 0000000..1faf49e
--- /dev/null
@@ -0,0 +1,189 @@
+GNU GENERAL PUBLIC LICENSE
+
+Version 3, 29 June 2007
+
+Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/>
+
+Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
+Preamble
+
+The GNU General Public License is a free, copyleft license for software and other kinds of works.
+
+The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too.
+
+When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.
+
+To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others.
+
+For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
+
+Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.
+
+For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions.
+
+Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users.
+
+Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.
+
+The precise terms and conditions for copying, distribution and modification follow.
+TERMS AND CONDITIONS
+0. Definitions.
+
+\93This License\94 refers to version 3 of the GNU General Public License.
+
+\93Copyright\94 also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.
+
+\93The Program\94 refers to any copyrightable work licensed under this License. Each licensee is addressed as \93you\94\93Licensees\94 and \93recipients\94 may be individuals or organizations.
+
+To \93modify\94 a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a \93modified version\94 of the earlier work or a work \93based on\94 the earlier work.
+
+A \93covered work\94 means either the unmodified Program or a work based on the Program.
+
+To \93propagate\94 a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.
+
+To \93convey\94 a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.
+
+An interactive user interface displays \93Appropriate Legal Notices\94 to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.
+1. Source Code.
+
+The \93source code\94 for a work means the preferred form of the work for making modifications to it. \93Object code\94 means any non-source form of a work.
+
+A \93Standard Interface\94 means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.
+
+The \93System Libraries\94 of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A \93Major Component\94, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.
+
+The \93Corresponding Source\94 for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work.
+
+The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.
+
+The Corresponding Source for a work in source code form is that same work.
+2. Basic Permissions.
+
+All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.
+
+You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.
+
+Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.
+3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.
+
+When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures.
+4. Conveying Verbatim Copies.
+
+You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.
+
+You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.
+5. Conveying Modified Source Versions.
+
+You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:
+
+    * a) The work must carry prominent notices stating that you modified it, and giving a relevant date.
+    * b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to \93keep intact all notices\94.
+    * c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.
+    * d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.
+
+A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an \93aggregate\94 if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.
+6. Conveying Non-Source Forms.
+
+You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:
+
+    * a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.
+    * b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge.
+    * c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.
+    * d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements.
+    * e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.
+
+A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.
+
+A \93User Product\94 is either (1) a \93consumer product\94, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, \93normally used\94 refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product.
+
+\93Installation Information\94 for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.
+
+If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).
+
+The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.
+
+Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.
+7. Additional Terms.
+
+\93Additional permissions\94 are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions.
+
+When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.
+
+Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:
+
+    * a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or
+    * b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or
+    * c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or
+    * d) Limiting the use for publicity purposes of names of licensors or authors of the material; or
+    * e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or
+    * f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.
+
+All other non-permissive additional terms are considered \93further restrictions\94 within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.
+
+If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.
+
+Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.
+8. Termination.
+
+You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).
+
+However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.
+
+Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.
+9. Acceptance Not Required for Having Copies.
+
+You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.
+10. Automatic Licensing of Downstream Recipients.
+
+Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.
+
+An \93entity transaction\94 is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.
+
+You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.
+11. Patents.
+
+A \93contributor\94 is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's \93contributor version\94.
+
+A contributor's \93essential patent claims\94 are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, \93control\94 includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.
+
+Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.
+
+In the following three paragraphs, a \93patent license\94 is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To \93grant\94 such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.
+
+If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. \93Knowingly relying\94 means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid.
+
+If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.
+
+A patent license is \93discriminatory\94 if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.
+
+Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.
+12. No Surrender of Others' Freedom.
+
+If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.
+13. Use with the GNU Affero General Public License.
+
+Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such.
+14. Revised Versions of this License.
+
+The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License \93or any later version\94 applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation.
+
+If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.
+
+Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.
+15. Disclaimer of Warranty.
+
+THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \93AS IS\94 WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+16. Limitation of Liability.
+
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+17. Interpretation of Sections 15 and 16.
+
+If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.
+
+END OF TERMS AND CONDITIONS
diff --git a/setup/windows/License.rtf b/setup/windows/License.rtf
new file mode 100644 (file)
index 0000000..2518440
--- /dev/null
@@ -0,0 +1,192 @@
+{\rtf1\ansi\ansicpg1252\deff0{\fonttbl{\f0\fswiss\fcharset0 Arial;}}\r
+{\*\generator Msftedit 5.41.15.1515;}\viewkind4\uc1\pard\lang1033\f0\fs20 GNU GENERAL PUBLIC LICENSE\par\r
+\par\r
+Version 3, 29 June 2007\par\r
+\par\r
+Copyright \'a9 2007 Free Software Foundation, Inc. <http://fsf.org/>\par\r
+\par\r
+Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.\par\r
+Preamble\par\r
+\par\r
+The GNU General Public License is a free, copyleft license for software and other kinds of works.\par\r
+\par\r
+The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too.\par\r
+\par\r
+When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.\par\r
+\par\r
+To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others.\par\r
+\par\r
+For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.\par\r
+\par\r
+Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.\par\r
+\par\r
+For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions.\par\r
+\par\r
+Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users.\par\r
+\par\r
+Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.\par\r
+\par\r
+The precise terms and conditions for copying, distribution and modification follow.\par\r
+TERMS AND CONDITIONS\par\r
+0. Definitions.\par\r
+\par\r
+\ldblquote This License\rdblquote  refers to version 3 of the GNU General Public License.\par\r
+\par\r
+\ldblquote Copyright\rdblquote  also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.\par\r
+\par\r
+\ldblquote The Program\rdblquote  refers to any copyrightable work licensed under this License. Each licensee is addressed as \ldblquote you\rdblquote . \ldblquote Licensees\rdblquote  and \ldblquote recipients\rdblquote  may be individuals or organizations.\par\r
+\par\r
+To \ldblquote modify\rdblquote  a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a \ldblquote modified version\rdblquote  of the earlier work or a work \ldblquote based on\rdblquote  the earlier work.\par\r
+\par\r
+A \ldblquote covered work\rdblquote  means either the unmodified Program or a work based on the Program.\par\r
+\par\r
+To \ldblquote propagate\rdblquote  a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.\par\r
+\par\r
+To \ldblquote convey\rdblquote  a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.\par\r
+\par\r
+An interactive user interface displays \ldblquote Appropriate Legal Notices\rdblquote  to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.\par\r
+1. Source Code.\par\r
+\par\r
+The \ldblquote source code\rdblquote  for a work means the preferred form of the work for making modifications to it. \ldblquote Object code\rdblquote  means any non-source form of a work.\par\r
+\par\r
+A \ldblquote Standard Interface\rdblquote  means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.\par\r
+\par\r
+The \ldblquote System Libraries\rdblquote  of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A \ldblquote Major Component\rdblquote , in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.\par\r
+\par\r
+The \ldblquote Corresponding Source\rdblquote  for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work.\par\r
+\par\r
+The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.\par\r
+\par\r
+The Corresponding Source for a work in source code form is that same work.\par\r
+2. Basic Permissions.\par\r
+\par\r
+All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.\par\r
+\par\r
+You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.\par\r
+\par\r
+Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.\par\r
+3. Protecting Users' Legal Rights From Anti-Circumvention Law.\par\r
+\par\r
+No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.\par\r
+\par\r
+When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures.\par\r
+4. Conveying Verbatim Copies.\par\r
+\par\r
+You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.\par\r
+\par\r
+You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.\par\r
+5. Conveying Modified Source Versions.\par\r
+\par\r
+You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:\par\r
+\par\r
+    * a) The work must carry prominent notices stating that you modified it, and giving a relevant date.\par\r
+    * b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to \ldblquote keep intact all notices\rdblquote .\par\r
+    * c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.\par\r
+    * d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.\par\r
+\par\r
+A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an \ldblquote aggregate\rdblquote  if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.\par\r
+6. Conveying Non-Source Forms.\par\r
+\par\r
+You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:\par\r
+\par\r
+    * a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.\par\r
+    * b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge.\par\r
+    * c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.\par\r
+    * d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements.\par\r
+    * e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.\par\r
+\par\r
+A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.\par\r
+\par\r
+A \ldblquote User Product\rdblquote  is either (1) a \ldblquote consumer product\rdblquote , which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, \ldblquote normally used\rdblquote  refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product.\par\r
+\par\r
+\ldblquote Installation Information\rdblquote  for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.\par\r
+\par\r
+If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).\par\r
+\par\r
+The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.\par\r
+\par\r
+Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.\par\r
+7. Additional Terms.\par\r
+\par\r
+\ldblquote Additional permissions\rdblquote  are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions.\par\r
+\par\r
+When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.\par\r
+\par\r
+Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:\par\r
+\par\r
+    * a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or\par\r
+    * b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or\par\r
+    * c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or\par\r
+    * d) Limiting the use for publicity purposes of names of licensors or authors of the material; or\par\r
+    * e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or\par\r
+    * f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.\par\r
+\par\r
+All other non-permissive additional terms are considered \ldblquote further restrictions\rdblquote  within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.\par\r
+\par\r
+If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.\par\r
+\par\r
+Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.\par\r
+8. Termination.\par\r
+\par\r
+You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).\par\r
+\par\r
+However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.\par\r
+\par\r
+Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.\par\r
+\par\r
+Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.\par\r
+9. Acceptance Not Required for Having Copies.\par\r
+\par\r
+You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.\par\r
+10. Automatic Licensing of Downstream Recipients.\par\r
+\par\r
+Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.\par\r
+\par\r
+An \ldblquote entity transaction\rdblquote  is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.\par\r
+\par\r
+You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.\par\r
+11. Patents.\par\r
+\par\r
+A \ldblquote contributor\rdblquote  is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's \ldblquote contributor version\rdblquote .\par\r
+\par\r
+A contributor's \ldblquote essential patent claims\rdblquote  are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, \ldblquote control\rdblquote  includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.\par\r
+\par\r
+Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.\par\r
+\par\r
+In the following three paragraphs, a \ldblquote patent license\rdblquote  is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To \ldblquote grant\rdblquote  such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.\par\r
+\par\r
+If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. \ldblquote Knowingly relying\rdblquote  means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid.\par\r
+\par\r
+If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.\par\r
+\par\r
+A patent license is \ldblquote discriminatory\rdblquote  if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.\par\r
+\par\r
+Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.\par\r
+12. No Surrender of Others' Freedom.\par\r
+\par\r
+If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.\par\r
+13. Use with the GNU Affero General Public License.\par\r
+\par\r
+Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such.\par\r
+14. Revised Versions of this License.\par\r
+\par\r
+The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.\par\r
+\par\r
+Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License \ldblquote or any later version\rdblquote  applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation.\par\r
+\par\r
+If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.\par\r
+\par\r
+Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.\par\r
+15. Disclaimer of Warranty.\par\r
+\par\r
+THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \ldblquote AS IS\rdblquote  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\par\r
+16. Limitation of Liability.\par\r
+\par\r
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\par\r
+17. Interpretation of Sections 15 and 16.\par\r
+\par\r
+If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.\par\r
+\par\r
+END OF TERMS AND CONDITIONS\par\r
+}\r
+\0
\ No newline at end of file
diff --git a/setup/windows/Makefile b/setup/windows/Makefile
new file mode 100644 (file)
index 0000000..603951b
--- /dev/null
@@ -0,0 +1,37 @@
+include Makefile.version
+include Makefile.python
+
+SERVER_DIRECTORY=../server
+FILES_DIRECTORY=files
+
+LAUNCH_PY2EXE=/cygdrive/c/python${PYTHON_VERSION}/python.exe setup.py py2exe
+
+MAKENSIS_ARGUMENTS=/DVERSION=$(VERSION)
+
+LAUNCH_MAKENSIS=/cygdrive/c/cygwin/makensis $(MAKENSIS_ARGUMENTS) setup.nsi
+
+default: allinone
+
+clean: server_clean
+       rm -rf $(FILES_DIRECTORY)/*.exe
+       rm -rf *.exe
+
+server_clean:
+       rm -rf $(SERVER_DIRECTORY)/dist 
+       rm -rf $(SERVER_DIRECTORY)/build
+       rm -rf $(SERVER_DIRECTORY)/win32/dist 
+       rm -rf $(SERVER_DIRECTORY)/win32/build
+       rm -rf $(SERVER_DIRECTORY)/*.exe
+       rm -rf $(SERVER_DIRECTORY)/.cyg*
+
+server: server_clean
+       (cd $(SERVER_DIRECTORY)/win32 && $(LAUNCH_PY2EXE))
+       (cd $(SERVER_DIRECTORY) && $(LAUNCH_PY2EXE))
+       rm -rf `/usr/bin/find ${SERVER_DIRECTORY}/dist/openerp/addons -maxdepth 1 -mindepth 1 -not -name "web_*" -and -not -name "base" -and -not -name "web" -type d | xargs rm -rf`
+       (cd $(SERVER_DIRECTORY) && $(LAUNCH_MAKENSIS))
+       cp $(SERVER_DIRECTORY)/openerp-*.exe $(FILES_DIRECTORY)/openerp-server-setup-$(VERSION).exe
+
+allinone: server
+       $(LAUNCH_MAKENSIS)
+       cp ./openerp-*.exe $(FILES_DIRECTORY)/openerp-allinone-setup-$(VERSION).exe
+
diff --git a/setup/windows/openerp-header.bmp b/setup/windows/openerp-header.bmp
new file mode 100644 (file)
index 0000000..61226b9
Binary files /dev/null and b/setup/windows/openerp-header.bmp differ
diff --git a/setup/windows/openerp-header.png b/setup/windows/openerp-header.png
new file mode 100644 (file)
index 0000000..22c1df4
Binary files /dev/null and b/setup/windows/openerp-header.png differ
diff --git a/setup/windows/openerp-icon.ico b/setup/windows/openerp-icon.ico
new file mode 100644 (file)
index 0000000..89ed393
Binary files /dev/null and b/setup/windows/openerp-icon.ico differ
diff --git a/setup/windows/openerp-icon.png b/setup/windows/openerp-icon.png
new file mode 100644 (file)
index 0000000..9057d12
Binary files /dev/null and b/setup/windows/openerp-icon.png differ
diff --git a/setup/windows/openerp-intro.bmp b/setup/windows/openerp-intro.bmp
new file mode 100644 (file)
index 0000000..a7e21ab
Binary files /dev/null and b/setup/windows/openerp-intro.bmp differ
diff --git a/setup/windows/openerp-slogan.bmp b/setup/windows/openerp-slogan.bmp
new file mode 100644 (file)
index 0000000..a3cffd1
Binary files /dev/null and b/setup/windows/openerp-slogan.bmp differ
diff --git a/setup/windows/openerp.ico b/setup/windows/openerp.ico
new file mode 100644 (file)
index 0000000..cde3e96
Binary files /dev/null and b/setup/windows/openerp.ico differ
diff --git a/setup/windows/openerp.png b/setup/windows/openerp.png
new file mode 100644 (file)
index 0000000..20da496
Binary files /dev/null and b/setup/windows/openerp.png differ
diff --git a/setup/windows/pg_hba.conf b/setup/windows/pg_hba.conf
new file mode 100644 (file)
index 0000000..74be691
--- /dev/null
@@ -0,0 +1,73 @@
+# PostgreSQL Client Authentication Configuration File\r
+# ===================================================\r
+#\r
+# Refer to the PostgreSQL Administrator's Guide, chapter "Client\r
+# Authentication" for a complete description.  A short synopsis\r
+# follows.\r
+#\r
+# This file controls: which hosts are allowed to connect, how clients\r
+# are authenticated, which PostgreSQL user names they can use, which\r
+# databases they can access.  Records take one of these forms:\r
+#\r
+# local      DATABASE  USER  METHOD  [OPTION]\r
+# host       DATABASE  USER  CIDR-ADDRESS  METHOD  [OPTION]\r
+# hostssl    DATABASE  USER  CIDR-ADDRESS  METHOD  [OPTION]\r
+# hostnossl  DATABASE  USER  CIDR-ADDRESS  METHOD  [OPTION]\r
+#\r
+# (The uppercase items must be replaced by actual values.)\r
+#\r
+# The first field is the connection type: "local" is a Unix-domain socket,\r
+# "host" is either a plain or SSL-encrypted TCP/IP socket, "hostssl" is an\r
+# SSL-encrypted TCP/IP socket, and "hostnossl" is a plain TCP/IP socket.\r
+#\r
+# DATABASE can be "all", "sameuser", "samerole", a database name, or\r
+# a comma-separated list thereof.\r
+#\r
+# USER can be "all", a user name, a group name prefixed with "+", or\r
+# a comma-separated list thereof.  In both the DATABASE and USER fields\r
+# you can also write a file name prefixed with "@" to include names from\r
+# a separate file.\r
+#\r
+# CIDR-ADDRESS specifies the set of hosts the record matches.\r
+# It is made up of an IP address and a CIDR mask that is an integer\r
+# (between 0 and 32 (IPv4) or 128 (IPv6) inclusive) that specifies\r
+# the number of significant bits in the mask.  Alternatively, you can write\r
+# an IP address and netmask in separate columns to specify the set of hosts.\r
+#\r
+# METHOD can be "trust", "reject", "md5", "crypt", "password",\r
+# "krb5", "ident", or "pam".  Note that "password" sends passwords\r
+# in clear text; "md5" is preferred since it sends encrypted passwords.\r
+#\r
+# OPTION is the ident map or the name of the PAM service, depending on METHOD.\r
+#\r
+# Database and user names containing spaces, commas, quotes and other special\r
+# characters must be quoted. Quoting one of the keywords "all", "sameuser" or\r
+# "samerole" makes the name lose its special character, and just match a\r
+# database or username with that name.\r
+#\r
+# This file is read on server startup and when the postmaster receives\r
+# a SIGHUP signal.  If you edit the file on a running system, you have\r
+# to SIGHUP the postmaster for the changes to take effect.  You can use\r
+# "pg_ctl reload" to do that.\r
+\r
+# Put your actual configuration here\r
+# ----------------------------------\r
+#\r
+# If you want to allow non-local connections, you need to add more\r
+# "host" records. In that case you will also need to make PostgreSQL listen\r
+# on a non-local interface via the listen_addresses configuration parameter,\r
+# or via the -i or -h command line switches.\r
+#\r
+\r
+\r
+\r
+# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD\r
+\r
+# IPv4 local connections:\r
+host    all         all         127.0.0.1/32          trust\r
+# IPv6 local connections:\r
+#host    all         all         ::1/128               md5\r
+\r
+# foreign connections\r
+host   all     all             0.0.0.0/0                       md5\r
+host  all   all         ::/0                    md5\r
diff --git a/setup/windows/postgresql.conf b/setup/windows/postgresql.conf
new file mode 100644 (file)
index 0000000..7255b23
--- /dev/null
@@ -0,0 +1,493 @@
+# -----------------------------\r
+# PostgreSQL configuration file\r
+# -----------------------------\r
+#\r
+# This file consists of lines of the form:\r
+#\r
+#   name = value\r
+#\r
+# (The "=" is optional.)  Whitespace may be used.  Comments are introduced with\r
+# "#" anywhere on a line.  The complete list of parameter names and allowed\r
+# values can be found in the PostgreSQL documentation.\r
+#\r
+# The commented-out settings shown in this file represent the default values.\r
+# Re-commenting a setting is NOT sufficient to revert it to the default value;\r
+# you need to reload the server.\r
+#\r
+# This file is read on server startup and when the server receives a SIGHUP\r
+# signal.  If you edit the file on a running system, you have to SIGHUP the\r
+# server for the changes to take effect, or use "pg_ctl reload".  Some\r
+# parameters, which are marked below, require a server shutdown and restart to\r
+# take effect.\r
+#\r
+# Any parameter can also be given as a command-line option to the server, e.g.,\r
+# "postgres -c log_connections=on".  Some paramters can be changed at run time\r
+# with the "SET" SQL command.\r
+#\r
+# Memory units:  kB = kilobytes MB = megabytes GB = gigabytes\r
+# Time units:    ms = milliseconds s = seconds min = minutes h = hours d = days\r
+\r
+\r
+#------------------------------------------------------------------------------\r
+# FILE LOCATIONS\r
+#------------------------------------------------------------------------------\r
+\r
+# The default values of these variables are driven from the -D command-line\r
+# option or PGDATA environment variable, represented here as ConfigDir.\r
+\r
+#data_directory = 'ConfigDir'          # use data in another directory\r
+                                       # (change requires restart)\r
+#hba_file = 'ConfigDir/pg_hba.conf'    # host-based authentication file\r
+                                       # (change requires restart)\r
+#ident_file = 'ConfigDir/pg_ident.conf'        # ident configuration file\r
+                                       # (change requires restart)\r
+\r
+# If external_pid_file is not explicitly set, no extra PID file is written.\r
+#external_pid_file = '(none)'          # write an extra PID file\r
+                                       # (change requires restart)\r
+\r
+\r
+#------------------------------------------------------------------------------\r
+# CONNECTIONS AND AUTHENTICATION\r
+#------------------------------------------------------------------------------\r
+\r
+# - Connection Settings -\r
+\r
+listen_addresses = '*'         # what IP address(es) to listen on;\r
+                                       # comma-separated list of addresses;\r
+                                       # defaults to 'localhost', '*' = all\r
+                                       # (change requires restart)\r
+port = 5432                            # (change requires restart)\r
+max_connections = 100                  # (change requires restart)\r
+# Note:  Increasing max_connections costs ~400 bytes of shared memory per \r
+# connection slot, plus lock space (see max_locks_per_transaction).  You might\r
+# also need to raise shared_buffers to support more connections.\r
+#superuser_reserved_connections = 3    # (change requires restart)\r
+#unix_socket_directory = ''            # (change requires restart)\r
+#unix_socket_group = ''                        # (change requires restart)\r
+#unix_socket_permissions = 0777                # begin with 0 to use octal notation\r
+                                       # (change requires restart)\r
+#bonjour_name = ''                     # defaults to the computer name\r
+                                       # (change requires restart)\r
+\r
+# - Security and Authentication -\r
+\r
+#authentication_timeout = 1min         # 1s-600s\r
+#ssl = off                             # (change requires restart)\r
+#ssl_ciphers = 'ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH'     # allowed SSL ciphers\r
+                                       # (change requires restart)\r
+#password_encryption = on\r
+#db_user_namespace = off\r
+\r
+# Kerberos and GSSAPI\r
+#krb_server_keyfile = ''               # (change requires restart)\r
+#krb_srvname = 'postgres'              # (change requires restart, Kerberos only)\r
+#krb_server_hostname = ''              # empty string matches any keytab entry\r
+                                       # (change requires restart, Kerberos only)\r
+#krb_caseins_users = off               # (change requires restart)\r
+#krb_realm = ''                        # (change requires restart)\r
+\r
+# - TCP Keepalives -\r
+# see "man 7 tcp" for details\r
+\r
+#tcp_keepalives_idle = 0               # TCP_KEEPIDLE, in seconds;\r
+                                       # 0 selects the system default\r
+#tcp_keepalives_interval = 0           # TCP_KEEPINTVL, in seconds;\r
+                                       # 0 selects the system default\r
+#tcp_keepalives_count = 0              # TCP_KEEPCNT;\r
+                                       # 0 selects the system default\r
+\r
+\r
+#------------------------------------------------------------------------------\r
+# RESOURCE USAGE (except WAL)\r
+#------------------------------------------------------------------------------\r
+\r
+# - Memory -\r
+\r
+shared_buffers = 32MB                  # min 128kB or max_connections*16kB\r
+                                       # (change requires restart)\r
+#temp_buffers = 8MB                    # min 800kB\r
+#max_prepared_transactions = 5         # can be 0 or more\r
+                                       # (change requires restart)\r
+# Note:  Increasing max_prepared_transactions costs ~600 bytes of shared memory\r
+# per transaction slot, plus lock space (see max_locks_per_transaction).\r
+#work_mem = 1MB                                # min 64kB\r
+#maintenance_work_mem = 16MB           # min 1MB\r
+#max_stack_depth = 2MB                 # min 100kB\r
+\r
+# - Free Space Map -\r
+\r
+max_fsm_pages = 204800                 # min max_fsm_relations*16, 6 bytes each\r
+                                       # (change requires restart)\r
+#max_fsm_relations = 1000              # min 100, ~70 bytes each\r
+                                       # (change requires restart)\r
+\r
+# - Kernel Resource Usage -\r
+\r
+#max_files_per_process = 1000          # min 25\r
+                                       # (change requires restart)\r
+shared_preload_libraries = '$libdir/plugins/plugin_debugger.dll'               # (change requires restart)\r
+\r
+# - Cost-Based Vacuum Delay -\r
+\r
+#vacuum_cost_delay = 0                 # 0-1000 milliseconds\r
+#vacuum_cost_page_hit = 1              # 0-10000 credits\r
+#vacuum_cost_page_miss = 10            # 0-10000 credits\r
+#vacuum_cost_page_dirty = 20           # 0-10000 credits\r
+#vacuum_cost_limit = 200               # 1-10000 credits\r
+\r
+# - Background Writer -\r
+\r
+#bgwriter_delay = 200ms                        # 10-10000ms between rounds\r
+#bgwriter_lru_maxpages = 100           # 0-1000 max buffers written/round\r
+#bgwriter_lru_multiplier = 2.0         # 0-10.0 multipler on buffers scanned/round\r
+\r
+\r
+#------------------------------------------------------------------------------\r
+# WRITE AHEAD LOG\r
+#------------------------------------------------------------------------------\r
+\r
+# - Settings -\r
+\r
+#fsync = on                            # turns forced synchronization on or off\r
+#synchronous_commit = on               # immediate fsync at commit\r
+#wal_sync_method = fsync               # the default is the first option \r
+                                       # supported by the operating system:\r
+                                       #   open_datasync\r
+                                       #   fdatasync\r
+                                       #   fsync\r
+                                       #   fsync_writethrough\r
+                                       #   open_sync\r
+#full_page_writes = on                 # recover from partial page writes\r
+#wal_buffers = 64kB                    # min 32kB\r
+                                       # (change requires restart)\r
+#wal_writer_delay = 200ms              # 1-10000 milliseconds\r
+\r
+#commit_delay = 0                      # range 0-100000, in microseconds\r
+#commit_siblings = 5                   # range 1-1000\r
+\r
+# - Checkpoints -\r
+\r
+#checkpoint_segments = 3               # in logfile segments, min 1, 16MB each\r
+#checkpoint_timeout = 5min             # range 30s-1h\r
+#checkpoint_completion_target = 0.5    # checkpoint target duration, 0.0 - 1.0\r
+#checkpoint_warning = 30s              # 0 is off\r
+\r
+# - Archiving -\r
+\r
+#archive_mode = off            # allows archiving to be done\r
+                               # (change requires restart)\r
+#archive_command = ''          # command to use to archive a logfile segment\r
+#archive_timeout = 0           # force a logfile segment switch after this\r
+                               # time; 0 is off\r
+\r
+\r
+#------------------------------------------------------------------------------\r
+# QUERY TUNING\r
+#------------------------------------------------------------------------------\r
+\r
+# - Planner Method Configuration -\r
+\r
+#enable_bitmapscan = on\r
+#enable_hashagg = on\r
+#enable_hashjoin = on\r
+#enable_indexscan = on\r
+#enable_mergejoin = on\r
+#enable_nestloop = on\r
+#enable_seqscan = on\r
+#enable_sort = on\r
+#enable_tidscan = on\r
+\r
+# - Planner Cost Constants -\r
+\r
+#seq_page_cost = 1.0                   # measured on an arbitrary scale\r
+#random_page_cost = 4.0                        # same scale as above\r
+#cpu_tuple_cost = 0.01                 # same scale as above\r
+#cpu_index_tuple_cost = 0.005          # same scale as above\r
+#cpu_operator_cost = 0.0025            # same scale as above\r
+#effective_cache_size = 128MB\r
+\r
+# - Genetic Query Optimizer -\r
+\r
+#geqo = on\r
+#geqo_threshold = 12\r
+#geqo_effort = 5                       # range 1-10\r
+#geqo_pool_size = 0                    # selects default based on effort\r
+#geqo_generations = 0                  # selects default based on effort\r
+#geqo_selection_bias = 2.0             # range 1.5-2.0\r
+\r
+# - Other Planner Options -\r
+\r
+#default_statistics_target = 10                # range 1-1000\r
+#constraint_exclusion = off\r
+#from_collapse_limit = 8\r
+#join_collapse_limit = 8               # 1 disables collapsing of explicit \r
+                                       # JOIN clauses\r
+\r
+\r
+#------------------------------------------------------------------------------\r
+# ERROR REPORTING AND LOGGING\r
+#------------------------------------------------------------------------------\r
+\r
+# - Where to Log -\r
+\r
+log_destination = 'stderr'             # Valid values are combinations of\r
+                                       # stderr, csvlog, syslog and eventlog,\r
+                                       # depending on platform.  csvlog\r
+                                       # requires logging_collector to be on.\r
+\r
+# This is used when logging to stderr:\r
+logging_collector = on         # Enable capturing of stderr and csvlog\r
+                                       # into log files. Required to be on for\r
+                                       # csvlogs.\r
+                                       # (change requires restart)\r
+\r
+# These are only used if logging_collector is on:\r
+#log_directory = 'pg_log'              # directory where log files are written,\r
+                                       # can be absolute or relative to PGDATA\r
+#log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'       # log file name pattern,\r
+                                       # can include strftime() escapes\r
+#log_truncate_on_rotation = off                # If on, an existing log file of the\r
+                                       # same name as the new log file will be\r
+                                       # truncated rather than appended to.\r
+                                       # But such truncation only occurs on\r
+                                       # time-driven rotation, not on restarts\r
+                                       # or size-driven rotation.  Default is\r
+                                       # off, meaning append to existing files\r
+                                       # in all cases.\r
+#log_rotation_age = 1d                 # Automatic rotation of logfiles will\r
+                                       # happen after that time.  0 to disable.\r
+#log_rotation_size = 10MB              # Automatic rotation of logfiles will \r
+                                       # happen after that much log output.\r
+                                       # 0 to disable.\r
+\r
+# These are relevant when logging to syslog:\r
+#syslog_facility = 'LOCAL0'\r
+#syslog_ident = 'postgres'\r
+\r
+\r
+# - When to Log -\r
+\r
+#client_min_messages = notice          # values in order of decreasing detail:\r
+                                       #   debug5\r
+                                       #   debug4\r
+                                       #   debug3\r
+                                       #   debug2\r
+                                       #   debug1\r
+                                       #   log\r
+                                       #   notice\r
+                                       #   warning\r
+                                       #   error\r
+\r
+#log_min_messages = notice             # values in order of decreasing detail:\r
+                                       #   debug5\r
+                                       #   debug4\r
+                                       #   debug3\r
+                                       #   debug2\r
+                                       #   debug1\r
+                                       #   info\r
+                                       #   notice\r
+                                       #   warning\r
+                                       #   error\r
+                                       #   log\r
+                                       #   fatal\r
+                                       #   panic\r
+\r
+#log_error_verbosity = default         # terse, default, or verbose messages\r
+\r
+#log_min_error_statement = error       # values in order of decreasing detail:\r
+                                       #   debug5\r
+                                       #   debug4\r
+                                       #   debug3\r
+                                       #   debug2\r
+                                       #   debug1\r
+                                       #   info\r
+                                       #   notice\r
+                                       #   warning\r
+                                       #   error\r
+                                       #   log\r
+                                       #   fatal\r
+                                       #   panic (effectively off)\r
+\r
+#log_min_duration_statement = -1       # -1 is disabled, 0 logs all statements\r
+                                       # and their durations, > 0 logs only\r
+                                       # statements running at least this time.\r
+\r
+#silent_mode = off                     # DO NOT USE without syslog or\r
+                                       # logging_collector\r
+                                       # (change requires restart)\r
+\r
+# - What to Log -\r
+\r
+#debug_print_parse = off\r
+#debug_print_rewritten = off\r
+#debug_print_plan = off\r
+#debug_pretty_print = off\r
+#log_checkpoints = off\r
+#log_connections = off\r
+#log_disconnections = off\r
+#log_duration = off\r
+#log_hostname = off\r
+log_line_prefix = '%t '                        # special values:\r
+                                       #   %u = user name\r
+                                       #   %d = database name\r
+                                       #   %r = remote host and port\r
+                                       #   %h = remote host\r
+                                       #   %p = process ID\r
+                                       #   %t = timestamp without milliseconds\r
+                                       #   %m = timestamp with milliseconds\r
+                                       #   %i = command tag\r
+                                       #   %c = session ID\r
+                                       #   %l = session line number\r
+                                       #   %s = session start timestamp\r
+                                       #   %v = virtual transaction ID\r
+                                       #   %x = transaction ID (0 if none)\r
+                                       #   %q = stop here in non-session\r
+                                       #        processes\r
+                                       #   %% = '%'\r
+                                       # e.g. '<%u%%%d> '\r
+#log_lock_waits = off                  # log lock waits >= deadlock_timeout\r
+#log_statement = 'none'                        # none, ddl, mod, all\r
+#log_temp_files = -1                   # log temporary files equal or larger\r
+                                       # than specified size;\r
+                                       # -1 disables, 0 logs all temp files\r
+#log_timezone = unknown                        # actually, defaults to TZ environment\r
+                                       # setting\r
+\r
+\r
+#------------------------------------------------------------------------------\r
+# RUNTIME STATISTICS\r
+#------------------------------------------------------------------------------\r
+\r
+# - Query/Index Statistics Collector -\r
+\r
+#track_activities = on\r
+#track_counts = on\r
+#update_process_title = on\r
+\r
+\r
+# - Statistics Monitoring -\r
+\r
+#log_parser_stats = off\r
+#log_planner_stats = off\r
+#log_executor_stats = off\r
+#log_statement_stats = off\r
+\r
+\r
+#------------------------------------------------------------------------------\r
+# AUTOVACUUM PARAMETERS\r
+#------------------------------------------------------------------------------\r
+\r
+#autovacuum = on                       # Enable autovacuum subprocess?  'on' \r
+                                       # requires track_counts to also be on.\r
+#log_autovacuum_min_duration = -1      # -1 disables, 0 logs all actions and\r
+                                       # their durations, > 0 logs only\r
+                                       # actions running at least that time.\r
+#autovacuum_max_workers = 3            # max number of autovacuum subprocesses\r
+#autovacuum_naptime = 1min             # time between autovacuum runs\r
+#autovacuum_vacuum_threshold = 50      # min number of row updates before\r
+                                       # vacuum\r
+#autovacuum_analyze_threshold = 50     # min number of row updates before \r
+                                       # analyze\r
+#autovacuum_vacuum_scale_factor = 0.2  # fraction of table size before vacuum\r
+#autovacuum_analyze_scale_factor = 0.1 # fraction of table size before analyze\r
+#autovacuum_freeze_max_age = 200000000 # maximum XID age before forced vacuum\r
+                                       # (change requires restart)\r
+#autovacuum_vacuum_cost_delay = 20     # default vacuum cost delay for\r
+                                       # autovacuum, -1 means use\r
+                                       # vacuum_cost_delay\r
+#autovacuum_vacuum_cost_limit = -1     # default vacuum cost limit for\r
+                                       # autovacuum, -1 means use\r
+                                       # vacuum_cost_limit\r
+\r
+\r
+#------------------------------------------------------------------------------\r
+# CLIENT CONNECTION DEFAULTS\r
+#------------------------------------------------------------------------------\r
+\r
+# - Statement Behavior -\r
+\r
+#search_path = '"$user",public'                # schema names\r
+#default_tablespace = ''               # a tablespace name, '' uses the default\r
+#temp_tablespaces = ''                 # a list of tablespace names, '' uses\r
+                                       # only default tablespace\r
+#check_function_bodies = on\r
+#default_transaction_isolation = 'read committed'\r
+#default_transaction_read_only = off\r
+#session_replication_role = 'origin'\r
+#statement_timeout = 0                 # 0 is disabled\r
+#vacuum_freeze_min_age = 100000000\r
+#xmlbinary = 'base64'\r
+#xmloption = 'content'\r
+\r
+# - Locale and Formatting -\r
+\r
+datestyle = 'iso, mdy'\r
+#timezone = unknown                    # actually, defaults to TZ environment\r
+                                       # setting\r
+#timezone_abbreviations = 'Default'     # Select the set of available time zone\r
+                                       # abbreviations.  Currently, there are\r
+                                       #   Default\r
+                                       #   Australia\r
+                                       #   India\r
+                                       # You can create your own file in\r
+                                       # share/timezonesets/.\r
+#extra_float_digits = 0                        # min -15, max 2\r
+#client_encoding = sql_ascii           # actually, defaults to database\r
+                                       # encoding\r
+\r
+# These settings are initialized by initdb, but they can be changed.\r
+lc_messages = 'C'                      # locale for system error message\r
+                                       # strings\r
+lc_monetary = 'C'                      # locale for monetary formatting\r
+lc_numeric = 'C'                       # locale for number formatting\r
+lc_time = 'C'                          # locale for time formatting\r
+\r
+# default configuration for text search\r
+default_text_search_config = 'pg_catalog.english'\r
+\r
+# - Other Defaults -\r
+\r
+#explain_pretty_print = on\r
+#dynamic_library_path = '$libdir'\r
+#local_preload_libraries = ''\r
+\r
+\r
+#------------------------------------------------------------------------------\r
+# LOCK MANAGEMENT\r
+#------------------------------------------------------------------------------\r
+\r
+#deadlock_timeout = 1s\r
+#max_locks_per_transaction = 64                # min 10\r
+                                       # (change requires restart)\r
+# Note:  Each lock table slot uses ~270 bytes of shared memory, and there are\r
+# max_locks_per_transaction * (max_connections + max_prepared_transactions)\r
+# lock table slots.\r
+\r
+\r
+#------------------------------------------------------------------------------\r
+# VERSION/PLATFORM COMPATIBILITY\r
+#------------------------------------------------------------------------------\r
+\r
+# - Previous PostgreSQL Versions -\r
+\r
+#add_missing_from = off\r
+#array_nulls = on\r
+#backslash_quote = safe_encoding       # on, off, or safe_encoding\r
+#default_with_oids = off\r
+#escape_string_warning = on\r
+#regex_flavor = advanced               # advanced, extended, or basic\r
+#sql_inheritance = on\r
+#standard_conforming_strings = off\r
+#synchronize_seqscans = on\r
+\r
+# - Other Platforms and Clients -\r
+\r
+#transform_null_equals = off\r
+\r
+\r
+#------------------------------------------------------------------------------\r
+# CUSTOMIZED OPTIONS\r
+#------------------------------------------------------------------------------\r
+\r
+#custom_variable_classes = ''          # list of custom variable class names\r
diff --git a/setup/windows/setup.nsi b/setup/windows/setup.nsi
new file mode 100755 (executable)
index 0000000..b212958
--- /dev/null
@@ -0,0 +1,459 @@
+#####################################################################################\r
+#\r
+# Copyright (c) 2004-TODAY OpenERP S.A. (http://www.openerp.com) All Rights Reserved.\r
+#\r
+# WARNING: This program as such is intended to be used by professional\r
+# programmers who take the whole responsability of assessing all potential\r
+# consequences resulting from its eventual inadequacies and bugs\r
+# End users who are looking for a ready-to-use solution with commercial\r
+# garantees and support are strongly adviced to contract a Free Software\r
+# Service Company\r
+#\r
+# This program is Free Software; you can redistribute it and/or\r
+# modify it under the terms of the GNU General Public License\r
+# as published by the Free Software Foundation; either version 3\r
+# of the License, or (at your option) any later version.\r
+#\r
+# This program is distributed in the hope that it will be useful,\r
+# but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+# GNU General Public License for more details.\r
+#\r
+# You should have received a copy of the GNU General Public License\r
+# along with this program; if not, write to the Free Software\r
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\r
+#####################################################################################\r
+\r
+# TODO: Avoid to uninstall the database\r
+# TODO: We can update the server or the clients without to uninstall the all-in-one\r
+\r
+!include 'MUI2.nsh'\r
+!include 'FileFunc.nsh'\r
+!include 'LogicLib.nsh'\r
+!include 'Sections.nsh'\r
+!include 'LogicLib.nsh'\r
+\r
+!macro IfKeyExists ROOT MAIN_KEY KEY\r
+    # This macro comes from http://nsis.sourceforge.net/Check_for_a_Registry_Key\r
+    Push $R0\r
+    Push $R1\r
+    Push $R2\r
\r
+    # XXX bug if ${ROOT}, ${MAIN_KEY} or ${KEY} use $R0 or $R1\r
\r
+    StrCpy $R1 "0" # loop index\r
+    StrCpy $R2 "0" # not found\r
\r
+    ${Do}\r
+        EnumRegKey $R0 ${ROOT} "${MAIN_KEY}" "$R1"\r
+        ${If} $R0 == "${KEY}"\r
+            StrCpy $R2 "1" # found\r
+            ${Break}\r
+        ${EndIf}\r
+        IntOp $R1 $R1 + 1\r
+    ${LoopWhile} $R0 != ""\r
\r
+    ClearErrors\r
\r
+    Exch 2\r
+    Pop $R0\r
+    Pop $R1\r
+    Exch $R2\r
+!macroend\r
+\r
+!define PUBLISHER 'OpenERP S.A.'\r
+\r
+!ifndef MAJOR_VERSION\r
+    !define MAJOR_VERSION '7'\r
+!endif\r
+\r
+!ifndef MINOR_VERSION\r
+    !define MINOR_VERSION '0'\r
+!endif\r
+\r
+!ifndef REVISION_VERSION\r
+    !define REVISION_VERSION '0'\r
+!endif\r
+\r
+!ifndef VERSION\r
+    !define VERSION "0"\r
+#!define VERSION "${MAJOR_VERSION}.${MINOR_VERSION}-r${REVISION_VERSION}"\r
+!endif\r
+\r
+!define PRODUCT_NAME "OpenERP"\r
+!define DISPLAY_NAME "${PRODUCT_NAME} ${MAJOR_VERSION}.${MINOR_VERSION}"\r
+\r
+!define REGISTRY_ROOT HKLM\r
+!define UNINSTALL_BASE_REGISTRY_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall"\r
+!define UNINSTALL_REGISTRY_KEY "${UNINSTALL_BASE_REGISTRY_KEY}\${DISPLAY_NAME}"\r
+\r
+!define UNINSTALL_REGISTRY_KEY_SERVER "${UNINSTALL_BASE_REGISTRY_KEY}\OpenERP Server ${VERSION}"\r
+\r
+!define REGISTRY_KEY "Software\${DISPLAY_NAME}"\r
+\r
+!define DEFAULT_POSTGRESQL_HOSTNAME 'localhost'\r
+!define DEFAULT_POSTGRESQL_PORT 5432\r
+!define DEFAULT_POSTGRESQL_USERNAME 'openpg'\r
+!define DEFAULT_POSTGRESQL_PASSWORD 'openpgpwd'\r
+\r
+Name '${DISPLAY_NAME}'\r
+Caption "${PRODUCT_NAME} ${VERSION} Setup"\r
+OutFile "openerp-allinone-setup-${VERSION}.exe"\r
+#SetCompressor /final /solid lzma\r
+#SetCompress auto\r
+ShowInstDetails show\r
+\r
+XPStyle on\r
+\r
+InstallDir "$PROGRAMFILES\OpenERP ${VERSION}"\r
+InstallDirRegKey HKCU "${REGISTRY_KEY}" ""\r
+\r
+BrandingText '${PRODUCT_NAME} ${VERSION}'\r
+\r
+RequestExecutionLevel admin\r
+\r
+#VIAddVersionKey "ProductName" "${PRODUCT_NAME}"\r
+#VIAddVersionKey "CompanyName" "${PUBLISHER}"\r
+#VIAddVersionKey "FileDescription" "Installer of ${DISPLAY_NAME}" \r
+#VIAddVersionKey "LegalCopyright" "${PUBLISHER}"\r
+#VIAddVersionKey "LegalTrademark" "OpenERP is a trademark of ${PUBLISHER}"\r
+#VIAddVersionKey "FileVersion" "${MAJOR_VERSION}.${MINOR_VERSION}.${REVISION_VERSION}"\r
+#VIProductVersion "${MAJOR_VERSION}.${MINOR_VERSION}.${REVISION_VERSION}"\r
+\r
+!insertmacro GetParameters\r
+!insertmacro GetOptions\r
+\r
+Var Option_AllInOne\r
+Var HasPostgreSQL\r
+Var cmdLineParams\r
+\r
+Var TextPostgreSQLHostname\r
+Var TextPostgreSQLPort\r
+Var TextPostgreSQLUsername\r
+Var TextPostgreSQLPassword\r
+\r
+Var HWNDPostgreSQLHostname\r
+Var HWNDPostgreSQLPort\r
+Var HWNDPostgreSQLUsername\r
+Var HWNDPostgreSQLPassword\r
+\r
+!define STATIC_PATH "static"\r
+!define PIXMAPS_PATH "${STATIC_PATH}\pixmaps"\r
+!define POSTGRESQL_EXE "${STATIC_PATH}\postgresql-8.3-int.msi"\r
+\r
+!define OPENERP_SERVER_SETUP 'openerp-server-setup-${VERSION}.exe'\r
+\r
+!define MUI_ABORTWARNING\r
+!define MUI_ICON "${PIXMAPS_PATH}\openerp-icon.ico"\r
+\r
+!define MUI_WELCOMEFINISHPAGE_BITMAP "${PIXMAPS_PATH}\openerp-intro.bmp"\r
+!define MUI_UNWELCOMEFINISHPAGE_BITMAP "${PIXMAPS_PATH}\openerp-intro.bmp"\r
+!define MUI_HEADERIMAGE\r
+!define MUI_HEADERIMAGE_BITMAP "${PIXMAPS_PATH}\openerp-slogan.bmp"\r
+!define MUI_HEADERIMAGE_BITMAP_NOSTRETCH\r
+!define MUI_HEADER_TRANSPARENT_TEXT ""\r
+\r
+!insertmacro MUI_PAGE_WELCOME\r
+!insertmacro MUI_PAGE_LICENSE "${STATIC_PATH}\doc\LICENSE"\r
+!define MUI_COMPONENTSPAGE_SMALLDESC\r
+!define MUI_PAGE_CUSTOMFUNCTION_LEAVE ComponentLeave\r
+!insertmacro MUI_PAGE_COMPONENTS\r
+Page Custom ShowPostgreSQL LeavePostgreSQL\r
+!insertmacro MUI_PAGE_DIRECTORY\r
+!insertmacro MUI_PAGE_INSTFILES\r
+\r
+!define MUI_FINISHPAGE_NOAUTOCLOSE\r
+!define MUI_FINISHPAGE_RUN\r
+!define MUI_FINISHPAGE_RUN_CHECKED\r
+!define MUI_FINISHPAGE_RUN_TEXT "$(DESC_FinishPageText)"\r
+!define MUI_FINISHPAGE_RUN_FUNCTION "LaunchLink"\r
+!define MUI_FINISHPAGE_LINK $(DESC_FinishPage_Link) \r
+!define MUI_FINISHPAGE_LINK_LOCATION "http://www.openerp.com/contact"\r
+!insertmacro MUI_PAGE_FINISH\r
+\r
+!insertmacro MUI_UNPAGE_WELCOME\r
+!insertmacro MUI_UNPAGE_CONFIRM\r
+!insertmacro MUI_UNPAGE_INSTFILES\r
+!insertmacro MUI_UNPAGE_FINISH\r
+\r
+!insertmacro MUI_LANGUAGE "English"\r
+!insertmacro MUI_LANGUAGE "French"\r
+!insertmacro MUI_RESERVEFILE_LANGDLL\r
+\r
+; English\r
+LangString DESC_OpenERP_Server ${LANG_ENGLISH} "Install the OpenERP Server with all the OpenERP standard modules."\r
+LangString DESC_PostgreSQL ${LANG_ENGLISH} "Install the PostgreSQL RDBMS used by OpenERP."\r
+LangString DESC_FinishPage_Link ${LANG_ENGLISH} "Contact OpenERP for Partnership and/or Support"\r
+LangString DESC_AtLeastOneComponent ${LANG_ENGLISH} "You have to choose at least one component"\r
+LangString DESC_CanNotInstallPostgreSQL ${LANG_ENGLISH} "You can not install the PostgreSQL database without the OpenERP Server"\r
+LangString WARNING_HostNameIsEmpty ${LANG_ENGLISH} "The hostname for the connection to the PostgreSQL Server is empty"\r
+LangString WARNING_UserNameIsEmpty ${LANG_ENGLISH} "The username for the connection to the PostgreSQL Server is empty"\r
+LangString WARNING_PasswordIsEmpty ${LANG_ENGLISH} "The password for the connection to the PostgreSQL Server is empty"\r
+LangString WARNING_PortIsWrong ${LANG_ENGLISH} "The port for the connexion to the PostgreSQL Server is wrong (default: 5432)"\r
+LangString DESC_PostgreSQLPage ${LANG_ENGLISH} "Configure the information for the PostgreSQL connection"\r
+LangString DESC_PostgreSQL_Hostname ${LANG_ENGLISH} "Hostname"\r
+LangString DESC_PostgreSQL_Port ${LANG_ENGLISH} "Port"\r
+LangString DESC_PostgreSQL_Username ${LANG_ENGLISH} "Username"\r
+LangString DESC_PostgreSQL_Password ${LANG_ENGLISH} "Password"\r
+LangString Profile_AllInOne ${LANG_ENGLISH} "All In One"\r
+LangString Profile_Server ${LANG_ENGLISH} "Server only"\r
+LangString TITLE_OpenERP_Server ${LANG_ENGLISH} "OpenERP Server"\r
+LangString TITLE_PostgreSQL ${LANG_ENGLISH} "PostgreSQL Database"\r
+LangString DESC_FinishPageText ${LANG_ENGLISH} "Start OpenERP"\r
+\r
+; French\r
+LangString DESC_OpenERP_Server ${LANG_FRENCH} "Installation du Serveur OpenERP avec tous les modules OpenERP standards."\r
+LangString DESC_PostgreSQL ${LANG_FRENCH} "Installation de la base de donn?es PostgreSQL utilis?e par OpenERP."\r
+LangString DESC_FinishPage_Link ${LANG_FRENCH} "Contactez OpenERP pour un Partenariat et/ou du Support"\r
+LangString DESC_AtLeastOneComponent ${LANG_FRENCH} "Vous devez choisir au moins un composant"\r
+LangString DESC_CanNotInstallPostgreSQL ${LANG_FRENCH} "Vous ne pouvez pas installer la base de donn?es PostgreSQL sans le serveur OpenERP"\r
+LangString WARNING_HostNameIsEmpty ${LANG_FRENCH} "L'adresse pour la connection au serveur PostgreSQL est vide"\r
+LangString WARNING_UserNameIsEmpty ${LANG_FRENCH} "Le nom d'utilisateur pour la connection au serveur PostgreSQL est vide"\r
+LangString WARNING_PasswordIsEmpty ${LANG_FRENCH} "Le mot de passe pour la connection au serveur PostgreSQL est vide"\r
+LangString WARNING_PortIsWrong ${LANG_FRENCH} "Le port pour la connection au serveur PostgreSQL est erron? (d?faut: 5432)"\r
+LangString DESC_PostgreSQLPage ${LANG_FRENCH} "Configurez les informations de connection pour le serveur PostgreSQL"\r
+LangString DESC_PostgreSQL_Hostname ${LANG_FRENCH} "H?te"\r
+LangString DESC_PostgreSQL_Port ${LANG_FRENCH} "Port"\r
+LangString DESC_PostgreSQL_Username ${LANG_FRENCH} "Utilisateur"\r
+LangString DESC_PostgreSQL_Password ${LANG_FRENCH} "Mot de passe"\r
+LangString Profile_AllInOne ${LANG_FRENCH} "All In One"\r
+LangString Profile_Server ${LANG_FRENCH} "Seulement le serveur"\r
+LangString TITLE_OpenERP_Server ${LANG_FRENCH} "Serveur OpenERP"\r
+LangString TITLE_PostgreSQL ${LANG_FRENCH} "Installation du serveur de base de donn?es PostgreSQL"\r
+LangString DESC_FinishPageText ${LANG_FRENCH} "Lancer OpenERP"\r
+\r
+InstType $(Profile_AllInOne)\r
+InstType $(Profile_Server)\r
+\r
+Section $(TITLE_OpenERP_Server) SectionOpenERP_Server\r
+    SectionIn 1 2\r
+    SetOutPath "$TEMP"\r
+    File "files\${OPENERP_SERVER_SETUP}"\r
+    ExecWait '"$TEMP\${OPENERP_SERVER_SETUP}" /S /D=$INSTDIR\Server'\r
+\r
+# If there is a previous install of the OpenERP Server, keep the login/password from the config file\r
+    WriteIniStr "$INSTDIR\Server\server\openerp-server.conf" "options" "db_host" $TextPostgreSQLHostname\r
+    WriteIniStr "$INSTDIR\Server\server\openerp-server.conf" "options" "db_user" $TextPostgreSQLUsername\r
+    WriteIniStr "$INSTDIR\Server\server\openerp-server.conf" "options" "db_password" $TextPostgreSQLPassword\r
+    WriteIniStr "$INSTDIR\Server\server\openerp-server.conf" "options" "db_port" $TextPostgreSQLPort\r
+\r
+    # if we've going to install postgresql force it's path,\r
+    # otherwise we consider it's always done and/or correctly tune by users\r
+    ${If} $HasPostgreSQL == 0\r
+        WriteIniStr "$INSTDIR\Server\server\openerp-server.conf" "options" "pg_path" "$INSTDIR\PostgreSQL\bin"\r
+    ${EndIf}\r
+\r
+    nsExec::Exec "net stop openerp-server-7.0"\r
+    sleep 2\r
+\r
+    nsExec::Exec "net start openerp-server-7.0"\r
+    sleep 2\r
+\r
+SectionEnd\r
+    \r
+Section $(TITLE_PostgreSQL) SectionPostgreSQL\r
+    SectionIn 1 2\r
+    SetOutPath '$TEMP'\r
+    nsExec::Exec 'net user openpgsvc /delete'\r
+\r
+    File "postgresql-9.2.2-1-windows.exe"\r
+\r
+    ReadRegStr $0 HKLM "System\CurrentControlSet\Control\ComputerName\ActiveComputerName" "ComputerName"\r
+    StrCmp $0 "" win9x\r
+    Goto done\r
+    win9x:\r
+        ReadRegStr $0 HKLM "System\CurrentControlSet\Control\ComputerName\ComputerName" "ComputerName"\r
+    done:\r
+    Rmdir /r "$INSTDIR\PostgreSQL"\r
+    ExecWait '"$TEMP\postgresql-9.2.2-1-windows.exe" \\r
+        --mode unattended \\r
+        --prefix "$INSTDIR\PostgreSQL" \\r
+        --datadir "$INSTDIR\PostgreSQL\data" \\r
+        --servicename "PostgreSQL_For_OpenERP" \\r
+        --serviceaccount "openpgsvc" --servicepassword "0p3npgsvcPWD" \\r
+        --superaccount "$TextPostgreSQLUsername" --superpassword "$TextPostgreSQLPassword" \\r
+        --serverport $TextPostgreSQLPort'\r
+SectionEnd\r
+\r
+Section -Post\r
+    WriteRegExpandStr HKLM "${UNINSTALL_REGISTRY_KEY}" "UninstallString" "$INSTDIR\Uninstall.exe"\r
+    WriteRegExpandStr HKLM "${UNINSTALL_REGISTRY_KEY}" "InstallLocation" "$INSTDIR"\r
+    WriteRegStr HKLM       "${UNINSTALL_REGISTRY_KEY}" "DisplayName" "${DISPLAY_NAME}"\r
+    WriteRegStr HKLM       "${UNINSTALL_REGISTRY_KEY}" "DisplayVersion" "${MAJOR_VERSION}.${MINOR_VERSION}"\r
+    WriteRegStr HKLM       "${UNINSTALL_REGISTRY_KEY}" "Publisher" "${PUBLISHER}"\r
+;    WriteRegDWORD HKLM     "${UNINSTALL_REGISTRY_KEY}" "Version" "${VERSION}"\r
+;    WriteRegDWORD HKLM     "${UNINSTALL_REGISTRY_KEY}" "VersionMajor" "${MAJOR_VERSION}.${MINOR_VERSION}"\r
+;    WriteRegDWORD HKLM     "${UNINSTALL_REGISTRY_KEY}" "VersionMinor" "${REVISION_VERSION}"\r
+    WriteRegStr HKLM       "${UNINSTALL_REGISTRY_KEY}" "HelpLink" "support@openerp.com"\r
+    WriteRegStr HKLM       "${UNINSTALL_REGISTRY_KEY}" "HelpTelephone" "+32.81.81.37.00"\r
+    WriteRegStr HKLM       "${UNINSTALL_REGISTRY_KEY}" "URLInfoAbout" "http://www.openerp.com"\r
+    WriteRegStr HKLM       "${UNINSTALL_REGISTRY_KEY}" "Contact" "sales@openerp.com"\r
+    WriteRegDWORD HKLM     "${UNINSTALL_REGISTRY_KEY}" "NoModify" "1"\r
+    WriteRegDWORD HKLM     "${UNINSTALL_REGISTRY_KEY}" "NoRepair" "1"\r
+    WriteUninstaller "$INSTDIR\Uninstall.exe"\r
+SectionEnd\r
+\r
+!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN\r
+    !insertmacro MUI_DESCRIPTION_TEXT ${SectionOpenERP_Server} $(DESC_OpenERP_Server)\r
+    !insertmacro MUI_DESCRIPTION_TEXT ${SectionPostgreSQL} $(DESC_PostgreSQL)\r
+!insertmacro MUI_FUNCTION_DESCRIPTION_END\r
+\r
+Section "Uninstall"\r
+    # Check if the server is installed\r
+    !insertmacro IfKeyExists "HKLM" "${UNINSTALL_REGISTRY_KEY_SERVER}" "UninstallString"\r
+    Pop $R0\r
+    ReadRegStr $0 HKLM "${UNINSTALL_REGISTRY_KEY_SERVER}" "UninstallString"\r
+    ExecWait '"$0" /S'\r
+\r
+    Rmdir /r "$INSTDIR\server"\r
+    Rmdir /r "$INSTDIR\service"\r
+\r
+    DeleteRegKey HKLM "${UNINSTALL_REGISTRY_KEY}"\r
+SectionEnd\r
+\r
+Function .onInit\r
+    Push $R0\r
+\r
+    ${GetParameters} $cmdLineParams\r
+    ClearErrors\r
+\r
+    Pop $R0\r
+\r
+    StrCpy $Option_AllInOne 0\r
+    StrCpy $HasPostgreSQL 0\r
+\r
+    StrCpy $TextPostgreSQLHostname ${DEFAULT_POSTGRESQL_HOSTNAME}\r
+    StrCpy $TextPostgreSQLPort ${DEFAULT_POSTGRESQL_PORT}\r
+    StrCpy $TextPostgreSQLUsername ${DEFAULT_POSTGRESQL_USERNAME}\r
+    StrCpy $TextPostgreSQLPassword ${DEFAULT_POSTGRESQL_PASSWORD}\r
+\r
+    Push $R0\r
+    ${GetOptions} $cmdLineParams '/allinone' $R0\r
+    IfErrors +2 0\r
+    StrCpy $Option_AllInOne 1\r
+    Pop $R0\r
+\r
+    StrCmp $Option_AllInOne 1 AllInOneMode\r
+    StrCmp $Option_AllInOne 0 NoAllInOneMode\r
+\r
+    AllInOneMode:\r
+        MessageBox MB_OK|MB_ICONINFORMATION "All In One"\r
+\r
+    NoAllInOneMode:\r
+    \r
+    !insertmacro MUI_LANGDLL_DISPLAY\r
+\r
+    ClearErrors\r
+    EnumRegKey $0 HKLM "SOFTWARE\PostgreSQL\Installations" 0\r
+    IfErrors DoInstallPostgreSQL 0\r
+    StrCmp $0 "" DoInstallPostgreSQL\r
+    StrCpy $HasPostgreSQL 1\r
+    #SectionSetText ${SectionPostgreSQL} ""\r
+    !insertmacro UnselectSection ${SectionPostgreSQL}\r
+    SectionSetFlags ${SectionPostgreSQL} ${SF_RO}\r
+\r
+    DoInstallPostgreSQL:\r
+FunctionEnd\r
+\r
+Function .onSelChange\r
+    ${If} $HasPostgreSQL == 1\r
+        !insertmacro UnselectSection ${SectionPostgreSQL}\r
+    ${EndIf}\r
+FunctionEnd\r
+\r
+Function PostgreSQLOnBack\r
+FunctionEnd\r
+\r
+Function ShowPostgreSQL\r
+    SectionGetFlags ${SectionOpenERP_Server} $0\r
+    IntOp $0 $0 & ${SF_SELECTED}\r
+    IntCmp $0 ${SF_SELECTED} LaunchPostgreSQLConfiguration\r
+    Abort\r
+    LaunchPostgreSQLConfiguration:\r
+\r
+    nsDialogs::Create /NOUNLOAD 1018\r
+    Pop $0\r
+\r
+    ${If} $0 == error\r
+        Abort\r
+    ${EndIf}\r
+\r
+    GetFunctionAddress $0 PostgreSQLOnBack\r
+    nsDialogs::OnBack $0\r
+\r
+    ${NSD_CreateLabel} 0 0 100% 10u $(DESC_PostgreSQLPage)\r
+    Pop $0\r
+\r
+    ${NSD_CreateLabel} 0 45 60u 12u $(DESC_PostgreSQL_Hostname)\r
+    Pop $0\r
+    ${NSD_CreateText} 100 45 150u 12u $TextPostgreSQLHostname\r
+    Pop $HWNDPostgreSQLHostname\r
+\r
+    ${NSD_CreateLabel} 0 75 60u 12u $(DESC_PostgreSQL_Port)\r
+    Pop $0\r
+    ${NSD_CreateNumber} 100 75 150u 12u $TextPostgreSQLPort\r
+    Pop $HWNDPostgreSQLPort\r
+    ${NSD_CreateLabel} 0 105 60u 12u $(DESC_PostgreSQL_Username)\r
+    Pop $0\r
+    ${NSD_CreateText} 100 105 150u 12u $TextPostgreSQLUsername\r
+    Pop $HWNDPostgreSQLUsername\r
+    ${NSD_CreateLabel} 0 135 60u 12u $(DESC_PostgreSQL_Password)\r
+    Pop $0\r
+    ${NSD_CreateText} 100 135 150u 12u $TextPostgreSQLPassword\r
+    Pop $HWNDPostgreSQLPassword\r
+\r
+    nsDialogs::Show\r
+FunctionEnd\r
+\r
+Function LeavePostgreSQL\r
+    ${NSD_GetText} $HWNDPostgreSQLHostname $TextPostgreSQLHostname\r
+    ${NSD_GetText} $HWNDPostgreSQLPort $TextPostgreSQLPort\r
+    ${NSD_GetText} $HWNDPostgreSQLUsername $TextPostgreSQLUsername\r
+    ${NSD_GetText} $HWNDPostgreSQLPassword $TextPostgreSQLPassword\r
+    StrLen $1 $TextPostgreSQLHostname\r
+    ${If} $1 == 0\r
+        MessageBox MB_ICONEXCLAMATION|MB_OK $(WARNING_HostNameIsEmpty)\r
+        Abort\r
+    ${EndIf}\r
+\r
+    ${If} $TextPostgreSQLPort <= 0\r
+    ${OrIf} $TextPostgreSQLPort > 65535\r
+        MessageBox MB_ICONEXCLAMATION|MB_OK $(WARNING_PortIsWrong)\r
+        Abort\r
+    ${EndIf}\r
+\r
+    StrLen $1 $TextPostgreSQLUsername\r
+    ${If} $1 == 0\r
+        MessageBox MB_ICONEXCLAMATION|MB_OK $(WARNING_UserNameIsEmpty)\r
+        Abort\r
+    ${EndIf}\r
+\r
+    StrLen $1 $TextPostgreSQLPassword\r
+    ${If} $1 == 0\r
+        MessageBox MB_ICONEXCLAMATION|MB_OK $(WARNING_PasswordIsEmpty)\r
+        Abort\r
+    ${EndIf}\r
+FunctionEnd\r
+\r
+Function ComponentLeave\r
+    SectionGetFlags ${SectionOpenERP_Server} $0\r
+    IntOp $0 $0 & ${SF_SELECTED}\r
+    IntCmp $0 ${SF_SELECTED} Done\r
+\r
+    SectionGetFlags ${SectionPostgreSQL} $0\r
+    IntOp $0 $0 & ${SF_SELECTED}\r
+    IntCmp $0 ${SF_SELECTED} DontInstallPostgreSQL\r
+\r
+    ChooseAtLeastOneComponent:\r
+        MessageBox MB_ICONEXCLAMATION|MB_OK $(DESC_AtLeastOneComponent)\r
+        Abort\r
+\r
+    DontInstallPostgreSQL:\r
+        MessageBox MB_ICONEXCLAMATION|MB_OK $(DESC_CanNotInstallPostgreSQL)\r
+        Abort\r
+    Done:\r
+FunctionEnd\r
+\r
+Function LaunchLink\r
+    ExecShell "open" "http://localhost:8069/"\r
+FunctionEnd\r
diff --git a/setup_rpm.sh b/setup_rpm.sh
deleted file mode 100644 (file)
index 510655f..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-#
-# This file is used by 'python setup.py bdist_rpm'
-# You should not execute/call this file yourself.
-#
-# This script is used as the 'install' part of the RPM .spec file.
-#
-# Need to overwrite the install-part of the RPM to append the
-# compression-suffix onto the filenames for the man-pages.
-#
-python -c "import compileall, os; compileall.compile_dir(os.path.join(os.environ['PWD'], 'doc'), force=True)"
-python -O -c "import compileall, os; compileall.compile_dir(os.path.join(os.environ['PWD'], 'doc'), force=True)"
-python setup.py install --optimize 1 --root=$RPM_BUILD_ROOT --record=INSTALLED_FILES
-
-SUFFIX=gz
-sed "s!\(/share/man/.*\)!\1.$SUFFIX!" -i INSTALLED_FILES
-
-# quote files with a space
-sed 's/\(.* .*\)/"\1"/' -i INSTALLED_FILES