changeset 832984e9d4a9 in modules/sale_promotion_coupon:default
details: 
https://hg.tryton.org/modules/sale_promotion_coupon?cmd=changeset;node=832984e9d4a9
description:
        Use the same query for active getter and searcher

        issue8870
        review276461002
diffstat:

 sale.py |  53 +++++++++++++----------------------------------------
 1 files changed, 13 insertions(+), 40 deletions(-)

diffs (88 lines):

diff -r 306bdf0ad836 -r 832984e9d4a9 sale.py
--- a/sale.py   Thu Dec 05 21:28:52 2019 +0100
+++ b/sale.py   Sat Dec 14 10:50:42 2019 +0100
@@ -77,7 +77,7 @@
             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 @@
         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 @@
                     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 @@
 
     @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

Reply via email to