class EmbeddedSlide(models.Model): """ Embedding in third party websites. Track view count, generate statistics. """ _name = 'slide.embed' _description = 'Embedded Slides View Counter' _rec_name = 'slide_id' slide_id = fields.Many2one('slide.slide', string="Presentation", required=True, index=True) url = fields.Char('Third Party Website URL', required=True) count_views = fields.Integer('# Views', default=1) def add_embed_url(self, slide_id, url): baseurl = urls.url_parse(url).netloc embeds = self.search([('url', '=', baseurl), ('slide_id', '=', int(slide_id))], limit=1) if embeds: embeds.count_views += 1 else: embeds = self.create({ 'slide_id': slide_id, 'url': baseurl, }) return embeds.count_views
class BaseModuleUninstall(models.TransientModel): _name = "base.module.uninstall" _description = "Module Uninstallation" show_all = fields.Boolean() module_id = fields.Many2one('ir.module.module', string="Module", required=True, domain=[ ('state', 'in', ['installed', 'to upgrade', 'to install']) ]) module_ids = fields.Many2many('ir.module.module', string="Impacted modules", compute='_compute_module_ids') model_ids = fields.Many2many('ir.model', string="Impacted data models", compute='_compute_model_ids') def _get_modules(self): """ Return all the modules impacted by self. """ return self.module_id.downstream_dependencies(self.module_id) @api.depends('module_id', 'show_all') def _compute_module_ids(self): for wizard in self: modules = wizard._get_modules() wizard.module_ids = modules if wizard.show_all else modules.filtered( 'application') def _get_models(self): """ Return the models (ir.model) to consider for the impact. """ return self.env['ir.model'].search([('transient', '=', False)]) @api.depends('module_ids') def _compute_model_ids(self): ir_models = self._get_models() ir_models_xids = ir_models._get_external_ids() for wizard in self: if wizard.module_id: module_names = set(wizard._get_modules().mapped('name')) # find the models that have all their XIDs in the given modules def lost(model): return all( xid.split('.')[0] in module_names for xid in ir_models_xids.get(model.id, ())) self.model_ids = ir_models.filtered(lost).sorted('name') @api.onchange('module_id') def _onchange_module_id(self): # if we select a technical module, show technical modules by default if not self.module_id.application: self.show_all = True @api.multi def action_uninstall(self): modules = self.mapped('module_id') return modules.button_immediate_uninstall()
class One2ManyMultiple(models.Model): _name = 'export.one2many.multiple' parent_id = fields.Many2one('export.one2many.recursive') const = fields.Integer(default=36) child1 = fields.One2many('export.one2many.child.1', 'parent_id') child2 = fields.One2many('export.one2many.child.2', 'parent_id')
class ProductPricelist(models.Model): _inherit = "product.pricelist" def _default_website(self): return self.env['website'].search([], limit=1) website_id = fields.Many2one('website', string="website", default=_default_website) code = fields.Char(string='E-commerce Promotional Code', groups="base.group_user") selectable = fields.Boolean(help="Allow the end user to choose this price list") def clear_cache(self): # website._get_pl() is cached to avoid to recompute at each request the # list of available pricelists. So, we need to invalidate the cache when # we change the config of website price list to force to recompute. website = self.env['website'] website._get_pl_partner_order.clear_cache(website) @api.model def create(self, data): res = super(ProductPricelist, self).create(data) self.clear_cache() return res @api.multi def write(self, data): res = super(ProductPricelist, self).write(data) self.clear_cache() return res @api.multi def unlink(self): res = super(ProductPricelist, self).unlink() self.clear_cache() return res
class ProjectTaskType(models.Model): _name = 'project.task.type' _description = 'Task Stage' _order = 'sequence, id' def _get_default_project_ids(self): default_project_id = self.env.context.get('default_project_id') return [default_project_id] if default_project_id else None name = fields.Char(string='Stage Name', required=True, translate=True) description = fields.Text(translate=True) sequence = fields.Integer(default=1) project_ids = fields.Many2many('project.project', 'project_task_type_rel', 'type_id', 'project_id', string='Projects', default=_get_default_project_ids) legend_priority = fields.Char( string='Starred Explanation', translate=True, help='Explanation text to help users using the star on tasks or issues in this stage.') legend_blocked = fields.Char( 'Red Kanban Label', default=lambda s: _('Blocked'), translate=True, required=True, help='Override the default value displayed for the blocked state for kanban selection, when the task or issue is in that stage.') legend_done = fields.Char( 'Green Kanban Label', default=lambda s: _('Ready for Next Stage'), translate=True, required=True, help='Override the default value displayed for the done state for kanban selection, when the task or issue is in that stage.') legend_normal = fields.Char( 'Grey Kanban Label', default=lambda s: _('In Progress'), translate=True, required=True, help='Override the default value displayed for the normal state for kanban selection, when the task or issue is in that stage.') mail_template_id = fields.Many2one( 'mail.template', string='Email Template', domain=[('model', '=', 'project.task')], help="If set an email will be sent to the customer when the task or issue reaches this step.") fold = fields.Boolean(string='Folded in Kanban', help='This stage is folded in the kanban view when there are no records in that stage to display.')
class HrHolidaysRemainingLeavesUser(models.Model): _name = "hr.holidays.remaining.leaves.user" _description = "Total holidays by type" _auto = False name = fields.Char('Employee', readonly=True) no_of_leaves = fields.Integer('Remaining leaves', readonly=True) user_id = fields.Many2one('res.users', string='User', readonly=True) leave_type = fields.Char('Leave Type', readonly=True) def init(self): tools.drop_view_if_exists(self._cr, 'hr_holidays_remaining_leaves_user') self._cr.execute(""" CREATE or REPLACE view hr_holidays_remaining_leaves_user as ( SELECT min(hrs.id) as id, rr.name as name, sum(hrs.number_of_days) as no_of_leaves, rr.user_id as user_id, hhs.name as leave_type FROM hr_holidays as hrs, hr_employee as hre, resource_resource as rr,hr_holidays_status as hhs WHERE hrs.employee_id = hre.id and hre.resource_id = rr.id and hhs.id = hrs.holiday_status_id GROUP BY rr.name,rr.user_id,hhs.name ) """)
class product_price_list(models.TransientModel): _name = 'product.price_list' _description = 'Price List' price_list = fields.Many2one('product.pricelist', 'PriceList', required=True) qty1 = fields.Integer('Quantity-1', default=1) qty2 = fields.Integer('Quantity-2', default=5) qty3 = fields.Integer('Quantity-3', default=10) qty4 = fields.Integer('Quantity-4', default=0) qty5 = fields.Integer('Quantity-5', default=0) @api.multi def print_report(self): """ To get the date and print the report @return : return report """ if (not self.env.user.company_id.logo): raise UserError( _("You have to set a logo or a layout for your company.")) elif (not self.env.user.company_id.external_report_layout): raise UserError( _("You have to set your reports's header and footer layout.")) datas = {'ids': self.env.context.get('active_ids', [])} res = self.read(['price_list', 'qty1', 'qty2', 'qty3', 'qty4', 'qty5']) res = res and res[0] or {} res['price_list'] = res['price_list'][0] datas['form'] = res return self.env.ref('product.action_report_pricelist').report_action( [], data=datas)
class Project(models.Model): _inherit = 'project.project' sale_line_id = fields.Many2one( 'sale.order.line', 'Sales Order Line', readonly=True, help= "Sale order line from which the project has been created. Used for tracability." ) @api.multi def action_view_timesheet(self): self.ensure_one() if self.allow_timesheets: return self.action_view_timesheet_plan() return { 'type': 'ir.actions.act_window', 'name': _('Timesheets of %s') % self.name, 'domain': [('project_id', '!=', False)], 'res_model': 'account.analytic.line', 'view_id': False, 'view_mode': 'tree,form', 'view_type': 'form', 'help': _(""" <p class="oe_view_nocontent_create"> Click to record timesheets. </p><p> You can register and track your workings hours by project every day. Every time spent on a project will become a cost and can be re-invoiced to customers if required. </p> """), 'limit': 80, 'context': { 'default_project_id': self.id, 'search_default_project_id': [self.id] } } @api.multi def action_view_timesheet_plan(self): return { 'name': _('Overview'), 'type': 'ir.actions.client', 'tag': 'timesheet.plan', 'context': { 'active_id': self.id, 'active_ids': self.ids, 'search_default_project_id': self.id, } }
class ResUsers(models.Model): _inherit = 'res.users' resource_ids = fields.One2many('resource.resource', 'user_id', 'Resources') resource_calendar_id = fields.Many2one('resource.calendar', 'Default Working Hours', related='resource_ids.calendar_id')
class StockMove(models.Model): _inherit = 'stock.move' def _default_uom(self): uom_categ_id = self.env.ref('product.product_uom_categ_kgm').id return self.env['product.uom'].search( [('category_id', '=', uom_categ_id), ('factor', '=', 1)], limit=1) weight = fields.Float(compute='_cal_move_weight', digits=dp.get_precision('Stock Weight'), store=True) weight_uom_id = fields.Many2one( 'product.uom', string='Weight Unit of Measure', required=True, readonly=True, help= "Unit of Measure (Unit of Measure) is the unit of measurement for Weight", default=_default_uom) @api.depends('product_id', 'product_uom_qty', 'product_uom') def _cal_move_weight(self): for move in self.filtered( lambda moves: moves.product_id.weight > 0.00): move.weight = (move.product_qty * move.product_id.weight) def _get_new_picking_values(self): vals = super(StockMove, self)._get_new_picking_values() vals['carrier_id'] = self.sale_line_id.order_id.carrier_id.id return vals
class Partner(models.Model): _inherit = 'res.partner' team_id = fields.Many2one('crm.team', string='Sales Channel', oldname='section_id') opportunity_ids = fields.One2many('crm.lead', 'partner_id', string='Opportunities', domain=[('type', '=', 'opportunity')]) meeting_ids = fields.Many2many('calendar.event', 'calendar_event_res_partner_rel', 'res_partner_id', 'calendar_event_id', string='Meetings', copy=False) opportunity_count = fields.Integer("Opportunity", compute='_compute_opportunity_count') meeting_count = fields.Integer("# Meetings", compute='_compute_meeting_count') @api.multi def _compute_opportunity_count(self): for partner in self: operator = 'child_of' if partner.is_company else '=' # the opportunity count should counts the opportunities of this company and all its contacts partner.opportunity_count = self.env['crm.lead'].search_count([('partner_id', operator, partner.id), ('type', '=', 'opportunity')]) @api.multi def _compute_meeting_count(self): for partner in self: partner.meeting_count = len(partner.meeting_ids) @api.multi def schedule_meeting(self): partner_ids = self.ids partner_ids.append(self.env.user.partner_id.id) action = self.env.ref('calendar.action_calendar_event').read()[0] action['context'] = { 'search_default_partner_ids': self._context['partner_name'], 'default_partner_ids': partner_ids, } return action
class RestaurantTable(models.Model): _name = 'restaurant.table' name = fields.Char('Table Name', required=True, help='An internal identification of a table') floor_id = fields.Many2one('restaurant.floor', string='Floor') shape = fields.Selection([('square', 'Square'), ('round', 'Round')], string='Shape', required=True, default='square') position_h = fields.Float('Horizontal Position', default=10, help="The table's horizontal position from the left side to the table's center, in pixels") position_v = fields.Float('Vertical Position', default=10, help="The table's vertical position from the top to the table's center, in pixels") width = fields.Float('Width', default=50, help="The table's width in pixels") height = fields.Float('Height', default=50, help="The table's height in pixels") seats = fields.Integer('Seats', default=1, help="The default number of customer served at this table.") color = fields.Char('Color', help="The table's color, expressed as a valid 'background' CSS property value") active = fields.Boolean('Active', default=True, help='If false, the table is deactivated and will not be available in the point of sale') @api.model def create_from_ui(self, table): """ create or modify a table from the point of sale UI. table contains the table's fields. If it contains an id, it will modify the existing table. It then returns the id of the table. """ if table.get('floor_id'): table['floor_id'] = table['floor_id'][0] table_id = table.pop('id', False) if table_id: self.browse(table_id).write(table) else: table_id = self.create(table).id return table_id
class ProductCategory(models.Model): _inherit = 'product.category' route_ids = fields.Many2many('stock.location.route', 'stock_location_route_categ', 'categ_id', 'route_id', 'Routes', domain=[('product_categ_selectable', '=', True)]) removal_strategy_id = fields.Many2one( 'product.removal', 'Force Removal Strategy', help= "Set a specific removal strategy that will be used regardless of the source location for this product category" ) total_route_ids = fields.Many2many('stock.location.route', string='Total routes', compute='_compute_total_route_ids', readonly=True) @api.one def _compute_total_route_ids(self): category = self routes = self.route_ids while category.parent_id: category = category.parent_id routes |= category.route_ids self.total_route_ids = routes
class StockProductionLot(models.Model): _inherit = 'stock.production.lot' use_next_on_work_order_id = fields.Many2one( 'mrp.workorder', help= 'Technical: used to figure out default serial number on work orders')
class Partner(models.Model): _inherit = 'res.partner' country_enforce_cities = fields.Boolean( related='country_id.enforce_cities') city_id = fields.Many2one('res.city', string='City') @api.onchange('city_id') def _onchange_city_id(self): self.city = self.city_id.name self.zip = self.city_id.zipcode self.state_id = self.city_id.state_id @api.model def _fields_view_get_address(self, arch): arch = super(Partner, self)._fields_view_get_address(arch) # render the partner address accordingly to address_view_id doc = etree.fromstring(arch) if doc.xpath("//field[@name='city_id']"): return arch for city_node in doc.xpath("//field[@name='city']"): replacement_xml = """ <div> <field name="country_enforce_cities" invisible="1"/> <field name='city' placeholder="%s" attrs="{'invisible': [('country_enforce_cities', '=', True), ('city_id', '!=', False)], 'readonly': [('type', '=', 'contact'), ('parent_id', '!=', False)]}"/> <field name='city_id' placeholder="%s" attrs="{'invisible': [('country_enforce_cities', '=', False)], 'readonly': [('type', '=', 'contact'), ('parent_id', '!=', False)]}" context="{'default_country_id': country_id}" domain="[('country_id', '=', country_id)]"/> </div> """ % (_('City'), _('City')) city_id_node = etree.fromstring(replacement_xml) city_node.getparent().replace(city_node, city_id_node) arch = etree.tostring(doc, encoding='unicode') return arch
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 Edition(models.Model): _name = 'test_new_api.creativework.edition' name = fields.Char() res_id = fields.Integer(required=True) res_model_id = fields.Many2one('ir.model', required=True) res_model = fields.Char(related='res_model_id.model', store=True)
class ResCompany(models.Model): _inherit = 'res.company' resource_calendar_ids = fields.One2many('resource.calendar', 'company_id', 'Working Hours') resource_calendar_id = fields.Many2one('resource.calendar', 'Default Working Hours', ondelete='restrict') @api.model def _init_data_resource_calendar(self): for company in self.search([('resource_calendar_id', '=', False)]): company.resource_calendar_id = self.env[ 'resource.calendar'].create({ 'name': _('Standard 40 hours/week') }).id @api.model def create(self, values): if not values.get('resource_calendar_id'): values['resource_calendar_id'] = self.env[ 'resource.calendar'].create({ 'name': _('Standard 40 hours/week') }).id company = super(ResCompany, self).create(values) # calendar created from form view: no company_id set because record was still not created if not company.resource_calendar_id.company_id: company.resource_calendar_id.company_id = company.id return company
class Expense(models.Model): _inherit = "hr.expense" sale_order_id = fields.Many2one('sale.order', string='Sale Order', readonly=True, states={ 'draft': [('readonly', False)], 'reported': [('readonly', False)] }, domain=[('state', '=', 'sale')]) @api.onchange('sale_order_id') def _onchange_sale_order(self): if self.sale_order_id: self.analytic_account_id = self.sale_order_id.analytic_account_id @api.multi def action_move_create(self): """ When posting expense, if a SO is set, this means you want to reinvoice. To do so, we have to set an Analytic Account on the expense. We choose the one from the SO, and if it does not exist, we generate it. Create AA even for product with no expense policy to keep track of the analytic. """ for expense in self.filtered(lambda expense: expense.sale_order_id and not expense.analytic_account_id): if not expense.sale_order_id.analytic_account_id: expense.sale_order_id._create_analytic_account() expense.write({ 'analytic_account_id': expense.sale_order_id.analytic_account_id.id }) return super(Expense, self).action_move_create()
class ProductAttributevalue(models.Model): _name = "product.attribute.value" _order = 'sequence, attribute_id, id' name = fields.Char('Value', required=True, translate=True) sequence = fields.Integer('Sequence', help="Determine the display order") attribute_id = fields.Many2one('product.attribute', 'Attribute', ondelete='cascade', required=True) product_ids = fields.Many2many('product.product', string='Variants', readonly=True) price_extra = fields.Float( 'Attribute Price Extra', compute='_compute_price_extra', inverse='_set_price_extra', default=0.0, digits=dp.get_precision('Product Price'), help="Price Extra: Extra price for the variant with this attribute value on sale price. eg. 200 price extra, 1000 + 200 = 1200.") price_ids = fields.One2many('product.attribute.price', 'value_id', 'Attribute Prices', readonly=True) _sql_constraints = [ ('value_company_uniq', 'unique (name,attribute_id)', 'This attribute value already exists !') ] @api.one def _compute_price_extra(self): if self._context.get('active_id'): price = self.price_ids.filtered(lambda price: price.product_tmpl_id.id == self._context['active_id']) self.price_extra = price.price_extra else: self.price_extra = 0.0 def _set_price_extra(self): if not self._context.get('active_id'): return AttributePrice = self.env['product.attribute.price'] prices = AttributePrice.search([('value_id', 'in', self.ids), ('product_tmpl_id', '=', self._context['active_id'])]) updated = prices.mapped('value_id') if prices: prices.write({'price_extra': self.price_extra}) else: for value in self - updated: AttributePrice.create({ 'product_tmpl_id': self._context['active_id'], 'value_id': value.id, 'price_extra': self.price_extra, }) @api.multi def name_get(self): if not self._context.get('show_attribute', True): # TDE FIXME: not used return super(ProductAttributevalue, self).name_get() return [(value.id, "%s: %s" % (value.attribute_id.name, value.name)) for value in self] @api.multi def unlink(self): linked_products = self.env['product.product'].with_context(active_test=False).search([('attribute_value_ids', 'in', self.ids)]) if linked_products: raise UserError(_('The operation cannot be completed:\nYou are trying to delete an attribute value with a reference on a product variant.')) return super(ProductAttributevalue, self).unlink() @api.multi def _variant_name(self, variable_attributes): return ", ".join([v.name for v in self if v.attribute_id in variable_attributes])
class ProductCategory(models.Model): _name = "product.category" _description = "Product Category" _parent_name = "parent_id" _parent_store = True _parent_order = 'name' _rec_name = 'complete_name' _order = 'parent_left' name = fields.Char('Name', index=True, required=True, translate=True) complete_name = fields.Char('Complete Name', compute='_compute_complete_name', store=True) parent_id = fields.Many2one('product.category', 'Parent Category', index=True, ondelete='cascade') child_id = fields.One2many('product.category', 'parent_id', 'Child Categories') parent_left = fields.Integer('Left Parent', index=1) parent_right = fields.Integer('Right Parent', index=1) product_count = fields.Integer( '# Products', compute='_compute_product_count', help= "The number of products under this category (Does not consider the children categories)" ) @api.depends('name', 'parent_id.complete_name') def _compute_complete_name(self): for category in self: if category.parent_id: category.complete_name = '%s / %s' % ( category.parent_id.complete_name, category.name) else: category.complete_name = category.name def _compute_product_count(self): read_group_res = self.env['product.template'].read_group( [('categ_id', 'child_of', self.ids)], ['categ_id'], ['categ_id']) group_data = dict((data['categ_id'][0], data['categ_id_count']) for data in read_group_res) for categ in self: product_count = 0 for sub_categ_id in categ.search([('id', 'child_of', categ.id) ]).ids: product_count += group_data.get(sub_categ_id, 0) categ.product_count = product_count @api.constrains('parent_id') def _check_category_recursion(self): if not self._check_recursion(): raise ValidationError( _('Error ! You cannot create recursive categories.')) return True @api.model def name_create(self, name): return self.create({'name': name}).name_get()[0]
class ResConfigSettings(models.TransientModel): _inherit = 'res.config.settings' lock_confirmed_po = fields.Boolean( "Lock Confirmed Orders", default=lambda self: self.env.user.company_id.po_lock == 'lock') po_lock = fields.Selection(related='company_id.po_lock', string="Purchase Order Modification *") po_order_approval = fields.Boolean( "Order Approval", default=lambda self: self.env.user.company_id.po_double_validation == 'two_step') po_double_validation = fields.Selection( related='company_id.po_double_validation', string="Levels of Approvals *") po_double_validation_amount = fields.Monetary( related='company_id.po_double_validation_amount', string="Minimum Amount", currency_field='company_currency_id') company_currency_id = fields.Many2one( 'res.currency', related='company_id.currency_id', readonly=True, help='Utility field to express amount currency') default_purchase_method = fields.Selection( [ ('purchase', 'Ordered quantities'), ('receive', 'Delivered quantities'), ], string="Bill Control", default_model="product.template", help="This default value is applied to any new product created. " "This can be changed in the product detail form.", default="receive") module_purchase_requisition = fields.Boolean("Purchase Agreements") group_warning_purchase = fields.Boolean( "Warnings", implied_group='purchase.group_warning_purchase') module_stock_dropshipping = fields.Boolean("Dropshipping") group_manage_vendor_price = fields.Boolean( "Vendor Pricelists", implied_group="purchase.group_manage_vendor_price") module_account_3way_match = fields.Boolean( "3-way matching: purchases, receptions and bills") is_installed_sale = fields.Boolean(string="Is the Sale Module Installed") group_analytic_account_for_purchases = fields.Boolean( 'Analytic accounting for purchases', implied_group='purchase.group_analytic_accounting') @api.multi def get_values(self): res = super(ResConfigSettings, self).get_values() res.update(is_installed_sale=self.env['ir.module.module'].search([( 'name', '=', 'sale'), ('state', '=', 'installed')]).id) return res def set_values(self): super(ResConfigSettings, self).set_values() self.po_lock = 'lock' if self.lock_confirmed_po else 'edit' self.po_double_validation = 'two_step' if self.po_order_approval else 'one_step'
class SaleOrderLine(models.Model): _inherit = 'sale.order.line' event_id = fields.Many2one('event.event', string='Event', help="Choose an event and it will automatically create a registration for this event.") event_ticket_id = fields.Many2one('event.event.ticket', string='Event Ticket', help="Choose " "an event ticket and it will automatically create a registration for this event ticket.") event_ok = fields.Boolean(related='product_id.event_ok', readonly=True) @api.multi def _prepare_invoice_line(self, qty): self.ensure_one() res = super(SaleOrderLine, self)._prepare_invoice_line(qty) if self.event_id: res['name'] = '%s: %s' % (res.get('name', ''), self.event_id.name) return res @api.multi def _update_registrations(self, confirm=True, cancel_to_draft=False, registration_data=None): """ Create or update registrations linked to a sales order line. A sale order line has a product_uom_qty attribute that will be the number of registrations linked to this line. This method update existing registrations and create new one for missing one. """ Registration = self.env['event.registration'].sudo() registrations = Registration.search([('sale_order_line_id', 'in', self.ids), ('state', '!=', 'cancel')]) for so_line in self.filtered('event_id'): existing_registrations = registrations.filtered(lambda self: self.sale_order_line_id.id == so_line.id) if confirm: existing_registrations.filtered(lambda self: self.state != 'open').confirm_registration() if cancel_to_draft: existing_registrations.filtered(lambda self: self.state == 'cancel').do_draft() for count in range(int(so_line.product_uom_qty) - len(existing_registrations)): registration = {} if registration_data: registration = registration_data.pop() # TDE CHECK: auto confirmation registration['sale_order_line_id'] = so_line Registration.with_context(registration_force_draft=True).create( Registration._prepare_attendee_values(registration)) return True @api.onchange('event_ticket_id') def _onchange_event_ticket_id(self): self.price_unit = (self.event_id.company_id or self.env.user.company_id).currency_id.compute(self.event_ticket_id.price, self.order_id.currency_id)
class daughter(models.Model): _inherit = 'test.inherit.daughter' # simply redeclare the field without adding any option template_id = fields.Many2one() # change the default value of an inherited field name = fields.Char(default='Baz')
class StockWarnInsufficientQtyScrap(models.TransientModel): _name = 'stock.warn.insufficient.qty.scrap' _inherit = 'stock.warn.insufficient.qty' scrap_id = fields.Many2one('stock.scrap', 'Scrap') def action_done(self): return self.scrap_id.do_scrap()
class ResCompany(models.Model): _inherit = 'res.company' project_time_mode_id = fields.Many2one('product.uom', string='Project Time Unit', default=lambda s: s.env.ref('product.product_uom_hour', raise_if_not_found=False), help="This will set the unit of measure used in projects and tasks.\n" "If you use the timesheet linked to projects, don't " "forget to setup the right unit of measure in your employees.")
class ProductAttribute(models.Model): _inherit = 'product.attribute' category_id = fields.Many2one( 'product.attribute.category', string="Category", help="Set a category to regroup similar attributes under " "the same section in the Comparison page of eCommerce")
class StockPicking(models.Model): _inherit = 'stock.picking' purchase_id = fields.Many2one( 'purchase.order', related='move_lines.purchase_line_id.order_id', string="Purchase Orders", readonly=True)
class ResPartner(models.Model): _inherit = 'res.partner' property_delivery_carrier_id = fields.Many2one( 'delivery.carrier', company_dependent=True, string="Delivery Method", help="This delivery method will be used when invoicing from picking.")
class StockMove(models.Model): _inherit = 'stock.move' subproduct_id = fields.Many2one( 'mrp.subproduct', 'Subproduct', help="Subproduct line that generated the move in a manufacturing order" )