Tower: unpublish om_data_remove — remove source from 18.0 branch

This commit is contained in:
2026-05-02 11:15:12 +00:00
parent 99dd5ad688
commit 686c06f52c
11 changed files with 0 additions and 711 deletions

View File

@@ -1,46 +0,0 @@
===================
Odoo 18 Remove Data
===================
This Module will help to remove transactional data from database
Installation
============
To install this module, you need to:
Download the module and add it to your Odoo addons folder. Afterward, log on to
your Odoo server and go to the Apps menu. Trigger the debug mode and update the
list by clicking on the "Update Apps List" link. Now install the module by
clicking on the install button.
Upgrade
============
To upgrade this module, you need to:
Download the module and add it to your Odoo addons folder. Restart the server
and log on to your Odoo server. Select the Apps menu and upgrade the module by
clicking on the upgrade button.
Configuration
=============
There is Nothing to Configure
Credits
=======
Contributors
------------
* Odoo Mates <odoomates@gmail.com>
* Sunpop.cn
Author & Maintainer
-------------------
This module is maintained by the Odoo Mates

View File

@@ -1,2 +0,0 @@
from . import models

View File

@@ -1,16 +0,0 @@
{
'name': 'Odoo 18 Remove Data',
'version': '1.4',
'author': 'Odoo Mates, Sunpop.cn',
'category': 'Tools',
'description': 'Data Clean up, Remove Data, Database Clean UP, Reset Database',
'summary': 'Data Clean up, Remove Data, Database Clean UP, Reset Database',
'maintainer': 'Odoo Mates',
'support': 'odoomates@gmail.com',
'license': 'LGPL-3',
'depends': ['base'],
'data': [
'views/view.xml',
],
'images': ['static/description/banner.png'],
}

View File

@@ -1,2 +0,0 @@
from . import model

View File

