aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBryan Newbold <bnewbold@robocracy.org>2018-04-14 12:11:08 -0700
committerBryan Newbold <bnewbold@robocracy.org>2018-04-14 12:11:08 -0700
commit91b4fb3e3224f11d2ce79010252000e65ab81cda (patch)
treed453634ea8649c60aa8b1d699bd68338755830f6
parentf9e2fd649acb273377ac4d2f4f65e9ac55477435 (diff)
downloadfatcat-91b4fb3e3224f11d2ce79010252000e65ab81cda.tar.gz
fatcat-91b4fb3e3224f11d2ce79010252000e65ab81cda.zip
start marshmallow refactor
-rw-r--r--fatcat/api.py22
-rw-r--r--fatcat/models.py68
-rw-r--r--fatcat/sql.py4
-rw-r--r--tests/test_backend.py2
4 files changed, 80 insertions, 16 deletions
diff --git a/fatcat/api.py b/fatcat/api.py
index 175d4d82..b7da49d9 100644
--- a/fatcat/api.py
+++ b/fatcat/api.py
@@ -12,10 +12,24 @@ from fatcat.sql import *
def api_work_get(work_id):
if not work_id.isdigit():
return abort(404)
- work = hydrate_work(work_id)
- return jsonify(work)
+ #work = hydrate_work(work_id)
+ #return jsonify(work)
+ entity = WorkIdent.query.filter(WorkIdent.id==work_id).first_or_404()
+ return work_schema.jsonify(entity)
@app.route('/v0/work/random', methods=['GET'])
def api_work_random():
- work = WorkIdent.query.order_by(db.func.random()).first()
- return redirect('/v0/work/{}'.format(work.id))
+ entity = WorkIdent.query.order_by(db.func.random()).first()
+ return redirect('/v0/work/{}'.format(entity.id))
+
+@app.route('/v0/file/<file_id>', methods=['GET'])
+def api_file_get(file_id):
+ if not file_id.isdigit():
+ return abort(404)
+ entity = FileIdent.query.filter(FileIdent.id==file_id).first_or_404()
+ return file_schema.jsonify(entity)
+
+@app.route('/v0/file/random', methods=['GET'])
+def api_file_random():
+ entity = FileIdent.query.order_by(db.func.random()).first()
+ return redirect('/v0/file/{}'.format(entity.id))
diff --git a/fatcat/models.py b/fatcat/models.py
index aeb3623b..00478b08 100644
--- a/fatcat/models.py
+++ b/fatcat/models.py
@@ -12,7 +12,7 @@ possible refactors:
- use mixins for entities
"""
-from marshmallow import post_load
+from marshmallow import post_dump
from fatcat import db, ma
@@ -71,7 +71,7 @@ class WorkIdent(db.Model):
"""
__tablename__ = 'work_ident'
id = db.Column(db.Integer, primary_key=True, nullable=False)
- live = db.Column(db.Boolean, nullable=False, default=False)
+ is_live = db.Column(db.Boolean, nullable=False, default=False)
rev_id = db.Column(db.ForeignKey('work_rev.id'), nullable=True)
redirect_id = db.Column(db.ForeignKey('work_ident.id'), nullable=True)
revision = db.relationship("WorkRev")
@@ -112,7 +112,7 @@ class ReleaseRev(db.Model):
class ReleaseIdent(db.Model):
__tablename__ = 'release_ident'
id = db.Column(db.Integer, primary_key=True)
- live = db.Column(db.Boolean, nullable=False, default=False)
+ is_live = db.Column(db.Boolean, nullable=False, default=False)
rev_id = db.Column(db.ForeignKey('release_rev.id'))
redirect_id = db.Column(db.ForeignKey('release_ident.id'), nullable=True)
revision = db.relationship("ReleaseRev")
@@ -139,7 +139,7 @@ class CreatorRev(db.Model):
class CreatorIdent(db.Model):
__tablename__ = 'creator_ident'
id = db.Column(db.Integer, primary_key=True)
- live = db.Column(db.Boolean, nullable=False, default=False)
+ is_live = db.Column(db.Boolean, nullable=False, default=False)
rev_id = db.Column(db.ForeignKey('creator_rev.id'))
redirect_id = db.Column(db.ForeignKey('creator_ident.id'), nullable=True)
revision = db.relationship("CreatorRev")
@@ -168,7 +168,7 @@ class ContainerRev(db.Model):
class ContainerIdent(db.Model):
__tablename__ = 'container_ident'
id = db.Column(db.Integer, primary_key=True)
- live = db.Column(db.Boolean, nullable=False, default=False)
+ is_live = db.Column(db.Boolean, nullable=False, default=False)
rev_id = db.Column(db.ForeignKey('container_rev.id'))
redirect_id = db.Column(db.ForeignKey('container_ident.id'), nullable=True)
revision = db.relationship("ContainerRev")
@@ -196,7 +196,7 @@ class FileRev(db.Model):
class FileIdent(db.Model):
__tablename__ = 'file_ident'
id = db.Column(db.Integer, primary_key=True)
- live = db.Column(db.Boolean, nullable=False, default=False)
+ is_live = db.Column(db.Boolean, nullable=False, default=False)
rev_id = db.Column('revision', db.ForeignKey('file_rev.id'))
redirect_id = db.Column(db.ForeignKey('file_ident.id'), nullable=True)
revision = db.relationship("FileRev")
@@ -216,15 +216,14 @@ class FileEdit(db.Model):
class EditGroup(db.Model):
__tablename__ = 'edit_group'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
- editor = db.Column(db.ForeignKey('editor.id'))
- description = db.Column(db.String)
editor = db.Column(db.ForeignKey('editor.id'), nullable=False)
+ description = db.Column(db.String)
class Editor(db.Model):
__tablename__ = 'editor'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String)
- group = db.Column(db.String)
+ is_admin = db.Column(db.Boolean, nullable=False, default=False)
class ChangelogEntry(db.Model):
__tablename__= 'changelog'
@@ -239,3 +238,54 @@ class ExtraJson(db.Model):
__tablename__ = 'extra_json'
sha1 = db.Column(db.String, primary_key=True)
json = db.Column(db.String)
+
+
+### Marshmallow Wrappers ####################################################
+
+# TODO: base class for entities and edits
+
+class WorkRevSchema(ma.ModelSchema):
+ class Meta:
+ model = WorkRev
+
+class WorkSchema(ma.ModelSchema):
+
+ @post_dump(pass_many=False)
+ def merge_rev(self, data):
+ if data.get('revision', None):
+ rev_id = data['revision'].pop('id')
+ data.update(data['revision'])
+ data.pop('revision')
+ data['rev'] = rev_id
+ if not data.get('redirect_id', None):
+ data['redirect_id'] = None
+
+ class Meta:
+ model = WorkIdent
+
+ revision = ma.Nested(WorkRevSchema)
+
+work_schema = WorkSchema()
+
+class FileSchema(ma.ModelSchema):
+
+ @post_dump(pass_many=False)
+ def merge_rev(self, data):
+ if data['revision']:
+ data['revision'].pop('id')
+ data.update(data['revision'])
+ data.pop('revision')
+
+ class Meta:
+ model = FileIdent
+
+file_schema = FileSchema()
+
+class FileEditSchema(ma.ModelSchema):
+ class Meta:
+ model = FileEdit
+
+class EditGroupSchema(ma.ModelSchema):
+ class Meta:
+ model = EditGroup
+
diff --git a/fatcat/sql.py b/fatcat/sql.py
index c38e6f0e..3a9f0544 100644
--- a/fatcat/sql.py
+++ b/fatcat/sql.py
@@ -84,7 +84,7 @@ def hydrate_work(wid):
"_type": "work",
"id": wid,
"rev": work.rev_id,
- "is_live": work.live,
+ "is_live": work.is_live,
"redirect_id": work.redirect_id,
}
if not work.revision:
@@ -115,7 +115,7 @@ def hydrate_release(rid):
"id": rid,
"revision": release.rev_id,
#"edit_id": release.revision.edit_id,
- "is_live": release.live,
+ "is_live": release.is_live,
"work_id": release.revision.work_ident_id,
"release_type": release.revision.release_type,
diff --git a/tests/test_backend.py b/tests/test_backend.py
index 7a139ef7..4c9169f3 100644
--- a/tests/test_backend.py
+++ b/tests/test_backend.py
@@ -12,7 +12,7 @@ import tempfile
## Helpers ##################################################################
def check_entity_fields(e):
- for key in ('id', 'rev', 'redirect_id'):
+ for key in ('id', 'rev', 'is_live', 'redirect_id'):
assert key in e
for key in ('id',):
assert e[key] is not None