# -*- 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:
Exemple #2
0
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
Exemple #3
0
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()

Exemple #4
0
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} -- ファイル名
Exemple #5
0
#!/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)
Exemple #6
0
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 {}
Exemple #7
0

@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)
Exemple #8
0
##############################################################################
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 リクエスト
Exemple #9
0
#    古くなった不要データをクリーンアップする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 リクエスト
Exemple #10
0
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"
Exemple #11
0
##############################################################################
#    仮登録セッション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"
            }
Exemple #12
0
##############################################################################
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/"
Exemple #13
0
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"
Exemple #14
0
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")
Exemple #15
0
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 リクエスト