|
import logging |
|
import inspect |
|
import os |
|
import sys |
|
import inspect |
|
|
|
import logging |
|
import json |
|
|
|
from datetime import datetime |
|
|
|
from peewee import * |
|
from playhouse.shortcuts import * |
|
from playhouse.pool import * |
|
|
|
from flask_mongoengine import MongoEngine |
|
|
|
from flask_restful import Resource |
|
|
|
|
|
# fix import paths for internal imports |
|
cmd_folder = os.path.realpath(os.path.abspath( |
|
os.path.split(inspect.getfile(inspect.currentframe()))[0])) |
|
if cmd_folder not in sys.path: |
|
sys.path.insert(0, cmd_folder) |
|
|
|
|
|
# -- Controller |
|
|
|
BASE_PATH = "/api" |
|
|
|
|
|
class Controller(Resource): |
|
path = "" |
|
|
|
|
|
class MyJsonEncoder(json.JSONEncoder): |
|
def default(self, obj): |
|
if isinstance(obj, datetime): |
|
return int(obj.strftime('%s')) |
|
return json.JSONEncoder.default(self, obj) |
|
|
|
# --- Database |
|
|
|
|
|
_DB = Proxy() |
|
|
|
|
|
class BaseModel(Model): |
|
class Meta: |
|
database = _DB |
|
|
|
created = TimestampField(null=False, default=None) |
|
edited = TimestampField(null=True, default=None, index=True) |
|
is_deleted = BooleanField(null=False, default=False) |
|
# is_archived = BooleanField(null=False, default=False) |
|
|
|
def __init__(self): |
|
super() |
|
self.modified() |
|
|
|
@classmethod |
|
def get(cls, id): |
|
sq = cls.select().where(cls.id == id, cls.is_deleted == False) |
|
if sq.count(): |
|
return sq.get() |
|
return None |
|
|
|
@classmethod |
|
def getAll(cls,): |
|
sq = cls.select().where(cls.is_deleted == False) |
|
return sq |
|
|
|
def modified(self): |
|
if not self.created: |
|
self.created = datetime.now() |
|
self.edited = datetime.now() |
|
|
|
def delete(self): |
|
self.modified() |
|
self.is_deleted = True |
|
self.save() |
|
|
|
|
|
# --- Register class tools |
|
|
|
|
|
logger = logging.getLogger('peewee') |
|
logger.setLevel(logging.WARN) |
|
logger.addHandler(logging.StreamHandler()) |
|
|
|
|
|
def register_controllers(api, controllers): |
|
for clazz in controllers: |
|
path = BASE_PATH + clazz.path |
|
logging.info("Register endpoint {} {}".format(path, clazz.__name__)) |
|
api.add_resource(clazz, path) |
|
pass |
|
|
|
|
|
def register_models(target, models): |
|
for model in models: |
|
target.append(model) |
|
pass |
|
|
|
def registered_models(): |
|
return [] |
|
|
|
def database_init(app): |
|
logging.debug("ConnectDB: " + app.config["DATABASE"]) |
|
if app.config["DATABASE"] == "postgresql": |
|
database = PooledPostgresqlExtDatabase( |
|
app.config["DATABASE_NAME"], max_connections=16, stale_timeout=300, **app.config["DATABASE_AUTH"]) |
|
elif app.config["DATABASE"] == "sqlite": |
|
database = SqliteDatabase(app.config["DATABASE_PATH"], pragmas={ |
|
'journal_mode': 'wal', 'cache_size': -1024 * 64}) |
|
else: |
|
raise RuntimeError("No database set or invalid") |
|
|
|
_DB.initialize(database) |
|
pass |
|
|
|
|
|
def database_connect(testing=False): |
|
_DB.connect() |
|
|
|
|
|
def database_create_tables(tables): |
|
_DB.create_tables(tables, safe=True) |
|
|