1 | from ..adapters.postgres import Postgre, PostgreNew |
---|
2 | from .base import SQLRepresenter, JSONRepresenter |
---|
3 | from . import representers, before_type, for_type |
---|
4 | from ..helpers.serializers import serializers |
---|
5 | |
---|
6 | |
---|
7 | @representers.register_for(Postgre) |
---|
8 | class PostgreRepresenter(SQLRepresenter, JSONRepresenter): |
---|
9 | def _make_geoextra(self, field_type): |
---|
10 | srid = 4326 |
---|
11 | geotype, params = field_type[:-1].split("(") |
---|
12 | params = params.split(",") |
---|
13 | if len(params) >= 2: |
---|
14 | schema, srid = params[:2] |
---|
15 | return {"srid": srid} |
---|
16 | |
---|
17 | @before_type("geometry") |
---|
18 | def geometry_extras(self, field_type): |
---|
19 | return self._make_geoextra(field_type) |
---|
20 | |
---|
21 | @for_type("geometry", adapt=False) |
---|
22 | def _geometry(self, value, srid): |
---|
23 | # If the value starts with a zero, treat as a WKB string |
---|
24 | # and pass back flagged as hex data as is. Otherwise treat |
---|
25 | # the value as WKT and pass it through the converter. |
---|
26 | if value[0] == "0": |
---|
27 | return "E'%s'" % value |
---|
28 | else: |
---|
29 | return "ST_GeomFromText('%s',%s)" % (value, srid) |
---|
30 | |
---|
31 | @before_type("geography") |
---|
32 | def geography_extras(self, field_type): |
---|
33 | return self._make_geoextra(field_type) |
---|
34 | |
---|
35 | @for_type("geography", adapt=False) |
---|
36 | def _geography(self, value, srid): |
---|
37 | return "ST_GeogFromText('SRID=%s;%s')" % (srid, value) |
---|
38 | |
---|
39 | @for_type("jsonb", encode=True) |
---|
40 | def _jsonb(self, value): |
---|
41 | return serializers.json(value) |
---|
42 | |
---|
43 | |
---|
44 | @representers.register_for(PostgreNew) |
---|
45 | class PostgreArraysRepresenter(PostgreRepresenter): |
---|
46 | def _listify_elements(self, elements): |
---|
47 | return "{" + ",".join(str(el) for el in elements) + "}" |
---|