from metadata import ctx, meta from restaurants import Restaurant from inspections import Inspection, InspectionViolation from violations import Violation from franchises import Franchise from metadata import * from restaurants import Restaurant franchise_table = Table('franchises', meta, Column('id', Integer, primary_key=True), Column('name', String, nullable=False), ) class Franchise(object): pass assign_mapper(ctx, Franchise, franchise_table, properties= { 'restaurants':relation(Restaurant, backref="franchise") } ) from datetime import datetime from metadata import * from violations import Violation inspection_table = Table('inspections', meta, Column('id', Integer, primary_key=True), Column('date', DateTime), Column('type', String), Column('noncritical', Integer, nullable=False), Column('restaurant_id', Integer, ForeignKey('restaurants.id')), ) inspectionviolations_table = Table('inspection_violations', meta, Column('severity', String, nullable=False), Column('inspection_id', Integer, ForeignKey('inspections.id')), Column('violation_id', Integer, ForeignKey('violations.id')), ) class Inspection(object): def __init__(self, date=None, type='Inspection', noncritical=0): if not date: date = datetime.now() self.date = date self.type = type self.noncritical = noncritical def add_violation(self, severity, violation): """Add a violation to this inspection with its severity If the violation is a string instead of a Violation object, it will be looked up from the db by that violation code. """ if isinstance(violation, str): violation = Violation.select_by(code=violation) if not violation: return False violation = violation[0] self.violations.append(ViolationAssociation(severity, violation)) class InspectionViolation(object): def __init__(self, severity, violation): self.severity = severity self.violation = violation assign_mapper(ctx, Inspection, inspection_table, properties=dict( violations=relation(InspectionViolation, lazy=False, cascade="all, delete-orphan") ) ) assign_mapper(ctx, InspectionViolation, inspectionviolations_table, primary_key=[inspectionviolations_table.c.inspection_id, inspectionviolations_table.c.violation_id], properties=dict( inspection=relation(Inspection, lazy=False), violation=relation(Violation, lazy=False) ) ) from sqlalchemy import * from sqlalchemy.ext.assignmapper import assign_mapper from pylons.database import create_engine, session_context meta = MetaData() ctx = session_context from metadata import * from inspections import Inspection restaurant_table= Table('restaurants', meta, Column('id', Integer, primary_key=True), Column('name', String(200), nullable=False), Column('address1', String, nullable=False), Column('address2', String), Column('city', String, nullable=False), Column('state', String(2), nullable=False), Column('zipcode', Integer, nullable=False), Column('lat', Float), Column('lng', Float), Column('in_store', Boolean, nullable=False), Column('url', String), Column('franchise_id', Integer, ForeignKey('franchises.id')), ) class Restaurant(object): def __init__(self, name, in_store=False, **kargs): self.name = name self.in_store = in_store for k, v in kargs.iteritems(): if k in self.c.keys(): setattr(self, k, v) assign_mapper(ctx, Restaurant, restaurant_table, properties=dict( inspections=relation(Inspection, lazy=False, cascade="all, delete-orphan", order_by=desc(Inspection.c.date), backref="restaurant") ) ) from metadata import * violation_table = Table('violations', meta, Column('id', Integer, primary_key=True), Column('code', String(10), nullable=False), Column('description', String, nullable=False), Column('correction', String), Column('county', String), ) class Violation(object): def __init__(self, code, description, correction, county): self.code = code self.description = description self.correction = correction self.county = county assign_mapper(ctx, Violation, violation_table)