Merge working version

This commit is contained in:
Alexander Minges 2019-01-31 14:49:46 +01:00
parent a4d53f3193
commit 3afaa831c9
33 changed files with 698 additions and 115 deletions

115
phytopi/routes.py Normal file
View file

@ -0,0 +1,115 @@
from flask import render_template, Response, flash, jsonify, request, stream_with_context, send_file
from phytopi.camera.camera_pi import Camera
from phytopi.forms import CameraSettingsForm
from phytopi import app
from phytopi import db
from phytopi.models import Dataset
from io import BytesIO
import zipstream
camera = Camera(app=app)
# camera = app.camera
save_frames = False
@app.route('/')
@app.route('/index')
def index():
content = {'timelapse': save_frames}
return render_template('index.html', content=content)
@app.route('/toggle_timelapse', methods=['GET', 'POST'])
def start_stop_timelapse():
global save_frames
global current_dataset
global camera
if save_frames:
save_frames = False
timelapse_interval = None
btn_text = "Start"
btn_class = 'btn-primary'
camera.current_dataset = None
camera.last_saved = None
print(" > switched off timelapse mode")
else:
save_frames = True
timelapse_interval = 1200
btn_text = "Stop"
btn_class = 'btn-danger'
dataset = Dataset()
db.session.add(dataset)
db.session.commit()
camera.current_dataset = dataset.id
print(" > switched on timelapse mode")
camera.set_timelapse_interval(timelapse_interval)
return jsonify(btn_text=btn_text, btn_class=btn_class)
def gen(camera):
# def gen():
"""Video streaming generator function."""
while True:
frame = camera.get_frame(thumbnail=True)
yield (b'--frame\r\n'
b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')
@app.route('/data')
def data():
return Response(app.config['DATA_PATH'])
@app.route('/video_feed')
def video_feed():
global camera
return Response(gen(camera),
mimetype='multipart/x-mixed-replace; boundary=frame')
@app.route('/settings', methods=['GET', 'POST'])
def settings():
form = CameraSettingsForm()
return render_template('settings.html', form=form)
#global camera
#camera_settings = {'fps': camera.camera.framerate,
# 'iso': camera.camera.iso}
#return render_template('settings.html', settings=camera_settings)
@app.route('/datasets')
@app.route('/datasets/<dataset_id>')
def datasets(dataset_id=None):
if dataset_id:
dataset = Dataset.query.get(int(dataset_id))
data = dataset.images.all()
else:
data = Dataset.query.order_by(Dataset.datetime_created.desc()).all()
content = {'data': data,
'id': dataset_id}
return render_template('datasets.html', content=content)
@app.route('/datasets/<dataset_id>/delete')
def dataset_delete(dataset_id):
Dataset.query.filter_by(id=dataset_id).delete()
db.session.commit()
return datasets()
@app.route('/datasets/<dataset_id>/download')
def dataset_download(dataset_id):
images = Dataset.query.get(int(dataset_id)).images.all()
def generateZip(images):
zf = zipstream.ZipFile(mode='w', compression=zipstream.ZIP_DEFLATED)
for image in images:
filename = '{}/{}'.format(app.config['DATA_PATH'], image.filename)
zf.write(filename, arcname=image.filename)
for chunk in zf:
yield chunk
zf.close()
#return send_file(generateZip(images), attachment_filename='dataset_{}.zip'.format(dataset_id), as_attachment=True)
response = Response(stream_with_context(generateZip(images)), mimetype='application/zip')
response.headers['Content-Disposition'] = 'attachment; filename=dataset_{}.zip'.format(dataset_id)
return response