models, get, post

This commit is contained in:
Yaman Qalieh 2018-01-28 23:27:09 -05:00
parent 18cdd67b1c
commit feac17bc5c
2 changed files with 61 additions and 38 deletions

View File

@ -108,3 +108,5 @@ venv.bak/
# Other # Other
*.p *.p
*.txt
*.db

View File

@ -1,72 +1,93 @@
import pickle import pickle
from flask import Flask from flask import Flask
from flask import render_template, jsonify, request from flask import render_template, jsonify, request
from flask_sqlalchemy import SQLAlchemy
import ulid import ulid
app = Flask(__name__) app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///data.db'
app.config.update( app.config.update(
DEBUG=True, DEBUG=True,
TEMPLATES_AUTO_RELOAD=True TEMPLATES_AUTO_RELOAD=True
) )
db = SQLAlchemy(app)
try:
with open("save.p", "rb") as f:
database = pickle.load(f)
# Can be commented out after non-id languages are all converted
for item in database['values']:
if not 'id' in item:
item['id'] = ulid.new().str
except (FileNotFoundError) as e:
database = {'languages': [],
'phonemes': [],
'values': []}
def saveDatabase(): class Frequency(db.Model):
# Save copy under separate name language_id = db.Column(db.Integer, db.ForeignKey('language.id'), primary_key=True)
with open("newestsave.p", "wb") as f: phoneme_id = db.Column(db.Integer, db.ForeignKey('phoneme.id'), primary_key=True)
pickle.dump(database, f) value = db.Column(db.Float(6), nullable=False)
phoneme = db.relationship('Phoneme')
class Language(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(100), nullable=False)
source = db.Column(db.LargeBinary)
phonemes = db.relationship('Frequency')
class Phoneme(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(5), nullable=False)
def database():
final = {'values': []}
final['languages'] = [f.name for f in Language.query.all()]
final['phonemes'] = [f.name for f in Phoneme.query.all()]
for language in Language.query.all():
languageobject = {'name': language.name,
'source': language.source,
'phonemes': {}}
languageobject['name'] = language.name
for frequency in language.phonemes:
languageobject['phonemes'][frequency.phoneme.name] = frequency.value
final['values'].append(languageobject)
return final
# Render the client at the default URL # Render the client at the default URL
@app.route("/") @app.route("/")
def initial(): def initial():
return render_template('index.html') return render_template('index.html')
# Place for client to communicate with the server # Place for client to communicate with the server
@app.route("/server", methods=["GET", "POST", "PATCH"]) @app.route("/server", methods=["GET", "POST", "PATCH"])
# TODO add more methods # TODO add more methods
def backend(): def backend():
# GET method returns the latest database # GET method returns the latest database
if request.method == "GET": if request.method == "GET":
return jsonify(database) return jsonify(database())
# POST method appends input to database['values'] # POST method appends input to database['values']
elif request.method == "POST": elif request.method == "POST":
newlanguage = request.get_json() recieved = request.get_json()
newlanguage['id'] = ulid.new().str language = Language(name=recieved['name'], source=recieved['source'])
database['values'].append(newlanguage) db.session.add(language)
# Add new phonemes for phoneme, value in recieved['phonemes'].items():
newphonemes = list(newlanguage[ 'phonemes' ]) with db.session.no_autoflush:
uniquephonemes = list(set(newphonemes) - set(database[ 'phonemes' ])) search = Phoneme.query.filter_by(name=phoneme).first()
database['phonemes'] = database['phonemes'] + uniquephonemes print(search)
if not search:
search = Phoneme(name=phoneme)
db.session.add(search)
link = Frequency(value=value, phoneme=search)
language.phonemes.append(link)
db.session.add(link)
db.session.commit()
return jsonify(database())
# Add new language
newlangname = {newlanguage['name']}
uniquelanguages = list(newlangname - set(database['languages']))
database['languages'] = database['languages'] + uniquelanguages
saveDatabase() # # PATCH method inputs edited language and returns updated database
return jsonify(database) # elif request.method == "PATCH":
# newlanguage = request.get_json()
# database['values'] = [newlanguage if language['id'] == newlanguage['id'] else language for language in database['values']]
# saveDatabase()
# return jsonify(database())
# PATCH method inputs edited language and returns updated database
elif request.method == "PATCH":
newlanguage = request.get_json()
database['values'] = [newlanguage if language['id'] == newlanguage['id'] else language for language in database['values']]
saveDatabase()
return jsonify(database)
else:
return
if __name__ == "__main__": if __name__ == "__main__":
app.run(host="0.0.0.0") app.run(host="0.0.0.0")