class StockPicking(models.Model): """Add text comment""" _inherit = "stock.picking" comment_template1_id = fields.Many2one('base.comment.template', string='Top Comment Template') comment_template2_id = fields.Many2one('base.comment.template', string='Bottom Comment Template') note1 = fields.Html('Top Comment') note2 = fields.Html('Bottom Comment') @api.onchange('comment_template1_id') def _set_note1(self): comment = self.comment_template1_id if comment: self.note1 = comment.get_value(self.partner_id.id) @api.onchange('comment_template2_id') def _set_note2(self): comment = self.comment_template2_id if comment: self.note2 = comment.get_value(self.partner_id.id) @api.onchange('partner_id') def _onchange_partner_id(self): comment_template = self.partner_id.comment_template_id if comment_template.position == 'before_lines': self.comment_template1_id = comment_template elif comment_template.position == 'after_lines': self.comment_template2_id = comment_template
class MixedModel(models.Model): _name = 'test_new_api.mixed' number = fields.Float(digits=(10, 2), default=3.14) date = fields.Date() now = fields.Datetime(compute='_compute_now') lang = fields.Selection(string='Language', selection='_get_lang') reference = fields.Reference(string='Related Document', selection='_reference_models') comment1 = fields.Html(sanitize=False) comment2 = fields.Html(sanitize_attributes=True, strip_classes=False) comment3 = fields.Html(sanitize_attributes=True, strip_classes=True) comment4 = fields.Html(sanitize_attributes=True, strip_style=True) currency_id = fields.Many2one( 'res.currency', default=lambda self: self.env.ref('base.EUR')) amount = fields.Monetary() @api.one def _compute_now(self): # this is a non-stored computed field without dependencies self.now = fields.Datetime.now() @api.model def _get_lang(self): return self.env['res.lang'].get_installed() @api.model def _reference_models(self): models = self.env['ir.model'].sudo().search([('state', '!=', 'manual') ]) return [(model.model, model.name) for model in models if not model.model.startswith('ir.')]
class ProductTemplate(models.Model): _inherit = "product.template" quotation_only_description = fields.Html( 'Quotation Only Description', sanitize_attributes=False, translate=html_translate, help="The quotation description (not used on eCommerce)") quotation_description = fields.Html( 'Quotation Description', compute='_compute_quotation_description', help= "This field uses the Quotation Only Description if it is defined, otherwise it will try to read the eCommerce Description." ) def _compute_quotation_description(self): for record in self: if record.quotation_only_description: record.quotation_description = record.quotation_only_description elif hasattr(record, 'website_description') and record.website_description: record.quotation_description = record.website_description else: record.quotation_description = ''
class ProductTemplate(models.Model): _inherit = "product.template" website_description = fields.Html( 'Description for the website', sanitize_attributes=False) # hack, if website_sale is not installed quote_description = fields.Html('Description for the quote', sanitize_attributes=False, translate=html_translate)
class Job(models.Model): _name = 'hr.job' _inherit = [ 'hr.job', 'website.seo.metadata', 'website.published.multi.mixin' ] def _get_default_website_description(self): default_description = self.env["ir.model.data"].xmlid_to_object( "website_hr_recruitment.default_website_description") return (default_description._render() if default_description else "") website_description = fields.Html('Website description', translate=html_translate, sanitize_attributes=False, default=_get_default_website_description, prefetch=False, sanitize_form=False) def _compute_website_url(self): super(Job, self)._compute_website_url() for job in self: job.website_url = "/jobs/detail/%s" % job.id def set_open(self): self.write({'website_published': False}) return super(Job, self).set_open() def get_backend_menu_id(self): return self.env.ref('hr_recruitment.menu_hr_recruitment_root').id
class Job(models.Model): _name = 'hr.job' _inherit = ['hr.job', 'website.seo.metadata', 'website.published.mixin'] def _get_default_website_description(self): default_description = self.env["ir.model.data"].xmlid_to_object("website_hr_recruitment.default_website_description") return (default_description.render() if default_description else "") def _default_website(self): default_website_id = self.env.ref('website.default_website') return [default_website_id.id] if default_website_id else None website_description = fields.Html('Website description', translate=html_translate, sanitize_attributes=False, default=_get_default_website_description) website_ids = fields.Many2many('website', 'website_hr_job_pub_rel', 'website_id', 'job_id', default=_default_website, string='Websites', copy=False, help='List of websites in which Job ' 'will published.') @api.multi def _compute_website_url(self): super(Job, self)._compute_website_url() for job in self: job.website_url = "/jobs/detail/%s" % job.id @api.multi def set_open(self): self.write({'website_published': False}) return super(Job, self).set_open()
class MrpProductionMessage(models.Model): _name = "mrp.message" _description = "Production Message" @api.model def _default_valid_until(self): return datetime.today() + relativedelta(days=7) name = fields.Text(compute='_get_note_first_line', store=True) message = fields.Html(required=True) product_tmpl_id = fields.Many2one('product.template', 'Product Template') product_id = fields.Many2one('product.product', string="Product") bom_id = fields.Many2one('mrp.bom', 'Bill of Material', domain="['|', ('product_id', '=', product_id), ('product_tmpl_id.product_variant_ids','=', product_id)]") workcenter_id = fields.Many2one('mrp.workcenter', string='Work Center') valid_until = fields.Date('Validity Date', default=_default_valid_until, required=True) routing_id = fields.Many2one('mrp.routing', string='Routing') @api.depends('message') def _get_note_first_line(self): for message in self: message.name = (message.message and html2plaintext(message.message) or "").strip().replace('*', '').split("\n")[0] @api.multi def save(self): """ Used in a wizard-like form view, manual save button when in edit mode """ return True
class SaleOrder(models.Model): _inherit = 'sale.order' website_description = fields.Html('Website Description', sanitize_attributes=False, translate=html_translate, sanitize_form=False) @api.onchange('partner_id') def onchange_update_description_lang(self): if not self.sale_order_template_id: return else: template = self.sale_order_template_id.with_context(lang=self.partner_id.lang) self.website_description = template.website_description def _compute_line_data_for_template_change(self, line): vals = super(SaleOrder, self)._compute_line_data_for_template_change(line) vals.update(website_description=line.website_description) return vals def _compute_option_data_for_template_change(self, option): vals = super(SaleOrder, self)._compute_option_data_for_template_change(option) vals.update(website_description=option.website_description) return vals @api.onchange('sale_order_template_id') def onchange_sale_order_template_id(self): ret = super(SaleOrder, self).onchange_sale_order_template_id() if self.sale_order_template_id: template = self.sale_order_template_id.with_context(lang=self.partner_id.lang) self.website_description = template.website_description return ret
class test_model(models.Model): _name = 'test_converter.test_model' _description = 'Test Converter Model' char = fields.Char() integer = fields.Integer() float = fields.Float() numeric = fields.Float(digits=(16, 2)) many2one = fields.Many2one('test_converter.test_model.sub', group_expand='_gbf_m2o') binary = fields.Binary(attachment=False) date = fields.Date() datetime = fields.Datetime() selection_str = fields.Selection( [ ('A', u"Qu'il n'est pas arrivé à Toronto"), ('B', u"Qu'il était supposé arriver à Toronto"), ('C', u"Qu'est-ce qu'il fout ce maudit pancake, tabernacle ?"), ('D', u"La réponse D"), ], string=u"Lorsqu'un pancake prend l'avion à destination de Toronto et " u"qu'il fait une escale technique à St Claude, on dit:") html = fields.Html() text = fields.Text() # `base` module does not contains any model that implement the functionality # `group_expand`; test this feature here... @api.model def _gbf_m2o(self, subs, domain, order): sub_ids = subs._search([], order=order, access_rights_uid=SUPERUSER_ID) return subs.browse(sub_ids)
class ConverterTest(models.Model): _name = 'web_editor.converter.test' _description = 'Web Editor Converter Test' # disable translation export for those brilliant field labels and values _translate = False char = fields.Char() integer = fields.Integer() float = fields.Float() numeric = fields.Float(digits=(16, 2)) many2one = fields.Many2one('web_editor.converter.test.sub') binary = fields.Binary(attachment=False) date = fields.Date() datetime = fields.Datetime() selection_str = fields.Selection( [ ('A', "Qu'il n'est pas arrivé à Toronto"), ('B', "Qu'il était supposé arriver à Toronto"), ('C', "Qu'est-ce qu'il fout ce maudit pancake, tabernacle ?"), ('D', "La réponse D"), ], string=u"Lorsqu'un pancake prend l'avion à destination de Toronto et " u"qu'il fait une escale technique à St Claude, on dit:") html = fields.Html() text = fields.Text()
class SaleOrderTemplateLine(models.Model): _inherit = "sale.order.template.line" website_description = fields.Html('Website Description', related='product_id.product_tmpl_id.quotation_only_description', translate=html_translate, readonly=False, sanitize_form=False) @api.onchange('product_id') def _onchange_product_id(self): ret = super(SaleOrderTemplateLine, self)._onchange_product_id() if self.product_id: self.website_description = self.product_id.quotation_description return ret @api.model def create(self, values): values = self._inject_quotation_description(values) return super(SaleOrderTemplateLine, self).create(values) def write(self, values): values = self._inject_quotation_description(values) return super(SaleOrderTemplateLine, self).write(values) def _inject_quotation_description(self, values): values = dict(values or {}) if not values.get('website_description') and values.get('product_id'): product = self.env['product.product'].browse(values['product_id']) values['website_description'] = product.quotation_description return values
class SaleQuoteTemplate(models.Model): _name = "sale.quote.template" _description = "Sale Quotation Template" name = fields.Char('Quotation Template', required=True) website_description = fields.Html('Description', translate=html_translate, sanitize_attributes=False) quote_line = fields.One2many('sale.quote.line', 'quote_id', 'Quotation Template Lines', copy=True) note = fields.Text('Terms and conditions') options = fields.One2many('sale.quote.option', 'template_id', 'Optional Products Lines', copy=True) number_of_days = fields.Integer('Quotation Duration', help='Number of days for the validity date computation of the quotation') require_payment = fields.Selection([ (0, 'Online Signature'), (1, 'Online Payment')], default=0, string='Confirmation Mode', help="Choose how you want to confirm an order to launch the delivery process. You can either " "request a digital signature or an upfront payment. With a digital signature, you can " "request the payment when issuing the invoice.") mail_template_id = fields.Many2one( 'mail.template', 'Confirmation Mail', domain=[('model', '=', 'sale.order')], help="This e-mail template will be sent on confirmation. Leave empty to send nothing.") active = fields.Boolean(default=True, help="If unchecked, it will allow you to hide the quotation template without removing it.") @api.multi def open_template(self): self.ensure_one() return { 'type': 'ir.actions.act_url', 'target': 'self', 'url': '/quote/template/%d' % self.id }
class WebsiteResPartner(models.Model): _name = 'res.partner' _inherit = [ 'res.partner', 'website.seo.metadata', 'website.published.mixin' ] def _default_website(self): default_website_id = self.env.ref('website.default_website') return [default_website_id.id] if default_website_id else None website_description = fields.Html('Website Partner Full Description', strip_style=True) website_short_description = fields.Text( 'Website Partner Short Description') website_ids = fields.Many2many('website', 'website_partner_pub_rel', 'website_id', 'partner_id', string='Websites', copy=False, default=_default_website, help='List of websites in which ' 'Partner will published.') @api.multi def _compute_website_url(self): super(WebsiteResPartner, self)._compute_website_url() for partner in self: partner.website_url = "/partners/%s" % slug(partner)
class SaleOrderLine(models.Model): _inherit = "sale.order.line" _description = "Sales Order Line" website_description = fields.Html('Line Description', sanitize=False, translate=html_translate) option_line_id = fields.One2many('sale.order.option', 'line_id', 'Optional Products Lines') # Take the description on the order template if the product is present in it @api.onchange('product_id') def product_id_change(self): domain = super(SaleOrderLine, self).product_id_change() if self.order_id.template_id: self.name = next((quote_line.name for quote_line in self.order_id.template_id.quote_line if quote_line.product_id.id == self.product_id.id), self.name) return domain @api.model def create(self, values): values = self._inject_quote_description(values) return super(SaleOrderLine, self).create(values) @api.multi def write(self, values): values = self._inject_quote_description(values) return super(SaleOrderLine, self).write(values) def _inject_quote_description(self, values): values = dict(values or {}) if not values.get('website_description') and values.get('product_id'): product = self.env['product.product'].browse(values['product_id']) values['website_description'] = product.quote_description or product.website_description return values
class ProductPublicCategory(models.Model): _name = "product.public.category" _inherit = ["website.seo.metadata", "website.multi.mixin", 'image.mixin'] _description = "Website Product Category" _parent_store = True _order = "sequence, name, id" def _default_sequence(self): cat = self.search([], limit=1, order="sequence DESC") if cat: return cat.sequence + 5 return 10000 name = fields.Char(required=True, translate=True) parent_id = fields.Many2one('product.public.category', string='Parent Category', index=True, ondelete="cascade") parent_path = fields.Char(index=True) child_id = fields.One2many('product.public.category', 'parent_id', string='Children Categories') parents_and_self = fields.Many2many('product.public.category', compute='_compute_parents_and_self') sequence = fields.Integer( help= "Gives the sequence order when displaying a list of product categories.", index=True, default=_default_sequence) website_description = fields.Html('Category Description', sanitize_attributes=False, translate=html_translate, sanitize_form=False) product_tmpl_ids = fields.Many2many( 'product.template', relation='product_public_category_product_template_rel') @api.constrains('parent_id') def check_parent_id(self): if not self._check_recursion(): raise ValueError( _('Error ! You cannot create recursive categories.')) def name_get(self): res = [] for category in self: res.append((category.id, " / ".join(category.parents_and_self.mapped('name')))) return res def _compute_parents_and_self(self): for category in self: if category.parent_path: category.parents_and_self = self.env[ 'product.public.category'].browse( [int(p) for p in category.parent_path.split('/')[:-1]]) else: category.parents_and_self = category
class Invite(models.TransientModel): """ Wizard to invite partners (or channels) and make them followers. """ _name = 'mail.wizard.invite' _description = 'Invite wizard' @api.model def default_get(self, fields): result = super(Invite, self).default_get(fields) user_name = self.env.user.name_get()[0][1] model = result.get('res_model') res_id = result.get('res_id') if self._context.get('mail_invite_follower_channel_only'): result['send_mail'] = False if 'message' in fields and model and res_id: model_name = self.env['ir.model']._get(model).display_name document_name = self.env[model].browse(res_id).name_get()[0][1] message = _('<div><p>Hello,</p><p>%s invited you to follow %s document: %s.</p></div>') % (user_name, model_name, document_name) result['message'] = message elif 'message' in fields: result['message'] = _('<div><p>Hello,</p><p>%s invited you to follow a new document.</p></div>') % user_name return result res_model = fields.Char('Related Document Model', required=True, index=True, help='Model of the followed resource') res_id = fields.Integer('Related Document ID', index=True, help='Id of the followed resource') partner_ids = fields.Many2many('res.partner', string='Recipients', help="List of partners that will be added as follower of the current document.") channel_ids = fields.Many2many('mail.channel', string='Channels', help='List of channels that will be added as listeners of the current document.', domain=[('channel_type', '=', 'channel')]) message = fields.Html('Message') send_mail = fields.Boolean('Send Email', default=True, help="If checked, the partners will receive an email warning they have been added in the document's followers.") @api.multi def add_followers(self): email_from = self.env['mail.message']._get_default_from() for wizard in self: Model = self.env[wizard.res_model] document = Model.browse(wizard.res_id) # filter partner_ids to get the new followers, to avoid sending email to already following partners new_partners = wizard.partner_ids - document.message_partner_ids new_channels = wizard.channel_ids - document.message_channel_ids document.message_subscribe(new_partners.ids, new_channels.ids) model_name = self.env['ir.model']._get(wizard.res_model).display_name # send an email if option checked and if a message exists (do not send void emails) if wizard.send_mail and wizard.message and not wizard.message == '<br>': # when deleting the message, cleditor keeps a <br> message = self.env['mail.message'].create({ 'subject': _('Invitation to follow %s: %s') % (model_name, document.name_get()[0][1]), 'body': wizard.message, 'record_name': document.name_get()[0][1], 'email_from': email_from, 'reply_to': email_from, 'model': wizard.res_model, 'res_id': wizard.res_id, 'no_auto_thread': True, }) new_partners.with_context(auto_delete=True)._notify(message, force_send=True, send_after_commit=False, user_signature=True) message.unlink() return {'type': 'ir.actions.act_window_close'}
class SaleQuoteOption(models.Model): _name = "sale.quote.option" _description = "Quotation Option" template_id = fields.Many2one('sale.quote.template', 'Quotation Template Reference', ondelete='cascade', index=True, required=True) name = fields.Text('Description', required=True, translate=True) product_id = fields.Many2one('product.product', 'Product', domain=[('sale_ok', '=', True)], required=True) layout_category_id = fields.Many2one('sale.layout_category', string='Section') website_description = fields.Html('Option Description', translate=html_translate, sanitize_attributes=False) price_unit = fields.Float('Unit Price', required=True, digits=dp.get_precision('Product Price')) discount = fields.Float('Discount (%)', digits=dp.get_precision('Discount')) uom_id = fields.Many2one('product.uom', 'Unit of Measure ', required=True) quantity = fields.Float('Quantity', required=True, digits=dp.get_precision('Product UoS'), default=1) @api.onchange('product_id') def _onchange_product_id(self): if not self.product_id: return product = self.product_id self.price_unit = product.list_price self.website_description = product.product_tmpl_id.quote_description name = product.name if self.product_id.description_sale: name += '\n' + self.product_id.description_sale self.name = name self.uom_id = product.uom_id domain = { 'uom_id': [('category_id', '=', self.product_id.uom_id.category_id.id)] } return {'domain': domain} @api.onchange('uom_id') def _onchange_product_uom(self): if not self.product_id: return if not self.uom_id: self.price_unit = 0.0 return if self.uom_id.id != self.product_id.uom_id.id: self.price_unit = self.product_id.uom_id._compute_price( self.price_unit, self.uom_id)
class ScheduleActivity(models.Model): _name = 'schedule.activity' _rec_name = 'activity_type_id' activity_type_id = fields.Many2one('mail.activity.type', 'Activity') summary = fields.Char('Summary') note = fields.Html('Note') feedback = fields.Html('Feedback') date_deadline = fields.Date('Due Date', index=True) due_days = fields.Char('Due In', compute='_compute_days') res_reference_id = fields.Many2one('supportdesk.ticket', string="Ticket") mail_activity_id = fields.Many2one('mail.activity', string="Mail " "activity ID") user_id = fields.Many2one('res.users', 'Assigned to', index=True) res_state = fields.Selection([('in_progress', 'In Progress'), ('done', 'Done'), ('cancel', 'Cancel')], string='State', default='in_progress') @api.depends('date_deadline') def _compute_days(self): for record in self: today = date.today() date_deadline = fields.Date.from_string(record.date_deadline) diff = (date_deadline - today) if diff.days == 0: record.due_days = 'Today' elif diff.days == 1: record.due_days = 'Tomorrow' elif diff.days == -1: record.due_days = 'Yesterday' elif diff.days > 1: record.due_days = ('Due in %d days' % math.fabs(diff.days)) elif diff.days < -1: record.due_days = ('%d days overdue' % math.fabs(diff.days)) @api.multi def unlink(self): for record in self: if record.res_state == 'in_progress': raise UserError( _('You cannot remove activity which is in Progress state')) return super(ScheduleActivity, self).unlink()
class MailingList(models.Model): _inherit = 'mailing.list' def _default_toast_content(self): return _('<p>Thanks for subscribing!</p>') website_popup_ids = fields.One2many('website.mass_mailing.popup', 'mailing_list_id', string="Website Popups") toast_content = fields.Html(default=_default_toast_content, translate=True)
class SaleQuoteLine(models.Model): _name = "sale.quote.line" _description = "Quotation Template Lines" _order = 'sequence, id' sequence = fields.Integer('Sequence', help="Gives the sequence order when displaying a list of sale quote lines.", default=10) quote_id = fields.Many2one('sale.quote.template', 'Quotation Template Reference', required=True, ondelete='cascade', index=True) name = fields.Text('Description', required=True, translate=True) product_id = fields.Many2one('product.product', 'Product', domain=[('sale_ok', '=', True)], required=True) layout_category_id = fields.Many2one('sale.layout_category', string='Section') website_description = fields.Html('Line Description', related='product_id.product_tmpl_id.quote_description', translate=html_translate) price_unit = fields.Float('Unit Price', required=True, digits=dp.get_precision('Product Price')) discount = fields.Float('Discount (%)', digits=dp.get_precision('Discount'), default=0.0) product_uom_qty = fields.Float('Quantity', required=True, digits=dp.get_precision('Product UoS'), default=1) product_uom_id = fields.Many2one('product.uom', 'Unit of Measure ', required=True) @api.onchange('product_id') def _onchange_product_id(self): self.ensure_one() if self.product_id: name = self.product_id.name_get()[0][1] if self.product_id.description_sale: name += '\n' + self.product_id.description_sale self.name = name self.price_unit = self.product_id.lst_price self.product_uom_id = self.product_id.uom_id.id self.website_description = self.product_id.quote_description or self.product_id.website_description or '' domain = {'product_uom_id': [('category_id', '=', self.product_id.uom_id.category_id.id)]} return {'domain': domain} @api.onchange('product_uom_id') def _onchange_product_uom(self): if self.product_id and self.product_uom_id: self.price_unit = self.product_id.uom_id._compute_price(self.product_id.lst_price, self.product_uom_id) @api.model def create(self, values): values = self._inject_quote_description(values) return super(SaleQuoteLine, self).create(values) @api.multi def write(self, values): values = self._inject_quote_description(values) return super(SaleQuoteLine, self).write(values) def _inject_quote_description(self, values): values = dict(values or {}) if not values.get('website_description') and values.get('product_id'): product = self.env['product.product'].browse(values['product_id']) values['website_description'] = product.quote_description or product.website_description or '' return values
class SaleOrderTemplateOption(models.Model): _inherit = "sale.order.template.option" website_description = fields.Html('Website Description', translate=html_translate, sanitize_attributes=False) @api.onchange('product_id') def _onchange_product_id(self): ret = super(SaleOrderTemplateOption, self)._onchange_product_id() if self.product_id: self.website_description = self.product_id.quotation_description return ret
class SaleOrderTemplate(models.Model): _inherit = "sale.order.template" website_description = fields.Html('Website Description', translate=html_translate, sanitize_attributes=False, sanitize_form=False) def open_template(self): self.ensure_one() return { 'type': 'ir.actions.act_url', 'target': 'self', 'url': '/sale_quotation_builder/template/%d' % self.id }
class PolicyDetails(models.Model): _name = 'policy.details' name = fields.Char(string='Name', required=True) policy_type = fields.Many2one('policy.type', string='Policy Type', required=True) payment_type = fields.Selection([('fixed', 'Fixed'), ('installment', 'Installment')], required=True, default='fixed') amount = fields.Float(string='Amount', required=True) policy_duration = fields.Integer(string='Duration in Days', required=True) note_field = fields.Html(string='Comment')
class WebsiteResPartner(models.Model): _name = 'res.partner' _inherit = ['res.partner', 'website.seo.metadata'] website_description = fields.Html('Website Partner Full Description', strip_style=True, translate=html_translate) website_short_description = fields.Text( 'Website Partner Short Description', translate=True) def _compute_website_url(self): super(WebsiteResPartner, self)._compute_website_url() for partner in self: partner.website_url = "/partners/%s" % slug(partner)
class MassMailingPopup(models.Model): _name = 'website.mass_mailing.popup' _description = "Mailing list popup" def _default_popup_content(self): return self.env['ir.ui.view']._render_template( 'website_mass_mailing.s_newsletter_subscribe_popup_content') mailing_list_id = fields.Many2one('mailing.list') website_id = fields.Many2one('website') popup_content = fields.Html(string="Website Popup Content", default=_default_popup_content, translate=True, sanitize=False)
class ProjectTeam(models.Model): _name = "project.team" _inherit = 'mail.thread' _description = "Project Team" name = fields.Char("Team Name", required=True, tracking=True) strength = fields.Text("Team Strength", tracking=True) member_ids = fields.Many2many("res.users", string="Members") master_id = fields.Many2one("res.users", string="Scrum Master", tracking=True) description = fields.Html() project_id = fields.Many2one('project.project', string="Project", tracking=True)
class HrPlanActivityType(models.Model): _name = 'hr.plan.activity.type' _description = 'Plan activity type' _rec_name = 'summary' activity_type_id = fields.Many2one( 'mail.activity.type', 'Activity Type', default=lambda self: self.env.ref('mail.mail_activity_data_todo'), domain=lambda self: ['|', ('res_model_id', '=', False), ('res_model_id', '=', self.env['ir.model']._get('hr.employee').id)], ondelete='restrict' ) summary = fields.Char('Summary', compute="_compute_default_summary", store=True, readonly=False) responsible = fields.Selection([ ('coach', 'Coach'), ('manager', 'Manager'), ('employee', 'Employee'), ('other', 'Other')], default='employee', string='Responsible', required=True) responsible_id = fields.Many2one('res.users', 'Responsible Person', help='Specific responsible of activity if not linked to the employee.') note = fields.Html('Note') @api.depends('activity_type_id') def _compute_default_summary(self): for plan_type in self: if not plan_type.summary and plan_type.activity_type_id and plan_type.activity_type_id.summary: plan_type.summary = plan_type.activity_type_id.summary def get_responsible_id(self, employee): if self.responsible == 'coach': if not employee.coach_id: raise UserError(_('Coach of employee %s is not set.', employee.name)) responsible = employee.coach_id.user_id if not responsible: raise UserError(_('User of coach of employee %s is not set.', employee.name)) elif self.responsible == 'manager': if not employee.parent_id: raise UserError(_('Manager of employee %s is not set.', employee.name)) responsible = employee.parent_id.user_id if not responsible: raise UserError(_('User of manager of employee %s is not set.', employee.name)) elif self.responsible == 'employee': responsible = employee.user_id if not responsible: raise UserError(_('User linked to employee %s is required.', employee.name)) elif self.responsible == 'other': responsible = self.responsible_id if not responsible: raise UserError(_('No specific user given on activity %s.', self.activity_type_id.name)) return responsible
class ImLivechatChannel(models.Model): _name = 'im_livechat.channel' _inherit = ['im_livechat.channel', 'website.published.mixin'] @api.multi def _compute_website_url(self): super(ImLivechatChannel, self)._compute_website_url() for channel in self: channel.website_url = "/livechat/channel/%s" % (slug(channel), ) website_description = fields.Html( "Website description", default=False, help="Description of the channel displayed on the website page", sanitize_attributes=False, translate=html_translate)
class SaleOrderOption(models.Model): _inherit = "sale.order.option" website_description = fields.Html('Website Description', sanitize_attributes=False, translate=html_translate) @api.onchange('product_id', 'uom_id') def _onchange_product_id(self): ret = super(SaleOrderOption, self)._onchange_product_id() if self.product_id: product = self.product_id.with_context(lang=self.order_id.partner_id.lang) self.website_description = product.quotation_description return ret def _get_values_to_add_to_order(self): values = super(SaleOrderOption, self)._get_values_to_add_to_order() values.update(website_description=self.website_description) return values
class MassMailingList(models.Model): _inherit = 'mail.mass_mailing.list' def _default_popup_content(self): return """<div class="modal-header text-center"> <h3 class="modal-title mt8">Flectra Presents</h3> </div> <div class="o_popup_message"> <font>7</font> <strong>Business Hacks</strong> <span> to<br/>boost your marketing</span> </div> <p class="o_message_paragraph">Join our Marketing newsletter and get <strong>this white paper instantly</strong></p>""" popup_content = fields.Html(string="Website Popup Content", translate=True, sanitize_attributes=False, default=_default_popup_content) popup_redirect_url = fields.Char(string="Website Popup Redirect URL", default='/')