changeset 8f8e6cf5bd0a in modules/company:default
details: https://hg.tryton.org/modules/company?cmd=changeset&node=8f8e6cf5bd0a
description:
        Remove tree structure from company

        issue10163
        review332181002
diffstat:

 CHANGELOG             |    1 +
 __init__.py           |    1 +
 company.py            |   12 +---
 company.xml           |   31 +------------
 doc/index.rst         |   12 ++--
 res.py                |  121 +++++++++++++++++++++++++++----------------------
 setup.py              |    2 +-
 tests/test_company.py |   30 ++---------
 view/company_form.xml |    6 +-
 view/company_tree.xml |    7 --
 view/user_form.xml    |    5 +-
 11 files changed, 90 insertions(+), 138 deletions(-)

diffs (461 lines):

diff -r 82ba9ef6a7a0 -r 8f8e6cf5bd0a CHANGELOG
--- a/CHANGELOG Thu Mar 11 23:18:02 2021 +0100
+++ b/CHANGELOG Thu Mar 18 23:04:17 2021 +0100
@@ -1,3 +1,4 @@
+* Remove tree structure from company
 * Add test on context of company multivalue target fields
 * Use report header for CompanyReport
 
diff -r 82ba9ef6a7a0 -r 8f8e6cf5bd0a __init__.py
--- a/__init__.py       Thu Mar 11 23:18:02 2021 +0100
+++ b/__init__.py       Thu Mar 18 23:04:17 2021 +0100
@@ -16,6 +16,7 @@
         company.Company,
         company.Employee,
         company.CompanyConfigStart,
+        res.UserCompany,
         res.UserEmployee,
         res.User,
         ir.Sequence,
diff -r 82ba9ef6a7a0 -r 8f8e6cf5bd0a company.py
--- a/company.py        Thu Mar 11 23:18:02 2021 +0100
+++ b/company.py        Thu Mar 18 23:04:17 2021 +0100
@@ -1,6 +1,6 @@
 # This file is part of Tryton.  The COPYRIGHT file at the top level of
 # this repository contains the full copyright notices and license terms.
-from trytond.model import ModelView, ModelSQL, fields, tree
+from trytond.model import ModelView, ModelSQL, fields
 from trytond.wizard import Wizard, StateView, Button, StateTransition
 from trytond.report import Report
 from trytond.pyson import Eval, If
@@ -17,15 +17,11 @@
 Transaction.cache_keys.update({'company', 'employee'})
 
 
-class Company(tree(), ModelSQL, ModelView):
+class Company(ModelSQL, ModelView):
     'Company'
     __name__ = 'company.company'
     party = fields.Many2One('party.party', 'Party', required=True,
             ondelete='CASCADE')
