From feac17bc5ca30f4b5fb5b5894dd9173745014e1f Mon Sep 17 00:00:00 2001 From: Yaman Qalieh Date: Sun, 28 Jan 2018 23:27:09 -0500 Subject: [PATCH] models, get, post --- SmearcarDB/.gitignore | 2 + SmearcarDB/server.py | 97 ++++++++++++++++++++++++++----------------- 2 files changed, 61 insertions(+), 38 deletions(-) diff --git a/SmearcarDB/.gitignore b/SmearcarDB/.gitignore index 3ce1870..6e71737 100644 --- a/SmearcarDB/.gitignore +++ b/SmearcarDB/.gitignore @@ -108,3 +108,5 @@ venv.bak/ # Other *.p +*.txt +*.db diff --git a/SmearcarDB/server.py b/SmearcarDB/server.py index 0c035d7..ca004e9 100644 --- a/SmearcarDB/server.py +++ b/SmearcarDB/server.py @@ -1,72 +1,93 @@ import pickle from flask import Flask from flask import render_template, jsonify, request +from flask_sqlalchemy import SQLAlchemy import ulid app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///data.db' app.config.update( DEBUG=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(): - # Save copy under separate name - with open("newestsave.p", "wb") as f: - pickle.dump(database, f) +class Frequency(db.Model): + language_id = db.Column(db.Integer, db.ForeignKey('language.id'), primary_key=True) + phoneme_id = db.Column(db.Integer, db.ForeignKey('phoneme.id'), primary_key=True) + 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 @app.route("/") def initial(): return render_template('index.html') + # Place for client to communicate with the server @app.route("/server", methods=["GET", "POST", "PATCH"]) # TODO add more methods def backend(): # GET method returns the latest database if request.method == "GET": - return jsonify(database) + return jsonify(database()) # POST method appends input to database['values'] elif request.method == "POST": - newlanguage = request.get_json() - newlanguage['id'] = ulid.new().str - database['values'].append(newlanguage) + recieved = request.get_json() + language = Language(name=recieved['name'], source=recieved['source']) + db.session.add(language) - # Add new phonemes - newphonemes = list(newlanguage[ 'phonemes' ]) - uniquephonemes = list(set(newphonemes) - set(database[ 'phonemes' ])) - database['phonemes'] = database['phonemes'] + uniquephonemes + for phoneme, value in recieved['phonemes'].items(): + with db.session.no_autoflush: + search = Phoneme.query.filter_by(name=phoneme).first() + 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() - 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()) - # 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__": app.run(host="0.0.0.0")