Remove tree structure from company (issue10163)

This commit is contained in:
Albert Cervera i Areny 2021-04-25 16:27:42 +02:00
parent df079094eb
commit 9a8805f4ab
20 changed files with 20 additions and 264 deletions

View File

@ -8,15 +8,12 @@ from . import cron
from . import employee
from . import carrier
from . import party
from . import user
def register():
Pool.register(
cron.Cron,
employee.Employee,
user.User,
user.UserCompany,
party.PartyCompany,
party.Party,
party.Address,

View File

@ -1,32 +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. -->
<tryton>
<data depends="account">
<record model="ir.rule" id="account.rule_account_type1">
<field name="domain"
eval="[('company', '=', Eval('user', {}).get('company', None))]"
pyson="1"/>
</record>
<record model="ir.rule" id="account.rule_account1">
<field name="domain"
eval="[('company', '=', Eval('user', {}).get('company', None))]"
pyson="1"/>
</record>
<record model="ir.rule" id="account.rule_general_ledger_account1">
<field name="domain"
eval="[('company', '=', Eval('user', {}).get('company', None))]"
pyson="1"/>
</record>
<record model="ir.rule" id="account.rule_general_ledger_line1">
<field name="domain"
eval="[('company', '=', Eval('user', {}).get('company', None))]"
pyson="1"/>
</record>
<record model="ir.rule" id="account.rule_aged_balance1">
<field name="domain"
eval="[('company', '=', Eval('user', {}).get('company', None))]"
pyson="1"/>
</record>
</data>
</tryton>

View File

@ -3,8 +3,6 @@
from trytond.pool import PoolMeta
from . import party
__all__ = ['Activity']
class Activity(party.PartyCompanyMixin, metaclass=PoolMeta):
__name__ = "activity.activity"

View File

@ -9,10 +9,8 @@ this repository contains the full copyright notices and license terms. -->
<field name="model" search="[('model', '=', 'activity.activity')]"/>
<field name="global_p" eval="True"/>
</record>
<record model="ir.rule" id="rule_activity_activity1">
<field name="domain"
eval="['OR', ('companies', 'in', [Eval('user', {}).get('company', None)]), ('companies', 'in', [])]"
pyson="1"/>
<record model="ir.rule" id="rule_activity_activity_companies">
<field name="domain" eval="[('companies', 'in', Eval('companies', []))]" pyson="1"/>
<field name="rule_group" ref="rule_group_activity_activity"/>
</record>
</data>

View File

@ -4,8 +4,6 @@ from trytond.model import fields
from trytond.pool import PoolMeta
from . import party
__all__ = ['Bank', 'BankAccount']
class Bank(party.PartyCompanyMixin, metaclass=PoolMeta):
__name__ = "bank"

View File

@ -9,10 +9,8 @@ this repository contains the full copyright notices and license terms. -->
<field name="model" search="[('model', '=', 'bank')]"/>
<field name="global_p" eval="True"/>
</record>
<record model="ir.rule" id="rule_bank1">
<field name="domain"
eval="['OR', ('companies', 'in', [Eval('user', {}).get('company', None)]), ('companies', 'in', [])]"
pyson="1"/>
<record model="ir.rule" id="rule_bank_companies">
<field name="domain" eval="[('companies', 'in', Eval('companies', []))]" pyson="1"/>
<field name="rule_group" ref="rule_group_bank"/>
</record>
@ -21,10 +19,8 @@ this repository contains the full copyright notices and license terms. -->
<field name="model" search="[('model', '=', 'bank.account')]"/>
<field name="global_p" eval="True"/>
</record>
<record model="ir.rule" id="rule_bank_account1">
<field name="domain"
eval="['OR', ('companies', 'in', [Eval('user', {}).get('company', None)]), ('companies', 'in', [])]"
pyson="1"/>
<record model="ir.rule" id="rule_bank_account_companies">
<field name="domain" eval="[('companies', 'in', Eval('companies', []))]" pyson="1"/>
<field name="rule_group" ref="rule_group_bank_account"/>
</record>
</data>

View File

@ -3,8 +3,6 @@
from trytond.pool import PoolMeta
from . import party
__all__ = ['Carrier']
class Carrier(party.PartyCompanyMixin, metaclass=PoolMeta):
__name__ = 'carrier'

View File

@ -9,10 +9,8 @@ this repository contains the full copyright notices and license terms. -->
<field name="model" search="[('model', '=', 'carrier')]"/>
<field name="global_p" eval="True"/>
</record>
<record model="ir.rule" id="rule_carrier1">
<field name="domain"
eval="['OR', ('companies', 'in', [Eval('user', {}).get('company', None)]), ('companies', 'in', [])]"
pyson="1"/>
<record model="ir.rule" id="rule_carrier_companies">
<field name="domain" eval="[('companies', 'in', Eval('companies', []))]" pyson="1"/>
<field name="rule_group" ref="rule_group_carrier"/>
</record>
</data>

View File

@ -9,10 +9,8 @@ this repository contains the full copyright notices and license terms. -->
<field name="model" search="[('model', '=', 'commission')]"/>
<field name="global_p" eval="True"/>
</record>
<record model="ir.rule" id="rule_commission1">
<field name="domain"
eval="[('agent.company', '=', Eval('user', {}).get('company', None))]"
pyson="1"/>
<record model="ir.rule" id="rule_commission_companies">
<field name="domain" eval="[('agent.company', 'in', Eval('companies', []))]" pyson="1"/>
<field name="rule_group" ref="rule_group_commission"/>
</record>
@ -22,10 +20,8 @@ this repository contains the full copyright notices and license terms. -->
<field name="model" search="[('model', '=', 'commission.agent')]"/>
<field name="global_p" eval="True"/>
</record>
<record model="ir.rule" id="rule_commission_agent1">
<field name="domain"
eval="[('company', '=', Eval('user', {}).get('company', None))]"
pyson="1"/>
<record model="ir.rule" id="rule_commission_agent_companies">
<field name="domain" eval="[('company', 'in', Eval('companies', []))]" pyson="1"/>
<field name="rule_group" ref="rule_group_commission_agent"/>
</record>
</data>

View File

@ -4,8 +4,6 @@ from trytond.model import ModelView, dualmethod
from trytond.pool import Pool, PoolMeta
from trytond.transaction import Transaction
__all__ = ['Cron']
class Cron(metaclass=PoolMeta):
__name__ = "ir.cron"

View File

@ -4,7 +4,6 @@ from trytond.pool import PoolMeta
from trytond.pyson import Eval, If
from trytond.transaction import Transaction
__all__ = ['Employee']
class Employee(metaclass=PoolMeta):
__name__ = 'company.employee'

View File

@ -4,9 +4,7 @@ this repository contains the full copyright notices and license terms. -->
<tryton>
<data>
<record model="ir.action.act_window" id="company.act_employee_form">
<field name="domain"
eval="[('company', '=', Eval('context', {}).get('company', -1))]"
pyson="1"/>
<field name="domain" eval="[('company', 'in', Eval('companies', []))]" pyson="1"/>
</record>
</data>
</tryton>

View File

@ -10,9 +10,6 @@ from trytond import backend
from trytond.i18n import gettext
from trytond.exceptions import UserError
__all__ = ['PartyCompany', 'Party', 'Address', 'PartyIdentifier',
'ContactMechanism']
class Party(metaclass=PoolMeta):
__name__ = 'party.party'

View File

@ -16,9 +16,7 @@ this repository contains the full copyright notices and license terms. -->
<field name="global_p" eval="True"/>
</record>
<record model="ir.rule" id="rule_party1">
<field name="domain"
eval="[('current_company', '=', True)]"
pyson="1"/>
<field name="domain" eval="[('current_company', '=', True)]" pyson="1"/>
<field name="rule_group" ref="rule_group_party"/>
</record>
@ -29,9 +27,7 @@ this repository contains the full copyright notices and license terms. -->
<field name="global_p" eval="True"/>
</record>
<record model="ir.rule" id="rule_address1">
<field name="domain"
eval="[('party.current_company', '=', True)]"
pyson="1"/>
<field name="domain" eval="[('party.current_company', '=', True)]" pyson="1"/>
<field name="rule_group" ref="rule_group_address"/>
</record>
@ -42,9 +38,7 @@ this repository contains the full copyright notices and license terms. -->
<field name="global_p" eval="True"/>
</record>
<record model="ir.rule" id="rule_identifier1">
<field name="domain"
eval="[('party.current_company', '=', True)]"
pyson="1"/>
<field name="domain" eval="[('party.current_company', '=', True)]" pyson="1"/>
<field name="rule_group" ref="rule_group_identifier"/>
</record>
@ -55,9 +49,7 @@ this repository contains the full copyright notices and license terms. -->
<field name="global_p" eval="True"/>
</record>
<record model="ir.rule" id="rule_contact_mechanism1">
<field name="domain"
eval="[('party.current_company', '=', True)]"
pyson="1"/>
<field name="domain" eval="[('party.current_company', '=', True)]" pyson="1"/>
<field name="rule_group" ref="rule_group_contact_mechanism"/>
</record>
</data>

View File

@ -4,10 +4,8 @@ The COPYRIGHT file at the top level of this repository contains the full copyrig
<tryton>
<data depends="sale_shop">
<record model="ir.rule" id="rule_sale_shop2">
<field name="domain"
eval="[('company', 'in', Eval('user', {}).get('main_companies', None))]"
pyson="1"/>
<field name="domain" eval="[('company', 'in', Eval('companies'))]" pyson="1"/>
<field name="rule_group" ref="sale_shop.rule_group_sale_shop"/>
</record>
</data>
</tryton>
</tryton>

View File

@ -5,9 +5,7 @@ this repository contains the full copyright notices and license terms. -->
<data depends="stock">
<!-- comment rule in case has not issue4482.diff patch -->
<record model="ir.rule" id="stock.rule_inventory">
<field name="domain"
eval="[('company', '=', Eval('user', {}).get('company', None))]"
pyson="1"/>
<field name="domain" eval="[('company', '=', Eval('companies'))]" pyson="1"/>
</record>
</data>
</tryton>

View File

@ -14,7 +14,6 @@ extras_depend:
sale_shop
stock
xml:
account.xml
activity.xml
bank.xml
carrier.xml
@ -23,5 +22,4 @@ xml:
party.xml
shop.xml
stock.xml
user.xml
messages.xml

136
user.py
View File

@ -1,136 +0,0 @@
# The COPYRIGHT file at the top level of this repository contains the full
# copyright notices and license terms.
import copy
from trytond.pool import Pool, PoolMeta
from trytond.model import ModelSQL, fields
from trytond.pyson import Eval
from trytond.transaction import Transaction
from trytond import backend
from sql import Table, Null, Column
from sql.functions import CurrentTimestamp
__all__ = ['User', 'UserCompany']
class User(metaclass=PoolMeta):
__name__ = 'res.user'
main_companies = fields.Many2Many('res.user-company.company', 'user',
'company', 'Main Companies')
@classmethod
def __setup__(cls):
super(User, cls).__setup__()
if not 'companies' in cls._context_fields:
cls._context_fields.insert(0, 'companies')
# replace company field domain and depends
domain = cls.company.domain
new_domain = [d for d in domain if not 'main_company' in str(d)]
new_domain.append(
('parent', 'child_of', Eval('main_companies'), 'parent'))
cls.company.domain = new_domain
depends = cls.company.depends
depends.append('main_companies')
if 'main_company' in depends:
depends.remove('main_company')
cls.company.depends = depends
@classmethod
def write(cls, *args):
actions = iter(args)
new_args = []
for records, values in zip(actions, actions):
new_args.append(records)
if 'main_company' in values:
values = values.copy()
values['main_companies'] = [('add', [values['main_company']])]
new_args.append(values)
super().write(*new_args)
@classmethod
def get_companies(cls, users, name):
Company = Pool().get('company.company')
companies = super(User, cls).get_companies(users, name)
companies = {}
company_childs = {}
for user in users:
companies[user.id] = []
for company in user.main_companies:
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
@classmethod
def get_preferences_fields_view(cls):
Company = Pool().get('company.company')
res = super(User, cls).get_preferences_fields_view()
res = copy.deepcopy(res)
if 'company' in res['fields']:
user = cls(Transaction().user)
selection = [(None, '')]
company_ids = [c.id for c in user.main_companies]
if company_ids:
companies = Company.search([
('parent', 'child_of', company_ids,
'parent'),
])
for company in companies:
selection.append((company.id, company.rec_name))
res['fields']['company']['selection'] = selection
return res
class UserCompany(ModelSQL):
'User - Company'
__name__ = 'res.user-company.company'
_table = 'res_user_company_rel'
user = fields.Many2One('res.user', 'User', ondelete='CASCADE',
required=True, select=True)
company = fields.Many2One('company.company', 'Company',
ondelete='CASCADE', required=True, select=True)
@classmethod
def __register__(cls, module_name):
User = Pool().get('res.user')
user_company_table_name = 'res_user_company_rel'
cursor = Transaction().connection.cursor()
user_company_table_exist = False
if backend.TableHandler.table_exist(user_company_table_name):
user_company_table_exist = True
super(UserCompany, cls).__register__(module_name)
if not user_company_table_exist:
# update main_company to null
user = User.__table__()
query = user.update(
columns=[user.main_company],
values=[None],
where=user.main_company != Null)
cursor.execute(*query)
# insert company user
fields = ['create_uid', 'create_date', 'user', 'company']
query = user.select(user.id, user.company,
where=(user.company != Null))
cursor.execute(*query)
values = [(0, CurrentTimestamp(), user_id, company_id) for user_id,
company_id in cursor.fetchall()]
if values:
user_company = Table(user_company_table_name)
query = user_company.insert(
columns=[Column(user_company, f) for f in fields],
values=values)
cursor.execute(*query)

View File

@ -1,22 +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. -->
<tryton>
<data>
<record model="ir.ui.view" id="user_view_form">
<field name="model">res.user</field>
<field name="inherit" ref="res.user_view_form"/>
<field name="name">user_form</field>
</record>
<record model="res.user" id="user_party_company">
<field name="login">user_cron_party_company</field>
<field name="name">Cron User Company</field>
<field name="active" eval="False"/>
</record>
<record model="res.user-res.group" id="user_party_company_group_admin">
<field name="user" ref="user_party_company"/>
<field name="group" ref="res.group_admin"/>
</record>
</data>
</tryton>

View File

@ -1,11 +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. -->
<data>
<xpath expr="/form/notebook/page/label[@name='main_company']" position="replace"/>
<xpath expr="/form/notebook/page/field[@name='main_company']" position="replace"/>
<xpath expr="/form/notebook/page/field[@name='employees']"
position="before">
<field name="main_companies" colspan="4"/>
</xpath>
</data>