oca-technical/odoo-bringout-oca-geospatial-base_geoengine/base_geoengine/geo_db.py
2025-08-29 15:43:03 +02:00

92 lines
2.8 KiB
Python

# Copyright 2011-2012 Nicolas Bessi (Camptocamp SA)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
"""Helper to setup Postgis"""
import logging
from odoo import _
from odoo.exceptions import MissingError
from odoo.tools import sql
logger = logging.getLogger("geoengine.sql")
_schema = logging.getLogger("odoo.schema")
def init_postgis(cr):
"""Initialize postgis
Add PostGIS support to the database. PostGIS is a spatial database
extender for PostgreSQL object-relational database. It adds support for
geographic objects allowing location queries to be run in SQL.
"""
cr.execute(
"""
SELECT
tablename
FROM
pg_tables
WHERE
tablename='spatial_ref_sys';
"""
)
check = cr.fetchone()
if check:
return {}
try:
cr.execute(
"""
CREATE EXTENSION postgis;
CREATE EXTENSION postgis_topology;
"""
)
except Exception as exc:
raise MissingError(
_(
"Error, can not automatically initialize spatial postgis"
" support. Database user may have to be superuser and"
" postgres/postgis extensions with their devel header have"
" to be installed. If you do not want Odoo to connect with a"
" super user you can manually prepare your database. To do"
" this, open a client to your database using a super user and"
" run:\n"
"CREATE EXTENSION postgis;\n"
"CREATE EXTENSION postgis_topology;\n"
)
) from exc
def create_geo_column(cr, tablename, columnname, geotype, srid, dim, comment=None):
"""Create a geometry column with the given type.
:params: srid: geometry's projection srid
:params: dim: geometry's dimension (2D or 3D)
"""
cr.execute(
"SELECT AddGeometryColumn( %s, %s, %s, %s, %s)",
(tablename, columnname, srid, geotype, dim),
)
if comment:
# pylint: disable=E8103
cr.execute(
'COMMENT ON COLUMN "{}"."{}" IS %s'.format(tablename, columnname),
(comment,),
)
_schema.debug(
"Table %r: added geometry column %r of type %s", tablename, columnname, geotype
)
def _postgis_index_name(table, col_name):
return "{}_{}_gist_index".format(table, col_name)
def create_geo_index(cr, tablename, columnname):
"""Create the given index unless it exists."""
indexname = _postgis_index_name(tablename, columnname)
if sql.index_exists(cr, indexname):
return
# pylint: disable=E8103
cr.execute(
"CREATE INDEX {} ON {} USING GIST ( {} )".format(
indexname, tablename, columnname
)
)
_schema.debug("Table %r: created index %r", tablename, indexname)