myview.xml
<odoo>
<data>
<record model = "ir.ui.view" id = "custom_expense.list">
<field name = "name"> custom_expense list </field>
<field name = "model"> custom_expense.custom_expense </field>
<field name = "arch" type = "xml">
<tree>
<field name = "name" />
<field name = "test" />
</tree>
</field>
</record>
<record model = "ir.actions.act_window" id = "custom_expense.action_window">
<field name = "name"> custom_expense </field>
<field name = "res_model"> custom_expense.custom_expense </field>
<field name = "view_mode"> tree, form </field>
</record>
<menuitem name = "custom_expense" id = "custom_expense.menu_root" />
<menuitem name = "Menu 1" id = "custom_expense.menu_1" parent = "custom_expense.menu_root" />
<menuitem name = "Submenu 1" id = "custom_expense.menu_1_list" parent = "custom_expense.menu_1"
action = "custom_expense.action_window" />
</data>
</odoo>
mymodel.py
from odoo import models, fields, api
class custom_expense (models.Model):
_name = 'custom_expense.custom_expense'
_inherit = 'hr.expense'
test = fields.Char (string = 'Valuethird')
I would like to display "name" field from hr.expense model but I found error: TypeError: Many2many fields custom_expense.custom_expense.tax_ids and hr.expense.tax_ids use the same table and columns - - -
I think you are trying to add a new field to hr.expense. If thats the case you dont need to create new model. only the _inherit will be enough and no need of _name in python file and just inherit the xml file. If you want the new table, then you will need to redefine the many2many in the parent model.
Related
what i'm trying to do here is creating a new field dimension that gets value from a field in the [stock.move] model this approach doesn't work i don't know why and it's not getting any errors from the python file the only error from the xpath tag at the xml file
this is models.py file
xx_Custom_Invoice(models.Model):
_inherit = 'account.move'
dimension = fields.Char(String="XxX", compute='get_data')
def get_data(self):
stock_move = self.env['stock.move']
for move in self:
picking = stock_move.picking_id
if move.id != picking.account_move_ids:
continue
for line in move:
line.update({
'dimension': line.dimension,
})
here is the views.xml
<record id="xx_account_move_view_inherit" model="ir.ui.view" >
<field name="name">account.move.view.inherit</field>
<field name="model">account.move</field>
<field name="inherit_id" ref="account.view_move_form"/>
<field name="arch" type="xml">
<xpath expr="/form/sheet/notebook/page/field[#name='invoice_line_ids']/tree/field[#name='product_id']" position="after">
<field name="dimension"/>
</xpath>
</field>
</record>
There is an issue here:
stock_move = self.env['stock.move']
for move in self:
stock_move here is an empty recordset, so no iteration will happen in the for loop.
You probably to use search() to fetch the record you want to operate on:
stock_move = self.env['stock.move'].search(<DOMAIN>)
for move in self:
I want to view 'working_hours' field only for employee, his manager and 'hr.group_hr_user' group.
how to hide this field automatically without edit form or trigger a button
class InheritHrEmployee(models.Model):
_inherit = 'hr.employee'
def hide_working_hours(self):
if self.env.uid == self.user_id.id or self.env.uid == self.parent_id.user_id.id or self.env.user.has_group(
'hr.group_hr_user'):
self.working_hours_view = True
else:
self.working_hours_view = False
working_hours_view = fields.Boolean(computed=hide_working_hours)
XML:
<record id="hide_working_hours_for_employees" model="ir.ui.view">
<field name="name">Hide Working Hours Employees Form</field>
<field name="model">hr.employee</field>
<field name="inherit_id" ref="hr.view_employee_form"/>
<field name="arch" type="xml">
<xpath expr="//field[#name='resource_calendar_id']" position="before">
<field name="working_hours_view" invisible="1"/>
</xpath>
<xpath expr="//field[#name='resource_calendar_id']" position="attributes">
<attribute name="attrs">{'invisible': [('working_hours_view' ,'=', False)]}</attribute>
</xpath>
</field>
</record>
Try below code for display working hours field only hr.group_hr_user group users.
XML:
<record id="hide_working_hours_for_employees" model="ir.ui.view">
<field name="name">Hide Working Hours Employees Form</field>
<field name="model">hr.employee</field>
<field name="inherit_id" ref="hr.view_employee_form"/>
<field name="arch" type="xml">
<xpath expr="//field[#name='resource_calendar_id']" position="before">
<field name="working_hours_view" invisible="1"/>
</xpath>
<xpath expr="//field[#name='resource_calendar_id']" position="attributes">
<attribute name="groups">hr.group_hr_user</attribute>
</xpath>
</field>
</record>
You can add multiple attributes in the XML file like above code.
i added the field before the function and it works now automatically
class InheritHrEmployee(models.Model):
_inherit = 'hr.employee'
inv = fields.Boolean(string="Invisible", compute="c_inv", store=False)
#api.one
def c_inv(self):
if self.env.uid == self.user_id.id or self.env.uid == self.parent_id.user_id.id or self.env.user.has_group(
'hr.group_hr_user'):
self.inv = False
else:
self.inv = True
.. like this example
make fields visible to user and invisible to other
For below code my boolean field not domain(searched) in database. It's work when i make this method depends. But i have above 1000 records so how to domain in action for all record simultaneously?
**Python Code:**
#api.multi
def _compute_opportunity_count111(self):
value = {}
for rec in self:
operator = 'child_of' if rec.is_company else '=' # the opportunity count should counts the opportunities of this company and all its contacts
won_list = rec.env['crm.lead'].search(
[('partner_id', operator, rec.id), ('stage_id.probability', '=', 100)]).ids
if won_list:
rec.won_customer = True
value.update(won_customer=rec.won_customer)
won_customer = fields.Boolean(compute='_compute_opportunity_count111', store=True)
**XML Code:**
<record id="base.action_partner_form" model="ir.actions.act_window">
<field name="name">Customers</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">res.partner</field>
<field name="view_type">form</field>
<field name="view_mode">kanban,tree,form</field>
<field name="context">{"search_default_customer":1}</field>
<field name="domain">[('won_customer', '=', True)]</field>
<field name="search_view_id" ref="base.view_res_partner_filter"/>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
Click to add a contact in your address book.
</p>
<p>
Odoo helps you easily track all activities related to
a customer: discussions, history of business opportunities,
documents, etc.
</p>
</field>
</record>
Thanks in advance
You should not use api.multi but api.depends -> this makes sure the method is called again when relevant fields changed.
Seems you depend on is_company -> #api.depends('is_company')
Also, from what I read your value dict is useless -> you can remove it
When clicking menu for open the pivot view, I keep encountering the error "ProgrammingError: column new_table_report.id does not exist".
My code file .py:
#api.model_cr
def init(self):
tools.drop_view_if_exists(self._cr, 'new_table_report')
self._cr.execute("""
CREATE or REPLACE VIEW new_table_report AS (
SELECT sub.*,
(SELECT name FROM maintenance_rating_score_range WHERE
(sub.average_deviation >= from_score and
sub.average_deviation <= to_score)
) as rating
FROM(
SELECT
eq.id as equipment_id,
eq.name as name,
eq.category_id as category_id,
eq.partner_id as partner_id,
count(m.id) as number_service,
(sum(rs.score)/count(m.id)) as average_deviation
FROM maintenance_request m
INNER JOIN maintenance_equipment eq on (m.equipment_id = eq.id)
INNER JOIN maintenance_rating r on (r.request_id = m.id)
LEFT JOIN maintenance_rating_score rs on (r.rating_satisf_id = rs.id)
GROUP BY eq.id, eq.partner_id
)AS sub
)
""")
My code file .xml:
<record model="ir.ui.view" id="view_new_table_report_pivot">
<field name="name">new.table.report.pivot</field>
<field name="model">new.table.report</field>
<field name="arch" type="xml">
<pivot string="Report Analysis" disable_linking="False">
<field name="equipment_id" type="row"/>
<field name="number_service" type="measure"/>
<field name="average_deviation" type="measure"/>
</pivot>
</field>
</record>
<record model="ir.actions.act_window" id="action_new_tabke_report">
<field name="name">Report Analysis</field>
<field name="res_model">new.table.report</field>
<field name="view_type">form</field>
<field name="view_mode">pivot,graph</field>
<field name="context">{}</field>
</record>
Thank you for Advance.
I can do it, i don't create id field in new table report
Im trying to make a rule that validates activity owners, are in the tutors pupil list. The problem is fields are in different model apart from the One2Many relation. Both classes here:
Activity:
class Activity(models.Model):
_name = "proyectosge.activity"
owner = fields.Many2one('res.users', string="Pupil",default=lambda self:
self.env.user,readonly=True)
Usuario:
class Usuario(models.Model):
_inherit = 'res.users'
tutor = fields.Many2one('res.users',string="Tutor")
pupils = fields.One2many('res.users','tutor',string = "Pupils")
And the rule I tried but obviusly not working cause they arent even on the same model:
<!--Tutor only view his pupil activities-->
<record model="ir.rule" id="activities_tutor_rule">
<field name="name">Tutor only see his pupil activities</field>
<field name="model_id" ref="model_proyectosge_activity"/>
<field name="groups" eval="[(4, ref('group_tutor'))]"/>
<field name="domain_force">[('owner','=',pupils)]</field>
<field name="perm_read" eval="True"/>
<field name="perm_create" eval="False"/>
<field name="perm_write" eval="False"/>
<field name="perm_unlink" eval="False"/>
</record>
Try this out if works. I am not 100% sure about this. Let me know if it works. Thanks
<field name="domain_force">[('owner','=',pupils.owner)]</field>