trytond-commission_party/party.py

125 lines
4.4 KiB
Python

# 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 Pool, PoolMeta
from trytond.transaction import Transaction
from trytond.pyson import Eval
from trytond import backend
from trytond.modules.company.model import (
CompanyMultiValueMixin, CompanyValueMixin)
class Party(CompanyMultiValueMixin, metaclass=PoolMeta):
__name__ = 'party.party'
agents = fields.One2Many('party.party.commission.agent', 'party', 'Agents',
domain=[
('company', '=', Eval('context', {}).get('company', -1)),
],
states={
'invisible': ~Eval('context', {}).get('company'),
})
agent = fields.MultiValue(fields.Many2One('commission.agent', 'Agent',
domain=[
('company', '=', Eval('context', {}).get('company', -1)),
],
states={
'invisible': ~Eval('context', {}).get('company'),
}))
@classmethod
def __setup__(cls):
super().__setup__()
cls.agent.searcher = 'search_agent'
@classmethod
def multivalue_model(cls, field):
pool = Pool()
if field in {'agent'}:
return pool.get('party.party.commission.agent')
return super(Party, cls).multivalue_model(field)
@classmethod
def search_agent(cls, name, clause):
Agent = Pool().get('commission.agent')
searched_parties = cls.search([('rec_name',) + tuple(clause[1:])])
agents = Agent.search([('party', 'in', searched_parties)])
parties = []
for agent in agents:
parties.extend(agent.assigned_parties)
return [('id', 'in', parties)]
class Agent(metaclass=PoolMeta):
__name__ = 'commission.agent'
assigned_parties = fields.Function(fields.One2Many('party.party', None,
'Assigned Parties'), 'get_assigned_parties')
@classmethod
def copy(cls, agents, default=None):
if default is None:
default = {}
default = default.copy()
default.setdefault('assigned_parties')
return super(Agent, cls).copy(agents, default)
def get_assigned_parties(self, name):
pool = Pool()
PartyCommissionAgent = pool.get('party.party.commission.agent')
Party = pool.get('party.party')
party_company_exist = backend.TableHandler.table_exist('party_company_rel')
if party_company_exist:
PartyCompany = pool.get('party.company.rel')
party_company = PartyCompany.__table__()
partyagent = PartyCommissionAgent.__table__()
party = Party().__table__()
cursor = Transaction().connection.cursor()
join = partyagent.join(party, condition=partyagent.party == party.id)
sql_where = ((partyagent.agent == self.id)
& (partyagent.company == self.company.id) & (party.active == True))
if party_company_exist:
join = join.join(party_company,
condition=partyagent.party == party_company.party)
sql_where &= party_company.company == self.company.id
cursor.execute(*join.select(partyagent.party, where=sql_where))
ids = cursor.fetchall()
if not ids:
return []
return [p[0] for p in ids]
class PartyCommissionAgent(ModelSQL, CompanyValueMixin):
"Party Commission Agent"
__name__ = 'party.party.commission.agent'
party = fields.Many2One('party.party', "Party", ondelete='CASCADE',
select=True)
agent = fields.Many2One('commission.agent', 'Agent', domain=[
('company', '=', Eval('company', -1)),
],
depends=['company'])
@classmethod
def __register__(cls, module_name):
Party = Pool().get('party.party')
cursor = Transaction().connection.cursor()
exist = backend.TableHandler.table_exist(cls._table)
table = cls.__table__()
party = Party.__table__()
super(PartyCommissionAgent, cls).__register__(module_name)
if not exist:
party_h = backend.TableHandler(Party, module_name)
if party_h.column_exist('agent'):
query = table.insert(
[table.party, table.agent],
party.select(party.id, party.agent,
where=(party.agent != Null)))
cursor.execute(*query)
party_h.drop_column('agent')