Add searcher on purchase_request's state

issue4046
review14361002
This commit is contained in:
Nicolas Évrard
2015-10-04 00:50:21 +02:00
parent 3fd8afa2e1
commit f0d499b978
4 changed files with 188 additions and 1 deletions
+1
View File
@@ -1,3 +1,4 @@
* Add searcher on purchase_request's state
* Add default internal provisioning per location
Version 3.6.0 - 2015-04-20
+31 -1
View File
@@ -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')
@@ -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
+4
View File
@@ -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