Use the same query for active getter and searcher

issue8870
review276461002
This commit is contained in:
Cédric Krier committed 2019-12-14 10:50:42 +01:00
1 parent db23e2f949
commit d8b1d4f77c
1 file changed
+13 -40
+13 -40
View File
@@ -77,7 +77,7 @@ class PromotionCouponNumber(DeactivableMixin, ModelSQL, ModelView):
fields.Boolean("Active"), 'get_active', searcher='search_active')
@classmethod
def get_active(cls, numbers, name):
def _active_query(cls):
pool = Pool()
Coupon = pool.get('sale.promotion.coupon')
Sale = pool.get('sale.sale')
@@ -87,7 +87,6 @@ class PromotionCouponNumber(DeactivableMixin, ModelSQL, ModelView):
sale = Sale.__table__()
sale_number = Sale_Number.__table__()
context = Transaction().context
cursor = Transaction().connection.cursor()
party = context.get('party')
query = (table
@@ -113,8 +112,16 @@ class PromotionCouponNumber(DeactivableMixin, ModelSQL, ModelView):
Count(sale_number.sale) < coupon.number_of_use),
else_=Literal(True))
query = query.select(table.id, active,
query = query.select(
group_by=[table.id, coupon.number_of_use, coupon.per_party])
return query, table, active
@classmethod
def get_active(cls, numbers, name):
cursor = Transaction().connection.cursor()
query, table, active = cls._active_query()
query.columns = [table.id, active]
result = {}
for sub_numbers in grouped_slice(numbers):
@@ -125,46 +132,12 @@ class PromotionCouponNumber(DeactivableMixin, ModelSQL, ModelView):
@classmethod
def search_active(cls, name, clause):
pool = Pool()
Coupon = pool.get('sale.promotion.coupon')
Sale = pool.get('sale.sale')
Sale_Number = pool.get('sale.sale-sale.promotion.coupon.number')
table = cls.__table__()
coupon = Coupon.__table__()
sale = Sale.__table__()
sale_number = Sale_Number.__table__()
context = Transaction().context
party = context.get('party')
_, operator, value = clause
Operator = fields.SQL_OPERATORS[operator]
query = (table
.join(sale_number, 'LEFT',
condition=table.id == sale_number.number)
.join(coupon, condition=table.coupon == coupon.id))
if party:
query = query.join(sale, 'LEFT',
condition=(sale_number.sale == sale.id)
& (sale.party == party))
active = Case(
((coupon.number_of_use > 0) & (coupon.per_party),
Count(sale.id) < coupon.number_of_use),
((coupon.number_of_use > 0)
& ~Coalesce(coupon.per_party, False),
Count(sale_number.sale) < coupon.number_of_use),
else_=Literal(True))
else:
active = Case(
((coupon.number_of_use > 0)
& ~Coalesce(coupon.per_party, False),
Count(sale_number.sale) < coupon.number_of_use),
else_=Literal(True))
query = query.select(table.id,
group_by=[table.id, coupon.number_of_use, coupon.per_party],
having=Operator(active, value))
query, table, active = cls._active_query()
query.columns = [table.id]
query.having = Operator(active, value)
return [('id', 'in', query)]
@classmethod