Please my friends I have a problem that blocks me what is the solution to make a field to be obliged and unique , and this field will servire like to call my reference recordings,
I tried this solution but it is still accepting registrations with the same NumOffre.
class saisir_soumi(osv.osv):
_name='saisir.soumi'
_rec_name = 'NumOffre'
_columns = {
'NumOffre' : fields.char('N° Offre',required=True), # Must be obliged and unique
'organisme_s' : fields.char('Organisme',required=True),
'taxe' : fields.selection([('17','17 %'),('12','12 %'),('10','10 %')],'Taxe Etablissement'),
'des_offre' : fields.char('Designation de l\'offre'),
'mont_marche' : fields.float('Montant Marché'),
'date_depot' : fields.datetime('Date dépot'),
'observation_s' : fields.text('Observation'),
'order_line' : fields.one2many('saisir.soumi.ligne','order_id','soumission_id'),
}
_sql_constraints = [
('uniq_NumOffre', 'unique(NumOffre,id)', "numero offre doit resté unique !"),
]
class saisir_soumi_ligne(osv.osv):
_name ='saisir.soumi.ligne'
def onchange_value(self, cr, uid, ids, prix , quantite, context = None):
return {'value': {'soustotal': prix * quantite}}
def on_change_produit(self, cr, uid, ids, product_id):
val = {}
prod = self.pool.get('product.product').browse(cr, uid, product_id)
if prod:
val['prix'] = prod.list_price
val['qty_stock'] = prod.qty_available
val['garantie'] = prod.warranty
return {'value': val}
_columns= {
'order_id': fields.many2one('saisir.soumission', 'Order Reference'),
'product_id' : fields.many2one('product.product', 'Type Engin'),
'quantite':fields.float(string='Quantité de soumi'),
'qty_stock' : fields.float(string='Quantité Stock'),
'marque' : fields.char('Marque'),
'garantie' : fields.float('Garantie'),
'prix' : fields.float('Prix Unitaire'),
'soustotal' : fields.float('Sous total')
}
class saisir_soumi(osv.osv):
_name ='saisir.soumi'
_columns= {
'order_idd': fields.many2one('saisir.soumission', 'N° Offre'),
'observation_d' : fields.text('Observation'),
'Date_ouv_pli' : fields.date('Date Ouverture Plis'),
'organisme_d' : fields.char('Organisme'),
'nom_prenom_demar' : fields.char('Nom Démarcheur'),
'date_depot_d' : fields.date('Date dépot de soumission'),
}
The constraint unique(NumOffre,id) restrict similar NumOffre and id, I think what you want is unique(NumOffre). also you need to make sure that there are no duplicated field existed before the constraint otherwise it won't work.
I have created a wizard in that i placed a many2one field [names] from another model in which report printing is enabled. What is happening here is when i select one record & clicked on print button it is printing only empty report.so is it possible to fetch the data into report over here.
def print_report(self, cr, uid, ids, context=None):
ob=self.pool.get('book.room')
wizard=self.browse(cr,uid,ids,context=context)
datas = {
'ids': wizard.name,
'model': 'book.room',
'form': ob.browse(cr, uid, wizard.name)#[-1]
# 'form': [{'create_uid': (1, u'Administrator'), 'create_date': '2015-10-20 10:32:42', 'name': (1, u'Nani'), '__last_update': '2015-10-20 10:32:42', 'date_end': '12/10/2015', 'date_start': "13/12/1201", 'write_uid': (1, u'Administrator'), 'write_date': '2015-10-20 10:32:42', 'display_name': u'Nani', 'id': 18}]
}
print datas.get('form')
# print datas,'88888888888888'
# print datas['form'],'9999999999999'
return {
'type': 'ir.actions.report.xml',
'report_name': 'hotel_mng.Booking_Details',
'datas': datas,
}
Thanks in advance
class print_report(osv.TransientModel):
_name='report.wizard'
_columns={
'room1':fields.many2one('hotel.allroom','roomnum','Room No.')
}
def print_report(self, cr, uid, ids, context=None):
current=self.browse(cr,uid,ids)
obj=self.pool.get('book.room')
k=obj.search(cr,uid,[('name','=',current.name.name)],context=context)
context = {}
data = self.read(cr, uid, ids)[0]
datas = {
'ids': k,
'model': 'report.wizard',
'form': data,
'context':context
}
return{
'type' : 'ir.actions.report.xml',
'report_name' : 'hotel_mng.Booking_Details',
'datas' : datas,
}
print_report()
the above code is working fine for me.. it takes names from ref. model and prints report Thanks
def print_report(self, cr, uid, ids, context=None):
datas = {}
a=[]
print "---------------------------------------------------------------"
for phone in self.browse(cr, uid, ids, context=context):
b=phone.selection_item
print b
if context is None:
context = {}
datas['ids'] = context.get('active_ids', [])
datas['model'] = context.get('active_model', 'ir.ui.menu')
datas['value']=b
context.update({'names':b})
return {
'type': 'ir.actions.report.xml',
'report_name': 'sales_invoice.report_mom',
'datas': datas,
'context':context}
at report
<p align="right"><span t-esc="o._context['names']"/></p>
I have following two modules. In the following asset1_inspection class I have created two tree views. 'msr_insp': fields.one2many('results.measure','insp_msr','Inspection Measure',),. I will create some measures for each inspection.
After that in feedback.py when I select a particular inspection in 'insp_msr1' I used to get assigned measure for that inspection
config.py
class asset1_inspection(osv.Model):
_name = "asset1.inspection"
_rec_name="inspection_name"
MAINTENANCE_SELECTION=[
('0','Daily'),
('1','Weekly'),
('2','Fortnight'),
('3','Bi-Monthly'),
('4','Quarterly'),
('5','Half-Yearly'),
('6','Yearly'),
('7','Bi-Yearly'),
]
MAINTENANCE_TYPE=[
('0', 'Corrective'),
('1', 'Preventive'),
('2', 'Predictive'),
]
SHOUTDOWN_SELECTION=[
('0','YES'),
('1','NO'),
]
_columns = {
'inspection_name':fields.char('Inspection Type',),
'freq_sel':fields.selection(MAINTENANCE_SELECTION,'Frequency'),
'shut_down':fields.selection(SHOUTDOWN_SELECTION,'Shout Down'),
'main_type':fields.selection(MAINTENANCE_TYPE,'Maintenance Type',),
'insp_id1' : fields.one2many('inspec1.grid','insp_id','BoM',),
'msr_insp' : fields.one2many('results.measure','insp_msr','Inspection Measure',),
}
asset1_inspection()
class inspec1_grid(osv.Model):
_name = 'inspec1.grid'
_columns = {
'insp_name' : fields.char('Part'),
'insp_code' : fields.char('Code'),
'insp_quty' : fields.char('Quantity '),
'insp_uom' : fields.char('UoM'),
'insp_id': fields.many2one('asset1.inspection','Insp Id'),
}
inspec1_grid()
class results_measure(osv.Model):
_name = 'results.measure'
_rec_name='measure'
_columns = {
'measure' : fields.char('Inspection Measure'),
'insp_msr' : fields.many2one('asset1.inspection','Insp Measr'),
}
results_measure()
**feedback.py**
from openerp.osv import fields, osv
from openerp import api
class feedback_form(osv.Model):
_name = 'feedback.form'
_rec_name = 'inspec_type'
_columns={
'location' : fields.char('Substation Location'),
'insp_rslt' : fields.one2many('feedback.tree','insp_rsltts','Inspection Result',),
}
class feedback_tree(osv.Model):
_name = 'feedback.tree'
_columns = {
'insp_type' : fields.many2one('asset1.inspection','Inspection Type',),
'frequency' : fields.char('Frequency'),
'shutdown' : fields.char('Shout Down'),
'insp_msr1' : fields.many2one('results.measure','Result',),
'insp_rsltts': fields.many2one('feedback.form','Result Id'),
}
def get_inspection(self, cr, uid, ids, inspec_type, context=None):
val = {}
if inspec_type:
for det in self.pool.get('asset1.inspection').browse(cr,uid,inspec_type,context=context):
val = {
'insp_msr1' : det.measure,
#'qty' : det.qty,
#'uom' : det.uom,
}
return {'value': val}
To use the on_change you have to go the your view and then to the field that will be changed.
For example:
<field name="my_field" on_change="onchange_method(xx_field_a, xx_field_b)"/>
So in the above example this field will call the method "onchange_method" when it's changed. You can also give it parameters that contain the current values on the form. This is how you retrieve those values.
The onchange_method itself is pretty simple:
def onchange_method(self, cr, uid, ids, xx_field_a, xx_field_b, context=None):
return {'value': {'my_field': xx_field_a * xx_field_b}}
Here you can see I retrieved xx_field_a and xx_field_b from my form because I passed them as parameters in the on_change in the view.
In folio_num field I wanted to get two value combined i.e. 'assetmodelid_add' + 'place'. In my case I have done function on change method but their I am getting index not string value. this is complete code i have posted here it has asset.asset and agile.poertfilio1 .py file. please go through it and tell me proper code .i think no need to add .xml file .
from openerp.osv import fields, osv
class asset_asset(osv.osv):
_inherit = "asset.asset"
#_name = "asset_asset"
_rec_name= "folio_num"
_columns = {
'name': fields.char('Asset Name', size=64),
'place': fields.many2one('asset.parentlocation', 'Location'),
'asset_catg_id' : fields.many2one('asset.catg', 'Asset Catg Selection',select=True, required=True),
'area_id' : fields.many2one('asset.name', 'Asset Name Selection', domain="[('asset_catg_id', '=', asset_catg_id)]", select=True, required=True),
'assetmodelid_add' : fields.many2one('agile.portfolio1','Asset Model Code',domain="[('area_id', '=', area_id)]",),
'folio_num' : fields.char('Folio No',),
'asse_line':fields.one2many('asset.line','emp_id','Name Plate'),
'asse_line2':fields.one2many('asset.part','emp_id1','Parts'),
# 'assed_modelid':fields.many2one('agile.portfolio1','Asset Model ID',select=True, required=True),
'quantity': fields.char('Quantity',size=64),
'uom': fields.char('Uinit of Measure',size=64),
'model_no' : fields.char('Model', size=64),
#'asset_id':fields.many2one('agile.portfolio','Asset ID'),
}
'''def get_asset_parts1(self, cr, uid, ids, assetmodelid_add,model_no, context=None):
val = {}
res = []
if model_no:
val['model_no'] = model_name
return {'value': val}'''
def onchange_first_last(self, cr, uid, ids, place, assetmodelid_add, context=None):
v = {}
asset_val=''
place_val=''
place_obj=self.pool.get('asset.parentlocation')
asset_obj=self.pool.get('agile.portfolio1')
if assetmodelid_add:
asset_val = asset_obj.browse(cr, uid, assetmodelid_add, context=None).name
if place:
place_val = place_obj.browse(cr, uid, place, context=None).name
v['folio_num'] = asset_val + place_val
return {'value': v}
def get_asset_parts(self, cr, uid, ids, assetmodelid_add,context=None):
val = {}
#
res = []
res2 = []
res3 = []
if assetmodelid_add:
for asset in self.pool.get('agile.portfolio1').browse(cr,uid,assetmodelid_add,context=context):
for ass in asset.asspart_id1:
val = {
'pname_id' : ass.asspart_name,
'vsurname' : ass.assvalue_code,
}
res.append(val)
for ass in asset.strat_id1:
val = {
'part_name' : ass.start_name,
'part_code' : ass.strat_code,
'part_quty' : ass.strat_quty,
'part_uom' : ass.strat_uom,
}
res2.append(val)
val['model_no'] = asset.model_name
val.update({'asse_line':res, 'asse_line2':res2,'model_no':asset.model_name })
return {'value': val}
asset_asset()
class asset_attach(osv.osv):
_inherit = "asset.asset"
_columns = {
#'rp_resume1' : fields.Binary(string='Resume'),
#'rp_resume1_name' : fields.Char(string='File name')
#'rp_more1_docs' : fields.many2many('ir.attachment', 'room_partner_attachment_rel', 'room_partner_id', 'attachment_id', 'More Documents'),
'attachments': fields.many2many('ir.attachment', 'partner_id',string="Attachments"),
#'nameee':fields.many2one('ir.attachment','Attachments'),
}
asset_attach()
class asset_model_id(osv.osv):
_inherit = "asset.asset"
_columns = {
'assetcat_id' : fields.char('Asset Catg',)
}
asset_model_id()
class pname_line(osv.osv):
_name='pname.line'
_columns = {
'name':fields.char('Name'),
}
pname_line()
class asset_line(osv.osv):
_name="asset.line"
APPOINTMENT_SELECTION=[
('0','Regular'),
('1','Aditional'),
('2','Deputation'),
]
_columns = {
'pname_id':fields.char('Pname'),
'vsurname':fields.char('Value'),
'emp_id': fields.many2one('asset.asset', 'vendor_id'),
}
asset_line()
class pname_part(osv.osv):
_name='pname.part'
_rec_name = 'namee'
_columns = {
'namee':fields.char('Name'),
}
pname_line()
class asset_part(osv.osv):
_name="asset.part"
#_rec_name = 'part_name'
APPOINTMENT_SELECTION=[
('0','Regular'),
('1','Aditional'),
('2','Deputation'),
]
_columns = {
'part_name':fields.char('Name'),
'part_code':fields.char('Code'),
'part_quty':fields.char('Quantity'),
'part_uom':fields.char('UoM'),
'emp_id1': fields.many2one('asset.asset', 'vendor_id'),
}
asset_part()
class asset_parentlocation(osv.osv):
_name="asset.parentlocation"
_rec_name="parent_location"
_columns = {
'location_name' : fields.char('Asset Location', required=True),
'parent_location' : fields.many2one('asset.parentlocation','Parent Location'),}
def name_get(self, cr, uid, ids, context=None):
if context is None:
context = {}
if not ids:
return []
reads = self.read(cr, uid, ids, ['location_name','parent_location'], context=context)
res = []
for record in reads:
name = record['location_name']
if record['parent_location']:
name = record['parent_location'][1]+' / '+name
res.append((record['id'], name))
return res
agile.portfolio1 .py file here
class asset_catg(osv.Model):
_name="asset.catg"
_rec_name='name1'
_description="Define Asset Catgs"
_columns={ 'name1':fields.char('Asset Catg Names',size=64,required=True),}
asset_catg()
class asset_name(osv.Model):
_name="asset.name"
_rec_name='name'
_description="Define asset name"
_columns={ 'name':fields.char('Asset Name',size=64,required=True),
'material_code' : fields.char('Material Code',),
#'area_type': fields.selection(area_type_lov,'Area Type',required=True),
'asset_catg_id':fields.many2one('asset.catg','Asset Catg Name',size=64,required=True),
}
asset_name()
class asset_config_super(osv.Model):
_name = "asset.config.super"
_description = "Assigning to substation"
_columns = {
'asset_catg_id' : fields.many2one('asset.catg', 'Asset Catg Selection', select=True, required=True),
'area_id' : fields.many2one('asset.name', 'Asset Name Selection', domain="[('asset_catg_id', '=', asset_catg_id)]", select=True, required=True),
}
asset_config_super()
#Asset Creation
class agile_portfolio1(osv.Model):
_name = "agile.portfolio1"
_rec_name = 'asset_id_add'
_columns = {
'asset_catg_id' : fields.many2one('asset.catg', 'Asset Catg Selection',select=True, required=True),
'area_id' : fields.many2one('asset.name','Asset Name Selection', domain="[('asset_catg_id', '=', asset_catg_id)]",),
'material_code' : fields.char('Material Code'),
'strat_id1' : fields.one2many('portfolio1.grid','strat_id','BoM',),
'asspart_id1' :fields.one2many('asset1.grid','asspart_id','Specification',),
'asset_id_add' : fields.char('Asset Model Code',),
'make_name' : fields.char('Make',),
'model_name': fields.char('Model',),
#'asset_categ': fields.many2one('asset.cat','Asset Catg',select=True,required=True,ondelete="restrict"),
}
def get_meet_dets(self, cr, uid, ids, area_id, context=None):
val = {}
if area_id:
for det in self.pool.get('asset.name').browse(cr,uid,area_id,context=context):
val = {
'material_code' : det.material_code,
}
return {'value': val}
def onchange_first_last(self, cr, uid, ids, make_name, model_name, context=None):
v = {}
#'area_ref':fields.related('area_ref','area_id',readonly=True,type='char',relation='agile.portfolio1',string='Area'),
if make_name and model_name:
v['asset_id_add'] = make_name + model_name
return {'value': v}
agile_portfolio1()
class portfolio1_grid(osv.Model):
_name = 'portfolio1.grid'
_columns = {
'start_name' : fields.char('Part'),
'strat_code' : fields.char('Code'),
'strat_quty' : fields.char('Quantity '),
'strat_uom' : fields.char('UoM'),
'strat_id': fields.many2one('agile.portfolio1','Strat Id'),
}
portfolio1_grid()
class asset1_grid(osv.Model):
_name = 'asset1.grid'
_columns = {
'asspart_name' : fields.char('Part'),
'assvalue_code' : fields.char('Value'),
'asspart_id': fields.many2one('agile.portfolio1','Specifications'),
}
asset1_grid()
#Inspection Class
class asset1_inspection(osv.Model):
_name = "asset1.inspection"
MAINTENANCE_SELECTION=[
('0','Daily'),
('1','Weekly'),
('2','Fortnight'),
('3','Bi-Monthly'),
('4','Quarterly'),
('5','Half-Yearly'),
('6','Yearly'),
('7','Bi-Yearly'),
]
MAINTENANCE_TYPE=[
('0', 'Corrective'),
('1', 'Preventive'),
('2', 'Predictive'),
]
SHOUTDOWN_SELECTION=[
('0','YES'),
('1','NO'),
]
_columns = {
'asset_catg_id' : fields.many2one('asset.catg', 'Asset Catg Selection',select=True, required=True),
'area_id' : fields.many2one('asset.name', 'Asset Name Selection', domain="[('asset_catg_id', '=', asset_catg_id)]", select=True, required=True),
'assetmodelid_add' : fields.many2one('agile.portfolio1','Asset Model Code',domain="[('area_id', '=', area_id)]", select=True, required=True),
'inspection_name':fields.char('Inspection Type',),
'freq_sel':fields.selection(MAINTENANCE_SELECTION,'Frequency'),
'shut_down':fields.selection(SHOUTDOWN_SELECTION,'Shout Down'),
'main_type':fields.selection(MAINTENANCE_TYPE,'Maintenance Type',),
'insp_id1' : fields.one2many('inspec1.grid','insp_id','BoM',),
'ainsp_id1' : fields.one2many('assetinspec1.grid','ainsp_id','Asset Maintenance',),
#'asset_type': fields.many2one('asset.cat','Asset Categ'),
#'asset_part_id': fields.many2one('ainspcat_name','Asset Cat',)
}
asset1_inspection()
class inspec1_grid(osv.Model):
_name = 'inspec1.grid'
_columns = {
'insp_name' : fields.char('Part'),
'insp_code' : fields.char('Code'),
'insp_quty' : fields.char('Quantity '),
'insp_uom' : fields.char('UoM'),
'insp_id': fields.many2one('asset1.inspection','Insp Id'),
}
inspec1_grid()
class assetinspec1_grid(osv.Model):
_name = 'assetinspec1.grid'
_columns = {
'ainsp_name' : fields.many2one('assetcat1.grid','Asset Name',),
'ainsp_id': fields.many2one('asset1.inspection','aInsp Id'),
}
assetinspec1_grid()
class asset1_cat(osv.Model):
_name = "asset1.cat"
#_rec_name="asset_catname"
_columns = {
'asset_catname':fields.char('Asset Type',),
'assetcat_id':fields.one2many('assetcat1.grid','ainspcat_id','Asset Name',)
}
asset1_cat()
class assetcat1_grid(osv.Model):
_name = 'assetcat1.grid'
#_rec_name='ainspcat_name'
_columns = {
'ainspcat_name' : fields.char('Asset Names'),
'ainspcat_id': fields.many2one('asset1.cat','AssetCat ID'),
}
assetcat1_grid()
Hear many2one fields always have return the id not the value at that we need to browse the record from the that field to that particular object and use that existing field name as well
you should follow some thing like this.
def onchange_first_last(self, cr, uid, ids, place, assetmodelid_add, context=None):
v = {}
assetmodelid_val=''
place_val=''
place_obj=self.pool.get('asset.parentlocation')
assetmodelid_obj=self.pool.get('agile.portfolio1')
if assetmodelid_add:
assetmodelid_val = assetmodelid_obj.browse(cr, uid, assetmodelid_add, context=None).name
if place:
place_val = place_obj.browse(cr, uid, place, context=None).name
v['folio_num'] = assetmodelid_val + place_val
return {'value': v}
I hope this should helpful for you :)
Try following,
def onchange_first_last(self, cr, uid, ids, place, assetmodelid_add, context=None):
v = {}
asset_val=''
place_val=''
place_obj=self.pool.get('asset.parentlocation')
asset_obj=self.pool.get('agile.portfolio1')
if assetmodelid_add:
asset_val = asset_obj.browse(cr, uid, assetmodelid_add, context=None).asset_id_add
if place:
place_val = place_obj.browse(cr, uid, place, context=None).name
v['folio_num'] = asset_val + place_val
return {'value': v}
Let say I have such classes:
class First(orm.Model):
_name = 'first.class'
_columns = {
'partner_id': fields.many2one('res.partner', 'Partner'),
'res_ids': fields.one2many('second.class', 'first_id', 'Resources'),
}
class Second(orm.Model):
_name = 'second.class'
_columns = {
'partner_id': fields.many2one('res.partner', 'Partner'),
'first_id': fields.many2one('first.class', 'First'),
}
Now I want to write a method, when it is called, it would create First class record taking values from Second class. But I don't understand how I should pass values in one2many field while creating First class.
For example let say I call create like this (this method is inside Second class):
def some_method(cr, uid, ids, context=None):
vals = {}
for obj in self.browse(cr, uid, ids):
#many2one value is easy. I just link one with another like this
vals['partner_id'] = obj.partner_id and obj.partner_id.id or False
#Now the question how to insert values for `res_ids`?
#`res_ids` should take `id` from `second.class`, but how?..
vals['res_ids'] = ??
self.pool.get('first.class').create(cr, uid, vals)
return True
There is a documentation about inserting one2many values here:
https://doc.openerp.com/v6.0/developer/2_5_Objects_Fields_Methods/methods.html/#osv.osv.osv.write
But that is only for write method.
Try this Values, If the second.class obj has partner than one2many is created.
obj = self.browse(cr, uid, ids)[0]
if obj.partner_id:
vals{
'partner_id': obj.partner_id.id,
'res_ids': [(0,0, {
'partner_id': obj.partner_id.id, #give id of partner
'first_id': obj.first_id.id #give id of first
})]
}
self.pool.get('first.class').create(cr, uid, vals)
You can create one record with one2many relation like:
invoice_line_1 = {
'name': 'line description 1',
'price_unit': 100,
'quantity': 1,
}
invoice_line_2 = {
'name': 'line description 2',
'price_unit': 200,
'quantity': 1,
}
invoice = {
'type': 'out_invoice',
'comment': 'Invoice for example',
'state': 'draft',
'partner_id': 1,
'account_id': 19,
'invoice_line': [
(0, 0, invoice_line_1),
(0, 0, invoice_line_2)
]
}
invoice_id = self.pool.get('account.invoice').create(
cr, uid, invoice, context=context)
return invoice_id
You can easily save record in this class
first_class_obj.create(cr,uid,{
'partner_id':partner.id,
res_ids : [
{'partner_id':parner_1.id},
{'partner_id':parner_2.id},
{'partner_id':parner_3.id},.....
]
})
here you can easily pass list of second class object