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
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
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>
I have a boolean field 'classified' on sale order and my idea was that only users who are in the group that I created 'Classified quotations' can see records on tree view in which classified is true . I created two rules and I have no idea why it doesn't work. Here is the code:
<?xml version="1.0" encoding="UTF-8"?>
<openerp>
<data>
<record id="sale_order_rule_group_classified_quotations" model="ir.rule">
<field name="name">sale_order_rule_group_classified_quotations</field>
<field name="model_id" search="[('model','=','sale.order')]" model="ir.model"/>
<field name="groups" eval="[(4,ref('group_classified_quotations'))]"/>
<field name="domain_force">['|',('classified','=',True),('classified','=',False)]</field>
</record>
<record id="sale_order_rule_no_group" model="ir.rule">
<field name="name">sale_order_rule_no_group</field>
<field name="model_id" search="[('model','=','sale.order')]" model="ir.model"/>
<field name="groups" eval="[(4,ref('base.group_user'))]"/>
<field name="domain_force">[('classified','=',False)]</field>
</record>
</data>
</openerp>
What am I doing wrong?
You didn't tell how it does not work (or how it behaves now). Also If you want to allow to see all records on rule, you should use this instead on domain_force: [(1,'=',1)], this means all records and you don't need to make True or False checking. Try if that works.
I've recently done something similar but done so in the .py file.
You can do something like this:
def write(self, cr, user, ids, vals, context=None):
if vals.get('classified'):
group_id = self.pool.get('ir.model.data').get_object_reference(cr, 1, 'your_model', 'your_group')
user = self.pool.get('res.users').browse(cr, user, user)
if group_id not in user.groups_id:
raise osv.except_osv(_('Error'), _("Only x user can adjust this field"))
return super(your_model, self).write(cr, user, ids, vals, context=context)