158 lines
5.9 KiB
Python
158 lines
5.9 KiB
Python
from flask import Flask, render_template, request, flash, redirect
|
|
import datetime
|
|
from sqlalchemy import create_engine, Column, Integer, String, Date
|
|
from sqlalchemy.ext.declarative import declarative_base
|
|
from sqlalchemy.orm import sessionmaker
|
|
import pymysql
|
|
|
|
app = Flask(__name__)
|
|
app.config['SECRET_KEY'] = 'fa6166b0218186fb852429060105aca18e0f979240be8ebf'
|
|
|
|
Base = declarative_base()
|
|
|
|
|
|
class Dates(Base):
|
|
__tablename__ = 'Dates'
|
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
|
dateTypeID = Column(Integer)
|
|
dateValue = Column(Date)
|
|
|
|
|
|
class DatesMetadata(Base):
|
|
__tablename__ = 'DatesMetadata'
|
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
|
dateTypeID = Column(Integer)
|
|
DateTypeName = Column(String(50))
|
|
|
|
|
|
class Settings(Base):
|
|
__tablename__ = 'Settings'
|
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
|
settingType = Column(Integer)
|
|
settingValue = Column(String(50))
|
|
|
|
|
|
class SettingsMetadata(Base):
|
|
__tablename__ = 'SettingsMetadata'
|
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
|
settingTypeID = Column(Integer)
|
|
settingTypeName = Column(String(50))
|
|
|
|
|
|
engine = create_engine('mysql+pymysql://hydro:pRnCWH/M)dujdifi@db.dandembinski.com:3306/Hydro')
|
|
Dates.__table__.create(bind=engine, checkfirst=True)
|
|
Settings.__table__.create(bind=engine, checkfirst=True)
|
|
DatesMetadata.__table__.create(bind=engine, checkfirst=True)
|
|
SettingsMetadata.__table__.create(bind=engine, checkfirst=True)
|
|
|
|
Session = sessionmaker(bind=engine)
|
|
|
|
|
|
@app.route('/', methods=('GET', 'POST'))
|
|
@app.route('/index.html', methods=('GET', 'POST'))
|
|
def index():
|
|
session = Session()
|
|
|
|
installCheck = session.query(Dates).first() is None
|
|
if installCheck is True:
|
|
# session.close()
|
|
return redirect('install.html')
|
|
|
|
# Init the dates dict
|
|
dates = {'plant': '', 'last': '', 'next': '', 'freq': ''}
|
|
alerts = {'text': '', 'email': ''}
|
|
# alerts = {'text': False, 'email': True}
|
|
|
|
# Get the feeding frequency and set it to an int
|
|
dates['freq'] = int(session.query(Settings).filter_by(settingType=3).first().settingValue)
|
|
|
|
alerts = {'text': False, 'email': False}
|
|
|
|
# If clicked the update button for dates, grab the new values and save them to the db. Then render the template
|
|
if request.method == 'POST':
|
|
dates['plant'] = request.form['plantDate']
|
|
dates['last'] = request.form['lastDate']
|
|
dates['next'] = datetime.datetime.strptime(dates['last'], '%Y-%m-%d') + datetime.timedelta(days=dates['freq'])
|
|
session.query(Dates).filter_by(dateTypeID=1).update({Dates.dateValue: dates['plant']})
|
|
session.query(Dates).filter_by(dateTypeID=2).update({Dates.dateValue: dates['last']})
|
|
session.query(Dates).filter_by(dateTypeID=3).update({Dates.dateValue: dates['next']})
|
|
|
|
# grab text message alert box. Set 'True' if checked or null if unchecked
|
|
if request.form.get('AlertText'):
|
|
alerts['text'] = 'True'
|
|
else:
|
|
alerts['text'] = None
|
|
# grab email message alert box. Set 'True' if checked or null if unchecked
|
|
if request.form.get('AlertEmail'):
|
|
alerts['email'] = 'True'
|
|
else:
|
|
alerts['email'] = None
|
|
|
|
session.query(Settings).filter_by(settingType=1).update({Settings.settingValue: alerts['text']})
|
|
session.query(Settings).filter_by(settingType=2).update({Settings.settingValue: alerts['email']})
|
|
|
|
session.commit()
|
|
# return render_template("index.html", plant=dates, alerts=alerts)
|
|
return redirect('index.html')
|
|
# If regular page load, grab all the dates from the db and render the template
|
|
else:
|
|
dates['plant'] = session.query(Dates).filter_by(dateTypeID=1).first().dateValue
|
|
dates['last'] = session.query(Dates).filter_by(dateTypeID=2).first().dateValue
|
|
dates['next'] = session.query(Dates).filter_by(dateTypeID=3).first().dateValue
|
|
|
|
alerts['text'] = session.query(Settings).filter_by(settingType=1).first().settingValue
|
|
alerts['email'] = session.query(Settings).filter_by(settingType=2).first().settingValue
|
|
|
|
return render_template("index.html", plant=dates, alerts=alerts)
|
|
|
|
|
|
@app.route('/updateFeed')
|
|
def updateFeed():
|
|
session = Session()
|
|
|
|
dates = {'plant': '', 'last': '', 'next': '', 'freq': ''}
|
|
dates['freq'] = int(session.query(Settings).filter_by(settingType=3).first().settingValue)
|
|
dates['last'] = datetime.date.today()
|
|
dates['next'] = dates['last'] + datetime.timedelta(days=dates['freq'])
|
|
session.query(Dates).filter_by(dateTypeID=2).update({Dates.dateValue: dates['last']})
|
|
session.query(Dates).filter_by(dateTypeID=3).update({Dates.dateValue: dates['next']})
|
|
|
|
session.commit()
|
|
session.close()
|
|
return redirect('/index.html')
|
|
|
|
|
|
@app.route('/install.html')
|
|
def install():
|
|
session = Session()
|
|
|
|
populateDate = datetime.date.today()
|
|
|
|
# Populate Dates Table
|
|
session.add(Dates(dateTypeID=1, dateValue=populateDate))
|
|
session.add(Dates(dateTypeID=2, dateValue=populateDate))
|
|
session.add(Dates(dateTypeID=3, dateValue=populateDate))
|
|
|
|
# Populate DatesMetadata
|
|
session.add(DatesMetadata(dateTypeID=1, DateTypeName='Plant Date'))
|
|
session.add(DatesMetadata(dateTypeID=2, DateTypeName='Last Feeding Date'))
|
|
session.add(DatesMetadata(dateTypeID=3, DateTypeName='Next Feeding Date'))
|
|
|
|
# Populate Settings
|
|
session.add(Settings(settingType=1, settingValue='False'))
|
|
session.add(Settings(settingType=2, settingValue='False'))
|
|
session.add(Settings(settingType=3, settingValue='14'))
|
|
|
|
# Populate SettingsMetadata
|
|
session.add(SettingsMetadata(settingTypeID=1, settingTypeName='Text'))
|
|
session.add(SettingsMetadata(settingTypeID=2, settingTypeName='Email'))
|
|
session.add(SettingsMetadata(settingTypeID=3, settingTypeName='Feeding Frequency'))
|
|
|
|
session.commit()
|
|
|
|
return redirect('index.html')
|
|
|
|
|
|
if __name__ == '__main__':
|
|
serve(app, host='0.0.0.0', port=8000)
|