diff --git a/app_odoo_customize/__manifest__.py b/app_odoo_customize/__manifest__.py index 582e5a99..ecd26af4 100644 --- a/app_odoo_customize/__manifest__.py +++ b/app_odoo_customize/__manifest__.py @@ -23,7 +23,7 @@ { 'name': 'Customize odoo OEM (Boost, My Odoo)', - 'version': '13.20.07.25', + 'version': '13.20.08.21', 'author': 'Sunpop.cn', 'category': 'Productivity', 'website': 'https://www.sunpop.cn', @@ -74,6 +74,7 @@ 31. Show or hide odoo Referral in the top menu. 32. Fix odoo bug of complete name bug of product category and stock location.. 33. Add Demo Ribbon Setting. + 34. Add Remove all quality data. This module can help to white label the Odoo. Also helpful for training and support for your odoo end-user. @@ -114,6 +115,7 @@ 31. 显示或去除 odoo 推荐 32. 增加修复品类及区位名的操作 33. 增加 Demo 的显示设置 + 34. 增加清除质检数据 """, 'images': ['static/description/banner.gif'], 'depends': [ diff --git a/app_odoo_customize/i18n/zh_CN.po b/app_odoo_customize/i18n/zh_CN.po index 43ddc7d9..dbde0fbb 100644 --- a/app_odoo_customize/i18n/zh_CN.po +++ b/app_odoo_customize/i18n/zh_CN.po @@ -4,10 +4,10 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 13.0+e-20200628\n" +"Project-Id-Version: Odoo Server 13.0+e\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-07-13 08:56+0000\n" -"PO-Revision-Date: 2020-07-13 08:56+0000\n" +"POT-Creation-Date: 2020-08-21 06:23+0000\n" +"PO-Revision-Date: 2020-08-21 06:23+0000\n" "Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -17,6 +17,7 @@ msgstr "" #. module: app_odoo_customize #. openerp-web +#: code:addons/app_common13/app_odoo_customize/static/src/xml/res_config_edition.xml:0 #: code:addons/app_odoo_customize/static/src/xml/res_config_edition.xml:0 #, python-format msgid "(Sunpop.cn Professional Edition)" @@ -67,6 +68,11 @@ msgstr "项目" msgid "Purchase" msgstr "采购" +#. module: app_odoo_customize +#: model_terms:ir.ui.view,arch_db:app_odoo_customize.view_app_theme_config_settings +msgid "Quality" +msgstr "质量" + #. module: app_odoo_customize #: model_terms:ir.ui.view,arch_db:app_odoo_customize.view_app_theme_config_settings msgid "Sale" @@ -77,8 +83,14 @@ msgstr "销售" msgid "Website And Blog" msgstr "网站与博客" +#. module: app_odoo_customize +#: model_terms:ir.ui.view,arch_db:app_odoo_customize.view_app_theme_config_settings +msgid "Set to False to hide" +msgstr "设置为 False 则不显示" + #. module: app_odoo_customize #. openerp-web +#: code:addons/app_common13/app_odoo_customize/static/src/xml/customize_user_menu.xml:0 #: code:addons/app_odoo_customize/static/src/xml/customize_user_menu.xml:0 #, python-format msgid "Activate the developer mode" @@ -86,6 +98,7 @@ msgstr "激活开发者模式" #. module: app_odoo_customize #. openerp-web +#: code:addons/app_common13/app_odoo_customize/static/src/xml/customize_user_menu.xml:0 #: code:addons/app_odoo_customize/static/src/xml/customize_user_menu.xml:0 #, python-format msgid "Activate the developer mode (with assets)" @@ -134,6 +147,7 @@ msgstr "数据清理(请谨慎操作!)" #. module: app_odoo_customize #. openerp-web +#: code:addons/app_common13/app_odoo_customize/static/src/xml/customize_user_menu.xml:0 #: code:addons/app_odoo_customize/static/src/xml/customize_user_menu.xml:0 #, python-format msgid "Deactivate the developer mode" @@ -196,6 +210,11 @@ msgstr "删除所有项目/任务/预测" msgid "Delete All Purchase Order and Requisition" msgstr "删除所有询价单、采购单,采购招标" +#. module: app_odoo_customize +#: model_terms:ir.ui.view,arch_db:app_odoo_customize.view_app_theme_config_settings +msgid "Delete All Quality" +msgstr "" + #. module: app_odoo_customize #: model_terms:ir.ui.view,arch_db:app_odoo_customize.view_app_theme_config_settings msgid "Delete All Sales Order" @@ -223,6 +242,7 @@ msgstr "开发者手册链接" #. module: app_odoo_customize #. openerp-web +#: code:addons/app_common13/app_odoo_customize/static/src/xml/customize_user_menu.xml:0 #: code:addons/app_odoo_customize/static/src/xml/customize_user_menu.xml:0 #, python-format msgid "Developer Manual" @@ -293,7 +313,7 @@ msgstr "您确认要删除指定数据?" #. module: app_odoo_customize #: model_terms:ir.ui.view,arch_db:app_odoo_customize.replace_login msgid "Powered by odooApp" -msgstr "Powered by Sunpop.cn" +msgstr "技术支持 Sunpop.cn" #. module: app_odoo_customize #: model_terms:ir.ui.view,arch_db:app_odoo_customize.view_app_theme_config_settings @@ -440,7 +460,7 @@ msgstr "菜单项具体操作设置" #. module: app_odoo_customize #: model:ir.model,name:app_odoo_customize.model_ir_ui_view msgid "View" -msgstr "查看" +msgstr "视图" #. module: app_odoo_customize #: model_terms:ir.ui.view,arch_db:app_odoo_customize.view_app_theme_config_settings @@ -489,11 +509,12 @@ msgstr "个性化odoo设置" #. module: app_odoo_customize #. openerp-web +#: code:addons/app_common13/app_odoo_customize/static/src/xml/res_config_edition.xml:0 #: code:addons/app_odoo_customize/static/src/xml/res_config_edition.xml:0 #: model:ir.ui.menu,name:app_odoo_customize.menu_app_group #, python-format msgid "odooApp" -msgstr "odooApp" +msgstr "" #. module: app_odoo_customize #: model_terms:ir.ui.view,arch_db:app_odoo_customize.view_app_theme_config_settings diff --git a/app_odoo_customize/models/res_config_settings.py b/app_odoo_customize/models/res_config_settings.py index 80a2afda..c8d4ad80 100644 --- a/app_odoo_customize/models/res_config_settings.py +++ b/app_odoo_customize/models/res_config_settings.py @@ -113,323 +113,219 @@ class ResConfigSettings(models.TransientModel): 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', ], - ] + # 清数据,o=对象, s=序列 + def remove_app_data(self, o, s=[]): try: - for line in to_removes: - obj_name = line[0] + for line in o: + obj_name = line obj = self.pool.get(obj_name) if obj: sql = "delete from %s" % obj._table self._cr.execute(sql) self._cr.commit() - # 更新序号 - seqs = self.env['ir.sequence'].search([('code', 'like', 'sale%')]) - for seq in seqs: - seq.write({ + self._cr.execute(sql) + self._cr.commit() + # 更新序号 + for line in s: + domain = [('code', '=ilike', '%s' % line)] + seqs = self.env['ir.sequence'].search(domain) + seqs.write({ 'number_next': 1, }) except Exception as e: - _logger.error('remove data error: %s,%s', 'sale', e) + _logger.error('remove data error: %s,%s', o, e) return True + + 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', + ] + seqs = [ + 'sale%', + ] + return self.remove_app_data(to_removes, seqs) def remove_product(self): to_removes = [ # 清除产品数据 - ['product.product', ], - ['product.template', ], + '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) - self._cr.commit() - # 更新序号,针对自动产品编号 - seqs = self.env['ir.sequence'].search([('code', '=', 'product.product')]) - for seq in seqs: - seq.write({ - 'number_next': 1, - }) - except Exception as e: - _logger.error('remove data error: %s,%s', 'product', e) - return True + seqs = [ + 'product.product', + ] + return self.remove_app_data(to_removes, seqs) def remove_product_attribute(self): to_removes = [ # 清除产品属性 - ['product.attribute.value', ], - ['product.attribute', ], + '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) - self._cr.commit() - except Exception as e: - _logger.error('remove data error: %s,%s', 'product_attr', e) - return True + seqs = [] + return self.remove_app_data(to_removes, seqs) def remove_pos(self): to_removes = [ # 清除POS单据 - ['pos.payment', ], - ['pos.order.line', ], - ['pos.order', ], - ['pos.session', ], + 'pos.payment', + 'pos.order.line', + 'pos.order', + 'pos.session', ] - 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) - self._cr.commit() - # 更新序号 - seqs = self.env['ir.sequence'].search([('code', 'like', 'pos.%')]) - 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() + seqs = [ + 'pos.%', + ] + res = self.remove_app_data(to_removes, seqs) + + # 更新要关帐的值,因为 store=true 的计算字段要重置 + statement = self.env['account.bank.statement'].search([]) + for s in statement: + s._end_balance() + return res - except Exception as e: - _logger.error('remove data error: %s,%s', 'pos', e) - return True def remove_purchase(self): to_removes = [ # 清除采购单据 - ['purchase.order.line', ], - ['purchase.order', ], - ['purchase.requisition.line', ], - ['purchase.requisition', ], + '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) - self._cr.commit() - # 更新序号 - seqs = self.env['ir.sequence'].search([('code', 'like', 'purchase.%')]) - for seq in seqs: - seq.write({ - 'number_next': 1, - }) - self._cr.execute(sql) - self._cr.commit() - except Exception as e: - _logger.error('remove data error: %s,%s', 'purchase', e) - return True + seqs = [ + 'purchase.%', + ] + return self.remove_app_data(to_removes, seqs) def remove_expense(self): to_removes = [ # 清除 - ['hr.expense.sheet', ], - ['hr.expense', ], - ['hr.payslip', ], - ['hr.payslip.run', ], + '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) - self._cr.commit() - # 更新序号 - seqs = self.env['ir.sequence'].search([ - ('code', 'like', 'hr.expense.%')]) - for seq in seqs: - seq.write({ - 'number_next': 1, - }) - self._cr.execute(sql) - self._cr.commit() - except Exception as e: - _logger.error('remove data error: %s,%s', 'expense', e) - return True + seqs = [ + 'hr.expense.%', + ] + return self.remove_app_data(to_removes, seqs) 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', ], + '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) - self._cr.commit() - # 更新序号 - seqs = self.env['ir.sequence'].search([('code', 'like', 'mrp.%')]) - for seq in seqs: - seq.write({ - 'number_next': 1, - }) - except Exception as e: - _logger.error('remove data error: %s,%s', 'mrp', e) - return True + seqs = [ + 'mrp.%', + ] + return self.remove_app_data(to_removes, seqs) def remove_mrp_bom(self): to_removes = [ # 清除生产BOM - ['mrp.bom.line', ], - ['mrp.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) - self._cr.commit() - except Exception as e: - _logger.error('remove data error: %s,%s', 'mrp_bom', e) - return True + seqs = [] + return self.remove_app_data(to_removes, seqs) 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.valuation.layer', ], - ['stock.production.lot', ], - # ['stock.fixed.putaway.strat', ], - ['procurement.group', ], + '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.valuation.layer', + '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) - self._cr.commit() - # 更新序号 - seqs = self.env['ir.sequence'].search([ - '|', ('code', 'like', 'stock.%'), - '|', ('code', 'like', '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: - _logger.error('remove data error: %s,%s', 'inventory', e) - return True + seqs = [ + 'stock.%', + 'picking.%', + 'WH/%', + ] + return self.remove_app_data(to_removes, seqs) def remove_account(self): to_removes = [ # 清除财务会计单据 - ['payment.transaction', ], - ['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', ], + 'payment.transaction', + '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) - self._cr.commit() + seqs = [] + res = self.remove_app_data(to_removes, seqs) - # 更新序号 - seqs = self.env['ir.sequence'].search([ - '|', ('code', 'like', 'account.%'), - '|', ('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: - _logger.error('remove data error: %s,%s', 'account', e) - return True + # extra 更新序号 + seqs = self.env['ir.sequence'].search([ + '|', ('code', '=ilike', 'account.%'), + '|', ('prefix', '=ilike', 'BNK1/%'), + '|', ('prefix', '=ilike', 'CSH1/%'), + '|', ('prefix', '=ilike', 'INV/%'), + '|', ('prefix', '=ilike', 'EXCH/%'), + '|', ('prefix', '=ilike', 'MISC/%'), + '|', ('prefix', '=ilike', '账单/%'), + ('prefix', '=ilike', '杂项/%') + ]) + seqs.write({ + 'number_next': 1, + }) + return res 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.account.account.tag', ], - ['wizard_multi_charts_accounts'], - ['account.journal', ], - ['account.account', ], + 'res.partner.bank', + 'res.bank', + 'account.move.line', + 'account.invoice', + 'account.payment', + 'account.bank.statement', + 'account.tax.account.tag', + 'account.tax', + 'account.account.account.tag', + 'wizard_multi_charts_accounts', + 'account.journal', + 'account.account', ] # todo: 要做 remove_hr,因为工资表会用到 account # 更新account关联,很多是多公司字段,故只存在 ir_property,故在原模型,只能用update @@ -477,113 +373,78 @@ class ResConfigSettings(models.TransientModel): 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) - self._cr.commit() - - - sql = "update res_company set chart_template_id=null;" - self._cr.execute(sql) - self._cr.commit() - # 更新序号 - except Exception as e: - pass - - return True + seqs = [] + return self.remove_app_data(to_removes, seqs) def remove_project(self): to_removes = [ # 清除项目 - ['account.analytic.line', ], - ['project.task', ], - ['project.forecast', ], - ['project.project', ], + '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) - self._cr.commit() - # 更新序号 - except Exception as e: - _logger.error('remove data error: %s,%s', 'project', e) - return True + seqs = [] + return self.remove_app_data(to_removes, seqs) + + def remove_quality(self): + to_removes = [ + # 清除质检数据 + 'quality.check', + 'quality.alert', + # 'quality.point', + # 'quality.alert.stage', + # 'quality.alert.team', + # 'quality.point.test_type', + # 'quality.reason', + # 'quality.tag', + ] + seqs = [ + 'quality.check', + 'quality.alert', + # 'quality.point', + ] + return self.remove_app_data(to_removes, seqs) def remove_website(self): to_removes = [ # 清除网站数据,w, w_blog - ['blog.tag.category', ], - ['blog.tag', ], - ['blog.post', ], - ['blog.blog', ], - ['product.wishlist', ], - ['website.published.multi.mixin', ], - ['website.published.mixin', ], - ['website.multi.mixin', ], - ['website.visitor', ], - ['website.redirect', ], - ['website.seo.metadata', ], - # ['website.page', ], - # ['website.menu', ], - # ['website', ], + 'blog.tag.category', + 'blog.tag', + 'blog.post', + 'blog.blog', + 'product.wishlist', + 'website.published.multi.mixin', + 'website.published.mixin', + 'website.multi.mixin', + 'website.visitor', + '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) - self._cr.commit() - except Exception as e: - _logger.error('remove data error: %s,%s', 'website', e) - return True + seqs = [] + return self.remove_app_data(to_removes, seqs) def remove_message(self): to_removes = [ # 清除消息数据 - ['mail.message', ], - ['mail.followers', ], - ['mail.activity', ], + 'mail.message', + 'mail.followers', + 'mail.activity', ] - 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) - self._cr.commit() - except Exception as e: - _logger.error('remove data error: %s,%s', 'message', e) - return True + seqs = [] + return self.remove_app_data(to_removes, seqs) def remove_workflow(self): to_removes = [ # 清除工作流 - ['wkf.workitem', ], - ['wkf.instance', ], + '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) - self._cr.commit() - - except Exception as e: - _logger.error('remove data error: %s,%s', 'workflow', e) - return True + seqs = [] + return self.remove_app_data(to_removes, seqs) def remove_all_biz(self): self.remove_account() @@ -594,6 +455,7 @@ class ResConfigSettings(models.TransientModel): self.remove_project() self.remove_pos() self.remove_expense() + self.remove_quality() self.remove_message() return True diff --git a/app_odoo_customize/views/app_theme_config_settings_views.xml b/app_odoo_customize/views/app_theme_config_settings_views.xml index 1f5ec499..edef7bb3 100644 --- a/app_odoo_customize/views/app_theme_config_settings_views.xml +++ b/app_odoo_customize/views/app_theme_config_settings_views.xml @@ -152,6 +152,11 @@