first commit
This commit is contained in:
122
modules/incoterm/party.py
Normal file
122
modules/incoterm/party.py
Normal file
@@ -0,0 +1,122 @@
|
||||
# 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 Literal
|
||||
from sql.conditionals import Coalesce
|
||||
|
||||
from trytond.model import ModelSQL, ModelView, fields, sequence_ordered
|
||||
from trytond.pool import Pool, PoolMeta
|
||||
from trytond.pyson import Eval
|
||||
from trytond.transaction import Transaction
|
||||
|
||||
|
||||
class Party(metaclass=PoolMeta):
|
||||
__name__ = 'party.party'
|
||||
|
||||
purchase_incoterms = fields.One2Many(
|
||||
'party.incoterm', 'party', "Purchase Incoterms",
|
||||
filter=[
|
||||
('type', '=', 'purchase'),
|
||||
],
|
||||
help="Incoterms available for use with the supplier.\n"
|
||||
"Leave empty for all.")
|
||||
sale_incoterms = fields.One2Many(
|
||||
'party.incoterm', 'party', "Sale Incoterms",
|
||||
filter=[
|
||||
('type', '=', 'sale'),
|
||||
],
|
||||
help="Incoterms available for use with the customer.\n"
|
||||
"Leave empty for all.")
|
||||
|
||||
|
||||
class Address(metaclass=PoolMeta):
|
||||
__name__ = 'party.address'
|
||||
|
||||
is_incoterm_related = fields.Function(
|
||||
fields.Boolean("Is Incoterm Related"),
|
||||
'get_is_incoterm_related')
|
||||
|
||||
@classmethod
|
||||
def _is_incoterm_related_query(cls, type=None, party=None):
|
||||
pool = Pool()
|
||||
Incoterm = pool.get('party.incoterm')
|
||||
context = Transaction().context
|
||||
if party is None:
|
||||
party = context.get('related_party')
|
||||
if type is None:
|
||||
type = context.get('incoterm_type')
|
||||
if not party:
|
||||
return
|
||||
table = Incoterm.__table__()
|
||||
where = table.party == party
|
||||
if type:
|
||||
where &= table.type == type
|
||||
return table.select(
|
||||
table.incoterm_location.as_('address'),
|
||||
Literal(True).as_('is_related'),
|
||||
where=where,
|
||||
group_by=[table.incoterm_location])
|
||||
|
||||
@classmethod
|
||||
def get_is_incoterm_related(cls, addresses, name):
|
||||
is_related = {a.id: False for a in addresses}
|
||||
query = cls._is_incoterm_related_query()
|
||||
if query:
|
||||
cursor = Transaction().connection.cursor()
|
||||
cursor.execute(*query)
|
||||
is_related.update(cursor)
|
||||
return is_related
|
||||
|
||||
@classmethod
|
||||
def order_is_incoterm_related(cls, tables):
|
||||
address, _ = tables[None]
|
||||
key = 'is_incoterm_related'
|
||||
if key not in tables:
|
||||
query = cls._is_incoterm_related_query()
|
||||
if not query:
|
||||
return []
|
||||
join = address.join(query, type_='LEFT',
|
||||
condition=query.address == address.id)
|
||||
tables[key] = {
|
||||
None: (join.right, join.condition),
|
||||
}
|
||||
else:
|
||||
query, _ = tables[key][None]
|
||||
return [Coalesce(query.is_related, False)]
|
||||
|
||||
|
||||
class Incoterm(sequence_ordered(), ModelView, ModelSQL):
|
||||
__name__ = 'party.incoterm'
|
||||
|
||||
party = fields.Many2One(
|
||||
'party.party', "Party", required=True, ondelete='CASCADE',
|
||||
context={
|
||||
'company': Eval('company', -1),
|
||||
},
|
||||
depends={'company'})
|
||||
company = fields.Many2One('company.company', "Company")
|
||||
type = fields.Selection([
|
||||
('purchase', "Purchase"),
|
||||
('sale', "Sale"),
|
||||
], "Type", required=True)
|
||||
incoterm = fields.Many2One(
|
||||
'incoterm.incoterm', "Incoterm", required=True, ondelete='CASCADE')
|
||||
incoterm_location = fields.Many2One(
|
||||
'party.address', "Incoterm Location", ondelete='CASCADE',
|
||||
search_context={
|
||||
'related_party': Eval('party'),
|
||||
},
|
||||
search_order=[
|
||||
('party.distance', 'ASC NULLS LAST'),
|
||||
('id', None),
|
||||
],
|
||||
depends={'party'})
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls.__access__.add('party')
|
||||
|
||||
@classmethod
|
||||
def default_company(cls):
|
||||
return Transaction().context.get('company')
|
||||
Reference in New Issue
Block a user