server-tools/database_cleanup/models/create_indexes.py

93 lines
2.9 KiB
Python

# Copyright 2017 Therp BV <http://therp.nl>
# Copyright 2021 Camptocamp <https://camptocamp.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
# pylint: disable=consider-merging-classes-inherited
from odoo import fields, models
from ..identifier_adapter import IdentifierAdapter
class CreateIndexesLine(models.TransientModel):
_inherit = "cleanup.purge.line"
_name = "cleanup.create_indexes.line"
_description = "Cleanup Create Indexes line"
purged = fields.Boolean("Created")
wizard_id = fields.Many2one("cleanup.create_indexes.wizard")
field_id = fields.Many2one("ir.model.fields", required=True)
def purge(self):
for field in self.mapped("field_id"):
model = self.env[field.model]
name = "{}_{}_index".format(model._table, field.name)
self.env.cr.execute(
"create index %s ON %s (%s)",
(
IdentifierAdapter(name, quote=False),
IdentifierAdapter(model._table),
IdentifierAdapter(field.name),
),
)
self.env.cr.execute("analyze %s", (IdentifierAdapter(model._table),))
self.write(
{
"purged": True,
}
)
class CreateIndexesWizard(models.TransientModel):
_inherit = "cleanup.purge.wizard"
_name = "cleanup.create_indexes.wizard"
_description = "Create indexes"
purge_line_ids = fields.One2many(
"cleanup.create_indexes.line",
"wizard_id",
)
def find(self):
res = list()
for field in self.env["ir.model.fields"].search(
[
("index", "=", True),
]
):
if field.model not in self.env.registry:
continue
model = self.env[field.model]
name = "{}_{}_index".format(model._table, field.name)
self.env.cr.execute(
"select indexname from pg_indexes "
"where indexname=%s and tablename=%s",
(name, model._table),
)
if self.env.cr.rowcount:
continue
self.env.cr.execute(
"select a.attname "
"from pg_attribute a "
"join pg_class c on a.attrelid=c.oid "
"join pg_tables t on t.tablename=c.relname "
"where attname=%s and c.relname=%s",
(
field.name,
model._table,
),
)
if not self.env.cr.rowcount:
continue
res.append(
(
0,
0,
{
"name": "{}.{}".format(field.model, field.name),
"field_id": field.id,
},
)
)
return res