Adapt to Tryton 5.2
This commit is contained in:
parent
f1626d756a
commit
2b36540c25
12
__init__.py
12
__init__.py
|
@ -2,16 +2,16 @@
|
||||||
# copyright notices and license terms.
|
# copyright notices and license terms.
|
||||||
|
|
||||||
from trytond.pool import Pool
|
from trytond.pool import Pool
|
||||||
from .nutrition_program import *
|
from . import nutrition_program
|
||||||
|
|
||||||
|
|
||||||
def register():
|
def register():
|
||||||
Pool.register(
|
Pool.register(
|
||||||
Animal,
|
nutrition_program.Animal,
|
||||||
AnimalGroup,
|
nutrition_program.AnimalGroup,
|
||||||
NutritionProgram,
|
nutrition_program.NutritionProgram,
|
||||||
Specie,
|
nutrition_program.Specie,
|
||||||
module='farm_nutrition_program', type_='model')
|
module='farm_nutrition_program', type_='model')
|
||||||
Pool.register(
|
Pool.register(
|
||||||
OpenBOM,
|
nutrition_program.OpenBOM,
|
||||||
module='farm_nutrition_program', type_='wizard')
|
module='farm_nutrition_program', type_='wizard')
|
||||||
|
|
|
@ -7,7 +7,6 @@ from trytond.transaction import Transaction
|
||||||
from trytond.wizard import Wizard, StateAction
|
from trytond.wizard import Wizard, StateAction
|
||||||
|
|
||||||
__all__ = ['NutritionProgram', 'Animal', 'AnimalGroup', 'OpenBOM', 'Specie']
|
__all__ = ['NutritionProgram', 'Animal', 'AnimalGroup', 'OpenBOM', 'Specie']
|
||||||
__metaclass__ = PoolMeta
|
|
||||||
|
|
||||||
|
|
||||||
class NutritionProgram(ModelSQL, ModelView):
|
class NutritionProgram(ModelSQL, ModelView):
|
||||||
|
@ -15,7 +14,9 @@ class NutritionProgram(ModelSQL, ModelView):
|
||||||
__name__ = 'farm.nutrition.program'
|
__name__ = 'farm.nutrition.program'
|
||||||
|
|
||||||
specie = fields.Many2One('farm.specie', 'Specie', required=True,
|
specie = fields.Many2One('farm.specie', 'Specie', required=True,
|
||||||
readonly=True, select=True)
|
select=True, states={
|
||||||
|
'readonly': True,
|
||||||
|
})
|
||||||
animal_type = fields.Selection([
|
animal_type = fields.Selection([
|
||||||
('male', 'Male'),
|
('male', 'Male'),
|
||||||
('female', 'Female'),
|
('female', 'Female'),
|
||||||
|
@ -58,7 +59,7 @@ def _get_nutrition_program(animal):
|
||||||
return programs[0].id
|
return programs[0].id
|
||||||
|
|
||||||
|
|
||||||
class Animal:
|
class Animal(metaclass=PoolMeta):
|
||||||
__name__ = 'farm.animal'
|
__name__ = 'farm.animal'
|
||||||
|
|
||||||
nutrition_program = fields.Function(
|
nutrition_program = fields.Function(
|
||||||
|
@ -69,7 +70,7 @@ class Animal:
|
||||||
return _get_nutrition_program(self)
|
return _get_nutrition_program(self)
|
||||||
|
|
||||||
|
|
||||||
class AnimalGroup:
|
class AnimalGroup(metaclass=PoolMeta):
|
||||||
__name__ = 'farm.animal.group'
|
__name__ = 'farm.animal.group'
|
||||||
|
|
||||||
nutrition_program = fields.Function(
|
nutrition_program = fields.Function(
|
||||||
|
@ -104,7 +105,7 @@ class OpenBOM(Wizard):
|
||||||
return 'end'
|
return 'end'
|
||||||
|
|
||||||
|
|
||||||
class Specie:
|
class Specie(metaclass=PoolMeta):
|
||||||
__name__ = 'farm.specie'
|
__name__ = 'farm.specie'
|
||||||
|
|
||||||
def _create_additional_menus(self, specie_menu, specie_submenu_seq,
|
def _create_additional_menus(self, specie_menu, specie_submenu_seq,
|
||||||
|
|
4
setup.py
4
setup.py
|
@ -4,7 +4,7 @@
|
||||||
from setuptools import setup
|
from setuptools import setup
|
||||||
import re
|
import re
|
||||||
import os
|
import os
|
||||||
import ConfigParser
|
import configparser
|
||||||
|
|
||||||
MODULE = 'farm_nutrition_program'
|
MODULE = 'farm_nutrition_program'
|
||||||
PREFIX = 'nantic'
|
PREFIX = 'nantic'
|
||||||
|
@ -14,7 +14,7 @@ MODULE2PREFIX = {}
|
||||||
def read(fname):
|
def read(fname):
|
||||||
return open(os.path.join(os.path.dirname(__file__), fname)).read()
|
return open(os.path.join(os.path.dirname(__file__), fname)).read()
|
||||||
|
|
||||||
config = ConfigParser.ConfigParser()
|
config = configparser.ConfigParser()
|
||||||
config.readfp(open('tryton.cfg'))
|
config.readfp(open('tryton.cfg'))
|
||||||
info = dict(config.items('tryton'))
|
info = dict(config.items('tryton'))
|
||||||
for key in ('depends', 'extras_depend', 'xml'):
|
for key in ('depends', 'extras_depend', 'xml'):
|
||||||
|
|
|
@ -2,204 +2,129 @@
|
||||||
Nutrition Program Scenario
|
Nutrition Program Scenario
|
||||||
==========================
|
==========================
|
||||||
|
|
||||||
=============
|
|
||||||
General Setup
|
|
||||||
=============
|
|
||||||
|
|
||||||
Imports::
|
Imports::
|
||||||
|
|
||||||
>>> import datetime
|
>>> import datetime
|
||||||
>>> from dateutil.relativedelta import relativedelta
|
>>> from dateutil.relativedelta import relativedelta
|
||||||
>>> from decimal import Decimal
|
>>> from decimal import Decimal
|
||||||
>>> from proteus import config, Model, Wizard
|
>>> from proteus import Model, Wizard
|
||||||
|
>>> from trytond.tests.tools import activate_modules
|
||||||
>>> from trytond.modules.company.tests.tools import create_company, \
|
>>> from trytond.modules.company.tests.tools import create_company, \
|
||||||
... get_company
|
... get_company
|
||||||
|
>>> from trytond.modules.account.tests.tools import create_fiscalyear, \
|
||||||
|
... create_chart, get_accounts
|
||||||
|
>>> from trytond.modules.farm.tests.tools import create_specie, \
|
||||||
|
... create_users, create_feed_product
|
||||||
>>> now = datetime.datetime.now()
|
>>> now = datetime.datetime.now()
|
||||||
>>> yesterday = datetime.datetime.now() - relativedelta(days=1)
|
>>> yesterday = datetime.datetime.now() - relativedelta(days=1)
|
||||||
>>> today = datetime.date.today()
|
>>> today = datetime.date.today()
|
||||||
|
|
||||||
Create database::
|
Install module::
|
||||||
|
|
||||||
>>> config = config.set_trytond()
|
>>> config = activate_modules('farm_nutrition_program')
|
||||||
>>> config.pool.test = True
|
|
||||||
|
|
||||||
Install farm::
|
|
||||||
|
|
||||||
>>> Module = Model.get('ir.module')
|
|
||||||
>>> modules = Module.find([
|
|
||||||
... ('name', '=', 'farm_nutrition_program'),
|
|
||||||
... ])
|
|
||||||
>>> Module.install([x.id for x in modules], config.context)
|
|
||||||
>>> Wizard('ir.module.install_upgrade').execute('upgrade')
|
|
||||||
|
|
||||||
Create company::
|
Create company::
|
||||||
|
|
||||||
>>> _ = create_company()
|
>>> _ = create_company()
|
||||||
>>> company = get_company()
|
>>> company = get_company()
|
||||||
>>> party = company.party
|
|
||||||
|
|
||||||
Reload the context::
|
|
||||||
|
|
||||||
>>> User = Model.get('res.user')
|
|
||||||
>>> config._context = User.get_preferences(True, config.context)
|
|
||||||
|
|
||||||
Create products::
|
|
||||||
|
|
||||||
>>> ProductUom = Model.get('product.uom')
|
|
||||||
>>> kg, = ProductUom.find([('name', '=', 'Kilogram')])
|
|
||||||
>>> unit, = ProductUom.find([('name', '=', 'Unit')])
|
|
||||||
>>> ProductTemplate = Model.get('product.template')
|
|
||||||
>>> Product = Model.get('product.product')
|
|
||||||
>>> individual_template = ProductTemplate(
|
|
||||||
... name='Male Pig',
|
|
||||||
... default_uom=unit,
|
|
||||||
... type='goods',
|
|
||||||
... list_price=Decimal('40'),
|
|
||||||
... cost_price=Decimal('25'))
|
|
||||||
>>> individual_template.save()
|
|
||||||
>>> individual_product = Product(template=individual_template)
|
|
||||||
>>> individual_product.save()
|
|
||||||
>>> group_template = ProductTemplate(
|
|
||||||
... name='Group of Pig',
|
|
||||||
... default_uom=unit,
|
|
||||||
... type='goods',
|
|
||||||
... list_price=Decimal('30'),
|
|
||||||
... cost_price=Decimal('20'))
|
|
||||||
>>> group_template.save()
|
|
||||||
>>> group_product = Product(template=group_template)
|
|
||||||
>>> group_product.save()
|
|
||||||
>>> feed_template = ProductTemplate(
|
|
||||||
... name='Feed',
|
|
||||||
... default_uom=kg,
|
|
||||||
... type='goods',
|
|
||||||
... list_price=Decimal('40'),
|
|
||||||
... cost_price=Decimal('25'))
|
|
||||||
>>> feed_template.save()
|
|
||||||
>>> feed_product = Product(template=feed_template)
|
|
||||||
>>> feed_product.save()
|
|
||||||
>>> feed_product.reload()
|
|
||||||
|
|
||||||
Create sequence::
|
|
||||||
|
|
||||||
>>> Sequence = Model.get('ir.sequence')
|
|
||||||
>>> event_order_sequence = Sequence(
|
|
||||||
... name='Event Order Pig Warehouse 1',
|
|
||||||
... code='farm.event.order',
|
|
||||||
... padding=4)
|
|
||||||
>>> event_order_sequence.save()
|
|
||||||
>>> individual_sequence = Sequence(
|
|
||||||
... name='Individual Pig Warehouse 1',
|
|
||||||
... code='farm.animal',
|
|
||||||
... padding=4)
|
|
||||||
>>> individual_sequence.save()
|
|
||||||
>>> group_sequence = Sequence(
|
|
||||||
... name='Groups Pig Warehouse 1',
|
|
||||||
... code='farm.animal.group',
|
|
||||||
... padding=4)
|
|
||||||
>>> group_sequence.save()
|
|
||||||
|
|
||||||
Create specie::
|
Create specie::
|
||||||
|
|
||||||
|
>>> specie, breed, products = create_specie('Pig')
|
||||||
|
>>> individual_product = products['individual']
|
||||||
|
>>> group_product = products['group']
|
||||||
|
>>> female_product = products['female']
|
||||||
|
>>> male_product = products['male']
|
||||||
|
>>> semen_product = products['semen']
|
||||||
|
|
||||||
|
Create farm users::
|
||||||
|
|
||||||
|
>>> users = create_users(company)
|
||||||
|
>>> individual_user = users['individual']
|
||||||
|
>>> group_user = users['group']
|
||||||
|
>>> female_user = users['female']
|
||||||
|
>>> male_user = users['male']
|
||||||
|
|
||||||
|
Get locations::
|
||||||
|
|
||||||
>>> Location = Model.get('stock.location')
|
>>> Location = Model.get('stock.location')
|
||||||
>>> lost_found_location, = Location.find([('type', '=', 'lost_found')])
|
>>> lost_found_location, = Location.find([('type', '=', 'lost_found')])
|
||||||
>>> warehouse, = Location.find([('type', '=', 'warehouse')])
|
>>> warehouse, = Location.find([('type', '=', 'warehouse')])
|
||||||
>>> Specie = Model.get('farm.specie')
|
>>> production_location, = Location.find([('type', '=', 'production')])
|
||||||
>>> SpecieBreed = Model.get('farm.specie.breed')
|
|
||||||
>>> SpecieFarmLine = Model.get('farm.specie.farm_line')
|
Create feed product::
|
||||||
>>> pigs_specie = Specie(
|
|
||||||
... name='Pigs',
|
>>> feed_product = create_feed_product('Feed', 40, 25)
|
||||||
... male_enabled=False,
|
|
||||||
... female_enabled=False,
|
|
||||||
... individual_enabled=True,
|
|
||||||
... individual_product=individual_product,
|
|
||||||
... group_enabled=True,
|
|
||||||
... group_product=group_product,
|
|
||||||
... removed_location=lost_found_location,
|
|
||||||
... foster_location=lost_found_location,
|
|
||||||
... lost_found_location=lost_found_location,
|
|
||||||
... feed_lost_found_location=lost_found_location)
|
|
||||||
>>> pigs_specie.save()
|
|
||||||
>>> pigs_breed = SpecieBreed(
|
|
||||||
... specie=pigs_specie,
|
|
||||||
... name='Holland')
|
|
||||||
>>> pigs_breed.save()
|
|
||||||
>>> pigs_farm_line = SpecieFarmLine(
|
|
||||||
... specie=pigs_specie,
|
|
||||||
... farm=warehouse,
|
|
||||||
... event_order_sequence=event_order_sequence,
|
|
||||||
... has_individual=True,
|
|
||||||
... individual_sequence=individual_sequence,
|
|
||||||
... has_group=True,
|
|
||||||
... group_sequence=group_sequence)
|
|
||||||
>>> pigs_farm_line.save()
|
|
||||||
|
|
||||||
Create farm locations::
|
Create farm locations::
|
||||||
|
|
||||||
>>> location1_id, location2_id = Location.create([{
|
>>> Location = Model.get('stock.location')
|
||||||
... 'name': 'Location 1',
|
>>> location1 = Location()
|
||||||
... 'code': 'L1',
|
>>> location1.name = 'Location 1'
|
||||||
... 'type': 'storage',
|
>>> location1.code = 'L1'
|
||||||
... 'parent': warehouse.storage_location.id,
|
>>> location1.type = 'storage'
|
||||||
... }, {
|
>>> location1.parent = warehouse.storage_location
|
||||||
... 'name': 'Location 2',
|
>>> location1.save()
|
||||||
... 'code': 'L2',
|
>>> location2 = Location()
|
||||||
... 'type': 'storage',
|
>>> location2.name = 'Location 2'
|
||||||
... 'parent': warehouse.storage_location.id,
|
>>> location2.code = 'L2'
|
||||||
... }], config.context)
|
>>> location2.type = 'storage'
|
||||||
>>> silo = Location(
|
>>> location2.parent = warehouse.storage_location
|
||||||
... name='Silo',
|
>>> location2.save()
|
||||||
... code='S',
|
>>> silo = Location()
|
||||||
... type='storage',
|
>>> silo.name = 'Silo'
|
||||||
... parent=warehouse.storage_location,
|
>>> silo.code = 'S'
|
||||||
... silo=True,
|
>>> silo.type = 'storage'
|
||||||
... locations_to_fed=[location1_id, location2_id])
|
>>> silo.parent = warehouse.storage_location
|
||||||
|
>>> silo.silo = True
|
||||||
|
>>> silo.locations_to_fed.append(location1)
|
||||||
|
>>> silo.locations_to_fed.append(location2)
|
||||||
>>> silo.save()
|
>>> silo.save()
|
||||||
|
|
||||||
Put 500 Kg of feed into silo location::
|
Put 500 Kg of feed into silo location::
|
||||||
|
|
||||||
>>> Move = Model.get('stock.move')
|
>>> Move = Model.get('stock.move')
|
||||||
>>> provisioning_moves = Move.create([{
|
>>> provisioning_move = Move()
|
||||||
... 'product': feed_product.id,
|
>>> provisioning_move.product = feed_product
|
||||||
... 'uom': kg.id,
|
>>> provisioning_move.uom = feed_product.default_uom
|
||||||
... 'quantity': 500.0,
|
>>> provisioning_move.quantity = 500.0
|
||||||
... 'from_location': party.supplier_location.id,
|
>>> provisioning_move.from_location = company.party.supplier_location
|
||||||
... 'to_location': silo.id,
|
>>> provisioning_move.to_location = silo
|
||||||
... 'planned_date': (now - relativedelta(days=10)).date(),
|
>>> provisioning_move.planned_date = (now - relativedelta(days=10)).date()
|
||||||
... 'effective_date': (now - relativedelta(days=10)).date(),
|
>>> provisioning_move.effective_date = (now - relativedelta(days=10)).date()
|
||||||
... 'company': config.context.get('company'),
|
>>> provisioning_move.company = company
|
||||||
... 'unit_price': feed_product.template.list_price,
|
>>> provisioning_move.unit_price = feed_product.template.list_price
|
||||||
... }],
|
>>> provisioning_move.save()
|
||||||
... config.context)
|
>>> provisioning_move.click('assign')
|
||||||
>>> Move.assign(provisioning_moves, config.context)
|
>>> provisioning_move.click('do')
|
||||||
>>> Move.do(provisioning_moves, config.context)
|
|
||||||
|
|
||||||
Create individual::
|
Create individual::
|
||||||
|
|
||||||
>>> Animal = Model.get('farm.animal')
|
>>> Animal = Model.get('farm.animal')
|
||||||
>>> individual = Animal(
|
>>> individual = Animal()
|
||||||
... type='individual',
|
>>> individual.type = 'individual'
|
||||||
... specie=pigs_specie,
|
>>> individual.specie = specie
|
||||||
... breed=pigs_breed,
|
>>> individual.breed = breed
|
||||||
... number='0001',
|
>>> individual.number = '0001'
|
||||||
... initial_location=location1_id,
|
>>> individual.initial_location = location1
|
||||||
... arrival_date=(now - relativedelta(days=5)).date())
|
>>> individual.arrival_date = (now - relativedelta(days=5)).date()
|
||||||
>>> individual.save()
|
>>> individual.save()
|
||||||
>>> individual.location.code
|
>>> individual.location.code
|
||||||
u'L1'
|
'L1'
|
||||||
>>> individual.farm.code
|
>>> individual.farm.code
|
||||||
u'WH'
|
'WH'
|
||||||
>>> individual.nutrition_program == None
|
>>> individual.nutrition_program == None
|
||||||
True
|
True
|
||||||
|
|
||||||
Create nutrition program::
|
Create nutrition program::
|
||||||
|
|
||||||
>>> NutritionProgram = Model.get('farm.nutrition.program')
|
>>> NutritionProgram = Model.get('farm.nutrition.program')
|
||||||
>>> nutrition_program = NutritionProgram(
|
>>> nutrition_program = NutritionProgram()
|
||||||
... specie=pigs_specie,
|
>>> nutrition_program.specie = specie
|
||||||
... animal_type='individual',
|
>>> nutrition_program.animal_type = 'individual'
|
||||||
... min_consumed_feed=2.0,
|
>>> nutrition_program.min_consumed_feed = 2.0
|
||||||
... max_consumed_feed=10.0,
|
>>> nutrition_program.max_consumed_feed = 10.0
|
||||||
... product=feed_product)
|
>>> nutrition_program.product = feed_product
|
||||||
>>> nutrition_program.save()
|
>>> nutrition_program.save()
|
||||||
>>> individual.nutrition_program == None
|
>>> individual.nutrition_program == None
|
||||||
True
|
True
|
||||||
|
@ -207,20 +132,20 @@ Create nutrition program::
|
||||||
Feed the animal::
|
Feed the animal::
|
||||||
|
|
||||||
>>> FeedEvent = Model.get('farm.feed.event')
|
>>> FeedEvent = Model.get('farm.feed.event')
|
||||||
>>> feed_event1 = FeedEvent(
|
>>> feed_event1 = FeedEvent()
|
||||||
... animal_type='individual',
|
>>> feed_event1.animal_type = 'individual'
|
||||||
... specie=pigs_specie,
|
>>> feed_event1.specie = specie
|
||||||
... farm=warehouse,
|
>>> feed_event1.farm = warehouse
|
||||||
... animal=individual,
|
>>> feed_event1.animal = individual
|
||||||
... timestamp=yesterday,
|
>>> feed_event1.timestamp = yesterday
|
||||||
... location=individual.location,
|
>>> feed_event1.location = individual.location
|
||||||
... feed_location=silo,
|
>>> feed_event1.feed_location = silo
|
||||||
... feed_product=feed_product,
|
>>> feed_event1.feed_product = feed_product
|
||||||
... uom=kg,
|
>>> feed_event1.uom = feed_product.default_uom
|
||||||
... feed_quantity=Decimal('6.0'))
|
>>> feed_event1.feed_quantity = Decimal('6.0')
|
||||||
>>> feed_event1.feed_product = feed_product
|
>>> feed_event1.feed_product = feed_product
|
||||||
>>> feed_event1.save()
|
>>> feed_event1.save()
|
||||||
>>> FeedEvent.validate_event([feed_event1.id], config.context)
|
>>> feed_event1.click('validate_event')
|
||||||
>>> individual.reload()
|
>>> individual.reload()
|
||||||
>>> individual.consumed_feed.quantize(Decimal('0.1'))
|
>>> individual.consumed_feed.quantize(Decimal('0.1'))
|
||||||
Decimal('6.0')
|
Decimal('6.0')
|
||||||
|
@ -229,35 +154,35 @@ Feed the animal::
|
||||||
|
|
||||||
Create another nutrition program::
|
Create another nutrition program::
|
||||||
|
|
||||||
>>> nutrition_program2 = NutritionProgram(
|
>>> nutrition_program2 = NutritionProgram()
|
||||||
... specie=pigs_specie,
|
>>> nutrition_program2.specie = specie
|
||||||
... animal_type='individual',
|
>>> nutrition_program2.animal_type = 'individual'
|
||||||
... min_consumed_feed=10.0,
|
>>> nutrition_program2.min_consumed_feed = 10.0
|
||||||
... max_consumed_feed=50.0,
|
>>> nutrition_program2.max_consumed_feed = 50.0
|
||||||
... product=feed_product)
|
>>> nutrition_program2.product = feed_product
|
||||||
>>> nutrition_program2.save()
|
>>> nutrition_program2.save()
|
||||||
>>> individual.nutrition_program == nutrition_program
|
>>> individual.nutrition_program == nutrition_program
|
||||||
True
|
True
|
||||||
|
|
||||||
Feed the animal::
|
Feed the animal::
|
||||||
|
|
||||||
>>> feed_event2 = FeedEvent(
|
>>> feed_event2 = FeedEvent()
|
||||||
... animal_type='individual',
|
>>> feed_event2.animal_type = 'individual'
|
||||||
... specie=pigs_specie,
|
>>> feed_event2.specie = specie
|
||||||
... farm=warehouse,
|
>>> feed_event2.farm = warehouse
|
||||||
... animal=individual,
|
>>> feed_event2.animal = individual
|
||||||
... timestamp=(yesterday + relativedelta(days=5)),
|
>>> feed_event2.timestamp = now
|
||||||
... start_date=yesterday.date(),
|
>>> feed_event2.start_date = yesterday.date()
|
||||||
... location=individual.location,
|
>>> feed_event2.location = individual.location
|
||||||
... feed_location=silo,
|
>>> feed_event2.feed_location = silo
|
||||||
... feed_product=feed_product,
|
>>> feed_event2.feed_product = feed_product
|
||||||
... uom=kg,
|
>>> feed_event2.uom = feed_product.default_uom
|
||||||
... feed_quantity=Decimal('25.0'))
|
>>> feed_event2.feed_quantity = Decimal('25.0')
|
||||||
>>> feed_event2.feed_product = feed_product
|
>>> feed_event2.feed_product = feed_product
|
||||||
>>> feed_event2.save()
|
>>> feed_event2.save()
|
||||||
>>> FeedEvent.validate_event([feed_event2.id], config.context)
|
>>> feed_event2.click('validate_event')
|
||||||
>>> individual.reload()
|
>>> individual.reload()
|
||||||
>>> individual.consumed_feed.quantize(Decimal('0.1'))
|
>>> individual.consumed_feed.quantize(Decimal('0.1'))
|
||||||
Decimal('11.0')
|
Decimal('31.0')
|
||||||
>>> individual.nutrition_program == nutrition_program2
|
>>> individual.nutrition_program == nutrition_program2
|
||||||
True
|
True
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
[tryton]
|
[tryton]
|
||||||
version=4.1.0
|
version=5.2.0
|
||||||
depends:
|
depends:
|
||||||
farm
|
farm
|
||||||
xml:
|
xml:
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?xml version="1.0"?>
|
<?xml version="1.0"?>
|
||||||
<!-- The COPYRIGHT file at the top level of this repository contains the full
|
<!-- The COPYRIGHT file at the top level of this repository contains the full
|
||||||
copyright notices and license terms. -->
|
copyright notices and license terms. -->
|
||||||
<form string="Nutrition Program" col="4">
|
<form>
|
||||||
<label name="animal_type"/>
|
<label name="animal_type"/>
|
||||||
<field name="animal_type"/>
|
<field name="animal_type"/>
|
||||||
<newline/>
|
<newline/>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?xml version="1.0"?>
|
<?xml version="1.0"?>
|
||||||
<!-- The COPYRIGHT file at the top level of this repository contains the full
|
<!-- The COPYRIGHT file at the top level of this repository contains the full
|
||||||
copyright notices and license terms. -->
|
copyright notices and license terms. -->
|
||||||
<tree string="Nutrition Programs">
|
<tree>
|
||||||
<field name="product"/>
|
<field name="product"/>
|
||||||
<field name="animal_type"/>
|
<field name="animal_type"/>
|
||||||
<field name="min_consumed_feed"/>
|
<field name="min_consumed_feed"/>
|
||||||
|
|
Loading…
Reference in New Issue