diff options
| -rw-r--r-- | fatcat/api.py | 21 | ||||
| -rw-r--r-- | fatcat/api_client.py | 21 | ||||
| -rw-r--r-- | fatcat/models.py | 16 | ||||
| -rw-r--r-- | fatcat/routes.py | 21 | ||||
| -rw-r--r-- | fatcat/templates/editgroup_view.html | 8 | ||||
| -rw-r--r-- | fatcat/templates/editor_changelog.html | 17 | ||||
| -rw-r--r-- | fatcat/templates/editor_view.html | 9 | ||||
| -rw-r--r-- | tests/api.py | 21 | ||||
| -rw-r--r-- | tests/routes.py | 6 | 
9 files changed, 119 insertions, 21 deletions
| diff --git a/fatcat/api.py b/fatcat/api.py index 905a4317..60d0ba0c 100644 --- a/fatcat/api.py +++ b/fatcat/api.py @@ -10,7 +10,7 @@ from fatcat.sql import *  def get_or_create_edit_group(param=None):      if param != None: -        edit_group = EditGroup.query.filter(EditGroup.id==1).first_or_404() +        edit_group = EditGroup.query.filter(EditGroup.id==int(param)).first_or_404()          return edit_group      editor = Editor.query.filter(Editor.id==1).first()      if editor.active_edit_group: @@ -219,7 +219,9 @@ def api_file_create():  @app.route('/v0/editgroup/<int:ident>', methods=['GET'])  def api_edit_group_get(ident): -    entity = EditGroup.query.filter(EditGroup.id==ident).first_or_404() +    entity = EditGroup.query\ +        .join(EditGroup.editor)\ +        .filter(EditGroup.id==ident).first_or_404()      # TODO: fill in all the related edit types...      return edit_group_schema.jsonify(entity) @@ -242,3 +244,18 @@ def api_edit_group_accept(ident):      entity = EditGroup.query.filter(EditGroup.id==ident).first_or_404()      accept_editgroup(entity)      return jsonify({'success': True}) + + +@app.route('/v0/editor/<username>', methods=['GET']) +def api_editor_get(username): +    entity = Editor.query.filter(Editor.username==username).first_or_404() +    return editor_schema.jsonify(entity) + +@app.route('/v0/editor/<username>/changelog', methods=['GET']) +def api_editor_changelog(username): +    entries = ChangelogEntry.query\ +        .join(ChangelogEntry.edit_group)\ +        .join(EditGroup.editor)\ +        .filter(Editor.username==username)\ +        .all() +    return changelogentry_schema.jsonify(entries, many=True) diff --git a/fatcat/api_client.py b/fatcat/api_client.py index 12c70407..181c3ca7 100644 --- a/fatcat/api_client.py +++ b/fatcat/api_client.py @@ -9,11 +9,9 @@ class FatCatApiClient:          self.host_url = host_url          self.session = requests.Session() -      def get(self, path):          return self.session.get(self.host_url + path) -      def post(self, path, data=None, headers=None):          hdrs = {"content-type": "application/json"}          if headers: @@ -22,22 +20,27 @@ class FatCatApiClient:          #    data = json.dumps(data, indent=None).encode('utf-8')          return self.session.post(self.host_url + path, json=data, headers=hdrs) -      def import_crossref_file(self, json_file): +        eg = self.new_edit_group()          with open(json_file, 'r') as file:              for line in file:                  obj = json.loads(line) -                self.import_crossref_dict(obj) - +                self.import_crossref_dict(obj, editgroup=eg) +        self.accept_editgroup(eg)      def new_edit_group(self): -        rv = self.post('/v0/editgroup') +        rv = self.post('/v0/editgroup', data=dict( +            editor=1))          assert rv.status_code == 200          editgroup_id = rv.json()['id']          return editgroup_id +    def accept_editgroup(self, eg): +        rv = self.post('/v0/editgroup/{}/accept'.format(eg)) +        assert rv.status_code == 200 +        return rv -    def import_crossref_dict(self, meta): +    def import_crossref_dict(self, meta, editgroup=None):          # creators          creators = [] @@ -71,7 +74,7 @@ class FatCatApiClient:          # work and release          title = meta['title'][0]          rv = self.post('/v0/work', -            data=dict(title=title)) #work_type="book" +            data=dict(title=title, editgroup=editgroup)) #work_type="book"          assert rv.status_code == 200          work_id = rv.json()['id'] @@ -88,6 +91,7 @@ class FatCatApiClient:              issue=meta.get('issue', None),              volume=meta.get('volume', None),              pages=meta.get('page', None), +            editgroup=editgroup,              extra=dict(crossref={                  'links': meta.get('link', []),                  'subject': meta['subject'], @@ -96,7 +100,6 @@ class FatCatApiClient:          assert rv.status_code == 200          release_id = rv.json()['id'] -      def health(self):          rv = self.get("/health")          assert rv.status_code == 200 diff --git a/fatcat/models.py b/fatcat/models.py index 957c929f..01aef79f 100644 --- a/fatcat/models.py +++ b/fatcat/models.py @@ -246,15 +246,15 @@ class EditGroup(db.Model):      id = db.Column(db.Integer, primary_key=True, autoincrement=True)      editor_id = db.Column(db.ForeignKey('editor.id'), nullable=False)      description = db.Column(db.String) -    editor = db.relationship('Editor', foreign_keys='EditGroup.editor_id')      extra_json_id = db.Column(db.ForeignKey('extra_json.sha1'), nullable=True)      extra_json = db.relationship("ExtraJson") -    # TODO: changelog entry relationship + +    editor = db.relationship("Editor", foreign_keys="EditGroup.editor_id")  class Editor(db.Model):      __tablename__ = 'editor'      id = db.Column(db.Integer, primary_key=True, autoincrement=True) -    username = db.Column(db.String) +    username = db.Column(db.String, nullable=False, unique=True)      is_admin = db.Column(db.Boolean, nullable=False, default=False)      active_edit_group_id = db.Column(db.ForeignKey('edit_group.id', use_alter=True))      active_edit_group = db.relationship('EditGroup', foreign_keys='Editor.active_edit_group_id') @@ -264,6 +264,7 @@ class ChangelogEntry(db.Model):      id = db.Column(db.Integer, primary_key=True, autoincrement=True)      edit_group_id = db.Column(db.ForeignKey('edit_group.id'))      timestamp = db.Column(db.Integer) +    edit_group = db.relationship("EditGroup")  ### Other ################################################################### @@ -441,6 +442,13 @@ class EditorSchema(ma.ModelSchema):  class EditGroupSchema(ma.ModelSchema):      class Meta:          model = EditGroup +    editor = ma.Nested(EditorSchema) -editor_schema = EditGroupSchema() +editor_schema = EditorSchema()  edit_group_schema = EditGroupSchema() + +class ChangelogEntrySchema(ma.ModelSchema): +    class Meta: +        model = ChangelogEntry + +changelogentry_schema = ChangelogEntrySchema() diff --git a/fatcat/routes.py b/fatcat/routes.py index 3bfcf58a..75411da9 100644 --- a/fatcat/routes.py +++ b/fatcat/routes.py @@ -83,6 +83,27 @@ def editgroup_current(ident):      eg = api.get_or_create_edit_group()      return redirect('/editgroup/{}'.format(eg.id)) +@app.route('/editor/<username>', methods=['GET']) +def editor_view(username): +    rv = api.api_editor_get(username) +    if rv.status_code != 200: +        # TODO: better wrapping for all entities +        return abort(rv.status_code) +    entity = json.loads(rv.data.decode('utf-8')) +    return render_template('editor_view.html', editor=entity) + +@app.route('/editor/<username>/changelog', methods=['GET']) +def editor_changelog(username): +    rv = api.api_editor_get(username) +    if rv.status_code != 200: +        # TODO: better wrapping for all entities +        return abort(rv.status_code) +    editor = json.loads(rv.data.decode('utf-8')) +    rv = api.api_editor_changelog(username) +    changelog_entries = json.loads(rv.data.decode('utf-8')) +    return render_template('editor_changelog.html', editor=editor, +        changelog_entries=changelog_entries) +  ### Static Routes ########################################################### diff --git a/fatcat/templates/editgroup_view.html b/fatcat/templates/editgroup_view.html index 13eb2d7f..144c9502 100644 --- a/fatcat/templates/editgroup_view.html +++ b/fatcat/templates/editgroup_view.html @@ -1,13 +1,9 @@  {% extends "base.html" %}  {% block body %} -<h1>Edit Group: {{ editgroup.id}}</h1> +<h1>Edit Group: #{{ editgroup.id}}</h1> -    description = db.Column(db.String) -    editor = db.relationship('Editor', foreign_keys='EditGroup.editor_id') - - -<p>Editor: <a href="/editor/{{ editgroup.editor.id }}">{{ editgroup.editor.username }}</a> +<p>Editor: <a href="/editor/{{ editgroup.editor.username }}">{{ editgroup.editor.username }}</a>  <p>Description: {{ editgroup.description }}  <p>TODO: list edits by type...</p> diff --git a/fatcat/templates/editor_changelog.html b/fatcat/templates/editor_changelog.html new file mode 100644 index 00000000..5d87d82e --- /dev/null +++ b/fatcat/templates/editor_changelog.html @@ -0,0 +1,17 @@ +{% extends "base.html" %} +{% block body %} + +<h1>Editor Changelog: {{ editor.username }}</h1> + +<p>Editor: <a href="/editor/{{ editor.username }}">{{ editor.username }}</a> + +<p>Changes accepted (aka, merged editgroups): +<ul> +{% for entry in changelog_entries %} +  <li><a href="/editgroup/{{ entry.edit_group }}">Edit Group #{{ entry.edit_group }}</a> (on {{ entry.timestamp }}) +{% else %} +NONE +{% endfor %} +</ul> + +{% endblock %} diff --git a/fatcat/templates/editor_view.html b/fatcat/templates/editor_view.html new file mode 100644 index 00000000..e0625c42 --- /dev/null +++ b/fatcat/templates/editor_view.html @@ -0,0 +1,9 @@ +{% extends "base.html" %} +{% block body %} + +<h1>Editor: {{ editor.username }}</h1> + +<p>Is Admin? {{ editor.is_admin }} +<p><a href="/editor/{{ editor.username }}/changelog">Changelog</a> + +{% endblock %} diff --git a/tests/api.py b/tests/api.py index 8b495c61..5fff779e 100644 --- a/tests/api.py +++ b/tests/api.py @@ -287,3 +287,24 @@ def test_api_container_lookup(rich_app):          data=json.dumps(dict(issn="not_even_valid_issn")),          headers={"content-type": "application/json"})      assert rv.status_code == 400 + +def test_api_editor_get(rich_app): +    app = rich_app + +    rv = app.get('/v0/editor/admin', +        headers={"content-type": "application/json"}) +    assert rv.status_code == 200 +    obj = json.loads(rv.data.decode('utf-8')) +    print(obj) +    assert obj['username'] == "admin" +    assert obj['id'] == 1 + +def test_api_editor_changelog(rich_app): +    app = rich_app + +    rv = app.get('/v0/editor/admin/changelog', +        headers={"content-type": "application/json"}) +    assert rv.status_code == 200 +    obj = json.loads(rv.data.decode('utf-8')) +    print(obj) +    assert len(obj) == 1 diff --git a/tests/routes.py b/tests/routes.py index 49afc5ce..e389a55f 100644 --- a/tests/routes.py +++ b/tests/routes.py @@ -32,3 +32,9 @@ def test_all_views(rich_app):      rv = app.get('/editgroup/1')      assert rv.status_code == 200 + +    rv = app.get('/editor/admin') +    assert rv.status_code == 200 + +    rv = app.get('/editor/admin/changelog') +    assert rv.status_code == 200 | 
