mirror of
https://github.com/bringout/oca-technical.git
synced 2026-04-18 03:52:00 +02:00
92 lines
2.8 KiB
Python
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)
|