# -*- coding: utf-8 -*- import logging from odoo import api, fields, models, _ _logger = logging.getLogger(__name__) class ResConfigSettings(models.TransientModel): _inherit = 'res.config.settings' app_system_name = fields.Char('System Name', help=u"Setup System Name,which replace Odoo") app_show_lang = fields.Boolean('Show Quick Language Switcher', help=u"When enable,User can quick switch language in user menu") app_show_debug = fields.Boolean('Show Quick Debug', help=u"When enable,everyone login can see the debug menu") app_show_documentation = fields.Boolean('Show Documentation', help=u"When enable,User can visit user manual") app_show_documentation_dev = fields.Boolean('Show Developer Documentation', help=u"When enable,User can visit development documentation") app_show_support = fields.Boolean('Show Support', help=u"When enable,User can vist your support site") app_show_account = fields.Boolean('Show My Account', help=u"When enable,User can login to your website") app_show_enterprise = fields.Boolean('Show Enterprise Tag', help=u"Uncheck to hide the Enterprise tag") app_show_share = fields.Boolean('Show Share Dashboard', help=u"Uncheck to hide the Odoo Share Dashboard") app_show_poweredby = fields.Boolean('Show Powered by Odoo', help=u"Uncheck to hide the Powered by text") app_stop_subscribe = fields.Boolean('Stop Odoo Subscribe(Performance Improve)', help=u"Check to stop Odoo Subscribe function") group_show_author_in_apps = fields.Boolean(string="Show Author in Apps Dashboard", implied_group='app_odoo_customize.group_show_author_in_apps', help=u"Uncheck to Hide Author and Website in Apps Dashboard") app_documentation_url = fields.Char('Documentation Url') app_documentation_dev_url = fields.Char('Developer Documentation Url') app_support_url = fields.Char('Support Url') app_account_title = fields.Char('My Odoo.com Account Title') app_account_url = fields.Char('My Odoo.com Account Url') app_enterprise_url = fields.Char('Customize Module Url(eg. Enterprise)') @api.model def get_values(self): res = super(ResConfigSettings, self).get_values() ir_config = self.env['ir.config_parameter'].sudo() app_system_name = ir_config.get_param('app_system_name', default='odooApp') app_show_lang = True if ir_config.get_param('app_show_lang') == "True" else False app_show_debug = True if ir_config.get_param('app_show_debug') == "True" else False app_show_documentation = True if ir_config.get_param('app_show_documentation') == "True" else False app_show_documentation_dev = True if ir_config.get_param('app_show_documentation_dev') == "True" else False app_show_support = True if ir_config.get_param('app_show_support') == "True" else False app_show_account = True if ir_config.get_param('app_show_account') == "True" else False app_show_enterprise = True if ir_config.get_param('app_show_enterprise') == "True" else False app_show_share = True if ir_config.get_param('app_show_share') == "True" else False app_show_poweredby = True if ir_config.get_param('app_show_poweredby') == "True" else False app_stop_subscribe = True if ir_config.get_param('app_stop_subscribe') == "True" else False app_documentation_url = ir_config.get_param('app_documentation_url', default='https://www.sunpop.cn/documentation/user/12.0/en/index.html') app_documentation_dev_url = ir_config.get_param('app_documentation_dev_url', default='https://www.sunpop.cn/documentation/12.0/index.html') app_support_url = ir_config.get_param('app_support_url', default='https://www.sunpop.cn/trial/') app_account_title = ir_config.get_param('app_account_title', default='My Online Account') app_account_url = ir_config.get_param('app_account_url', default='https://www.sunpop.cn/my-account/') app_enterprise_url = ir_config.get_param('app_enterprise_url', default='https://www.sunpop.cn') res.update( app_system_name=app_system_name, app_show_lang=app_show_lang, app_show_debug=app_show_debug, app_show_documentation=app_show_documentation, app_show_documentation_dev=app_show_documentation_dev, app_show_support=app_show_support, app_show_account=app_show_account, app_show_enterprise=app_show_enterprise, app_show_share=app_show_share, app_show_poweredby=app_show_poweredby, app_stop_subscribe=app_stop_subscribe, app_documentation_url=app_documentation_url, app_documentation_dev_url=app_documentation_dev_url, app_support_url=app_support_url, app_account_title=app_account_title, app_account_url=app_account_url, app_enterprise_url=app_enterprise_url ) return res @api.multi def set_values(self): super(ResConfigSettings, self).set_values() ir_config = self.env['ir.config_parameter'].sudo() ir_config.set_param("app_system_name", self.app_system_name or "") ir_config.set_param("app_show_lang", self.app_show_lang or "False") ir_config.set_param("app_show_debug", self.app_show_debug or "False") ir_config.set_param("app_show_documentation", self.app_show_documentation or "False") ir_config.set_param("app_show_documentation_dev", self.app_show_documentation_dev or "False") ir_config.set_param("app_show_support", self.app_show_support or "False") ir_config.set_param("app_show_account", self.app_show_account or "False") ir_config.set_param("app_show_enterprise", self.app_show_enterprise or "False") ir_config.set_param("app_show_share", self.app_show_share or "False") ir_config.set_param("app_show_poweredby", self.app_show_poweredby or "False") ir_config.set_param("app_stop_subscribe", self.app_stop_subscribe or "False") ir_config.set_param("app_documentation_url", self.app_documentation_url or "https://www.sunpop.cn/documentation/user/12.0/en/index.html") ir_config.set_param("app_documentation_dev_url", self.app_documentation_dev_url or "https://www.sunpop.cn/documentation/12.0/index.html") ir_config.set_param("app_support_url", self.app_support_url or "https://www.sunpop.cn/trial/") ir_config.set_param("app_account_title", self.app_account_title or "My Online Account") ir_config.set_param("app_account_url", self.app_account_url or "https://www.sunpop.cn/my-account/") ir_config.set_param("app_enterprise_url", self.app_enterprise_url or "https://www.sunpop.cn") def set_module_url(self): sql = "UPDATE ir_module_module SET website = '%s' WHERE license like '%s' and website <> ''" % (self.app_enterprise_url, 'OEEL%') try: self._cr.execute(sql) except Exception as e: pass def remove_sales(self): to_removes = [ # 清除销售单据 ['sale.order.line', ], ['sale.order', ], # 销售提成,自用 ['sale.commission.line', ], # 不能删除报价单模板 # ['sale.order.template.option', ], # ['sale.order.template.line', ], # ['sale.order.template', ], ] try: for line in to_removes: obj_name = line[0] obj = self.pool.get(obj_name) if obj: sql = "delete from %s" % obj._table self._cr.execute(sql) # 更新序号 seqs = self.env['ir.sequence'].search([ '|', ('code', '=', 'sale.order'), ('code', '=', 'sale.commission.line')]) for seq in seqs: seq.write({ 'number_next': 1, }) except Exception as e: raise Warning(e) return True def remove_product(self): to_removes = [ # 清除产品数据 ['product.product', ], ['product.template', ], ] try: for line in to_removes: obj_name = line[0] obj = self.pool.get(obj_name) if obj: sql = "delete from %s" % obj._table self._cr.execute(sql) # 更新序号,针对自动产品编号 seqs = self.env['ir.sequence'].search([('code', '=', 'product.product')]) for seq in seqs: seq.write({ 'number_next': 1, }) except Exception as e: pass # raise Warning(e) return True def remove_product_attribute(self): to_removes = [ # 清除产品属性 ['product.attribute.value', ], ['product.attribute', ], ] try: for line in to_removes: obj_name = line[0] obj = self.pool.get(obj_name) if obj: sql = "delete from %s" % obj._table self._cr.execute(sql) except Exception as e: pass # raise Warning(e) return True @api.multi def remove_pos(self): to_removes = [ # 清除POS单据 ['pos.order.line', ], ['pos.order', ], ] try: for line in to_removes: obj_name = line[0] obj = self.pool.get(obj_name) if obj: sql = "delete from %s" % obj._table self._cr.execute(sql) # 更新序号 seqs = self.env['ir.sequence'].search([('code', '=', 'pos.order')]) for seq in seqs: seq.write({ 'number_next': 1, }) # 更新要关帐的值,因为 store=true 的计算字段要重置 statement = self.env['account.bank.statement'].search([]) for s in statement: s._end_balance() except Exception as e: pass # raise Warning(e) return True @api.multi def remove_purchase(self): to_removes = [ # 清除采购单据 ['purchase.order.line', ], ['purchase.order', ], ['purchase.requisition.line', ], ['purchase.requisition', ], ] try: for line in to_removes: obj_name = line[0] obj = self.pool.get(obj_name) if obj: sql = "delete from %s" % obj._table self._cr.execute(sql) # 更新序号 seqs = self.env['ir.sequence'].search([ '|', ('code', '=', 'purchase.order'), '|', ('code', '=', 'purchase.requisition.purchase.tender'), ('code', '=', 'purchase.requisition.blanket.order')]) for seq in seqs: seq.write({ 'number_next': 1, }) self._cr.execute(sql) except Exception as e: pass # raise Warning(e) return True @api.multi def remove_expense(self): to_removes = [ # 清除采购单据 ['hr.expense.sheet', ], ['hr.expense', ], ] try: for line in to_removes: obj_name = line[0] obj = self.pool.get(obj_name) if obj: sql = "delete from %s" % obj._table self._cr.execute(sql) # 更新序号 seqs = self.env['ir.sequence'].search([ ('code', '=', 'hr.expense.invoice')]) for seq in seqs: seq.write({ 'number_next': 1, }) self._cr.execute(sql) except Exception as e: pass # raise Warning(e) return True @api.multi def remove_expense(self): to_removes = [ # 清除 ['hr.expense.sheet', ], ['hr.expense', ], ['hr.payslip', ], ['hr.payslip.run', ], ] try: for line in to_removes: obj_name = line[0] obj = self.pool.get(obj_name) if obj: sql = "delete from %s" % obj._table self._cr.execute(sql) # 更新序号 seqs = self.env['ir.sequence'].search([ ('code', '=', 'hr.expense.invoice')]) for seq in seqs: seq.write({ 'number_next': 1, }) self._cr.execute(sql) except Exception as e: pass # raise Warning(e) return True @api.multi def remove_mrp(self): to_removes = [ # 清除生产单据 ['mrp.workcenter.productivity', ], ['mrp.workorder', ], ['mrp.production.workcenter.line', ], ['change.production.qty', ], ['mrp.production', ], ['mrp.production.product.line', ], ['mrp.unbuild', ], ['change.production.qty', ], ['sale.forecast.indirect', ], ['sale.forecast', ], ] try: for line in to_removes: obj_name = line[0] obj = self.pool.get(obj_name) if obj: sql = "delete from %s" % obj._table self._cr.execute(sql) # 更新序号 seqs = self.env['ir.sequence'].search([ '|', ('code', '=', 'mrp.production'), ('code', '=', 'mrp.unbuild'), ]) for seq in seqs: seq.write({ 'number_next': 1, }) except Exception as e: pass # raise Warning(e) return True @api.multi def remove_mrp_bom(self): to_removes = [ # 清除生产BOM ['mrp.bom.line', ], ['mrp.bom', ], ] try: for line in to_removes: obj_name = line[0] obj = self.pool.get(obj_name) if obj: sql = "delete from %s" % obj._table self._cr.execute(sql) except Exception as e: pass # raise Warning(e) return True @api.multi def remove_inventory(self): to_removes = [ # 清除库存单据 ['stock.quant', ], ['stock.move.line', ], ['stock.package.level', ], ['stock.quantity.history', ], ['stock.quant.package', ], ['stock.move', ], # ['stock.pack.operation', ], ['stock.picking', ], ['stock.scrap', ], ['stock.picking.batch', ], ['stock.inventory.line', ], ['stock.inventory', ], ['stock.production.lot', ], ['stock.fixed.putaway.strat', ], ['procurement.group', ], ] try: for line in to_removes: obj_name = line[0] obj = self.pool.get(obj_name) if obj: sql = "delete from %s" % obj._table self._cr.execute(sql) # 更新序号 seqs = self.env['ir.sequence'].search([ '|', ('code', '=', 'stock.lot.serial'), '|', ('code', '=', 'stock.lot.tracking'), '|', ('code', '=', 'stock.orderpoint'), '|', ('code', '=', 'stock.picking'), '|', ('code', '=', 'picking.batch'), '|', ('code', '=', 'stock.quant.package'), '|', ('code', '=', 'stock.scrap'), '|', ('code', '=', 'stock.picking'), '|', ('prefix', '=', 'WH/IN/'), '|', ('prefix', '=', 'WH/INT/'), '|', ('prefix', '=', 'WH/OUT/'), '|', ('prefix', '=', 'WH/PACK/'), ('prefix', '=', 'WH/PICK/') ]) for seq in seqs: seq.write({ 'number_next': 1, }) except Exception as e: pass # raise Warning(e) return True @api.multi def remove_account(self): to_removes = [ # 清除财务会计单据 ['account.voucher.line', ], ['account.voucher', ], ['account.bank.statement.line', ], ['account.payment', ], ['account.analytic.line', ], ['account.analytic.account', ], ['account.invoice.line', ], ['account.invoice.refund', ], ['account.invoice', ], ['account.partial.reconcile', ], ['account.move.line', ], ['hr.expense.sheet', ], ['account.move', ], ] try: for line in to_removes: obj_name = line[0] obj = self.pool.get(obj_name) if obj: sql = "delete from %s" % obj._table self._cr.execute(sql) # 更新序号 seqs = self.env['ir.sequence'].search([ '|', ('code', '=', 'account.reconcile'), '|', ('code', '=', 'account.payment.customer.invoice'), '|', ('code', '=', 'account.payment.customer.refund'), '|', ('code', '=', 'account.payment.supplier.invoice'), '|', ('code', '=', 'account.payment.supplier.refund'), '|', ('code', '=', 'account.payment.transfer'), '|', ('prefix', 'like', 'BNK1/'), '|', ('prefix', 'like', 'CSH1/'), '|', ('prefix', 'like', 'INV/'), '|', ('prefix', 'like', 'EXCH/'), '|', ('prefix', 'like', 'MISC/'), '|', ('prefix', 'like', '账单/'), ('prefix', 'like', '杂项/') ]) for seq in seqs: seq.write({ 'number_next': 1, }) except Exception as e: pass # raise Warning(e) return True @api.multi def remove_account_chart(self): to_removes = [ # 清除财务科目,用于重设 ['res.partner.bank', ], ['res.bank', ], ['account.move.line'], ['account.invoice'], ['account.payment'], ['account.bank.statement', ], ['account.tax.account.tag', ], ['account.tax', ], ['account.tax', ], ['account.account.account.tag', ], ['wizard_multi_charts_accounts'], ['account.account', ], ['account.journal', ], ] # todo: 要做 remove_hr,因为工资表会用到 account # 更新account关联,很多是多公司字段,故只存在 ir_property,故在原模型,只能用update try: # reset default tax,不管多公司 field1 = self.env['ir.model.fields']._get('product.template', "taxes_id").id field2 = self.env['ir.model.fields']._get('product.template', "supplier_taxes_id").id sql = ("delete from ir_default where field_id = %s or field_id = %s") % (field1, field2) self._cr.execute(sql) except Exception as e: pass # raise Warning(e) try: rec = self.env['res.partner'].search([]) for r in rec: r.write({ 'property_account_receivable_id': None, 'property_account_payable_id': None, }) except Exception as e: pass # raise Warning(e) try: rec = self.env['product.category'].search([]) for r in rec: r.write({ 'property_account_income_categ_id': None, 'property_account_expense_categ_id': None, 'property_account_creditor_price_difference_categ': None, 'property_stock_account_input_categ_id': None, 'property_stock_account_output_categ_id': None, 'property_stock_valuation_account_id': None, }) except Exception as e: pass # raise Warning(e) try: rec = self.env['stock.location'].search([]) for r in rec: r.write({ 'valuation_in_account_id': None, 'valuation_out_account_id': None, }) except Exception as e: pass # raise Warning(e) try: for line in to_removes: obj_name = line[0] obj = self.pool.get(obj_name) if obj: sql = "delete from %s" % obj._table self._cr.execute(sql) sql = "update res_company set chart_template_id=null;" self._cr.execute(sql) # 更新序号 except Exception as e: pass return True @api.multi def remove_project(self): to_removes = [ # 清除项目 ['account.analytic.line', ], ['project.task', ], ['project.forecast', ], ['project.project', ], ] try: for line in to_removes: obj_name = line[0] obj = self.pool.get(obj_name) if obj: sql = "delete from %s" % obj._table self._cr.execute(sql) # 更新序号 except Exception as e: pass # raise Warning(e) return True @api.multi def remove_website(self): to_removes = [ # 清除网站数据,w, w_blog ['blog.tag.category', ], ['blog.tag', ], ['blog.post', ], ['blog.blog', ], ['website.published.multi.mixin', ], ['website.published.mixin', ], ['website.multi.mixin', ], ['website.redirect', ], ['website.seo.metadata', ], ['website.page', ], ['website.menu', ], ['website', ], ] try: for line in to_removes: obj_name = line[0] obj = self.pool.get(obj_name) if obj and obj._table: sql = "delete from %s" % obj._table self._cr.execute(sql) except Exception as e: pass # raise Warning(e) return True @api.multi def remove_message(self): to_removes = [ # 清除消息数据 ['mail.message', ], ['mail.followers', ], ] try: for line in to_removes: obj_name = line[0] obj = self.pool.get(obj_name) if obj and obj._table: sql = "delete from %s" % obj._table self._cr.execute(sql) except Exception as e: pass # raise Warning(e) return True @api.multi def remove_workflow(self): to_removes = [ # 清除工作流 ['wkf.workitem', ], ['wkf.instance', ], ] try: for line in to_removes: obj_name = line[0] obj = self.pool.get(obj_name) if obj and obj._table: sql = "delete from %s" % obj._table self._cr.execute(sql) except Exception as e: pass # raise Warning(e) return True @api.multi def remove_all_biz(self): try: self.remove_account() self.remove_inventory() self.remove_mrp() self.remove_purchase() self.remove_sales() self.remove_project() self.remove_pos() self.remove_expense() self.remove_message() except Exception as e: pass # raise Warning(e) return True