Source code for atlas_core.sqlalchemy
from .helpers.flask import abort
from .core import db
from sqlalchemy import inspect
def object_as_dict(o):
return {col.key: getattr(o, col.key) for col in inspect(o).mapper.column_attrs}
[docs]class BaseQuery(db.Query):
"""Base Query object that includes a number of convenience functions for
common patterns."""
[docs] def get_or_abort(self, obj_id, http_code=404):
"""Get an object or return an error code."""
result = self.get(obj_id)
return result or abort(http_code)
[docs] def first_or_abort(self, obj_id, http_code=404):
"""Get first result or return an error code."""
result = self.first()
return result or abort(http_code)
[docs] def filter_by_enum(self, enum, value, possible_values=None, http_code=400):
"""
Filters a query object by an enum, testing that it got a valid value.
:param enum: Enum column from model, e.g. Vehicle.type
:param value: Value to filter by
:param possible_values: None or list of acceptable values for `value`
:param http_code int: pass
"""
if value is None:
return self
if possible_values is None:
possible_values = enum.property.columns[0].type.enums
if value not in possible_values:
msg = "Expected one of: {0}, got {1}".format(possible_values, value)
abort(http_code, message=msg)
return self.filter(enum == value)
[docs]class BaseModel(db.Model):
"""Base Model object that sets sane defaults like InnoDB and utf8 for
mysql, etc."""
__abstract__ = True
__table_args__ = {"mysql_engine": "InnoDB", "mysql_charset": "utf8"}
query_class = BaseQuery