From f0d499b9786aa2a0cc5dfc8f1d6a77b60992d989 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20=C3=89vrard?= Date: Sun, 4 Oct 2015 00:50:21 +0200 Subject: [PATCH] Add searcher on purchase_request's state issue4046 review14361002 --- CHANGELOG | 1 + purchase_request.py | 32 +++- ...scenario_stock_supply_purchase_request.rst | 152 ++++++++++++++++++ tests/test_stock_supply.py | 4 + 4 files changed, 188 insertions(+), 1 deletion(-) create mode 100644 tests/scenario_stock_supply_purchase_request.rst diff --git a/CHANGELOG b/CHANGELOG index eb1e8763db..bc803c2a3f 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,4 @@ +* Add searcher on purchase_request's state * Add default internal provisioning per location Version 3.6.0 - 2015-04-20 diff --git a/purchase_request.py b/purchase_request.py index 693d58df93..2373a9ba58 100644 --- a/purchase_request.py +++ b/purchase_request.py @@ -2,6 +2,8 @@ # this repository contains the full copyright notices and license terms. import datetime import operator +from sql import Null +from sql.conditionals import Case from itertools import groupby from functools import partial from decimal import Decimal @@ -76,7 +78,7 @@ class PurchaseRequest(ModelSQL, ModelView): ('done', 'Done'), ('draft', 'Draft'), ('cancel', 'Cancel'), - ], 'State'), 'get_state') + ], 'State'), 'get_state', searcher='search_state') @classmethod def __setup__(cls): @@ -143,6 +145,34 @@ class PurchaseRequest(ModelSQL, ModelView): return 'purchased' return 'draft' + @classmethod + def search_state(cls, name, clause): + pool = Pool() + Purchase = pool.get('purchase.purchase') + PurchaseLine = pool.get('purchase.line') + + request = cls.__table__() + purchase_line = PurchaseLine.__table__() + purchase = Purchase.__table__() + + _, operator_, state = clause + Operator = fields.SQL_OPERATORS[operator_] + state_case = Case( + (purchase.state == 'cancel', 'cancel'), + (purchase.state == 'done', 'done'), + (request.purchase_line != Null, 'purchased'), + else_='draft') + state_query = request.join( + purchase_line, type_='LEFT', + condition=request.purchase_line == purchase_line.id + ).join(purchase, type_='LEFT', + condition=purchase_line.purchase == purchase.id + ).select( + request.id, + where=Operator(state_case, state)) + + return [('id', 'in', state_query)] + def get_warehouse_required(self, name): return self.product.type in ('goods', 'assets') diff --git a/tests/scenario_stock_supply_purchase_request.rst b/tests/scenario_stock_supply_purchase_request.rst new file mode 100644 index 0000000000..a3b5f9e937 --- /dev/null +++ b/tests/scenario_stock_supply_purchase_request.rst @@ -0,0 +1,152 @@ +========================= +Purchase Request Scenario +========================= + +Imports:: + + >>> import datetime + >>> from dateutil.relativedelta import relativedelta + >>> from decimal import Decimal + >>> from proteus import config, Model, Wizard + >>> from trytond.modules.company.tests.tools import create_company, \ + ... get_company + >>> from trytond.modules.account.tests.tools import (create_chart, + ... get_accounts) + >>> today = datetime.date.today() + +Create database:: + + >>> config = config.set_trytond() + >>> config.pool.test = True + +Install stock Module:: + + >>> Module = Model.get('ir.module') + >>> module, = Module.find([('name', '=', 'stock_supply')]) + >>> module.click('install') + >>> Wizard('ir.module.install_upgrade').execute('upgrade') + +Create company:: + + >>> _ = create_company() + >>> company = get_company() + +Reload the context:: + + >>> User = Model.get('res.user') + >>> Group = Model.get('res.group') + >>> config._context = User.get_preferences(True, config.context) + +Create chart of accounts:: + + >>> _ = create_chart(company) + >>> accounts = get_accounts(company) + >>> expense = accounts['expense'] + +Create a customer:: + + >>> Party = Model.get('party.party') + >>> customer = Party(name='Customer') + >>> customer.save() + +Create stock admin user:: + + >>> stock_admin_user = User() + >>> stock_admin_user.name = 'Stock Admin' + >>> stock_admin_user.login = 'stock_admin' + >>> stock_admin_user.main_company = company + >>> stock_admin_group, = Group.find([('name', '=', 'Stock Administration')]) + >>> stock_admin_user.groups.append(stock_admin_group) + >>> stock_admin_user.save() + +Create stock user:: + + >>> stock_user = User() + >>> stock_user.name = 'Stock' + >>> stock_user.login = 'stock' + >>> stock_user.main_company = company + >>> stock_group, = Group.find([('name', '=', 'Stock')]) + >>> stock_user.groups.append(stock_group) + >>> stock_user.save() + +Create product user:: + + >>> product_admin_user = User() + >>> product_admin_user.name = 'Product' + >>> product_admin_user.login = 'product' + >>> product_admin_user.main_company = company + >>> product_admin_group, = Group.find([ + ... ('name', '=', 'Product Administration') + ... ]) + >>> product_admin_user.groups.append(product_admin_group) + >>> product_admin_user.save() + +Create product:: + + >>> config.user = product_admin_user.id + >>> ProductUom = Model.get('product.uom') + >>> ProductTemplate = Model.get('product.template') + >>> Product = Model.get('product.product') + >>> unit, = ProductUom.find([('name', '=', 'Unit')]) + >>> product = Product() + >>> template = ProductTemplate() + >>> template.name = 'Product' + >>> template.default_uom = unit + >>> template.type = 'goods' + >>> template.list_price = Decimal('20') + >>> template.cost_price = Decimal('8') + >>> template.purchasable = True + >>> template.account_expense = expense + >>> template.save() + >>> product.template = template + >>> product.save() + +Get stock locations:: + + >>> config.user = stock_admin_user.id + >>> Location = Model.get('stock.location') + >>> warehouse_loc, = Location.find([('code', '=', 'WH')]) + >>> supplier_loc, = Location.find([('code', '=', 'SUP')]) + >>> customer_loc, = Location.find([('code', '=', 'CUS')]) + >>> output_loc, = Location.find([('code', '=', 'OUT')]) + >>> storage_loc, = Location.find([('code', '=', 'STO')]) + +Create a need for missing product:: + + >>> config.user = stock_user.id + >>> ShipmentOut = Model.get('stock.shipment.out') + >>> shipment_out = ShipmentOut() + >>> shipment_out.planned_date = today + >>> shipment_out.effective_date = today + >>> shipment_out.customer = customer + >>> shipment_out.warehouse = warehouse_loc + >>> shipment_out.company = company + >>> move = shipment_out.outgoing_moves.new() + >>> move.product = product + >>> move.uom = unit + >>> move.quantity = 1 + >>> move.from_location = output_loc + >>> move.to_location = customer_loc + >>> move.company = company + >>> move.unit_price = Decimal('1') + >>> move.currency = company.currency + >>> shipment_out.click('wait') + +There is no purchase request:: + + >>> PurchaseRequest = Model.get('purchase.request') + >>> PurchaseRequest.find([]) + [] + +Create the purchase request:: + + >>> create_pr = Wizard('purchase.request.create') + >>> create_pr.execute('create_') + +There is now a draft purchase request:: + + >>> pr, = PurchaseRequest.find([('state', '=', 'draft')]) + >>> pr.product == product + True + >>> pr.quantity + 1 diff --git a/tests/test_stock_supply.py b/tests/test_stock_supply.py index 9f29a88b0b..36f6c2df68 100644 --- a/tests/test_stock_supply.py +++ b/tests/test_stock_supply.py @@ -128,4 +128,8 @@ def suite(): suite.addTests(doctest.DocFileSuite('scenario_stock_internal_supply.rst', setUp=doctest_setup, tearDown=doctest_teardown, encoding='utf-8', optionflags=doctest.REPORT_ONLY_FIRST_FAILURE)) + suite.addTests(doctest.DocFileSuite( + 'scenario_stock_supply_purchase_request.rst', + setUp=doctest_setup, tearDown=doctest_teardown, encoding='utf-8', + optionflags=doctest.REPORT_ONLY_FIRST_FAILURE)) return suite