Skip to content
Snippets Groups Projects
__init__.py 1.51 KiB
Newer Older
  • Learn to ignore specific revisions
  • import json
    
    from flask_restx import abort
    from flask_sqlalchemy import BaseQuery
    from flask_sqlalchemy.model import Model
    from sqlalchemy import Column, DateTime, Text
    from sqlalchemy.sql import func
    from sqlalchemy.types import TypeDecorator
    
    
    class Base(Model):
        __abstract__ = True
        _created = Column(DateTime(timezone=True), server_default=func.now())
        _updated = Column(DateTime(timezone=True), onupdate=func.now())
    
    
    class ExtendedQuery(BaseQuery):
        def first_extended(self, required=True, error_message=None, error_code=404):
            item = self.first()
    
            if required and not item:
                if not error_message:
                    error_message = "Object not found"
                abort(error_code, error_message)
    
            return item
    
        def pagination(self, page=0, page_size=15, order_column=None, order=1):
            query = self
            if order_column:
                if order == 1:
                    query = query.order_by(order_column)
                else:
                    query = query.order_by(order_column.desc())
    
            total = query.count()
            query = query.limit(page_size).offset(page * page_size)
            items = query.all()
            return items, total
    
    
    class Dictionary(TypeDecorator):
    
    
        impl = Text
    
    
        def process_bind_param(self, value, dialect):
            if value is not None:
                value = json.dumps(value).replace("'", '"')
    
            return value
    
        def process_result_value(self, value, dialect):
            if value is not None:
                value = json.loads(value)
            return value