Changeset 1186
- Timestamp:
- 07/17/09 14:29:31 (3 years ago)
- Files:
-
- 7 modified
-
Core/trunk/bycycle/core/model/data/integrator.py (modified) (1 diff)
-
Core/trunk/bycycle/core/model/data/sqltypes.py (modified) (4 diffs)
-
Core/trunk/bycycle/core/model/entities/base.py (modified) (5 diffs)
-
Core/trunk/bycycle/core/model/entities/public.py (modified) (3 diffs)
-
Core/trunk/bycycle/core/model/portlandor/data/__init__.py (modified) (1 diff)
-
TripPlanner/trunk/bycycle/tripplanner/controllers/regions.py (modified) (1 diff)
-
TripPlanner/trunk/bycycle/tripplanner/lib/base.py (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
Core/trunk/bycycle/core/model/data/integrator.py
r1160 r1186 471 471 record = dict( 472 472 id=id, 473 geom= r.geom.geometryN(0),473 geom=(r.geom.geoms[0] if r.geom is not None else None), 474 474 permanent_id=r.permanent_id, 475 475 bikemode=bikemodes[r.bikemode], -
Core/trunk/bycycle/core/model/data/sqltypes.py
r1155 r1186 2 2 3 3 from shapely import geometry, wkb 4 import pyproj5 6 from binascii import a2b_hex, b2a_hex7 4 8 5 … … 13 10 super(Geometry, self).__init__() 14 11 self.SRID = SRID 15 self.proj = pyproj.Proj(init='epsg:%s' % SRID)16 12 self.type = type_.upper() 17 13 self.dimension = dimension … … 23 19 """Convert from Python type to database type.""" 24 20 def process(value): 21 """``value`` is a Python/Shapely geometry object.""" 25 22 if value is None: 26 23 return None 27 24 else: 28 return 'SRID=%s;%s' % (self.SRID, b2a_hex(value.to_wkb()))25 return 'SRID=%s;%s' % (self.SRID, value) 29 26 return process 30 27 … … 32 29 """Convert from database type to Python type.""" 33 30 def process(value): 31 """``value`` is a hex-encoded WKB string.""" 34 32 if value is None: 35 33 return None 36 34 else: 37 return wkb.loads( a2b_hex(value))35 return wkb.loads(value.decode('hex')) 38 36 return process 39 37 -
Core/trunk/bycycle/core/model/entities/base.py
r1160 r1186 20 20 """ 21 21 import sys 22 import json 23 import decimal 24 import datetime 22 25 23 26 from sqlalchemy import func, select, Column, ForeignKey … … 27 30 28 31 from shapely import geometry, wkt 29 30 import simplejson 32 from shapely.geometry.base import BaseGeometry 31 33 32 34 from bycycle.core.util import gis, joinAttrs … … 36 38 37 39 __all__ = ['DeclarativeBase', 'Node', 'Edge'] 40 41 42 datetime_types = (datetime.time, datetime.date, datetime.datetime) 38 43 39 44 … … 87 92 return result 88 93 89 def to_simple_object(self): 90 """Return an object that can be serialized by ``simplejson.dumps``.""" 91 obj = dict(type=self.__class__.__name__) 92 attrs = set(self._attrs) 94 @classmethod 95 def simplify_object(cls, obj): 96 """Convert ``obj`` to something JSON encoder can handle.""" 93 97 try: 94 self.__table__98 obj = obj.to_simple_object() 95 99 except AttributeError: 96 100 pass 97 else: 98 attrs = attrs.union(set(self.__table__.columns.keys())) 99 for name in attrs: 100 value = getattr(self, name) 101 try: 102 value = value.to_simple_object() 103 except AttributeError: 104 pass 105 obj[name] = value 101 if isinstance(obj, decimal.Decimal): 102 obj = float(obj) 103 # HACK: Convert decimal with 0 fractional part to int 104 decimal_part = int(str(obj).split('.')[1]) 105 if decimal_part == 0: 106 obj = int(obj) 107 elif isinstance(obj, datetime_types): 108 obj = str(obj) 109 elif isinstance(obj, BaseGeometry): 110 obj = obj.__geo_interface__ 106 111 return obj 107 112 108 def to_json(self): 109 return simplejson.dumps(self.to_simple_object()) 110 111 @staticmethod 112 def to_json_collection(instances): 113 simple_obj = {'result': [i.to_simple_object() for i in instances]} 114 return simplejson.dumps(simple_obj) 113 def to_simple_object(self, fields=None): 114 obj = dict(type=self.__class__.__name__) 115 names = fields or self.public_names 116 for name in names: 117 val = getattr(self, name) 118 val = self.simplify_object(val) 119 obj[name] = val 120 return obj 121 122 def to_json(self, fields=None): 123 return json.dumps(self.to_simple_object(fields=fields)) 124 125 @classmethod 126 def to_simple_collection(cls, collection=None, fields=None): 127 if collection is None: 128 collection = cls.q() 129 return [i.to_simple_object() for i in collection] 130 131 @classmethod 132 def to_json_collection(cls, collection=None, fields=None): 133 simple_obj = cls.to_simple_collection(collection, fields=fields) 134 return json.dumps(simple_obj) 115 135 116 136 def __setattr__(self, name, value): … … 133 153 else: 134 154 return str(self.to_simple_object()) 155 156 @property 157 def public_names(self): 158 """We want all public DB columns and `property`s by default.""" 159 try: 160 self._public_names 161 except AttributeError: 162 names = [] 163 class_attrs = self.__class__.__dict__ 164 for name in class_attrs: 165 if name.startswith('_'): 166 continue 167 attr = class_attrs[name] 168 if isinstance(attr, property): 169 names.append(name) 170 else: 171 try: 172 clause_el = attr.__clause_element__() 173 except AttributeError: 174 pass 175 else: 176 if issubclass(clause_el.__class__, Column): 177 names.append(name) 178 names = set(names) 179 self._public_names = names 180 return self._public_names 135 181 136 182 -
Core/trunk/bycycle/core/model/entities/public.py
r1160 r1186 19 19 from sqlalchemy.types import Integer, String, CHAR, Float, Date 20 20 21 from shapely import geometry 21 from shapely import geometry, wkt 22 22 import pyproj 23 23 … … 78 78 79 79 def bounds(self, srid=None): 80 srs = str(SpatialReference(epsg=self.srid)) 81 f = func.extent(self.module.Node.__table__.c.geom) 82 result = select([f.label('ext')], bind=db.engine).execute() 83 result = result.fetchone() 84 extent = result.ext.lstrip('BOX').strip().lstrip('(').rstrip(')') 85 sw, ne = extent.split(',') 86 sw, ne = 'POINT(%s)' % sw, 'POINT(%s)' % ne 87 sw = geometry.Geometry.fromWKT(sw, srs=srs) 88 ne = geometry.Geometry.fromWKT(ne, srs=srs) 89 if srid is not None: 90 srid = int(srid) 91 new_srs = str(SpatialReference(epsg=srid)) 92 sw.transform(src_proj=srs, dst_proj=new_srs) 93 ne.transform(src_proj=srs, dst_proj=new_srs) 80 f = func.astext(func.envelope(func.extent(self.module.Node.__table__.c.geom))) 81 result = select([f.label('envelope')], bind=db.engine).execute() 82 envelope = wkt.loads(result.fetchone().envelope) 83 bounds = envelope.bounds 94 84 return { 95 'sw': {'x': sw.x, 'y': sw.y},96 'ne': {'x': ne.x, 'y': ne.y}85 'sw': {'x': bounds[0], 'y': bounds[1]}, 86 'ne': {'x': bounds[2], 'y': bounds[3]} 97 87 } 98 88 99 def to_simple_object(self ):89 def to_simple_object(self, fields=None): 100 90 # Append dynamically computed geometries to default simple object 101 obj = super(Region, self).to_simple_object( );91 obj = super(Region, self).to_simple_object(fields=fields); 102 92 obj['geometry'] = {'4326': {}} 103 93 … … 118 108 bounds = self.bounds(srid) 119 109 set_geom(obj['geometry'][srid], bounds) 110 111 obj.pop('module', None) 112 obj.pop('proj', None) 120 113 121 114 return obj -
Core/trunk/bycycle/core/model/portlandor/data/__init__.py
r1160 r1186 91 91 92 92 # To places table 93 zipcolef= Column(Integer, key='zip_code_l')94 zipcorgt= Column(Integer, key='zip_code_r')93 lzip = Column(Integer, key='zip_code_l') 94 rzip = Column(Integer, key='zip_code_r') 95 95 96 96 # To edge table (supplemental) -
TripPlanner/trunk/bycycle/tripplanner/controllers/regions.py
r1160 r1186 7 7 8 8 class RegionsController(RestController): 9 10 entity = Region 9 11 10 12 def __before__(self): -
TripPlanner/trunk/bycycle/tripplanner/lib/base.py
r1160 r1186 6 6 from pylons.templating import render_mako as render 7 7 8 import restler as _restler8 import restler.controller 9 9 10 10 from bycycle.core import model … … 13 13 14 14 15 RestController = _restler.RestController(model) 15 class RestController(restler.controller.Controller): 16 17 default_format = 'html' 18 19 def get_db_session(self): 20 return model.Session 16 21 17 22