@@ -1,455 +0,0 @@
import logging
from odoo import api, fields, models, _
_logger = logging.getLogger(__name__)
class ResConfigSettings(models.TransientModel):
_inherit = 'res.config.settings'
def _remove_data(self, o, s=[]):
if not self.env.user.has_group('base.group_system'):
return False
for line in o:
try:
if not self.env['ir.model']._get(line):
continue
except Exception as e:
_logger.warning('remove data error get ir.model: %s,%s', line, e)
continue
obj_name = line
obj = self.pool.get(obj_name)
if not obj:
t_name = obj_name.replace('.', '_')
else:
t_name = obj._table
sql = "delete from %s" % t_name
try:
self._cr.execute(sql)
self._cr.commit()
except Exception as e:
_logger.warning('remove data error: %s,%s', line, e)
for line in s:
domain = ['|', ('code', '=ilike', line + '%'), ('prefix', '=ilike', line + '%')]
try:
seqs = self.env['ir.sequence'].sudo().search(domain)
if seqs.exists():
seqs.write({
'number_next': 1,
})
except Exception as e:
_logger.warning('reset sequence data error: %s,%s', line, e)
return True
def _remove_sales(self):
if not self.env.user.has_group('base.group_system'):
return False
to_removes = [
'sale.order.line',
'sale.order',
]
seqs = [
'sale',
]
return self._remove_data(to_removes, seqs)
def _remove_product(self):
if not self.env.user.has_group('base.group_system'):
return False
to_removes = [
'product.product',
'product.template',
]
seqs = [
'product.product',
]
return self._remove_data(to_removes, seqs)
def _remove_product_attribute(self):
if not self.env.user.has_group('base.group_system'):
return False
to_removes = [
'product.attribute.value',
'product.attribute',
]
seqs = []
return self._remove_data(to_removes, seqs)
def _remove_pos(self):
if not self.env.user.has_group('base.group_system'):
return False
to_removes = [
'pos.payment',
'pos.order.line',
'pos.order',
'pos.session',
]
seqs = [
'pos.',
]
res = self._remove_data(to_removes, seqs)
try:
statement = self.env['account.bank.statement'].sudo().search([])
for s in statement:
s._end_balance()
except Exception as e:
_logger.error('reset sequence data error: %s', e)
return res
def _remove_purchase(self):
if not self.env.user.has_group('base.group_system'):
return False
to_removes = [
'purchase.order.line',
'purchase.order',
'purchase.requisition.line',
'purchase.requisition',
]
seqs = [
'purchase.',
]
return self._remove_data(to_removes, seqs)
def _remove_expense(self):
if not self.env.user.has_group('base.group_system'):
return False
to_removes = [
'hr.expense.sheet',
'hr.expense',
'hr.payslip',
'hr.payslip.run',
]
seqs = [
'hr.expense.',
]
return self._remove_data(to_removes, seqs)
def _remove_mrp(self):
if not self.env.user.has_group('base.group_system'):
return False
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',
]
seqs = [
'mrp.',
]
return self._remove_data(to_removes, seqs)
def _remove_mrp_bom(self):
if not self.env.user.has_group('base.group_system'):
return False
to_removes = [
'mrp.bom.line',
'mrp.bom',
]
seqs = []
return self._remove_data(to_removes, seqs)
def _remove_inventory(self):
if not self.env.user.has_group('base.group_system'):
return False
to_removes = [
'stock.quant',
'stock.move.line',
'stock.package_level',
'stock.quantity.history',
'stock.quant.package',
'stock.move',
'stock.picking',
'stock.scrap',
'stock.picking.batch',
'stock.inventory.line',
'stock.inventory',
'stock.valuation.layer',
'stock.production.lot',
'procurement.group',
]
seqs = [
'stock.',
'picking.',
'procurement.group',
'product.tracking.default',
'WH/',
]
return self._remove_data(to_removes, seqs)
def _remove_account(self):
if not self.env.user.has_group('base.group_system'):
return False
to_removes = [
'payment.transaction',
'account.bank.statement.line',
'account.payment',
'account.analytic.line',
'account.analytic.account',
'account.partial.reconcile',
'account.move.line',
'hr.expense.sheet',
'account.move',
]
res = self._remove_data(to_removes, [])
domain = [
('company_id', '=', self.env.company.id),
'|', ('code', '=ilike', 'account.%'),
'|', ('prefix', '=ilike', 'BNK1/%'),
'|', ('prefix', '=ilike', 'CSH1/%'),
'|', ('prefix', '=ilike', 'INV/%'),
'|', ('prefix', '=ilike', 'EXCH/%'),
'|', ('prefix', '=ilike', 'MISC/%'),
'|', ('prefix', '=ilike', '账单/%'),
('prefix', '=ilike', '杂项/%')
]
try:
seqs = self.env['ir.sequence'].search(domain)
if seqs.exists():
seqs.write({
'number_next': 1,
})
except Exception as e:
_logger.error('reset sequence data error: %s,%s', domain, e)
return res
def _remove_account_chart(self):
if not self.env.user.has_group('base.group_system'):
return False
company_id = self.env.company.id
self = self.with_context(force_company=company_id, company_id=company_id)
to_removes = [
'res.partner.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',
]
try:
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) and company_id=%d" \
% (field1, field2, company_id)
sql2 = "update account_journal set bank_account_id=NULL where company_id=%d;" % company_id
self._cr.execute(sql)
self._cr.execute(sql2)
self._cr.commit()
except Exception as e:
_logger.error('remove data error: %s,%s', 'account_chart: set tax and account_journal', e)
if self.env['ir.model']._get('pos.config'):
self.env['pos.config'].write({
'journal_id': False,
})
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:
_logger.error('remove data error: %s,%s', 'account_chart', 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
try:
rec = self.env['product.template'].search([])
for r in rec:
r.write({
'property_account_income_id': None,
'property_account_expense_id': None,
})
except Exception as e:
pass
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
seqs = []
res = self._remove_data(to_removes, seqs)
return res
def _remove_project(self):
if not self.env.user.has_group('base.group_system'):
return False
to_removes = [
'account.analytic.line',
'project.task',
'project.forecast',
'project.project',
]
seqs = []
return self._remove_data(to_removes, seqs)
def _remove_quality(self):
if not self.env.user.has_group('base.group_system'):
return False
to_removes = [
'quality.check',
'quality.alert',
]
seqs = [
'quality.check',
'quality.alert',
]
return self._remove_data(to_removes, seqs)
def _remove_quality_setting(self):
if not self.env.user.has_group('base.group_system'):
return False
to_removes = [
'quality.point',
'quality.alert.stage',
'quality.alert.team',
'quality.point.test_type',
'quality.reason',
'quality.tag',
]
return self._remove_data(to_removes)
def _remove_website(self):
if not self.env.user.has_group('base.group_system'):
return False
to_removes = [
'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',
]
seqs = []
return self._remove_data(to_removes, seqs)
def _remove_message(self):
if not self.env.user.has_group('base.group_system'):
return False
to_removes = [
'mail.message',
'mail.followers',
'mail.activity',
]
seqs = []
return self._remove_data(to_removes, seqs)
def action_remove_all(self):
self._remove_all()
def action_remove_sales(self):
self._remove_sales()
def action_remove_pos(self):
self._remove_pos()
def action_remove_purchase(self):
self._remove_purchase()
def action_remove_expense(self):
self._remove_expense()
def action_remove_mrp(self):
self._remove_mrp()
def action_remove_mrp_bom(self):
self._remove_mrp_bom()
def action_remove_inventory(self):
self._remove_inventory()
def action_remove_account(self):
self._remove_account()
def action_remove_account_chart(self):
self._remove_account_chart()
def action_remove_project(self):
self._remove_project()
def action_remove_quality(self):
self._remove_quality()
def action_remove_quality_setting(self):
self._remove_quality_setting()
def action_remove_website(self):
self._remove_website()
def action_remove_product(self):
self._remove_product()
def action_remove_product_attribute(self):
self._remove_product_attribute()
def action_remove_message(self):
self._remove_message()
def _remove_all(self):
if not self.env.user.has_group('base.group_system'):
return False
self.action_remove_account()
self.action_remove_quality()
self.action_remove_website()
self.action_remove_quality_setting()
self.action_remove_inventory()
self.action_remove_purchase()
self.action_remove_mrp()
self.action_remove_sales()
self.action_remove_project()
self.action_remove_pos()
self.action_remove_expense()
self.action_remove_account_chart()
self.action_remove_message()
return True
def reset_cat_loc_name(self):
ids = self.env['product.category'].search([
('parent_id', '!=', False)
], order='complete_name')
for rec in ids:
try:
rec._compute_complete_name()
except:
pass
try:
ids = self.env['stock.location'].search([
('location_id', '!=', False),
('usage', '!=', 'views'),
], order='complete_name')
for rec in ids:
rec._compute_complete_name()
except:
pass
return True

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

View File

@@ -1,70 +0,0 @@
<section class="oe_container oe_dark">
<div class="col-md-12">
<h2 class="oe_slogan" style="font-size: 35px;color:#2C0091"><b>Odoo 18 Remove Data</b></h2>
</div>
</section>
<section class="oe_container">
<div class="oe_row oe_spaced">
<div style="align:center;">
<h1 style=" text-align: center;">
<span align="center" style="color:#148963;">
<span class="fa fa-star fa-spin">
</span>
Features:</span>
</h1>
<div class="col-sm-2"/>
<div class="col-sm-4" style="text-align:left">
<p class="fa fa-hand-o-right" style="color:CRIMSON;font-size: 25px;">
<span style="color:#2dd280;font-size: 15px;">Remove all data in single click.</span>
</p><br/>
<p class="fa fa-hand-o-right" style="color:CRIMSON;font-size: 25px;">
<span style="color:#2dd280;font-size: 15px;">Easy to test odoo.</span>
</p><br/>
</div>
</div>
<br/>
</div>
</section>
<section class="oe_container oe_dark">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan" style="color:olive;">Remove Data Screen</h2>
<div class="oe_demo oe_picture oe_screenshot">
<img src="screen.png">
</div>
</div>
</section>
<hr style="width: 100%;height: 4px;background: #2C0091;margin: 0px 0px;">
<hr style="width: 100%;height: 4px;background: #148963;margin: 0px 0px;">
<section class="oe_container oe_dark">
<div class="oe_row ">
<div class="oe_slogan text-center">
<img src="odoo_mates.png"/>
<div style="color:#269900;">
<h3 style="color:#2C0091;font-size: 25px;">If you need any support or want more features, just contact us:</h3><br>
<h3 style="color:#2C0091;font-size: 20px;">Email: <a href="odoomates@gmail.com">odoomates@gmail.com</a> <br></h3>
</div>
<div class="oe_slogan">
<h2>
<a target="_blank" href="https://www.facebook.com/odoomate/" target="new">
<i class="fa fa-facebook-square" style="font-size:38px;"></i>
</a>
<a target="_blank" href="https://twitter.com/odoomates/" target="new">
<i class="fa fa-twitter" style="font-size:38px;"></i>
</a>
<a href="#" target="_blank">
<i class="fa fa-linkedin" style="font-size:38px;"></i>
</a>
<a target="_blank" href="https://www.youtube.com/channel/UCVKlUZP7HAhdQgs-9iTJklQ">
<i class="fa fa-youtube-play" style="font-size:38px;"></i>
</a>
</h2>
</div>
</div>
</div>
</section>
<hr style="width: 100%;height: 4px;background: #148963;margin: 0px 0px;">
<hr style="width: 100%;height: 4px;background: #2C0091;margin: 0px 0px;">

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

View File

@@ -1,120 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_remove_data" model="ir.ui.view">
<field name="name">Remove Data</field>
<field name="model">res.config.settings</field>
<field name="priority">20</field>
<field name="arch" type="xml">
<form string="odooApp Customize Settings" class="oe_form_configuration">
<div class="mt16 o_settings_container" name="data-clean">
<span>
<h2>Data Cleaning (Be careful to do that!)</h2>
<h2>
Data is deleted direcly from the database table using queries, once you done, it is not
reversible !
</h2>
</span>
<div class="col-12 col-lg-12 mb4">
<span class="col-3 col-lg-2 text-start">Remove All</span>
<button string="Delete All Transactions Except Master Data" type="object" name="action_remove_all" confirm="Please confirm to delete the data?" class="oe_highlight"/>
</div>
<div class="col-12 col-lg-12 mb4">
<span class="col-3 col-lg-2 text-start">Sale</span>
<button string="Delete All Sales Order" type="object" name="action_remove_sales"
confirm="Please confirm to delete the select data?" class="oe_highlight"/>
</div>
<div class="col-12 col-lg-12 mb4">
<span class="col-3 col-lg-2 text-start">POS</span>
<button string="Delete All POS Order" type="object" name="action_remove_pos"
confirm="Please confirm to delete the select data?"
class="oe_highlight"/>
</div>
<div class="col-12 col-lg-12 mb4">
<span class="col-3 col-lg-2 text-start">Purchase</span>
<button string="Delete All Purchase Order and Requisition" type="object" name="action_remove_purchase"
confirm="Please confirm to delete the select data?" class="oe_highlight"/>
</div>
<div class="col-12 col-lg-12 mb4">
<span class="col-3 col-lg-2 text-start">Expense</span>
<button string="Delete All Expense and Sheet" type="object" name="action_remove_expense"
confirm="Please confirm to delete the select data?" class="oe_highlight"/>
</div>
<div class="col-12 col-lg-12 mb4">
<span class="col-3 col-lg-2 text-start">MRP</span>
<button string="Delete All Manufacturing Order" type="object" name="action_remove_mrp"
confirm="Please confirm to delete the select data?" class="oe_highlight"/>
|
<button string="Delete All BOM" type="object" name="action_remove_mrp_bom"
confirm="Please confirm to delete the select data?" class="oe_highlight"/>
</div>
<div class="col-12 col-lg-12 mb4">
<span class="col-3 col-lg-2 text-start">Inventory</span>
<button string="Delete All Move/Picking/Package/Lot" type="object" name="action_remove_inventory"
confirm="Please confirm to delete the select data?" class="oe_highlight"/>
</div>
<div class="col-12 col-lg-12 mb4">
<span class="col-3 col-lg-2 text-start">
Accounting
<span title="Values set here are company-specific." groups="base.group_multi_company"/>
</span>
<button string="Delete All Voucher/Invoice/Bill" type="object" name="action_remove_account"
confirm="Please confirm to delete the select data?" class="oe_highlight"/>
|
<button string="Clean and reset Account Chart" type="object" name="action_remove_account_chart"
confirm="Please confirm to delete the select data?" class="oe_highlight"/>
</div>
<div class="col-12 col-lg-12 mb4">
<span class="col-3 col-lg-2 text-start">Project</span>
<button string="Delete All Project/Task/Forecast" type="object" name="action_remove_project"
confirm="Please confirm to delete the select data?" class="oe_highlight"/>
</div>
<div class="col-12 col-lg-12 mb4">
<span class="col-3 col-lg-2 text-start">Quality</span>
<button string="Delete All Quality" type="object" name="action_remove_quality"
confirm="Please confirm to delete the select data?" class="oe_highlight"/>
|
<button string="Delete All Quality Setting" type="object" name="action_remove_quality_setting"
confirm="Please confirm to delete the select data?" class="oe_highlight"/>
</div>
<div class="col-12 col-lg-12 mb4">
<span class="col-3 col-lg-2 text-start">Website And Blog</span>
<button string="Delete All Website/Blog" type="object" name="action_remove_website"
confirm="Please confirm to delete the select data?" class="oe_highlight"/>
</div>
<div class="col-12 col-lg-12 mb4">
<span class="col-3 col-lg-2 text-start">Base Models</span>
<button string="Delete All Product" type="object" name="action_remove_product"
confirm="Please confirm to delete the select data?" class="oe_highlight"/>
|
<button string="Delete All Product Attribute" type="object" name="action_remove_product_attribute"
confirm="Please confirm to delete the select data?" class="oe_highlight"/>
|
<button string="Delete All Message" type="object" name="action_remove_message"
confirm="Please confirm to delete the select data?" class="oe_highlight"/>
|
<button string="Reset Category And Location Complete Name" type="object"
name="reset_cat_loc_name" class="oe_highlight"/>
</div>
</div>
</form>
</field>
</record>
<record id="action_remove_data" model="ir.actions.act_window">
<field name="name">Remove Data</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">res.config.settings</field>
<field name="view_mode">form</field>
<field name="view_id" ref="view_remove_data"/>
</record>
<menuitem
id="menu_remove_data"
name="Remove Data"
action="action_remove_data"
parent="base.menu_administration"
sequence="1"
groups="base.group_system"/>
</odoo>