Changeset 1186

Show
Ignore:
Timestamp:
07/17/09 14:29:31 (3 years ago)
Author:
wyatt
Message:

More movement toward 'modernization'.

Files:
7 modified

Legend:

Unmodified
Added
Removed
  • Core/trunk/bycycle/core/model/data/integrator.py

    r1160 r1186  
    471471            record = dict( 
    472472                id=id, 
    473                 geom=r.geom.geometryN(0), 
     473                geom=(r.geom.geoms[0] if r.geom is not None else None), 
    474474                permanent_id=r.permanent_id, 
    475475                bikemode=bikemodes[r.bikemode], 
  • Core/trunk/bycycle/core/model/data/sqltypes.py

    r1155 r1186  
    22 
    33from shapely import geometry, wkb 
    4 import pyproj 
    5  
    6 from binascii import a2b_hex, b2a_hex 
    74 
    85 
     
    1310        super(Geometry, self).__init__() 
    1411        self.SRID = SRID 
    15         self.proj = pyproj.Proj(init='epsg:%s' % SRID) 
    1612        self.type = type_.upper() 
    1713        self.dimension = dimension 
     
    2319        """Convert from Python type to database type.""" 
    2420        def process(value): 
     21            """``value`` is a Python/Shapely geometry object.""" 
    2522            if value is None: 
    2623                return None 
    2724            else: 
    28                 return 'SRID=%s;%s' % (self.SRID, b2a_hex(value.to_wkb())) 
     25                return 'SRID=%s;%s' % (self.SRID, value) 
    2926        return process 
    3027 
     
    3229        """Convert from database type to Python type.""" 
    3330        def process(value): 
     31            """``value`` is a hex-encoded WKB string.""" 
    3432            if value is None: 
    3533                return None 
    3634            else: 
    37                 return wkb.loads(a2b_hex(value)) 
     35                return wkb.loads(value.decode('hex')) 
    3836        return process 
    3937 
  • Core/trunk/bycycle/core/model/entities/base.py

    r1160 r1186  
    2020""" 
    2121import sys 
     22import json 
     23import decimal 
     24import datetime 
    2225 
    2326from sqlalchemy import func, select, Column, ForeignKey 
     
    2730 
    2831from shapely import geometry, wkt 
    29  
    30 import simplejson 
     32from shapely.geometry.base import BaseGeometry 
    3133 
    3234from bycycle.core.util import gis, joinAttrs 
     
    3638 
    3739__all__ = ['DeclarativeBase', 'Node', 'Edge'] 
     40 
     41 
     42datetime_types = (datetime.time, datetime.date, datetime.datetime) 
    3843 
    3944 
     
    8792        return result 
    8893 
    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.""" 
    9397        try: 
    94             self.__table__ 
     98            obj = obj.to_simple_object() 
    9599        except AttributeError: 
    96100            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__ 
    106111        return obj 
    107112 
    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) 
    115135 
    116136    def __setattr__(self, name, value): 
     
    133153        else: 
    134154            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 
    135181 
    136182 
  • Core/trunk/bycycle/core/model/entities/public.py

    r1160 r1186  
    1919from sqlalchemy.types import Integer, String, CHAR, Float, Date 
    2020 
    21 from shapely import geometry 
     21from shapely import geometry, wkt 
    2222import pyproj 
    2323 
     
    7878 
    7979    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 
    9484        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]} 
    9787        } 
    9888 
    99     def to_simple_object(self): 
     89    def to_simple_object(self, fields=None): 
    10090        # 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); 
    10292        obj['geometry'] = {'4326': {}} 
    10393 
     
    118108        bounds = self.bounds(srid) 
    119109        set_geom(obj['geometry'][srid], bounds) 
     110         
     111        obj.pop('module', None) 
     112        obj.pop('proj', None) 
    120113 
    121114        return obj 
  • Core/trunk/bycycle/core/model/portlandor/data/__init__.py

    r1160 r1186  
    9191 
    9292    # 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') 
    9595 
    9696    # To edge table (supplemental) 
  • TripPlanner/trunk/bycycle/tripplanner/controllers/regions.py

    r1160 r1186  
    77 
    88class RegionsController(RestController): 
     9 
     10    entity = Region 
    911 
    1012    def __before__(self): 
  • TripPlanner/trunk/bycycle/tripplanner/lib/base.py

    r1160 r1186  
    66from pylons.templating import render_mako as render 
    77 
    8 import restler as _restler 
     8import restler.controller 
    99 
    1010from bycycle.core import model 
     
    1313 
    1414 
    15 RestController = _restler.RestController(model) 
     15class RestController(restler.controller.Controller): 
     16 
     17    default_format = 'html' 
     18 
     19    def get_db_session(self): 
     20        return model.Session 
    1621 
    1722