# -*- coding: utf-8 -*- import falcon import sqlalchemy.orm.scoping as scoping from sqlalchemy.exc import SQLAlchemyError from app import log from app import config from app.errors import DatabaseError, ERR_DATABASE_ROLLBACK LOG = log.get_logger() class DatabaseSessionManager(object): def __init__(self, db_session): self._session_factory = db_session self._scoped = isinstance(db_session, scoping.ScopedSession) def process_request(self, req, res, resource=None): """ Handle post-processing of the response (after routing). """ req.context['session'] = self._session_factory() def process_response(self, req, res, resource=None): """ Handle post-processing of the response (after routing). """ session = req.context['session'] if config.DB_AUTOCOMMIT:
import falcon import threading from app import log, config, redisBroker from app.constants import CRED_GEN from app.api.common import base from app.middleware import AuthMiddleware from app.api.v1 import validation from app.model import emailValidationTx from app.errors import AppError from mongoengine import connect LOG = log.get_logger() class App(falcon.API): def __init__(self, *args, **kwargs): super(App, self).__init__(*args, **kwargs) LOG.info("API Server is starting") # Simple endpoint for base self.add_route("/", base.BaseResource()) # Receive callback from elastOS self.add_route("/v1/validation/callback", validation.EmailConfirmation()) self.add_error_handler(AppError, AppError.handle) # Connect to mongodb
from flask import session from app.log import get_logger from app.models.SQL_DB import Newsletter, db logger = get_logger(__name__) def user_newsletters(email): newsletters = Newsletter.query.filter_by(username=email).all() return newsletters def add_newsletter(username, subject, message, recipients, sender, tags, campaign): newsletter = Newsletter( None, username, recipients, message, None, None, 0, subject, sender, tags, campaign, ) db.session.add(newsletter) return db.session.commit()
import datetime import requests import traceback import re import json from requests.exceptions import HTTPError from datetime import datetime as dt from typing import Any, Dict, List from configparser import ConfigParser from sqlalchemy.orm.exc import NoResultFound from flask import Response, send_from_directory # 独自モジュール読み込み import app.log as log from model.products import Product logger = log.get_logger("image") # 設定ファイル読み込み config = ConfigParser() config.read("settings.conf", encoding="utf-8") ##### 設定読み込み #################### # 画像保管先を表すディレクトリーパス DESTINATION_DIRECTORY_PATH = config.get("register", "destination_directory_path") def execute(file_name: str) -> Response: """指定したファイル名に合致する本登録済み商品イメージ画像のバイナリーを返します。 Arguments: file_name {str} -- ファイル名
#!/usr/bin/env python # -*- coding: utf-8 -*- import falcon from app import config from app import log logger = log.get_logger() ALLOWED_ORIGINS = config.ALLOWED_ORIGINS ALLOWED_HEADERS = config.ALLOWED_HEADERS ALLOWED_METHODS = config.ALLOWED_METHODS class CorsMiddleware(object): def process_request(self, request, response): origin = request.get_header('Origin') logger.info("origin: {}".format(origin)) if origin is None: raise falcon.HTTPForbidden( title=falcon.HTTP_403, description='Origin domain is not allow') if origin not in ALLOWED_ORIGINS.split(','): raise falcon.HTTPForbidden( title=falcon.HTTP_403, description='Origin domain is not allow') response.set_header('Access-Control-Allow-Origin', origin)
import aiohttp_jinja2 from app.handlers.abstract import AbstractView from app.log import get_logger log = get_logger() class AdminCategories(AbstractView): @aiohttp_jinja2.template('admin_categories.jinja2') async def get(self): return {} async def post(self): return {}
@app.route("/cleanup") def cleanup(): """古くなった過去データをクリーンアップします。 """ from app.api import cleanup return jsonify(cleanup.execute(request)) @app.route("/health") def health(): """ステータスコード 200 を返してシステムが正常な状態であることを表します。 """ return jsonify({}) if __name__ == "__main__": import os import ptvsd import app.log as log logger = log.get_logger("Entrypoint") # リモートデバッグを有効にする logger.info("Waiting for remote debugging...") ptvsd.enable_attach(address=("0.0.0.0", DEBUGGER_PORT)) # 単体起動した場合は Flask 内蔵サーバーを立ち上げる app.run(host="0.0.0.0", port=FLASK_SERVER_PORT)
############################################################################## import os import datetime import requests import traceback import json import time from requests.exceptions import HTTPError from datetime import datetime as dt from typing import Any, Dict, List from configparser import ConfigParser # 独自モジュール読み込み import app.log as log from model.products import Product logger = log.get_logger("listup_async") # 設定ファイル読み込み config = ConfigParser() config.read("settings.conf", encoding="utf-8") ##### 設定読み込み #################### # メッセージを送信するための Slack Incoming Webhook URL SLACK_INCOMING_WEBHOOK_URL = config.get("slack", "incoming_webhook_url") def execute(request): """与えられた商品イメージ画像と賞味期限の情報をすべてSlackへ書き出します。 Arguments: request -- POST リクエスト
# 古くなった不要データをクリーンアップするAPI ############################################################################## import os import datetime import traceback from datetime import datetime as dt from typing import Any, Dict, List from configparser import ConfigParser from sqlalchemy import func # 独自モジュール読み込み import app.log as log import app.common as common from model.temporary_products import TemporaryProduct from model.products import Product logger = log.get_logger("cleanup") # 設定ファイル読み込み config = ConfigParser() config.read("settings.conf", encoding="utf-8") ##### 設定読み込み #################### # クリーンアップ対象とする現在の日にちを起点とした経過日数 THRESHOLD_DAYS = int(config.get("cleanup", "threshold_days")) def execute(request) -> Dict[str, Any]: """古くなった不要データのクリーンアップを行います。 Arguments: request -- GET リクエスト
import requests import traceback import re import json from requests.exceptions import HTTPError from datetime import datetime as dt from typing import Any, Dict, List from configparser import ConfigParser from sqlalchemy.orm.exc import NoResultFound # 独自モジュール読み込み import app.log as log import app.common as common from model.products import Product logger = log.get_logger("command") # 設定ファイル読み込み config = ConfigParser() config.read("settings.conf", encoding="utf-8") ##### 設定読み込み #################### # Slack API トークン SLACK_TOKEN = config.get("slack", "token") # Slack 買い物リストチャンネル SLACK_SHOPPINGLIST_CHANNEL = config.get("command", "shoppinglist_channel") ##### 定数定義 #################### # ファイルアップロードを行うための Slack API エンドポイント SLACK_FILE_UPLOAD_URL = "https://slack.com/api/files.upload"
############################################################################## # 仮登録セッションIDを破棄するAPI ############################################################################## import os import json from typing import Any, Dict, List from configparser import ConfigParser from sqlalchemy.orm.exc import NoResultFound # 独自モジュール読み込み import app.common as common import app.log as log from model.temporary_products import TemporaryProduct from model.products import Product logger = log.get_logger("cancel") # 設定ファイル読み込み config = ConfigParser() config.read("settings.conf", encoding="utf-8") def execute(request) -> Dict[str, Any]: """与えられたセッションIDに該当する仮登録レコードを削除します。 Arguments: request -- POST リクエスト { // 仮登録テーブルに紐づけられたセッションID "session_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" }
############################################################################## import os import datetime import requests import traceback import json from requests.exceptions import HTTPError from datetime import datetime as dt from typing import Any, Dict, List from configparser import ConfigParser # 独自モジュール読み込み import app.log as log import app.common as common from model.products import Product logger = log.get_logger("remind") # 設定ファイル読み込み config = ConfigParser() config.read("settings.conf", encoding="utf-8") ##### 設定読み込み #################### # メッセージを送信するための Slack Incoming Webhook URL SLACK_INCOMING_WEBHOOK_URL = config.get("slack", "incoming_webhook_url") # このサーバーの外から見たときのURLのベース URL_NAME_BASE = config.get("slack", "url_name_base") ##### 定数定義 #################### # 本登録済みの商品イメージ画像を取得するためのURL GET_IMAGE_URL = f"https://{URL_NAME_BASE}/images/"
import os import datetime import requests import traceback import json import subprocess from requests.exceptions import HTTPError from datetime import datetime as dt from typing import Any, Dict, List from configparser import ConfigParser # 独自モジュール読み込み import app.log as log import app.common as common from model.products import Product logger = log.get_logger("listup") # 設定ファイル読み込み config = ConfigParser() config.read("settings.conf", encoding="utf-8") ##### 設定読み込み #################### # このサーバーの外から見たときのURLのベース URL_NAME_BASE = config.get("slack", "url_name_base") ##### 定数定義 #################### # 本登録済みの商品イメージ画像を取得するためのURL GET_IMAGE_URL = f"https://{URL_NAME_BASE}/images/" # 非同期的にSlackに商品イメージ画像と賞味期限を送信するためのURL LISTUP_ASYNC_URL = f"http://localhost/listup/async"
import cv2 import numpy as np import requests import json import re import uuid import datetime from datetime import datetime as dt from typing import Any, Dict, List from configparser import ConfigParser # 独自モジュール読み込み import app.log as log import app.common as common from model.temporary_products import TemporaryProduct logger = log.get_logger("detect") # 設定ファイル読み込み config = ConfigParser() config.read("settings.conf", encoding="utf-8") ##### 設定読み込み #################### # 賞味期限フォーマットパターン DATE_FORMAT_PATTERNS = json.loads(config.get("detect", "date_format_patterns")) # 現在の日付よりも古い期限を許可する日数差分 OLD_LIMIT_DAYS = int(config.get("detect", "old_limit_days")) # 現在の日付よりも新しい期限を許可する日数差分 NEW_LIMIT_DAYS = int(config.get("detect", "new_limit_days")) # OCRに使用するAPIキー API_KEY = config.get("detect", "api_key")
import os import cv2 import numpy as np import json import datetime from datetime import datetime as dt from typing import Any, Dict, List from configparser import ConfigParser from sqlalchemy.orm.exc import NoResultFound # 独自モジュール読み込み import app.log as log import app.common as common from model.temporary_products import TemporaryProduct from model.products import Product logger = log.get_logger("register") # 設定ファイル読み込み config = ConfigParser() config.read("settings.conf", encoding="utf-8") ##### 設定読み込み #################### # 画像保管先を表すディレクトリーパス DESTINATION_DIRECTORY_PATH = config.get("register", "destination_directory_path") def execute(request) -> Dict[str, Any]: """JPEG形式の画像を整数の配列で表したデータとセッションIDを紐づけて本登録を行います。 Arguments: request -- POST リクエスト