Files
classifieds/app/models/geo.py
T
2026-06-15 11:23:05 -04:00

37 lines
1.3 KiB
Python

"""Geocoding reference tables.
ZipGeo: offline US ZIP -> lat/lng/city/state/metro (source the full ~42k-row
dataset from SimpleMaps US ZIP or Census ZCTA; a small sample is seeded for tests).
Metro: SEO landing-page anchor (pages built in Phase 7; column wired now).
"""
from app.extensions import db
class ZipGeo(db.Model):
__tablename__ = "zip_geo"
zip = db.Column(db.String(12), primary_key=True)
city = db.Column(db.String(80), nullable=False)
state = db.Column(db.String(2), nullable=False, index=True)
lat = db.Column(db.Float, nullable=False)
lng = db.Column(db.Float, nullable=False)
metro = db.Column(db.String(80), nullable=True, index=True)
def __repr__(self):
return f"<ZipGeo {self.zip} {self.city},{self.state}>"
class Metro(db.Model):
__tablename__ = "metros"
id = db.Column(db.BigInteger().with_variant(db.Integer, "sqlite"),
primary_key=True, autoincrement=True)
slug = db.Column(db.String(80), unique=True, nullable=False, index=True)
name = db.Column(db.String(120), nullable=False)
state = db.Column(db.String(2), nullable=True)
center_lat = db.Column(db.Float, nullable=True)
center_lng = db.Column(db.Float, nullable=True)
def __repr__(self):
return f"<Metro {self.slug}>"