# ログ取得APIを定義します。 ############################################################################### import sys sys.path.insert(0, ".") import datetime from datetime import datetime as dt from sqlalchemy import func, asc, desc from sqlalchemy.orm.exc import NoResultFound # Flask サブモジュールとして必要なパッケージの取り込みと設定を行う from flask import Blueprint, request, jsonify, Response from flask_cors import CORS import app.common as Common sub_function = Blueprint("logs", __name__, url_prefix="/logs") CORS(sub_function) logger = Common.get_logger("logs") @sub_function.route("/", methods=["GET"]) def log(): """指定期間、および日当たりそれぞれの時間帯におけるすべてのトイレの使用回数を表す Chart.js グラフ用データを返します。 このAPIでは、ドアが閉じられた回数をもとに集計します。 Arguments: begin_date {str} -- 期間開始日 (%Y%m%d) end_date {str} -- 期間終了日 (%Y%m%d) begin_hours_per_day {int} -- 日当たりの集計始端時間 (0-23) end_hours_per_day {int} -- 日当たりの集計終端時間 (0-23) step_hours {int} -- 期間内におけるサンプリング間隔 (1-24)、始端時間から終端時間の差をこの値で割り切れない場合は割り切れる時間まで延長します。 Returns:
import logging from django.http import JsonResponse from rest_framework import status from app.common import get_logger from app.rest import error_format log = get_logger(__name__) class ExceptionsHandlingMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): response = self.get_response(request) # rest_framework добавляет `data` к response, # поэтому этот код будет работать только тогда, # когда исключение возникло при маршрутизации if not hasattr(response, 'data') and \ response.status_code == status.HTTP_404_NOT_FOUND: return JsonResponse( error_format(404, 'Endpoint not found =('), status=status.HTTP_404_NOT_FOUND)
import json from django.conf import settings from django.contrib.auth.models import User from django.db import models from django.utils import timezone from django.utils.translation import ugettext_lazy as _ from rest_framework.exceptions import NotFound from app.common import get_logger from app.records import classification from app.records import entity_extraction from app.records.misc import import_module_attr from app.records.signals import ready_to_process log = get_logger(__file__) class Source(models.Model): name = models.CharField(max_length=100) owner = models.ForeignKey(User, on_delete=models.CASCADE) @classmethod def get_or_create_default(cls, user): source, _created = cls.objects.get_or_create( owner=user, name=settings.DEFAULT_SOURCE_NAME) return source
############################################################################### # 取得系の処理を実行するAPIを定義します。 ############################################################################### import sys sys.path.insert(0, ".") import datetime from datetime import datetime as dt from sqlalchemy import func, asc, desc from sqlalchemy.orm.exc import NoResultFound # Flask サブモジュールとして必要なパッケージの取り込みと設定を行う from flask import Blueprint, request, jsonify, Response from flask_cors import CORS import app.common as Common from app.main import app logger = Common.get_logger("root") @app.route("/", methods=["GET"]) def status(): """現在のトイレ在室状況を返します。 なお、システム停止モードに移行している間はすべて success=False として返します。 Returns: Response -- application/json = { success: True or False, message: "エラーメッセージ", // エラー発生時のみ。正常完了時は空文字 status: [ { name: "4F 男性用トイレ" // トイレグループの名称 valid: True or False, // このトイレグループの状況を取得できたかどうか
############################################################################### import sys sys.path.insert(0, ".") from datetime import datetime as dt from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from sqlalchemy.orm.exc import NoResultFound from sqlalchemy.pool import SingletonThreadPool # Flask サブモジュールとして必要なパッケージの取り込みと設定を行う from flask import Blueprint, request, jsonify, Response from flask_cors import CORS import app.common as Common sub_function = Blueprint("emergency", __name__, url_prefix="/emergency") CORS(sub_function) logger = Common.get_logger("emergency") @sub_function.route("/", methods=["PATCH"]) def emergency() -> Response: """システムモードの 停止 or 再開 状態を反転させます。 Returns: Response -- application/json = { valid: 0 or 1, // 反転後のステート番号 action: "停止" or "再開", // 反転後のステート名 } """ from model.app_state import AppState logger.info(f"[emergency] API Called.")
############################################################################### import sys sys.path.insert(0, ".") from datetime import datetime as dt from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from sqlalchemy.orm.exc import NoResultFound from sqlalchemy.pool import SingletonThreadPool # Flask サブモジュールとして必要なパッケージの取り込みと設定を行う from flask import Blueprint, request, jsonify, Response from flask_cors import CORS import app.common as Common sub_function = Blueprint("door", __name__, url_prefix="/door") CORS(sub_function) logger = Common.get_logger("door") ### 定数定義 # open/close を許可する最短呼出間隔 (秒) MIN_DOOR_EVENT_SPAN_SECONDS = 3 @sub_function.route("/open", methods=["PUT"]) def open() -> Response: """トイレのドアが開いたことを記録します。 Arguments: toilet_id {int} -- ターゲットトイレID Returns: Response -- application/json = {