Skip to content

Commit f274496

Browse files
committed
added sql database
1 parent e00b69b commit f274496

12 files changed

+159
-75
lines changed

.gitignore

+4-1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,7 @@
22
*.log
33
# ignore cache
44
__pycache__
5-
*.pyc
5+
*.pyc
6+
7+
#ignore DB instance
8+
instance/

Procfile

-1
This file was deleted.

app.py

-73
This file was deleted.

app/__init__.py

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
from flask import Flask
2+
from flask_caching import Cache
3+
from models import db
4+
from constant import *
5+
6+
cache = Cache()
7+
8+
def create_app():
9+
app = Flask(__name__)
10+
app.config['SQLALCHEMY_DATABASE_URI'] = SQLALCHEMY_DATABASE_URI
11+
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
12+
db.init_app(app)
13+
14+
app.config['CACHE_TYPE'] = CACHE_TYPE
15+
app.config['CACHE_REDIS_HOST'] = CACHE_REDIS_HOST
16+
app.config['CACHE_REDIS_PORT'] = CACHE_REDIS_PORT
17+
app.config['CACHE_DEFAULT_TIMEOUT'] = CACHE_DEFAULT_TIMEOUT
18+
19+
cache.init_app(app)
20+
21+
from app.setData import set_bp
22+
from app.getData import getdata_bp
23+
from app.location import locations
24+
from app.getInfo import getinfo
25+
26+
app.register_blueprint(set_bp)
27+
app.register_blueprint(getdata_bp)
28+
app.register_blueprint(locations)
29+
app.register_blueprint(getinfo)
30+
31+
return app

app/getData.py

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
from flask import Blueprint, jsonify
2+
from models import Data
3+
from app import cache
4+
5+
getdata_bp = Blueprint('getdata_bp', __name__)
6+
7+
@getdata_bp.route("/getdata/<int:device_fk_id>", methods=['GET'])
8+
@cache.cached(timeout=120, query_string=True)
9+
def getdata(device_fk_id):
10+
data = Data.query.filter_by(device_fk_id=device_fk_id).order_by(
11+
Data.time_stamp.desc()).first()
12+
result = {'device_fk_id': data.device_fk_id, 'latitude': data.latitude, 'longitude': data.longitude,
13+
'time_stamp': data.time_stamp.strftime('%Y-%m-%dT%H:%M:%SZ'), 'sts': data.sts, 'speed': data.speed}
14+
return jsonify(result)

app/getInfo.py

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from flask import Blueprint, jsonify, request
2+
from models import Data
3+
from datetime import datetime
4+
from app import cache
5+
6+
getinfo = Blueprint('getinfo', __name__)
7+
8+
@getinfo.route("/getinfo", methods=['GET'])
9+
@cache.cached(timeout=120, query_string=True)
10+
def getfulldata():
11+
deviceId = request.args.get('deviceId')
12+
start_time = request.args.get('starttime')
13+
end_time = request.args.get('endtime')
14+
formatted_start_time = datetime.strptime(start_time, '%Y-%m-%dT%H:%M:%SZ')
15+
formatted_end_time = datetime.strptime(end_time, '%Y-%m-%dT%H:%M:%SZ')
16+
data = Data.query.filter_by(device_fk_id=deviceId).filter(
17+
Data.time_stamp >= formatted_start_time, Data.time_stamp <= formatted_end_time).order_by(Data.time_stamp.desc()).all()
18+
result = [{'latitude': d.latitude, 'longitude': d.longitude, 'time_stamp': d.time_stamp.strftime('%Y-%m-%dT%H:%M:%SZ')} for d in data]
19+
return jsonify(result)

