diff --git a/SmearcarDB/server.py b/SmearcarDB/server.py index 081d982..eb6e247 100644 --- a/SmearcarDB/server.py +++ b/SmearcarDB/server.py @@ -1,8 +1,7 @@ -import pickle from flask import Flask from flask import render_template, jsonify, request from flask_sqlalchemy import SQLAlchemy -import ulid +import time app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///data.db' @@ -12,8 +11,6 @@ app.config.update( ) db = SQLAlchemy(app) -# TODO Updates table (add, edit, delete) (author, date, title, content) -# TODO convert pickle to db class Frequency(db.Model): language_id = db.Column(db.Integer, db.ForeignKey('language.id'), primary_key=True) @@ -34,6 +31,15 @@ class Phoneme(db.Model): name = db.Column(db.String(5), nullable=False, unique=True) +class Update(db.Model): + id = db.Column(db.Integer, primary_key=True, autoincrement=True) + author = db.Column(db.String(30), nullable=False) + title = db.Column(db.String(100), nullable=False) + content = db.Column(db.Text, nullable=False) + date = db.Column(db.BigInteger, nullable=False, + default=int(time.time()*1000)) + + def database(): final = {'values': []} final['languages'] = [f.name for f in Language.query.all()] @@ -48,13 +54,6 @@ def database(): final['values'].append(languageobject) return final -patch_functions = { - "phoneme_add": phoneme_add, # Add and edit value - "phoneme_remove": phoneme_remove, # Remove association and phoneme if necessary - # "language_name_edit": language_name_edit, # Change language name - # "language_source_add": language_source_add # Add/edit source -} - def phoneme_add(info): """Add or edit value associated with phoneme.""" @@ -66,7 +65,9 @@ def phoneme_add(info): phoneme = Phoneme.query.filter_by(name=info['phoneme']).first() language = Language.query.filter_by(id=info['language_id']).first() if phoneme: - link = Frequency.query.filter_by(language_id=language.id, phoneme_id=phoneme.id).first() + link = Frequency.query.filter_by( + language_id=language.id, + phoneme_id=phoneme.id).first() link.value = info['value'] else: phoneme = Phoneme(name=info['phoneme']) @@ -82,9 +83,44 @@ def phoneme_remove(info): # language_id: language_id, # phoneme_id: phoneme_id # } - pass + phoneme = Phoneme.query.filter_by(id=info['phoneme_id']).first() + language = Language.query.filter_by(id=info['language_id']).first() + frequency = Frequency.query.filter_by( + phoneme_id=info['phoneme_id'], language_id=info['language_id']).first() + + if Frequency.query.filter_by(phoneme_id=info['phoneme_id']).count() == 1: + # Delete phoneme + db.session.delete(phoneme) + + language.phonemes = [frequency for frequency in language.phonemes + if frequency.phoneme_id != info['phoneme_id']] + db.session.delete(frequency) +def language_name_edit(info): + """Edit the name of a Language.""" + # info = { + # language_id: language_id, + # language_name: name + # } + Language.query.filter_by(id=info['language_id']).first().name = info['language_name'] + + +def language_source_add(info): + """Add or replace a source""" + # info = { + # language_id: language_id, + # language_source = source + # } + Language.query.filter_by(id=info['language_id']).first().source = info['language_source'] + + +patch_functions = { + "phoneme_add": phoneme_add, # Add and edit value + "phoneme_remove": phoneme_remove, # Remove association and/or phoneme + "language_name_edit": language_name_edit, # Change language name + "language_source_add": language_source_add # Add/edit source +} # Render the client at the default URL @@ -101,7 +137,6 @@ def file_return(lang_id): # 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": @@ -126,17 +161,36 @@ def backend(): db.session.commit() # return jsonify(database()) - # PATCH method inputs edited language and returns updated database elif request.method == "PATCH": recieved = request.get_json() patch_functions[recieved['action']](recieved['data']) db.session.commit() - # database['values'] = [newlanguage if language['id'] == newlanguage['id'] else language for language in database['values']] - # saveDatabase() return jsonify(database()) +# Manipulate Updates +@app.route("/updates", methods=["GET", "POST", "PATCH"]) +def updates(): + if request.method == "POST": + recieved = request.get_json() + update = Update(author=recieved['author'], + title=recieved['title'], + content=recieved['content']) + db.session.add(update) + elif request.method == "PATCH": + update = Update.query.filter_by(id=recieved['id']).first() + update.name = recieved['author'] + update.title = recieved['title'] + update.content = recieved['content'] + db.session.commit() + return jsonify([{"author": update.name, + "id": update.id, + "title": update.title, + "content": update.content, + "date": update.date} + for update in Update.query.all()]) + # if __name__ == "__main__": # app.run(host="0.0.0.0")