class Rule(Model): _name = "wkf.rule" _string = "Workflow Rule" _name_field = "description" _fields = { "trigger_model_id": fields.Many2One("model", "Trigger Model", required=True, search=True), "trigger_event": fields.Char("Trigger Event", required=True, search=True), "condition_method": fields.Char("Condition Method"), "condition_args": fields.Text("Condition Arguments"), "action_model_id": fields.Many2One("model", "Action Model", required=True, search=True), "action_method": fields.Char("Action Method", required=True), "action_args": fields.Text("Action Arguments"), "description": fields.Text("Rule Description", search=True), "comments": fields.One2Many("message", "related_id", "Comments"), "state": fields.Selection([["active", "Active"], ["inactive", "Inactive"]], "Status", required=True, search=True), "error": fields.Text("Error Message"), } _order = "trigger_model_id.name,trigger_event,action_model_id.name,action_method" _defaults = { "state": "active", }
class BatchImportSaleInvoice(Model): _name = "batch.import.sale.invoice" _fields = { "import_id": fields.Many2One("batch.import", "Import", required=True, on_delete="cascade"), "date": fields.Date("Date", required=True), "number": fields.Text("Invoice No."), "contact": fields.Char("Customer Name"), "description": fields.Text("Description"), "amount": fields.Decimal("Amount"), "account_id": fields.Many2One("account.account", "Income Account"), "tax_id": fields.Many2One("account.tax.rate", "Tax Rate"), "invoice_id": fields.Many2One("account.invoice", "Invoice"), }
class OpportCompet(Model): _name = "opport.compet" _string = "Opportunity Competitor" _fields = { "opport_id": fields.Many2One("sale.opportunity", "Opportunity"), "compet_id": fields.Many2One("competitor", "Competitor"), "strengths": fields.Text("Strengths"), "weaknesses": fields.Text("Weaknesses"), "comments": fields.One2Many("message", "related_id", "Comments"), }
class ContactCateg(Model): _name = "contact.categ" _string = "Contact Category" _key = ["code"] _name_field = "name" _fields = { "name": fields.Char("Category Name", required=True, search=True), "code": fields.Char("Category Code", search=True), "parent_id": fields.Many2One("contact.categ", "Parent", search=True), "description": fields.Text("Description"), "comments": fields.One2Many("message", "related_id", "Comments"), "full_name": fields.Char("Full Name", function="get_full_name"), } _order = "code" def get_full_name(self, ids, context={}): vals = {} for obj in self.browse(ids): n = obj.name p = obj.parent_id while p: n = p.name + " / " + n p = p.parent_id vals[obj.id] = n return vals
class Website(Model): _name = "website" _string = "Website" _fields = { "name": fields.Char("Website Title"), "parent_categ_id": fields.Many2One("product.categ", "Product Category"), "parent_group_id": fields.Many2One("product.group", "Product Group"), "contact_categ_id": fields.Many2One("contact.categ", "Customer Contact Category"), "user_profile_id": fields.Many2One("profile", "Customer User Profile"), "sale_account_id": fields.Many2One("account.account", "Sales Account"), "sale_tax_id": fields.Many2One("account.tax.rate", "Sales Tax"), "account_receivable_id": fields.Many2One("account.account", "Receivable Account"), "news_categ_id": fields.Many2One("contact.categ", "Newsletter Contact Category"), "target_list_id": fields.Many2One("mkt.target.list", "Newsletter Target List"), "invoice_flag": fields.Boolean("Use same invoice number as sale order number"), "ship_product_id": fields.Many2One("product", "Shipping Product"), "preview_doc_categ_id": fields.Many2One("document.categ", "Preview picture document category"), "invoice_template_id": fields.Many2One("report.template", "Invoice Template"), "payment_slip_template_id": fields.Many2One("report.template", "Payment Slip Template"), "auto_create_account": fields.Boolean("Auto-create customer account after checkout"), "ga_script": fields.Text("Google Analytic script"), "state": fields.Selection([["active", "Active"], ["inactive", "Inactive"]], "Status", required=True), "theme_id": fields.Many2One("theme", "Theme"), "settings": fields.One2Many("website.setting","website_id","Website Settings"), "sale_channel_id": fields.Many2One("sale.channel","Sales Channel"), "bank_method_id": fields.Many2One("payment.method","Bank Transfer",condition=[["type","=","bank"]]), "paypal_method_id": fields.Many2One("payment.method","Paypal",condition=[["type","=","paypal"]]), "paysbuy_method_id": fields.Many2One("payment.method","Paysbuy",condition=[["type","=","paysbuy"]]), "scb_method_id": fields.Many2One("payment.method","SCB Gateway",condition=[["type","=","scb_gateway"]]), "url": fields.Char("Website URL"), } _order="name" _defaults = { "state": "active", }
class ProductBrand(Model): _name = "product.brand" _string = "Brand" _fields = { "name": fields.Char("Name", required=True, search=True), "description": fields.Text("Description", search=True), "image": fields.File("Image"), "code": fields.Char("Code"), "parent_id": fields.Many2One("product.brand","Parent Brand"), "sub_brands": fields.One2Many("product.brand","parent_id","Sub Brands"), "products": fields.One2Many("product","brand_id","Products", operator="child_of"), "num_products": fields.Integer("Number of products", function="get_num_products"), "groups": fields.Many2Many("product.brand.group","Group"), } _order = "name" def get_num_products(self, ids, context={}): vals = {} for obj in self.browse(ids): nums = 0 for product in obj.products: if not product.parent_id: nums += 1 vals[obj.id] = nums return vals
class CustomOption(Model): _name = "product.custom.option" _string = "Custom Option" _key = ["code"] _fields = { "name": fields.Char("Name", required=True, search=True, translate=True), "seq": fields.Char("Sequence", required=True), "code": fields.Char("Code", search=True), "type": fields.Selection([["text", "Text"], ["selection", "Selection"]], "Type", required=True), "required": fields.Boolean("Required"), "description": fields.Text("Description"), "price": fields.Decimal("Price"), "values": fields.One2Many("product.custom.option.value", "cust_opt_id", "Values"), } _defaults = { "type": "text", "seq": '0', }
class BarcodeIssueLine(Model): _name = "barcode.issue.line" _transient = True _fields = { "wizard_id": fields.Many2One("barcode.issue", "Wizard", required=True, on_delete="cascade"), "product_id": fields.Many2One("product", "Product", required=True), "qty": fields.Decimal("Qty", required=True), "uom_id": fields.Many2One("uom", "UoM", required=True), "qty2": fields.Decimal("Secondary Qty"), "lot_id": fields.Many2One("stock.lot", "Lot / Serial Number"), "container_from_id": fields.Many2One("stock.container", "From Container"), "container_to_id": fields.Many2One("stock.container", "To Container"), "location_from_id": fields.Many2One("stock.location", "From Location"), "location_to_id": fields.Many2One("stock.location", "To Location"), "related_id": fields.Reference([["sale.order", "Sales Order"], ["purchase.order", "Purchase Order"]], "Related To"), "qty2": fields.Decimal("Qty2"), "notes": fields.Text("Notes"), }
class TaskTemplate(Model): _name = "task.template" _string = "Task Template" _name_field = "description" _fields = { "job_template_id": fields.Many2One("job.template", "Job Template", on_delete="cascade"), # XXX: deprecated "task_list_template_id": fields.Many2One("task.list.template", "Task List Template", required=True, on_delete="cascade"), "sequence": fields.Integer("Sequence"), "title": fields.Char("Title", required=True), "description": fields.Text("Description"), "duration": fields.Integer("Duration (Days)", required=True), "start_after": fields.Integer("Start After (Days)"), } _order = "task_list_template_id.name,sequence"
class customerMessage(Model): _name = "cms.customer.message" _fields = { "name": fields.Char("Name", required=True), "email": fields.Char("Email", required=True), "description": fields.Text("Description", required=True), }
class Page(Model): _name = "cms.page" _string = "Page" _name_field = "title" _fields = { "title": fields.Char("Title", required=True, translate=True, search=True), "code": fields.Char("Code", required=True, search=True), "body": fields.Text("Body", translate=True), "blocks": fields.One2Many("cms.block", "related_id", "Blocks"), "comments": fields.One2Many("message", "related_id", "Comments"), "meta_description": fields.Char("Meta Description"), "meta_keywords": fields.Char("Meta Keywords"), "template": fields.Char("Template"), "state": fields.Selection([["active", "Active"], ["inactive", "Inactive"]], "Status", required=True), } _defaults = { "state": "active", }
class RequiredDoc(Model): _name = "required.doc" _string = "Required Document" _fields = { "name": fields.Text("Document Name", required=True), "related_id": fields.Reference([], "Related To"), }
class SaleCost(Model): _name = "sale.cost" _string = "Cost" _fields = { "sale_id": fields.Many2One("sale.order","Sales Order",required=True,on_delete="cascade"), "sequence": fields.Char("Apply To Item No."), "product_id": fields.Many2One("product","Cost Product"), "description": fields.Text("Description",required=True,search=True), "unit_price": fields.Decimal("Unit Price"), # XXX deprecated "list_price": fields.Decimal("Supplier List Price"), "purchase_price": fields.Decimal("Purchase Price"), "purchase_duty_percent": fields.Decimal("Import Duty (%)"), "purchase_ship_percent": fields.Decimal("Shipping Charge (%)"), "landed_cost": fields.Decimal("Landed Cost"), "qty": fields.Decimal("Qty"), "uom_id": fields.Many2One("uom","UoM"), # XXX deprecated "amount": fields.Decimal("Cost Amount",function="get_amount"), "currency_id": fields.Many2One("currency","Currency"), "currency_rate": fields.Decimal("Currency Rate"), # XXX: deprecated "supplier_id": fields.Many2One("contact","Supplier"), } def get_amount(self,ids,context={}): vals={} for obj in self.browse(ids): vals[obj.id]=(obj.qty or 0)*(obj.landed_cost or 0) return vals
class InlineHelp(Model): _name = "inline.help" _string = "Help Item" _fields = { "action": fields.Char("Action Name", required=True, search=True), "title": fields.Char("Help Title", required=True, search=True), "content": fields.Text("Help Content", required=True, search=True), "hide": fields.Boolean("Hide"), "create_date": fields.DateTime("Date Created"), "modif_date": fields.DateTime("Date Modified"), } _order = "title" _defaults = { "create_date": lambda *a: time.strftime("%Y-%m-%d %H:%M:%S"), "modif_date": lambda *a: time.strftime("%Y-%m-%d %H:%M:%S"), } def create(self, vals, **kw): res = super().create(vals, **kw) static.clear_translations() # XXX: rename this return res def write(self, ids, vals, **kw): super().write(ids, vals, **kw) static.clear_translations() # XXX: rename this def delete(self, ids, **kw): super().delete(ids, **kw) static.clear_translations() # XXX: rename this
class EmailReject(Model): _name = "email.reject" _string = "Reject Email" _fields = { "email": fields.Char("Email", required=True, search=True), "reason": fields.Selection([["bounced", "Bounced"], ["rejected", "Rejected"], ["unsubscribed", "Unsubscribed"], ["complained", "Complained"], ["other", "Other"]], "Reason", search=True), "details": fields.Text("Details"), "date": fields.Date("Date Created", required=True, search=True), } _order = "date desc" _defaults = { "date": time.strftime("%Y-%m-%d %H:%M:%S"), } def add_to_black_list(self, email, reason): res = self.search([["email", "=", email]]) if res: return vals = { "email": email, "reason": reason, } self.create(vals)
class JobLine(Model): _name = "job.line" _fields = { "job_id": fields.Many2One("job", "Job", required=True, on_delete="cascade"), "sequence": fields.Integer("Sequence"), "type": fields.Selection( [["labor", "Labor"], ["part", "Parts"], ["other", "Other"]], "Type"), "description": fields.Text("Description"), "product_id": fields.Many2One("product", "Product"), "qty": fields.Decimal("Qty"), "uom_id": fields.Many2One("uom", "UoM"), "unit_price": fields.Decimal("Sale Unit Price"), "amount": fields.Decimal("Sale Amount", function="get_amount"), "payment_type": fields.Selection([["contract", "Included In Contract"], ["job", "Not Included In Contract"]], "Payment Type"), } _order = "sequence,id" def get_amount(self, ids, context={}): vals = {} for obj in self.browse(ids): vals[obj.id] = (obj.qty or 0) * (obj.unit_price or 0) return vals
class FixedAssetType(Model): _name = "account.fixed.asset.type" _string = "Asset Type" _fields = { "name": fields.Char("Name", required=True, search=True), "dep_rate": fields.Decimal("Depreciation Rate (%)", search=True, required=True), "dep_method": fields.Selection( [["line", "Straight Line"], ["decline", "Declining Balance"]], "Depreciation Method", search=True, required=True), "fixed_asset_account_id": fields.Many2One("account.account", "Fixed Asset Account", required=True), "accum_dep_account_id": fields.Many2One("account.account", "Accum. Depr. Account", required=True), "dep_exp_account_id": fields.Many2One("account.account", "Depr. Exp. Account", required=True), "description": fields.Text("Description"), }
class Report(Model): _name = "report.custom" _name_field = "Custom Report" _fields = { "name": fields.Char("Report Name", required=True), "code": fields.Char("Report Code"), "config": fields.Text("Configuration Data"), }
class ShipTerm(Model): _name = "ship.term" _string = "Shipping Terms" _fields = { "name": fields.Char("Name", required=True), "description": fields.Text("Description"), } _order = "name"
class WebsiteSetting(Model): _name = "website.setting" _string = "Website Setting" _fields = { "website_id": fields.Many2One("website", "Website", required=True), "name": fields.Char("Setting Name", required=True), "value": fields.Text("Setting Value"), }
class Team(Model): _name = "mfg.team" _string = "Team" _fields = { "name": fields.Char("Team Name", search=True, required=True), "description": fields.Text("Description"), } _order = "name"
class Room(Model): _name = "room" _string = "Room" _fields = { "name": fields.Char("Name", search=True), "description": fields.Text("Description"), "comments": fields.One2Many("message", "related_id", "Comments") }
class CompanyType(Model): _name = "company.type" _string = "Company Type" _key = ["name"] _fields = { "name": fields.Char("Name", required=True, search=True), "description": fields.Text("Description"), } _order = "name"
class TranslationField(Model): _name = "translation.field" _fields = { "model": fields.Char("Model", required=True), "field": fields.Char("Field", required=True), "rec_id": fields.Integer("Record ID", required=True), "lang": fields.Selection([["zh_CN", "Chinese"], ["en_US", "English"], ["my_MM", "Myanmar"], ["th_TH", "Thai"]], "Language", required=True), "translation": fields.Text("Translation"), }
class SmsTemplate(Model): _name = "sms.template" _string = "SMS Template" _name_field = "sender" _fields = { "name": fields.Char("Template Name", required=True, search=True), "phone": fields.Char("Phone Number", required=True, size=256, search=True), "body": fields.Text("Body", search=True), "account_id": fields.Many2One("sms.account", "SMS Account"), } _order = "name" def create_sms(self, ids, data={}, name_id=None, related_id=None, context={}): print("SMSTemplate.create_sms", ids) obj = self.browse(ids)[0] try: phone = render_template(obj.phone or "", data) except: raise Exception("Failed to render 'Phone' in template: %s" % obj.name) try: body = render_template(obj.body or "", data) except: raise Exception("Failed to render 'Body' in template: %s" % obj.name) if obj.related and not related_id: try: related_id = render_template(obj.related or "", data) except: raise Exception( "Failed to render 'Related To' in template: %s" % obj.name) if obj.contact and not name_id: try: name_id = render_template(obj.contact or "", data) except: raise Exception("Failed to render 'Contact' in template: %s" % obj.name) else: name_id = None vals = { "date": time.strftime("%Y-%m-%d %H:%M:%S"), "phone": phone, "body": body, "state": "to_send", "account_id": obj.account_id.id, } print("vals", vals) sms_id = get_model("sms.message").create(vals) return sms_id
class ContactRelationType(Model): _name = "contact.relation.type" _string = "Relation Type" _fields = { "name": fields.Char("Name", required=True, search=True), "description": fields.Text("Description"), "comments": fields.One2Many("message", "related_id", "Comments"), } _order = "name"
class Bank(Model): _name = "bank" _string = "Bank" _key = ["name"] _fields = { "name": fields.Char("Name", required=True, search=True), "description": fields.Text("Description"), } _order = "name"
class Application(Model): _name = "service.application" _string = "Application" _fields = { "name": fields.Char("Name", required=True, search=True), "code": fields.Char("Code", required=True, search=True), "industry_id": fields.Many2One("industry", "Industry", search=True), "description": fields.Text("Description", search=True), } _order = "name"
class StoreType(Model): _name = "store.type" _string = "Storage Type" _fields = { "name": fields.Char("Name", required=True), "code": fields.Char("Code"), "description": fields.Text("Description"), "comments": fields.One2Many("message", "related_id", "Comments"), } _order = "name"
class Leave_type(Model): _name = "hr.leave.type" _string = "Leave Type" _key = ["name"] _fields = { "name": fields.Char("Name", search=True), "description": fields.Text("Description"), "comments": fields.One2Many("message", "related_id", "Comments"), "employees": fields.Many2Many("hr.employee", "Employees"), }