app/location.py

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from flask import Blueprint, jsonify, request
2+
from models import Data
3+
from datetime import datetime
4+
from app import cache
5+
6+
locations = Blueprint('locations', __name__)
7+
8+
@locations.route("/getlocation/<int:device_fk_id>", methods=['GET'])
9+
@cache.cached(timeout=120, query_string=True)
10+
def getlocdata():
11+
deviceId = request.args.get('deviceId')
12+
start_time = datetime.strptime(
13+
request.args.get('starttime'), '%Y-%m-%dT%H:%M:%SZ')
14+
end_time = datetime.strptime(
15+
request.args.get('endtime'), '%Y-%m-%dT%H:%M:%SZ')
16+
data = Data.query.filter_by(device_fk_id=deviceId).order_by(
17+
Data.time_stamp.desc()).all()
18+
result = [{'latitude': d.latitude, 'longitude': d.longitude, 'time_stamp': d.time_stamp.strftime('%Y-%m-%dT%H:%M:%SZ')}
19+
for d in data if start_time <= d.time_stamp <= end_time]
20+
return jsonify(result)
21+

app/setData.py

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from flask import Blueprint, jsonify
2+
from models import db, Data
3+
from data import *
4+
from app import cache
5+
6+
set_bp = Blueprint('set_bp', __name__)
7+
8+
@set_bp.before_app_first_request
9+
def create_tables():
10+
db.create_all()
11+
populate_database_from_csv()
12+
13+
@set_bp.route('/set', methods=['GET'])
14+
@cache.cached(timeout=120, query_string=True)
15+
def set():
16+
data = Data.query.order_by(Data.sts.desc()).all()
17+
result = [{'device_fk_id': d.device_fk_id, 'latitude': d.latitude, 'longitude': d.longitude,
18+
'time_stamp': d.time_stamp.strftime('%Y-%m-%dT%H:%M:%SZ'), 'sts': d.sts, 'speed': d.speed} for d in data]
19+
return jsonify(result)

constant.py

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
CACHE_TYPE = "redis"
2+
CACHE_REDIS_HOST="redis"
3+
CACHE_REDIS_PORT=6379
4+
CACHE_DEFAULT_TIMEOUT=600
5+
SQLALCHEMY_DATABASE_URI = 'sqlite:///data.db'

data.py

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import csv
2+
from models import db, Data
3+
4+
def populate_database_from_csv():
5+
with open('utils/raw_data.csv') as csvfile:
6+
reader = csv.DictReader(csvfile)
7+
for row in reader:
8+
device_fk_id = int(row['device_fk_id'])
9+
latitude = float(row['latitude'])
10+
longitude = float(row['longitude'])
11+
time_stamp = row['time_stamp']
12+
sts = True if row['sts'] == '1' else False
13+
speed = float(row['speed'])
14+
data = Data(device_fk_id, latitude, longitude, time_stamp, sts, speed)
15+
db.session.add(data)
16+
db.session.commit()

models.py

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
from datetime import datetime
2+
from flask_sqlalchemy import SQLAlchemy
3+
4+
db = SQLAlchemy()
5+
6+
class Data(db.Model):
7+
__tablename__ = 'data'
8+
id = db.Column(db.Integer, primary_key=True)
9+
device_fk_id = db.Column(db.Integer)
10+
latitude = db.Column(db.Float)
11+
longitude = db.Column(db.Float)
12+
time_stamp = db.Column(db.DateTime, default=datetime.utcnow)
13+
sts = db.Column(db.Boolean)
14+
speed = db.Column(db.Float)
15+
16+
def __init__(self, device_fk_id, latitude, longitude, time_stamp, sts, speed):
17+
self.device_fk_id = device_fk_id
18+
self.latitude = latitude
19+
self.longitude = longitude
20+
self.time_stamp = datetime.strptime(time_stamp, '%Y-%m-%dT%H:%M:%SZ')
21+
self.sts = sts
22+
self.speed = speed

run.py

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import os
2+
from app import create_app
3+
4+
app = create_app()
5+
6+
if __name__ == '__main__':
7+
port = int(os.environ.get("PORT", 5000))
8+
app.run(host='0.0.0.0', port=port)

0 commit comments

Comments
 (0)