Source code for api.models

"""
DB-related helper utilities. Taken from database.py
file at https://github.com/cookiecutter-flask/cookiecutter-flask
"""
import os
import sys

sys.path.append(os.getcwd())
from init import db


[docs]class CRUDMixin: """ Mixin that adds convenience methods for CRUD (create, read, update, delete) operations. """
[docs] @classmethod def create(cls, **kwargs): """Create a new record and save it in the database. Returns: DB Class Object: returns the created record """ instance = cls(**kwargs) return instance.save()
[docs] def update(self, commit=True, **kwargs): """Update specific fields of a record Args: commit (bool, optional): flag whether to commit. Defaults to True. Returns: Db Class object: returns the updated record if committed, None otherwise """ for attr, value in kwargs.items(): setattr(self, attr, value) if commit: self.save() return self return None
[docs] def save(self, commit=True): """Save the record. Args: commit (bool, optional): flag whether to commit. Defaults to True. Returns: Db Class object: returns the record saved to db session """ db.session.add(self) if commit: db.session.commit() return self
[docs] def delete(self, commit=True): """Remove the record from the database. Args: commit (bool, optional): flag whether to commit. Defaults to True. Returns: Db Class object: returns the updated record if committed, None otherwise """ db.session.delete(self) if commit: db.session.commit() return self return None
[docs]class YoModel(CRUDMixin, db.Model): """Base model class that includes CRUD convenience methods.""" __abstract__ = True
[docs]class PkModel(YoModel): """ Base model class that includes CRUD convenience methods, plus adds a 'primary key' column named 'id'. """ __abstract__ = True id = db.Column(db.Integer, primary_key=True)
[docs] @classmethod def get_by_id(cls, record_id): """Get record by ID. Args: record_id (int): ID of record to get Returns: DB Class object: object identified by record_id if any, None otherwise """ if any( ( isinstance(record_id, (str, bytes)) and record_id.isdigit(), isinstance(record_id, (int, float)), ) ): return cls.query.get(int(record_id)) return None