Remove tree structure from company (issue10163)
This commit is contained in:
parent
df079094eb
commit
9a8805f4ab
|
@ -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,
|
||||
|
|
32
account.xml
32
account.xml
|
@ -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>
|
|
@ -3,8 +3,6 @@
|
|||
from trytond.pool import PoolMeta
|
||||
from . import party
|
||||
|
||||
__all__ = ['Activity']
|
||||
|
||||
|
||||
class Activity(party.PartyCompanyMixin, metaclass=PoolMeta):
|
||||
__name__ = "activity.activity"
|
||||
|
|
|
@ -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>
|
||||
|
|
2
bank.py
2
bank.py
|
@ -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"
|
||||
|
|
12
bank.xml
12
bank.xml
|
@ -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>
|
||||
|
|
|
@ -3,8 +3,6 @@
|
|||
from trytond.pool import PoolMeta
|
||||
from . import party
|
||||
|
||||
__all__ = ['Carrier']
|
||||
|
||||
|
||||
class Carrier(party.PartyCompanyMixin, metaclass=PoolMeta):
|
||||
__name__ = 'carrier'
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
2
cron.py
2
cron.py
|
@ -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"
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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>
|
||||
|
|
3
party.py
3
party.py
|
@ -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'
|
||||
|
|
16
party.xml
16
party.xml
|
@ -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>
|
||||
|
|
6
shop.xml
6
shop.xml
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
136
user.py
|
@ -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)
|
22
user.xml
22
user.xml
|
@ -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>
|
|
@ -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>
|
Loading…
Reference in New Issue