-    parent = fields.Many2One('company.company', 'Parent',
-        help="Add the company below the parent.")
-    childs = fields.One2Many('company.company', 'parent', 'Children',
-        help="Add children below the company.")
     header = fields.Text(
         'Header', help="The text to display on report headers.")
     footer = fields.Text(
@@ -130,10 +126,10 @@
 
         self.company.save()
         users = User.search([
-                ('main_company', '=', None),
+                ('companies', '=', None),
                 ])
         User.write(users, {
-                'main_company': self.company.id,
+                'companies': [('add', [self.company.id])],
                 'company': self.company.id,
                 })
         return 'end'
diff -r 82ba9ef6a7a0 -r 8f8e6cf5bd0a company.xml
--- a/company.xml       Thu Mar 11 23:18:02 2021 +0100
+++ b/company.xml       Thu Mar 18 23:04:17 2021 +0100
@@ -44,41 +44,12 @@
             <field name="inherit" eval="None"/>
             <field name="name">company_form</field>
         </record>
-        <record model="ir.ui.view" id="company_view_tree">
-            <field name="model">company.company</field>
-            <field name="type">tree</field>
-            <field name="field_childs">childs</field>
-            <field name="name">company_tree</field>
-        </record>
         <record model="ir.ui.view" id="company_view_list">
             <field name="model">company.company</field>
             <field name="type">tree</field>
             <field name="priority" eval="10"/>
             <field name="name">company_list</field>
         </record>
-        <record model="ir.action.act_window" id="act_company_tree">
-            <field name="name">Companies</field>
-            <field name="res_model">company.company</field>
-            <field name="domain" eval="[('parent', '=', None)]" pyson="1"/>
-        </record>
-        <record model="ir.action.act_window.view"
-            id="act_company_tree_view1">
-            <field name="sequence" eval="10"/>
-            <field name="view" ref="company_view_tree"/>
-            <field name="act_window" ref="act_company_tree"/>
-        </record>
-        <record model="ir.action.act_window.view"
-            id="act_company_tree_view2">
-            <field name="sequence" eval="20"/>
-            <field name="view" ref="company_view_form"/>
-            <field name="act_window" ref="act_company_tree"/>
-        </record>
-
-        <menuitem
-            parent="menu_company"
-            action="act_company_tree"
-            sequence="10"
-            id="menu_company_tree"/>
 
         <record model="ir.action.act_window" id="act_company_list">
             <field name="name">Companies</field>
@@ -97,7 +68,7 @@
             <field name="act_window" ref="act_company_list"/>
         </record>
         <menuitem
-            parent="menu_company_tree"
+            parent="menu_company"
             action="act_company_list"
             sequence="10"
             id="menu_company_list"/>
diff -r 82ba9ef6a7a0 -r 8f8e6cf5bd0a doc/index.rst
--- a/doc/index.rst     Thu Mar 11 23:18:02 2021 +0100
+++ b/doc/index.rst     Thu Mar 18 23:04:17 2021 +0100
@@ -27,10 +27,8 @@
 User
 ****
 
-Are added to the user model: a main company, a company and an employee
-field. The company field defines the current company of the user, this
-current company will influence the data this user see in Tryton: most
-of the records that are linked to a company will only be available for
-users in this very company. The main company define which current
-company a user can choose: either the main company itself or one of
-the children companies.
+Are added to the user model: companies, a company and an employee field. The
+company field defines the current company of the user, this current company
+will influence the data this user see in Tryton: most of the records that are
+linked to a company will only be available for users in this very company. The
+companies define which current company a user can choose.
diff -r 82ba9ef6a7a0 -r 8f8e6cf5bd0a res.py
--- a/res.py    Thu Mar 11 23:18:02 2021 +0100
+++ b/res.py    Thu Mar 18 23:04:17 2021 +0100
@@ -1,11 +1,24 @@
 # This file is part of Tryton.  The COPYRIGHT file at the top level of
 # this repository contains the full copyright notices and license terms.
+from sql import Null
+
 from trytond.model import ModelSQL, fields
 from trytond.pool import PoolMeta, Pool
 from trytond.pyson import Eval
 from trytond.transaction import Transaction
 
 
+class UserCompany(ModelSQL):
+    "User - Company"
+    __name__ = 'res.user-company.company'
+
+    user = fields.Many2One(
+        'res.user', "User", ondelete='CASCADE', select=True, required=True)
+    company = fields.Many2One(
+        'company.company', "Company",
+        ondelete='CASCADE', select=True, required=True)
+
+
 class UserEmployee(ModelSQL):
     'User - Employee'
     __name__ = 'res.user-company.employee'
@@ -17,16 +30,23 @@
 
 class User(metaclass=PoolMeta):
     __name__ = 'res.user'
-    main_company = fields.Many2One('company.company', 'Main Company',
-        help="Grant access to the company and its children.")
-    company = fields.Many2One('company.company', 'Current Company',
-        domain=[('parent', 'child_of', [Eval('main_company')], 'parent')],
-        depends=['main_company'],
+
+    companies = fields.Many2Many(
+        'res.user-company.company', 'user', 'company', "Companies",
+        help="The companies that the user has access to.")
+    company = fields.Many2One(
+        'company.company', "Current Company",
+        domain=[
+            ('id', 'in', Eval('companies', [])),
+            ],
+        depends=['companies'],
         help="Select the company to work for.")
-    companies = fields.Function(fields.One2Many('company.company', None,
-            'Companies'), 'get_companies')
     employees = fields.Many2Many('res.user-company.employee', 'user',
         'employee', 'Employees',
+        domain=[
+            ('company', 'in', Eval('companies', [])),
+            ],
+        depends=['companies'],
         help="Add employees to grant the user access to them.")
     employee = fields.Many2One('company.employee', 'Current Employee',
         domain=[
@@ -42,37 +62,42 @@
         cls._context_fields.insert(0, 'company')
         cls._context_fields.insert(0, 'employee')
 
-    @staticmethod
-    def default_main_company():
-        return Transaction().context.get('company')
+    @classmethod
+    def __register__(cls, module):
+        pool = Pool()
+        UserCompany = pool.get('res.user-company.company')
+        transaction = Transaction()
+        table = cls.__table__()
+        user_company = UserCompany.__table__()
+
+        super().__register__(module)
+
+        table_h = cls.__table_handler__(module)
+        cursor = transaction.connection.cursor()
+
+        # Migration from 5.8: remove main_company
+        if table_h.column_exist('main_company'):
+            cursor.execute(*user_company.insert(
+                    [user_company.user, user_company.company],
+                    table.select(
+                        table.id, table.main_company,
+                        where=table.main_company != Null)))
+            cursor.execute(*user_company.insert(
+                    [user_company.user, user_company.company],
+                    table.select(
+                        table.id, table.company,
+                        where=(table.company != Null)
+                        & (table.company != table.main_company))))
+            table_h.drop_column('main_company')
+
+    @classmethod
+    def default_companies(cls):
+        company = Transaction().context.get('company')
+        return [company] if company else None
 
     @classmethod
     def default_company(cls):
-        return cls.default_main_company()
-
-    @classmethod
-    def get_companies(cls, users, name):
-        Company = Pool().get('company.company')
-        companies = {}
-        company_childs = {}
-        for user in users:
-            companies[user.id] = []
-            company = None
-            if user.company:
-                company = user.company
-            elif user.main_company:
-                company = user.main_company
-            if company:
-                if company in company_childs:
-                    company_ids = company_childs[company]
-                else:
-                    company_ids = list(map(int, Company.search([
-                                ('parent', 'child_of', [company.id]),
-                                ])))
-                    company_childs[company] = company_ids
-                if company_ids:
-                    companies[user.id].extend(company_ids)
-        return companies
+        return Transaction().context.get('company')
 
     def get_status_bar(self, name):
         def same_company(record):
@@ -82,16 +107,11 @@
                 and len(list(filter(same_company, self.employees))) > 1):
             status += ' - %s' % self.employee.rec_name
         if self.company:
-            if self.main_company.childs:
+            if len(self.companies) > 1:
                 status += ' - %s' % self.company.rec_name
             status += ' [%s]' % self.company.currency.code
         return status
 
-    @fields.depends('main_company')
-    def on_change_main_company(self):
-        self.company = self.main_company
-        self.employee = None
-
     @fields.depends('company', 'employees')
     def on_change_company(self):
         Employee = Pool().get('company.employee')
@@ -109,16 +129,12 @@
         res = super(User, cls)._get_preferences(user,
             context_only=context_only)
         if not context_only:
-            res['main_company'] = None
-            if user.main_company:
-                res['main_company'] = user.main_company.id
-                res['main_company.rec_name'] = user.main_company.rec_name
+            res['companies'] = [c.id for c in user.companies]
             res['employees'] = [e.id for e in user.employees]
         return res
 
     @classmethod
     def read(cls, ids, fields_names):
-        Company = Pool().get('company.company')
         user_id = Transaction().user
         if user_id == 0 and 'user' in Transaction().context:
             user_id = Transaction().context['user']
@@ -138,15 +154,12 @@
             if values:
                 if ('company' in fields_names
                         and 'company' in Transaction().context):
-                    main_company_id = values.get('main_company')
-                    if not main_company_id:
-                        main_company_id = cls.read([user_id],
-                            ['main_company'])[0]['main_company']
-                    companies = Company.search([
-                            ('parent', 'child_of', [main_company_id]),
-                            ])
+                    companies = values.get('companies')
+                    if not companies:
+                        companies = cls.read([user_id],
+                            ['companies'])[0]['companies']
                     company_id = Transaction().context['company']
-                    if ((company_id and company_id in map(int, companies))
+                    if ((company_id and company_id in companies)
                             or not company_id
                             or Transaction().user == 0):
                         values['company'] = company_id
diff -r 82ba9ef6a7a0 -r 8f8e6cf5bd0a setup.py
--- a/setup.py  Thu Mar 11 23:18:02 2021 +0100
+++ b/setup.py  Thu Mar 18 23:04:17 2021 +0100
@@ -57,7 +57,7 @@
 if local_version:
     version += '+' + '.'.join(local_version)
 
-requires = []
+requires = ['python-sql >= 0.4']
 for dep in info.get('depends', []):
     if not re.match(r'(ir|res)(\W|$)', dep):
         requires.append(get_require_version('trytond_%s' % dep))
diff -r 82ba9ef6a7a0 -r 8f8e6cf5bd0a tests/test_company.py
--- a/tests/test_company.py     Thu Mar 11 23:18:02 2021 +0100
+++ b/tests/test_company.py     Thu Mar 18 23:04:17 2021 +0100
@@ -51,7 +51,7 @@
     pool = Pool()
     User = pool.get('res.user')
     User.write([User(Transaction().user)], {
-            'main_company': company.id,
+            'companies': [('add', [company.id])],
             'company': company.id,
                 })
     with Transaction().set_context(User.get_preferences(context_only=True)):
@@ -111,23 +111,6 @@
         self.assertTrue(company)
 
     @with_transaction()
-    def test_company_recursion(self):
-        'Test company recursion'
-        pool = Pool()
-        Company = pool.get('company.company')
-
-        company1 = create_company()
-        company2 = create_company('Michael Scott Paper Company')
-        company2.parent = company1
-        company2.save()
-        self.assertTrue(company2)
-
-        self.assertRaises(Exception, Company.write,
-            [company1], {
-                'parent': company2.id,
-                })
-
-    @with_transaction()
     def test_employe(self):
         'Create employee'
         pool = Pool()
@@ -154,19 +137,18 @@
         company1 = create_company()
         company2 = create_company('Michael Scott Paper Company',
             currency=company1.currency)
-        company2.parent = company1
         company2.save()
         company3 = create_company()
 
         user1, user2 = User.create([{
                     'name': 'Jim Halper',
                     'login': 'jim',
-                    'main_company': company1.id,
+                    'companies': [('add', [company1.id, company2.id])],
                     'company': company1.id,
                     }, {
                     'name': 'Pam Beesly',
                     'login': 'pam',
-                    'main_company': company2.id,
+                    'companies': [('add', [company2.id])],
                     'company': company2.id,
                     }])
         self.assertTrue(user1)
@@ -200,7 +182,7 @@
         company = create_company()
         root = User(0)
         root.company = None
-        root.main_company = None
+        root.companies = None
         root.save()
 
         with transaction.set_user(0):
@@ -224,14 +206,14 @@
         user1, user2 = User.create([{
                     'name': "Jim Halper",
                     'login': "jim",
-                    'main_company': company.id,
+                    'companies': [('add', [company.id])],
                     'company': company.id,
                     'employees': [('add', [employee1.id, employee2.id])],
                     'employee': employee1.id,
                     }, {
                     'name': "Pam Beesly",
                     'login': "pam",
-                    'main_company': company.id,
+                    'companies': [('add', [company.id])],
                     'company': company.id,
                     'employees': [('add', [employee2.id])],
                     'employee': employee2.id,
diff -r 82ba9ef6a7a0 -r 8f8e6cf5bd0a view/company_form.xml
--- a/view/company_form.xml     Thu Mar 11 23:18:02 2021 +0100
+++ b/view/company_form.xml     Thu Mar 18 23:04:17 2021 +0100
@@ -9,10 +9,8 @@
     <label name="timezone"/>
     <field name="timezone"/>
     <notebook colspan="6">
-        <page string="Company" col="2" id="company">
-            <label name="parent"/>
-            <field name="parent"/>
-            <field name="employees" colspan="2"/>
+        <page name="employees" col="1">
+            <field name="employees"/>
         </page>
         <page string="Reports" col="1" id="reports">
             <separator name="header"/>
diff -r 82ba9ef6a7a0 -r 8f8e6cf5bd0a view/company_tree.xml
--- a/view/company_tree.xml     Thu Mar 11 23:18:02 2021 +0100
+++ /dev/null   Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-<?xml version="1.0"?>
-<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
-this repository contains the full copyright notices and license terms. -->
-<tree>
-    <field name="party" expand="1"/>
-    <field name="currency"/>
-</tree>
diff -r 82ba9ef6a7a0 -r 8f8e6cf5bd0a view/user_form.xml
--- a/view/user_form.xml        Thu Mar 11 23:18:02 2021 +0100
+++ b/view/user_form.xml        Thu Mar 18 23:04:17 2021 +0100
@@ -4,12 +4,11 @@
 <data>
     <xpath expr="/form/notebook/page/separator[@name='signature']"
         position="before">
-        <label name="main_company"/>
-        <field name="main_company" widget="selection"/>
         <label name="company"/>
         <field name="company" widget="selection"/>
         <label name="employee"/>
         <field name="employee" widget="selection"/>
-        <field name="employees" colspan="4"/>
+        <field name="companies" colspan="2"/>
+        <field name="employees" colspan="2"/>
     </xpath>
 </data>

Reply via email to