models, get, post
This commit is contained in:
parent
18cdd67b1c
commit
feac17bc5c
2
SmearcarDB/.gitignore
vendored
2
SmearcarDB/.gitignore
vendored
@ -108,3 +108,5 @@ venv.bak/
|
|||||||
|
|
||||||
# Other
|
# Other
|
||||||
*.p
|
*.p
|
||||||
|
*.txt
|
||||||
|
*.db
|
||||||
|
|||||||
@ -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")
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user