summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBryan Newbold <bnewbold@robocracy.org>2018-06-30 20:30:51 -0700
committerBryan Newbold <bnewbold@robocracy.org>2018-06-30 20:31:00 -0700
commiteb9c5b9a8d0b55e0ddaec864a1810f5f5d963a3e (patch)
tree6154a519565d2b94fae54f32d9ea20088be4785c
parent9f40f6131cb08f14a8a5b4211af9c71ee474f3e6 (diff)
downloadfatcat-eb9c5b9a8d0b55e0ddaec864a1810f5f5d963a3e.tar.gz
fatcat-eb9c5b9a8d0b55e0ddaec864a1810f5f5d963a3e.zip
more fatcat-web views (changelog, history, etc)
-rw-r--r--python/README_codegen.md11
-rw-r--r--python/fatcat/routes.py162
-rw-r--r--python/fatcat/templates/changelog.html23
-rw-r--r--python/fatcat/templates/changelog_view.html13
-rw-r--r--python/fatcat/templates/container_create.html (renamed from python/fatcat/templates/container_add.html)0
-rw-r--r--python/fatcat/templates/editgroup_view.html50
-rw-r--r--python/fatcat/templates/editor_changelog.html10
-rw-r--r--python/fatcat/templates/editor_view.html6
-rw-r--r--python/fatcat/templates/entity_edit.html8
-rw-r--r--python/fatcat/templates/entity_history.html30
-rw-r--r--python/fatcat/templates/home.html6
-rw-r--r--python/fatcat/templates/release_create.html (renamed from python/fatcat/templates/work_add.html)0
-rw-r--r--python/fatcat_client/__init__.py4
-rw-r--r--python/fatcat_client/api/default_api.py701
-rw-r--r--python/fatcat_client/models/__init__.py4
-rw-r--r--python/fatcat_client/models/changelog_entry.py195
-rw-r--r--python/fatcat_client/models/entity_history_entry.py171
-rw-r--r--python/tests/codegen_tests/test_changelog_entry.py40
-rw-r--r--python/tests/codegen_tests/test_default_api.py42
-rw-r--r--python/tests/codegen_tests/test_entity_history_entry.py40
-rw-r--r--python/tests/routes.py30
21 files changed, 1488 insertions, 58 deletions
diff --git a/python/README_codegen.md b/python/README_codegen.md
index 6d436160..71e56fa0 100644
--- a/python/README_codegen.md
+++ b/python/README_codegen.md
@@ -80,17 +80,24 @@ Class | Method | HTTP request | Description
*DefaultApi* | [**create_release_batch**](docs/DefaultApi.md#create_release_batch) | **POST** /release/batch |
*DefaultApi* | [**create_work**](docs/DefaultApi.md#create_work) | **POST** /work |
*DefaultApi* | [**create_work_batch**](docs/DefaultApi.md#create_work_batch) | **POST** /work/batch |
+*DefaultApi* | [**get_changelog**](docs/DefaultApi.md#get_changelog) | **GET** /changelog |
+*DefaultApi* | [**get_changelog_entry**](docs/DefaultApi.md#get_changelog_entry) | **GET** /changelog/{id} |
*DefaultApi* | [**get_container**](docs/DefaultApi.md#get_container) | **GET** /container/{id} |
+*DefaultApi* | [**get_container_history**](docs/DefaultApi.md#get_container_history) | **GET** /container/{id}/history |
*DefaultApi* | [**get_creator**](docs/DefaultApi.md#get_creator) | **GET** /creator/{id} |
+*DefaultApi* | [**get_creator_history**](docs/DefaultApi.md#get_creator_history) | **GET** /creator/{id}/history |
*DefaultApi* | [**get_creator_releases**](docs/DefaultApi.md#get_creator_releases) | **GET** /creator/{id}/releases |
*DefaultApi* | [**get_editgroup**](docs/DefaultApi.md#get_editgroup) | **GET** /editgroup/{id} |
*DefaultApi* | [**get_editor**](docs/DefaultApi.md#get_editor) | **GET** /editor/{username} |
*DefaultApi* | [**get_editor_changelog**](docs/DefaultApi.md#get_editor_changelog) | **GET** /editor/{username}/changelog |
*DefaultApi* | [**get_file**](docs/DefaultApi.md#get_file) | **GET** /file/{id} |
+*DefaultApi* | [**get_file_history**](docs/DefaultApi.md#get_file_history) | **GET** /file/{id}/history |
*DefaultApi* | [**get_release**](docs/DefaultApi.md#get_release) | **GET** /release/{id} |
*DefaultApi* | [**get_release_files**](docs/DefaultApi.md#get_release_files) | **GET** /release/{id}/files |
+*DefaultApi* | [**get_release_history**](docs/DefaultApi.md#get_release_history) | **GET** /release/{id}/history |
*DefaultApi* | [**get_stats**](docs/DefaultApi.md#get_stats) | **GET** /stats |
*DefaultApi* | [**get_work**](docs/DefaultApi.md#get_work) | **GET** /work/{id} |
+*DefaultApi* | [**get_work_history**](docs/DefaultApi.md#get_work_history) | **GET** /work/{id}/history |
*DefaultApi* | [**get_work_releases**](docs/DefaultApi.md#get_work_releases) | **GET** /work/{id}/releases |
*DefaultApi* | [**lookup_container**](docs/DefaultApi.md#lookup_container) | **GET** /container/lookup |
*DefaultApi* | [**lookup_creator**](docs/DefaultApi.md#lookup_creator) | **GET** /creator/lookup |
@@ -100,14 +107,14 @@ Class | Method | HTTP request | Description
## Documentation For Models
- - [Changelogentries](docs/Changelogentries.md)
- - [ChangelogentriesInner](docs/ChangelogentriesInner.md)
+ - [ChangelogEntry](docs/ChangelogEntry.md)
- [ContainerEntity](docs/ContainerEntity.md)
- [CreatorEntity](docs/CreatorEntity.md)
- [Editgroup](docs/Editgroup.md)
- [EditgroupEdits](docs/EditgroupEdits.md)
- [Editor](docs/Editor.md)
- [EntityEdit](docs/EntityEdit.md)
+ - [EntityHistoryEntry](docs/EntityHistoryEntry.md)
- [ErrorResponse](docs/ErrorResponse.md)
- [FileEntity](docs/FileEntity.md)
- [ReleaseContrib](docs/ReleaseContrib.md)
diff --git a/python/fatcat/routes.py b/python/fatcat/routes.py
index 5bd68ba1..ec6b849e 100644
--- a/python/fatcat/routes.py
+++ b/python/fatcat/routes.py
@@ -18,9 +18,43 @@ def container_view(ident):
abort(ae.status)
return render_template('container_view.html', container=entity)
+@app.route('/container/<uuid:ident>/history', methods=['GET'])
+def container_history(ident):
+ try:
+ entity = api.get_container(str(ident))
+ history = api.get_container_history(str(ident))
+ except ApiException as ae:
+ abort(ae.status)
+ print(history)
+ return render_template('entity_history.html',
+ page_title=entity.name,
+ entity_type="container",
+ entity=entity,
+ history=history)
+
+@app.route('/container/<uuid:ident>/edit', methods=['GET'])
+def container_edit_view(ident):
+ try:
+ entity = api.get_container(str(ident))
+ except ApiException as ae:
+ abort(ae.status)
+ return render_template('entity_edit.html')
+
+#@app.route('/container/<uuid:ident>/edit', methods=['POST'])
+#def container_edit(ident):
+# raise NotImplemented()
+# params = dict()
+# for k in request.form:
+# if k.startswith('container_'):
+# params[k[10:]] = request.form[k]
+# edit = api.update_container(params=params)
+# return redirect("/container/{}".format(edit.ident))
+# # else:
+# #return render_template('container_edit.html')
+
@app.route('/container/create', methods=['GET'])
def container_create_view():
- return render_template('container_add.html')
+ return render_template('container_create.html')
@app.route('/container/create', methods=['POST'])
def container_create():
@@ -51,6 +85,27 @@ def creator_view(ident):
abort(ae.status)
return render_template('creator_view.html', creator=entity, releases=releases)
+@app.route('/creator/<uuid:ident>/history', methods=['GET'])
+def creator_history(ident):
+ try:
+ entity = api.get_creator(str(ident))
+ history = api.get_creator_history(str(ident))
+ except ApiException as ae:
+ abort(ae.status)
+ return render_template('entity_history.html',
+ page_title=entity.display_name,
+ entity_type="creator",
+ entity=entity,
+ history=history)
+
+@app.route('/creator/<uuid:ident>/edit', methods=['GET'])
+def creator_edit_view(ident):
+ try:
+ entity = api.get_creator(str(ident))
+ except ApiException as ae:
+ abort(ae.status)
+ return render_template('entity_edit.html')
+
@app.route('/creator/lookup', methods=['GET'])
def creator_lookup():
orcid = request.args.get('orcid')
@@ -70,6 +125,27 @@ def file_view(ident):
abort(ae.status)
return render_template('file_view.html', file=entity)
+@app.route('/file/<uuid:ident>/history', methods=['GET'])
+def file_history(ident):
+ try:
+ entity = api.get_file(str(ident))
+ history = api.get_file_history(str(ident))
+ except ApiException as ae:
+ abort(ae.status)
+ return render_template('entity_history.html',
+ page_title=None,
+ entity_type="file",
+ entity=entity,
+ history=history)
+
+@app.route('/file/<uuid:ident>/edit', methods=['GET'])
+def file_edit_view(ident):
+ try:
+ entity = api.get_file(str(ident))
+ except ApiException as ae:
+ abort(ae.status)
+ return render_template('entity_edit.html')
+
@app.route('/file/lookup', methods=['GET'])
def file_lookup():
sha1 = request.args.get('sha1')
@@ -107,18 +183,39 @@ def release_lookup():
abort(ae.status)
return redirect('/release/{}'.format(resp.ident))
-#@app.route('/release/<uuid:ident>/changelog', methods=['GET'])
-#def release_changelog(ident):
-# try:
-# entity = api.get_release(str(ident))
-# except ApiException as ae:
-# abort(ae.status)
-# try:
-# entries = api.release_changelog(str(ident))
-# except ApiException as ae:
-# abort(ae.status)
-# return render_template('release_changelog.html', release=entity,
-# changelog_entries=entries)
+@app.route('/release/create', methods=['GET'])
+def release_create_view():
+ return render_template('release_create.html')
+
+@app.route('/release/create', methods=['POST'])
+def release_create():
+ params = dict()
+ for k in request.form:
+ if k.startswith('release_'):
+ params[k[10:]] = request.form[k]
+ edit = api.create_release(params=params)
+ return redirect("/release/{}".format(edit.ident))
+
+@app.route('/release/<uuid:ident>/history', methods=['GET'])
+def release_history(ident):
+ try:
+ entity = api.get_release(str(ident))
+ history = api.get_release_history(str(ident))
+ except ApiException as ae:
+ abort(ae.status)
+ return render_template('entity_history.html',
+ page_title=entity.title,
+ entity_type="release",
+ entity=entity,
+ history=history)
+
+@app.route('/release/<uuid:ident>/edit', methods=['GET'])
+def release_edit_view(ident):
+ try:
+ entity = api.get_release(str(ident))
+ except ApiException as ae:
+ abort(ae.status)
+ return render_template('entity_edit.html')
@app.route('/work/<uuid:ident>', methods=['GET'])
def work_view(ident):
@@ -129,9 +226,26 @@ def work_view(ident):
abort(ae.status)
return render_template('work_view.html', work=entity, releases=releases)
-@app.route('/work/create', methods=['GET'])
-def work_create():
- return render_template('work_add.html')
+@app.route('/work/<uuid:ident>/history', methods=['GET'])
+def work_history(ident):
+ try:
+ entity = api.get_work(str(ident))
+ history = api.get_work_history(str(ident))
+ except ApiException as ae:
+ abort(ae.status)
+ return render_template('entity_history.html',
+ page_title=None,
+ entity_type="work",
+ entity=entity,
+ history=history)
+
+@app.route('/work/<uuid:ident>/edit', methods=['GET'])
+def work_edit_view(ident):
+ try:
+ entity = api.get_work(str(ident))
+ except ApiException as ae:
+ abort(ae.status)
+ return render_template('entity_edit.html')
@app.route('/editgroup/<int:ident>', methods=['GET'])
def editgroup_view(ident):
@@ -160,6 +274,22 @@ def editor_changelog(username):
return render_template('editor_changelog.html', editor=editor,
changelog_entries=changelog_entries)
+@app.route('/changelog', methods=['GET'])
+def changelog_view():
+ try:
+ entries = api.get_changelog(limit=request.args.get('limit'))
+ except ApiException as ae:
+ abort(ae.status)
+ return render_template('changelog.html', entries=entries)
+
+@app.route('/changelog/<int:index>', methods=['GET'])
+def changelog_entry_view(index):
+ try:
+ entry = api.get_changelog_entry(int(index))
+ except ApiException as ae:
+ abort(ae.status)
+ return render_template('changelog_view.html', entry=entry, editgroup=entry.editgroup)
+
@app.route('/stats', methods=['GET'])
def stats_view():
stats = api.get_stats()
diff --git a/python/fatcat/templates/changelog.html b/python/fatcat/templates/changelog.html
new file mode 100644
index 00000000..ee50a7d2
--- /dev/null
+++ b/python/fatcat/templates/changelog.html
@@ -0,0 +1,23 @@
+{% extends "base.html" %}
+{% block body %}
+
+<h1 class="ui header">Recent Changes
+<div class="sub header"><code>changelog</code></div></h1>
+
+<table class="ui table">
+ <thead><tr><th>Changelog<br>Index
+ <th>Timestamp (UTC)
+ <th>Editgroup
+ <th>Editor
+ <th>Description
+ <tbody>
+ {% for entry in entries %}
+ <tr><td><a href="/changelog/{{ entry.index }}">{{ entry.index }}</a>
+ <td>{{ entry.timestamp }}
+ <td><a href="/editgroup/{{ entry.editgroup_id }}">{{ entry.editgroup_id }}</a>
+ <td><a href="/editor/{{ entry.editgroup.editor_id }}">{{ entry.editgroup.editor_id }}</a>
+ <td>{% if entry.editgroup.description != None %}{{ entry.editgroup.description }}{% endif %}
+ {% endfor %}
+</table>
+
+{% endblock %}
diff --git a/python/fatcat/templates/changelog_view.html b/python/fatcat/templates/changelog_view.html
new file mode 100644
index 00000000..22aff9bc
--- /dev/null
+++ b/python/fatcat/templates/changelog_view.html
@@ -0,0 +1,13 @@
+{% extends "editgroup_view.html" %}
+{% block editgroupheader %}
+
+<h1 class="ui header">Changelog Entry
+<div class="sub header">
+ <code>changelog {{ entry.index }}</code>
+</div>
+</h1>
+
+<br><b>Timestamp:</b> {{ entry.timestamp }}
+<br><b>Editgroup:</b> <a href="/editgroup/{{editgroup.id}}">{{ editgroup.id }}</a>
+
+{% endblock %}
diff --git a/python/fatcat/templates/container_add.html b/python/fatcat/templates/container_create.html
index 15288142..15288142 100644
--- a/python/fatcat/templates/container_add.html
+++ b/python/fatcat/templates/container_create.html
diff --git a/python/fatcat/templates/editgroup_view.html b/python/fatcat/templates/editgroup_view.html
index 06fef424..ac3228b0 100644
--- a/python/fatcat/templates/editgroup_view.html
+++ b/python/fatcat/templates/editgroup_view.html
@@ -1,49 +1,53 @@
{% extends "base.html" %}
{% block body %}
-<h1>Edit Group: #{{ editgroup.id}}</h1>
+{# extended by changelog_entry #}
+{% block editgroupheader %}
+<h1 class="ui header">Edit Group
+<div class="sub header"><code>editgroup {{ editgroup.id }}</code></div></h1>
+{% endblock %}
{# TODO: <p>Editor: <a href="/editor/{{ editgroup.editor.username }}">{{ editgroup.editor.username }}</a> #}
-<p>Editor: {{ editgroup.editor_id }}
-<p>Description: {{ editgroup.description }}
+<br><b>Editor:</b> <a href="/editor/{{editgroup.editor_id}}">{{ editgroup.editor_id }}</a>
+<br><b>Description:</b> {{ editgroup.description }}
-<h3>Work Edits ({{ editgroup.work_edits|count }})</h3>
+<h3>Work Edits ({{ editgroup.edits.works|count }})</h3>
<ul>
-{% for edit in editgroup.work_edits %}
- <li><a href="/work/edit/{{ edit.id }}">Edit #{{ edit.id }}</a>:
- <a href="/work/{{ edit.ident }}">{{ edit.ident }}</a> to rev {{ edit.rev }}
+{% for edit in editgroup.edits.works %}
+ <li>Work edit #<a href="/work/edit/{{ edit.edit_id }}">{{ edit.edit_id }}</a>:
+ <a href="/work/{{ edit.ident }}">{{ edit.ident }}</a> to rev {{ edit.revision }}
{% endfor %}
</ul>
-<h3>Release Edits ({{ editgroup.release_edits|count }})</h3>
+<h3>Release Edits ({{ editgroup.edits.releases|count }})</h3>
<ul>
-{% for edit in editgroup.release_edits %}
- <li><a href="/release/edit/{{ edit.id }}">Edit #{{ edit.id }}</a>
- <a href="/release/{{ edit.ident }}">{{ edit.ident }}</a> to rev {{ edit.rev }}
+{% for edit in editgroup.edits.releases %}
+ <li>Release edit #<a href="/release/edit/{{ edit.edit_id }}">{{ edit.edit_id }}</a>:
+ <a href="/release/{{ edit.ident }}">{{ edit.ident }}</a> to rev {{ edit.revision }}
{% endfor %}
</ul>
-<h3>Container Edits ({{ editgroup.container_edits|count }})</h3>
+<h3>Container Edits ({{ editgroup.edits.containers|count }})</h3>
<ul>
-{% for edit in editgroup.container_edits %}
- <li><a href="/container/edit/{{ edit.id }}">Edit #{{ edit.id }}</a>
- <a href="/container/{{ edit.ident }}">{{ edit.ident }}</a> to rev {{ edit.rev }}
+{% for edit in editgroup.edits.containers %}
+ <li>Container edit #<a href="/container/edit/{{ edit.edit_id }}">{{ edit.edit_id }}</a>:
+ <a href="/container/{{ edit.ident }}">{{ edit.ident }}</a> to rev {{ edit.revision }}
{% endfor %}
</ul>
-<h3>Creator Edits ({{ editgroup.creator_edits|count }})</h3>
+<h3>Creator Edits ({{ editgroup.edits.creators|count }})</h3>
<ul>
-{% for edit in editgroup.creator_edits %}
- <li><a href="/creator/edit/{{ edit.id }}">Edit #{{ edit.id }}</a>
- <a href="/creator/{{ edit.ident }}">{{ edit.ident }}</a> to rev {{ edit.rev }}
+{% for edit in editgroup.edits.creators %}
+ <li>Creator edit #<a href="/creator/edit/{{ edit.edit_id }}">{{ edit.edit_id }}</a>:
+ <a href="/creator/{{ edit.ident }}">{{ edit.ident }}</a> to rev {{ edit.revision }}
{% endfor %}
</ul>
-<h3>File Edits ({{ editgroup.file_edits|count }})</h3>
+<h3>File Edits ({{ editgroup.edits.files|count }})</h3>
<ul>
-{% for edit in editgroup.file_edits %}
- <li><a href="/file/edit/{{ edit.id }}">Edit #{{ edit.id }}</a>
- <a href="/file/{{ edit.ident }}">{{ edit.ident }}</a> to rev {{ edit.rev }}
+{% for edit in editgroup.edits.files %}
+ <li>File edit #<a href="/file/edit/{{ edit.edit_id }}">{{ edit.edit_id }}</a>:
+ <a href="/file/{{ edit.ident }}">{{ edit.ident }}</a> to rev {{ edit.revision }}
{% endfor %}
</ul>
diff --git a/python/fatcat/templates/editor_changelog.html b/python/fatcat/templates/editor_changelog.html
index e1410874..543d6bac 100644
--- a/python/fatcat/templates/editor_changelog.html
+++ b/python/fatcat/templates/editor_changelog.html
@@ -1,9 +1,13 @@
{% extends "base.html" %}
{% block body %}
-<h1>Editor Changelog: {{ editor.username }}</h1>
-
-<p>Editor: <a href="/editor/{{ editor.username }}">{{ editor.username }}</a>
+<h1 class="ui header">Editor Changelog: {{ editor.username }}
+<div class="sub header">
+ <a href="/editor/{{editor.id}}">
+ <code>editor {{ editor.id }}</code>
+ </a>
+</div>
+</h1>
<p>Changes accepted (aka, merged editgroups):
<ul>
diff --git a/python/fatcat/templates/editor_view.html b/python/fatcat/templates/editor_view.html
index e0625c42..f58b85b5 100644
--- a/python/fatcat/templates/editor_view.html
+++ b/python/fatcat/templates/editor_view.html
@@ -1,7 +1,11 @@
{% extends "base.html" %}
{% block body %}
-<h1>Editor: {{ editor.username }}</h1>
+<h1 class="ui header">{{ editor.username }}
+<div class="sub header">
+ <code>editor {{ editor.id }}</code>
+</div>
+</h1>
<p>Is Admin? {{ editor.is_admin }}
<p><a href="/editor/{{ editor.username }}/changelog">Changelog</a>
diff --git a/python/fatcat/templates/entity_edit.html b/python/fatcat/templates/entity_edit.html
new file mode 100644
index 00000000..5da98d89
--- /dev/null
+++ b/python/fatcat/templates/entity_edit.html
@@ -0,0 +1,8 @@
+{% extends "base.html" %}
+{% block body %}
+
+<h1>Not Implemented</h1>
+
+Entity editing isn't implemented yet, only creation. Sorry!
+
+{% endblock %}
diff --git a/python/fatcat/templates/entity_history.html b/python/fatcat/templates/entity_history.html
new file mode 100644
index 00000000..54577b2f
--- /dev/null
+++ b/python/fatcat/templates/entity_history.html
@@ -0,0 +1,30 @@
+{% extends "base.html" %}
+{% block body %}
+
+<h1 class="ui header">{% if page_title != None %}{{ page_title }}{% endif %}
+<div class="sub header">
+ <a href="/{{entity_type}}/{{entity.ident}}">
+ <code>{{ entity_type }} {{ entity.ident }}</code>
+ </a>
+</div>
+</h1>
+
+<h3 class="ui header">Fatcat Metadata Edit History</h3>
+
+<table class="ui table">
+ <thead><tr><th>Changelog<br>Index
+ <th>Timestamp (UTC)
+ <th>Editgroup
+ <th>Editor
+ <th>Description
+ <tbody>
+ {% for entry in history %}
+ <tr><td><a href="/changelog/{{ entry.changelog_entry.index }}">{{ entry.changelog_entry.index }}</a>
+ <td>{{ entry.changelog_entry.timestamp }}
+ <td><a href="/editgroup/{{ entry.editgroup.id }}">{{ entry.editgroup.id }}</a>
+ <td><a href="/editor/{{ entry.editgroup.editor_id }}">{{ entry.editgroup.editor_id }}</a>
+ <td>{% if entry.editgroup.description != None %}{{ entry.editgroup.description }}{% endif %}
+ {% endfor %}
+</table>
+
+{% endblock %}
diff --git a/python/fatcat/templates/home.html b/python/fatcat/templates/home.html
index 0ec0bd18..9a8a55c8 100644
--- a/python/fatcat/templates/home.html
+++ b/python/fatcat/templates/home.html
@@ -27,11 +27,11 @@ indexing (aka, linking together of pre-prints and final copies).
<td><a href="/container/00000000-0000-0000-1111-000000000002">Fake</a>
<br><a href="/container/00000000-0000-0000-1111-000000000003">Real</a>
<tr><td><b>Creator</b>
- <td><a href="/creator/create">Create</a>
+ <td><!-- <a href="/creator/create">Create</a> -->
<td><a href="/creator/00000000-0000-0000-2222-000000000002">Fake</a>
<br><a href="/creator/00000000-0000-0000-2222-000000000003">Real</a>
<tr><td><b>File</b>
- <td><a href="/file/create">Create</a>
+ <td>
<td><a href="/file/00000000-0000-0000-3333-000000000002">Fake</a>
<br><a href="/file/00000000-0000-0000-3333-000000000003">Real</a>
<tr><td><b>Release</b>
@@ -39,7 +39,7 @@ indexing (aka, linking together of pre-prints and final copies).
<td><a href="/release/00000000-0000-0000-4444-000000000002">Fake</a>
<br><a href="/release/00000000-0000-0000-4444-000000000003">Real</a>
<tr><td><b>Work</b>
- <td><a href="/work/create">Create</a>
+ <td>
<td><a href="/work/00000000-0000-0000-5555-000000000002">Fake</a>
<br><a href="/work/00000000-0000-0000-5555-000000000003">Real</a>
</table>
diff --git a/python/fatcat/templates/work_add.html b/python/fatcat/templates/release_create.html
index ac8a8169..ac8a8169 100644
--- a/python/fatcat/templates/work_add.html
+++ b/python/fatcat/templates/release_create.html
diff --git a/python/fatcat_client/__init__.py b/python/fatcat_client/__init__.py
index 8aa96f04..fca893a7 100644
--- a/python/fatcat_client/__init__.py
+++ b/python/fatcat_client/__init__.py
@@ -22,14 +22,14 @@ from fatcat_client.api.default_api import DefaultApi
from fatcat_client.api_client import ApiClient
from fatcat_client.configuration import Configuration
# import models into sdk package
-from fatcat_client.models.changelogentries import Changelogentries
-from fatcat_client.models.changelogentries_inner import ChangelogentriesInner
+from fatcat_client.models.changelog_entry import ChangelogEntry
from fatcat_client.models.container_entity import ContainerEntity
from fatcat_client.models.creator_entity import CreatorEntity
from fatcat_client.models.editgroup import Editgroup
from fatcat_client.models.editgroup_edits import EditgroupEdits
from fatcat_client.models.editor import Editor
from fatcat_client.models.entity_edit import EntityEdit
+from fatcat_client.models.entity_history_entry import EntityHistoryEntry
from fatcat_client.models.error_response import ErrorResponse
from fatcat_client.models.file_entity import FileEntity
from fatcat_client.models.release_contrib import ReleaseContrib
diff --git a/python/fatcat_client/api/default_api.py b/python/fatcat_client/api/default_api.py
index 09e8d505..f63a1daf 100644
--- a/python/fatcat_client/api/default_api.py
+++ b/python/fatcat_client/api/default_api.py
@@ -1197,6 +1197,196 @@ class DefaultApi(object):
_request_timeout=params.get('_request_timeout'),
collection_formats=collection_formats)
+ def get_changelog(self, **kwargs): # noqa: E501
+ """get_changelog # noqa: E501
+
+ This method makes a synchronous HTTP request by default. To make an
+ asynchronous HTTP request, please pass async=True
+ >>> thread = api.get_changelog(async=True)
+ >>> result = thread.get()
+
+ :param async bool
+ :param int limit:
+ :return: list[ChangelogEntry]
+ If the method is called asynchronously,
+ returns the request thread.
+ """
+ kwargs['_return_http_data_only'] = True
+ if kwargs.get('async'):
+ return self.get_changelog_with_http_info(**kwargs) # noqa: E501
+ else:
+ (data) = self.get_changelog_with_http_info(**kwargs) # noqa: E501
+ return data
+
+ def get_changelog_with_http_info(self, **kwargs): # noqa: E501
+ """get_changelog # noqa: E501
+
+ This method makes a synchronous HTTP request by default. To make an
+ asynchronous HTTP request, please pass async=True
+ >>> thread = api.get_changelog_with_http_info(async=True)
+ >>> result = thread.get()
+
+ :param async bool
+ :param int limit:
+ :return: list[ChangelogEntry]
+ If the method is called asynchronously,
+ returns the request thread.
+ """
+
+ all_params = ['limit'] # noqa: E501
+ all_params.append('async')
+ all_params.append('_return_http_data_only')
+ all_params.append('_preload_content')
+ all_params.append('_request_timeout')
+
+ params = locals()
+ for key, val in six.iteritems(params['kwargs']):
+ if key not in all_params:
+ raise TypeError(
+ "Got an unexpected keyword argument '%s'"
+ " to method get_changelog" % key
+ )
+ params[key] = val
+ del params['kwargs']
+
+ collection_formats = {}
+
+ path_params = {}
+
+ query_params = []
+ if 'limit' in params:
+ query_params.append(('limit', params['limit'])) # noqa: E501
+
+ header_params = {}
+
+ form_params = []
+ local_var_files = {}
+
+ body_params = None
+ # HTTP header `Accept`
+ header_params['Accept'] = self.api_client.select_header_accept(
+ ['application/json']) # noqa: E501
+
+ # HTTP header `Content-Type`
+ header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501
+ ['application/json']) # noqa: E501
+
+ # Authentication setting
+ auth_settings = [] # noqa: E501
+
+ return self.api_client.call_api(
+ '/changelog', 'GET',
+ path_params,
+ query_params,
+ header_params,
+ body=body_params,
+ post_params=form_params,
+ files=local_var_files,
+ response_type='list[ChangelogEntry]', # noqa: E501
+ auth_settings=auth_settings,
+ async=params.get('async'),
+ _return_http_data_only=params.get('_return_http_data_only'),
+ _preload_content=params.get('_preload_content', True),
+ _request_timeout=params.get('_request_timeout'),
+ collection_formats=collection_formats)
+
+ def get_changelog_entry(self, id, **kwargs): # noqa: E501
+ """get_changelog_entry # noqa: E501
+
+ This method makes a synchronous HTTP request by default. To make an
+ asynchronous HTTP request, please pass async=True
+ >>> thread = api.get_changelog_entry(id, async=True)
+ >>> result = thread.get()
+
+ :param async bool
+ :param int id: (required)
+ :return: ChangelogEntry
+ If the method is called asynchronously,
+ returns the request thread.
+ """
+ kwargs['_return_http_data_only'] = True
+ if kwargs.get('async'):
+ return self.get_changelog_entry_with_http_info(id, **kwargs) # noqa: E501
+ else:
+ (data) = self.get_changelog_entry_with_http_info(id, **kwargs) # noqa: E501
+ return data
+
+ def get_changelog_entry_with_http_info(self, id, **kwargs): # noqa: E501
+ """get_changelog_entry # noqa: E501
+
+ This method makes a synchronous HTTP request by default. To make an
+ asynchronous HTTP request, please pass async=True
+ >>> thread = api.get_changelog_entry_with_http_info(id, async=True)
+ >>> result = thread.get()
+
+ :param async bool
+ :param int id: (required)
+ :return: ChangelogEntry
+ If the method is called asynchronously,
+ returns the request thread.
+ """
+
+ all_params = ['id'] # noqa: E501
+ all_params.append('async')
+ all_params.append('_return_http_data_only')
+ all_params.append('_preload_content')
+ all_params.append('_request_timeout')
+
+ params = locals()
+ for key, val in six.iteritems(params['kwargs']):
+ if key not in all_params:
+ raise TypeError(
+ "Got an unexpected keyword argument '%s'"
+ " to method get_changelog_entry" % key
+ )
+ params[key] = val
+ del params['kwargs']
+ # verify the required parameter 'id' is set
+ if ('id' not in params or
+ params['id'] is None):
+ raise ValueError("Missing the required parameter `id` when calling `get_changelog_entry`") # noqa: E501
+
+ collection_formats = {}
+
+ path_params = {}
+ if 'id' in params:
+ path_params['id'] = params['id'] # noqa: E501
+
+ query_params = []
+
+ header_params = {}
+
+ form_params = []
+ local_var_files = {}
+
+ body_params = None
+ # HTTP header `Accept`
+ header_params['Accept'] = self.api_client.select_header_accept(
+ ['application/json']) # noqa: E501
+
+ # HTTP header `Content-Type`
+ header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501
+ ['application/json']) # noqa: E501
+
+ # Authentication setting
+ auth_settings = [] # noqa: E501
+
+ return self.api_client.call_api(
+ '/changelog/{id}', 'GET',
+ path_params,
+ query_params,
+ header_params,
+ body=body_params,
+ post_params=form_params,
+ files=local_var_files,
+ response_type='ChangelogEntry', # noqa: E501
+ auth_settings=auth_settings,
+ async=params.get('async'),
+ _return_http_data_only=params.get('_return_http_data_only'),
+ _preload_content=params.get('_preload_content', True),
+ _request_timeout=params.get('_request_timeout'),
+ collection_formats=collection_formats)
+
def get_container(self, id, **kwargs): # noqa: E501
"""get_container # noqa: E501
@@ -1294,6 +1484,107 @@ class DefaultApi(object):
_request_timeout=params.get('_request_timeout'),
collection_formats=collection_formats)
+ def get_container_history(self, id, **kwargs): # noqa: E501
+ """get_container_history # noqa: E501
+
+ This method makes a synchronous HTTP request by default. To make an
+ asynchronous HTTP request, please pass async=True
+ >>> thread = api.get_container_history(id, async=True)
+ >>> result = thread.get()
+
+ :param async bool
+ :param str id: (required)
+ :param int limit:
+ :return: list[EntityHistoryEntry]
+ If the method is called asynchronously,
+ returns the request thread.
+ """
+ kwargs['_return_http_data_only'] = True
+ if kwargs.get('async'):
+ return self.get_container_history_with_http_info(id, **kwargs) # noqa: E501
+ else:
+ (data) = self.get_container_history_with_http_info(id, **kwargs) # noqa: E501
+ return data
+
+ def get_container_history_with_http_info(self, id, **kwargs): # noqa: E501
+ """get_container_history # noqa: E501
+
+ This method makes a synchronous HTTP request by default. To make an
+ asynchronous HTTP request, please pass async=True
+ >>> thread = api.get_container_history_with_http_info(id, async=True)
+ >>> result = thread.get()
+
+ :param async bool
+ :param str id: (required)
+ :param int limit:
+ :return: list[EntityHistoryEntry]
+ If the method is called asynchronously,
+ returns the request thread.
+ """
+
+ all_params = ['id', 'limit'] # noqa: E501
+ all_params.append('async')
+ all_params.append('_return_http_data_only')
+ all_params.append('_preload_content')
+ all_params.append('_request_timeout')
+
+ params = locals()
+ for key, val in six.iteritems(params['kwargs']):
+ if key not in all_params:
+ raise TypeError(
+ "Got an unexpected keyword argument '%s'"
+ " to method get_container_history" % key
+ )
+ params[key] = val
+ del params['kwargs']
+ # verify the required parameter 'id' is set
+ if ('id' not in params or
+ params['id'] is None):
+ raise ValueError("Missing the required parameter `id` when calling `get_container_history`") # noqa: E501
+
+ collection_formats = {}
+
+ path_params = {}
+ if 'id' in params:
+ path_params['id'] = params['id'] # noqa: E501
+
+ query_params = []
+ if 'limit' in params:
+ query_params.append(('limit', params['limit'])) # noqa: E501
+
+ header_params = {}
+
+ form_params = []
+ local_var_files = {}
+
+ body_params = None
+ # HTTP header `Accept`
+ header_params['Accept'] = self.api_client.select_header_accept(
+ ['application/json']) # noqa: E501
+
+ # HTTP header `Content-Type`
+ header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501
+ ['application/json']) # noqa: E501
+
+ # Authentication setting
+ auth_settings = [] # noqa: E501
+
+ return self.api_client.call_api(
+ '/container/{id}/history', 'GET',
+ path_params,
+ query_params,
+ header_params,
+ body=body_params,
+ post_params=form_params,
+ files=local_var_files,
+ response_type='list[EntityHistoryEntry]', # noqa: E501
+ auth_settings=auth_settings,
+ async=params.get('async'),
+ _return_http_data_only=params.get('_return_http_data_only'),
+ _preload_content=params.get('_preload_content', True),
+ _request_timeout=params.get('_request_timeout'),
+ collection_formats=collection_formats)
+
def get_creator(self, id, **kwargs): # noqa: E501
"""get_creator # noqa: E501
@@ -1391,6 +1682,107 @@ class DefaultApi(object):
_request_timeout=params.get('_request_timeout'),
collection_formats=collection_formats)
+ def get_creator_history(self, id, **kwargs): # noqa: E501
+ """get_creator_history # noqa: E501
+
+ This method makes a synchronous HTTP request by default. To make an
+ asynchronous HTTP request, please pass async=True
+ >>> thread = api.get_creator_history(id, async=True)
+ >>> result = thread.get()
+
+ :param async bool
+ :param str id: (required)
+ :param int limit:
+ :return: list[EntityHistoryEntry]
+ If the method is called asynchronously,
+ returns the request thread.
+ """
+ kwargs['_return_http_data_only'] = True
+ if kwargs.get('async'):
+ return self.get_creator_history_with_http_info(id, **kwargs) # noqa: E501
+ else:
+ (data) = self.get_creator_history_with_http_info(id, **kwargs) # noqa: E501
+ return data
+
+ def get_creator_history_with_http_info(self, id, **kwargs): # noqa: E501
+ """get_creator_history # noqa: E501
+
+ This method makes a synchronous HTTP request by default. To make an
+ asynchronous HTTP request, please pass async=True
+ >>> thread = api.get_creator_history_with_http_info(id, async=True)
+ >>> result = thread.get()
+
+ :param async bool
+ :param str id: (required)
+ :param int limit:
+ :return: list[EntityHistoryEntry]
+ If the method is called asynchronously,
+ returns the request thread.
+ """
+
+ all_params = ['id', 'limit'] # noqa: E501
+ all_params.append('async')
+ all_params.append('_return_http_data_only')
+ all_params.append('_preload_content')
+ all_params.append('_request_timeout')
+
+ params = locals()
+ for key, val in six.iteritems(params['kwargs']):
+ if key not in all_params:
+ raise TypeError(
+ "Got an unexpected keyword argument '%s'"
+ " to method get_creator_history" % key
+ )
+ params[key] = val
+ del params['kwargs']
+ # verify the required parameter 'id' is set
+ if ('id' not in params or
+ params['id'] is None):
+ raise ValueError("Missing the required parameter `id` when calling `get_creator_history`") # noqa: E501
+
+ collection_formats = {}
+
+ path_params = {}
+ if 'id' in params:
+ path_params['id'] = params['id'] # noqa: E501
+
+ query_params = []
+ if 'limit' in params:
+ query_params.append(('limit', params['limit'])) # noqa: E501
+
+ header_params = {}
+
+ form_params = []
+ local_var_files = {}
+
+ body_params = None
+ # HTTP header `Accept`
+ header_params['Accept'] = self.api_client.select_header_accept(
+ ['application/json']) # noqa: E501
+
+ # HTTP header `Content-Type`
+ header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501
+ ['application/json']) # noqa: E501
+
+ # Authentication setting
+ auth_settings = [] # noqa: E501
+
+ return self.api_client.call_api(
+ '/creator/{id}/history', 'GET',
+ path_params,
+ query_params,
+ header_params,
+ body=body_params,
+ post_params=form_params,
+ files=local_var_files,
+ response_type='list[EntityHistoryEntry]', # noqa: E501
+ auth_settings=auth_settings,
+ async=params.get('async'),
+ _return_http_data_only=params.get('_return_http_data_only'),
+ _preload_content=params.get('_preload_content', True),
+ _request_timeout=params.get('_request_timeout'),
+ collection_formats=collection_formats)
+
def get_creator_releases(self, id, **kwargs): # noqa: E501
"""get_creator_releases # noqa: E501
@@ -1692,7 +2084,7 @@ class DefaultApi(object):
:param async bool
:param str username: (required)
- :return: Changelogentries
+ :return: list[ChangelogEntry]
If the method is called asynchronously,
returns the request thread.
"""
@@ -1713,7 +2105,7 @@ class DefaultApi(object):
:param async bool
:param str username: (required)
- :return: Changelogentries
+ :return: list[ChangelogEntry]
If the method is called asynchronously,
returns the request thread.
"""
@@ -1771,7 +2163,7 @@ class DefaultApi(object):
body=body_params,
post_params=form_params,
files=local_var_files,
- response_type='Changelogentries', # noqa: E501
+ response_type='list[ChangelogEntry]', # noqa: E501
auth_settings=auth_settings,
async=params.get('async'),
_return_http_data_only=params.get('_return_http_data_only'),
@@ -1876,6 +2268,107 @@ class DefaultApi(object):
_request_timeout=params.get('_request_timeout'),
collection_formats=collection_formats)
+ def get_file_history(self, id, **kwargs): # noqa: E501
+ """get_file_history # noqa: E501
+
+ This method makes a synchronous HTTP request by default. To make an
+ asynchronous HTTP request, please pass async=True
+ >>> thread = api.get_file_history(id, async=True)
+ >>> result = thread.get()
+
+ :param async bool
+ :param str id: (required)
+ :param int limit:
+ :return: list[EntityHistoryEntry]
+ If the method is called asynchronously,
+ returns the request thread.
+ """
+ kwargs['_return_http_data_only'] = True
+ if kwargs.get('async'):
+ return self.get_file_history_with_http_info(id, **kwargs) # noqa: E501
+ else:
+ (data) = self.get_file_history_with_http_info(id, **kwargs) # noqa: E501
+ return data
+
+ def get_file_history_with_http_info(self, id, **kwargs): # noqa: E501
+ """get_file_history # noqa: E501
+
+ This method makes a synchronous HTTP request by default. To make an
+ asynchronous HTTP request, please pass async=True
+ >>> thread = api.get_file_history_with_http_info(id, async=True)
+ >>> result = thread.get()
+
+ :param async bool
+ :param str id: (required)
+ :param int limit:
+ :return: list[EntityHistoryEntry]
+ If the method is called asynchronously,
+ returns the request thread.
+ """
+
+ all_params = ['id', 'limit'] # noqa: E501
+ all_params.append('async')
+ all_params.append('_return_http_data_only')
+ all_params.append('_preload_content')
+ all_params.append('_request_timeout')
+
+ params = locals()
+ for key, val in six.iteritems(params['kwargs']):
+ if key not in all_params:
+ raise TypeError(
+ "Got an unexpected keyword argument '%s'"
+ " to method get_file_history" % key
+ )
+ params[key] = val
+ del params['kwargs']
+ # verify the required parameter 'id' is set
+ if ('id' not in params or
+ params['id'] is None):
+ raise ValueError("Missing the required parameter `id` when calling `get_file_history`") # noqa: E501
+
+ collection_formats = {}
+
+ path_params = {}
+ if 'id' in params:
+ path_params['id'] = params['id'] # noqa: E501
+
+ query_params = []
+ if 'limit' in params:
+ query_params.append(('limit', params['limit'])) # noqa: E501
+
+ header_params = {}
+
+ form_params = []
+ local_var_files = {}
+
+ body_params = None
+ # HTTP header `Accept`
+ header_params['Accept'] = self.api_client.select_header_accept(
+ ['application/json']) # noqa: E501
+
+ # HTTP header `Content-Type`
+ header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501
+ ['application/json']) # noqa: E501
+
+ # Authentication setting
+ auth_settings = [] # noqa: E501
+
+ return self.api_client.call_api(
+ '/file/{id}/history', 'GET',
+ path_params,
+ query_params,
+ header_params,
+ body=body_params,
+ post_params=form_params,
+ files=local_var_files,
+ response_type='list[EntityHistoryEntry]', # noqa: E501
+ auth_settings=auth_settings,
+ async=params.get('async'),
+ _return_http_data_only=params.get('_return_http_data_only'),
+ _preload_content=params.get('_preload_content', True),
+ _request_timeout=params.get('_request_timeout'),
+ collection_formats=collection_formats)
+
def get_release(self, id, **kwargs): # noqa: E501
"""get_release # noqa: E501
@@ -2070,6 +2563,107 @@ class DefaultApi(object):
_request_timeout=params.get('_request_timeout'),
collection_formats=collection_formats)
+ def get_release_history(self, id, **kwargs): # noqa: E501
+ """get_release_history # noqa: E501
+
+ This method makes a synchronous HTTP request by default. To make an
+ asynchronous HTTP request, please pass async=True
+ >>> thread = api.get_release_history(id, async=True)
+ >>> result = thread.get()
+
+ :param async bool
+ :param str id: (required)
+ :param int limit:
+ :return: list[EntityHistoryEntry]
+ If the method is called asynchronously,
+ returns the request thread.
+ """
+ kwargs['_return_http_data_only'] = True
+ if kwargs.get('async'):
+ return self.get_release_history_with_http_info(id, **kwargs) # noqa: E501
+ else:
+ (data) = self.get_release_history_with_http_info(id, **kwargs) # noqa: E501
+ return data
+
+ def get_release_history_with_http_info(self, id, **kwargs): # noqa: E501
+ """get_release_history # noqa: E501
+
+ This method makes a synchronous HTTP request by default. To make an
+ asynchronous HTTP request, please pass async=True
+ >>> thread = api.get_release_history_with_http_info(id, async=True)
+ >>> result = thread.get()
+
+ :param async bool
+ :param str id: (required)
+ :param int limit:
+ :return: list[EntityHistoryEntry]
+ If the method is called asynchronously,
+ returns the request thread.
+ """
+
+ all_params = ['id', 'limit'] # noqa: E501
+ all_params.append('async')
+ all_params.append('_return_http_data_only')
+ all_params.append('_preload_content')
+ all_params.append('_request_timeout')
+
+ params = locals()
+ for key, val in six.iteritems(params['kwargs']):
+ if key not in all_params:
+ raise TypeError(
+ "Got an unexpected keyword argument '%s'"
+ " to method get_release_history" % key
+ )
+ params[key] = val
+ del params['kwargs']
+ # verify the required parameter 'id' is set
+ if ('id' not in params or
+ params['id'] is None):
+ raise ValueError("Missing the required parameter `id` when calling `get_release_history`") # noqa: E501
+
+ collection_formats = {}
+
+ path_params = {}
+ if 'id' in params:
+ path_params['id'] = params['id'] # noqa: E501
+
+ query_params = []
+ if 'limit' in params:
+ query_params.append(('limit', params['limit'])) # noqa: E501
+
+ header_params = {}
+
+ form_params = []
+ local_var_files = {}
+
+ body_params = None
+ # HTTP header `Accept`
+ header_params['Accept'] = self.api_client.select_header_accept(
+ ['application/json']) # noqa: E501
+
+ # HTTP header `Content-Type`
+ header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501
+ ['application/json']) # noqa: E501
+
+ # Authentication setting
+ auth_settings = [] # noqa: E501
+
+ return self.api_client.call_api(
+ '/release/{id}/history', 'GET',
+ path_params,
+ query_params,
+ header_params,
+ body=body_params,
+ post_params=form_params,
+ files=local_var_files,
+ response_type='list[EntityHistoryEntry]', # noqa: E501
+ auth_settings=auth_settings,
+ async=params.get('async'),
+ _return_http_data_only=params.get('_return_http_data_only'),
+ _preload_content=params.get('_preload_content', True),
+ _request_timeout=params.get('_request_timeout'),
+ collection_formats=collection_formats)
+
def get_stats(self, **kwargs): # noqa: E501
"""get_stats # noqa: E501
@@ -2260,6 +2854,107 @@ class DefaultApi(object):
_request_timeout=params.get('_request_timeout'),
collection_formats=collection_formats)
+ def get_work_history(self, id, **kwargs): # noqa: E501
+ """get_work_history # noqa: E501
+
+ This method makes a synchronous HTTP request by default. To make an
+ asynchronous HTTP request, please pass async=True
+ >>> thread = api.get_work_history(id, async=True)
+ >>> result = thread.get()
+
+ :param async bool
+ :param str id: (required)
+ :param int limit:
+ :return: list[EntityHistoryEntry]
+ If the method is called asynchronously,
+ returns the request thread.
+ """
+ kwargs['_return_http_data_only'] = True
+ if kwargs.get('async'):
+ return self.get_work_history_with_http_info(id, **kwargs) # noqa: E501
+ else:
+ (data) = self.get_work_history_with_http_info(id, **kwargs) # noqa: E501
+ return data
+
+ def get_work_history_with_http_info(self, id, **kwargs): # noqa: E501
+ """get_work_history # noqa: E501
+
+ This method makes a synchronous HTTP request by default. To make an
+ asynchronous HTTP request, please pass async=True
+ >>> thread = api.get_work_history_with_http_info(id, async=True)
+ >>> result = thread.get()
+
+ :param async bool
+ :param str id: (required)
+ :param int limit:
+ :return: list[EntityHistoryEntry]
+ If the method is called asynchronously,
+ returns the request thread.
+ """
+
+ all_params = ['id', 'limit'] # noqa: E501
+ all_params.append('async')
+ all_params.append('_return_http_data_only')
+ all_params.append('_preload_content')
+ all_params.append('_request_timeout')
+
+ params = locals()
+ for key, val in six.iteritems(params['kwargs']):
+ if key not in all_params:
+ raise TypeError(
+ "Got an unexpected keyword argument '%s'"
+ " to method get_work_history" % key
+ )
+ params[key] = val
+ del params['kwargs']
+ # verify the required parameter 'id' is set
+ if ('id' not in params or
+ params['id'] is None):
+ raise ValueError("Missing the required parameter `id` when calling `get_work_history`") # noqa: E501
+
+ collection_formats = {}
+
+ path_params = {}
+ if 'id' in params:
+ path_params['id'] = params['id'] # noqa: E501
+
+ query_params = []
+ if 'limit' in params:
+ query_params.append(('limit', params['limit'])) # noqa: E501
+
+ header_params = {}
+
+ form_params = []
+ local_var_files = {}
+
+ body_params = None
+ # HTTP header `Accept`
+ header_params['Accept'] = self.api_client.select_header_accept(
+ ['application/json']) # noqa: E501
+
+ # HTTP header `Content-Type`
+ header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501
+ ['application/json']) # noqa: E501
+
+ # Authentication setting
+ auth_settings = [] # noqa: E501
+
+ return self.api_client.call_api(
+ '/work/{id}/history', 'GET',
+ path_params,
+ query_params,
+ header_params,
+ body=body_params,
+ post_params=form_params,
+ files=local_var_files,
+ response_type='list[EntityHistoryEntry]', # noqa: E501
+ auth_settings=auth_settings,
+ async=params.get('async'),
+ _return_http_data_only=params.get('_return_http_data_only'),
+ _preload_content=params.get('_preload_content', True),
+ _request_timeout=params.get('_request_timeout'),
+ collection_formats=collection_formats)
+
def get_work_releases(self, id, **kwargs): # noqa: E501
"""get_work_releases # noqa: E501
diff --git a/python/fatcat_client/models/__init__.py b/python/fatcat_client/models/__init__.py
index f003f51c..e09fe3e4 100644
--- a/python/fatcat_client/models/__init__.py
+++ b/python/fatcat_client/models/__init__.py
@@ -15,14 +15,14 @@
from __future__ import absolute_import
# import models into model package
-from fatcat_client.models.changelogentries import Changelogentries
-from fatcat_client.models.changelogentries_inner import ChangelogentriesInner
+from fatcat_client.models.changelog_entry import ChangelogEntry
from fatcat_client.models.container_entity import ContainerEntity
from fatcat_client.models.creator_entity import CreatorEntity
from fatcat_client.models.editgroup import Editgroup
from fatcat_client.models.editgroup_edits import EditgroupEdits
from fatcat_client.models.editor import Editor
from fatcat_client.models.entity_edit import EntityEdit
+from fatcat_client.models.entity_history_entry import EntityHistoryEntry
from fatcat_client.models.error_response import ErrorResponse
from fatcat_client.models.file_entity import FileEntity
from fatcat_client.models.release_contrib import ReleaseContrib
diff --git a/python/fatcat_client/models/changelog_entry.py b/python/fatcat_client/models/changelog_entry.py
new file mode 100644
index 00000000..ae9925c5
--- /dev/null
+++ b/python/fatcat_client/models/changelog_entry.py
@@ -0,0 +1,195 @@
+# coding: utf-8
+
+"""
+ fatcat
+
+ A scalable, versioned, API-oriented catalog of bibliographic entities and file metadata # noqa: E501
+
+ OpenAPI spec version: 0.1.0
+
+ Generated by: https://github.com/swagger-api/swagger-codegen.git
+"""
+
+
+import pprint
+import re # noqa: F401
+
+import six
+
+from fatcat_client.models.editgroup import Editgroup # noqa: F401,E501
+
+
+class ChangelogEntry(object):
+ """NOTE: This class is auto generated by the swagger code generator program.
+
+ Do not edit the class manually.
+ """
+
+ """
+ Attributes:
+ swagger_types (dict): The key is attribute name
+ and the value is attribute type.
+ attribute_map (dict): The key is attribute name
+ and the value is json key in definition.
+ """
+ swagger_types = {
+ 'index': 'int',
+ 'editgroup_id': 'int',
+ 'timestamp': 'datetime',
+ 'editgroup': 'Editgroup'
+ }
+
+ attribute_map = {
+ 'index': 'index',
+ 'editgroup_id': 'editgroup_id',
+ 'timestamp': 'timestamp',
+ 'editgroup': 'editgroup'
+ }
+
+ def __init__(self, index=None, editgroup_id=None, timestamp=None, editgroup=None): # noqa: E501
+ """ChangelogEntry - a model defined in Swagger""" # noqa: E501
+
+ self._index = None
+ self._editgroup_id = None
+ self._timestamp = None
+ self._editgroup = None
+ self.discriminator = None
+
+ self.index = index
+ self.editgroup_id = editgroup_id
+ self.timestamp = timestamp
+ if editgroup is not None:
+ self.editgroup = editgroup
+
+ @property
+ def index(self):
+ """Gets the index of this ChangelogEntry. # noqa: E501
+
+
+ :return: The index of this ChangelogEntry. # noqa: E501
+ :rtype: int
+ """
+ return self._index
+
+ @index.setter
+ def index(self, index):
+ """Sets the index of this ChangelogEntry.
+
+
+ :param index: The index of this ChangelogEntry. # noqa: E501
+ :type: int
+ """
+ if index is None:
+ raise ValueError("Invalid value for `index`, must not be `None`") # noqa: E501
+
+ self._index = index
+
+ @property
+ def editgroup_id(self):
+ """Gets the editgroup_id of this ChangelogEntry. # noqa: E501
+
+
+ :return: The editgroup_id of this ChangelogEntry. # noqa: E501
+ :rtype: int
+ """
+ return self._editgroup_id
+
+ @editgroup_id.setter
+ def editgroup_id(self, editgroup_id):
+ """Sets the editgroup_id of this ChangelogEntry.
+
+
+ :param editgroup_id: The editgroup_id of this ChangelogEntry. # noqa: E501
+ :type: int
+ """
+ if editgroup_id is None:
+ raise ValueError("Invalid value for `editgroup_id`, must not be `None`") # noqa: E501
+
+ self._editgroup_id = editgroup_id
+
+ @property
+ def timestamp(self):
+ """Gets the timestamp of this ChangelogEntry. # noqa: E501
+
+
+ :return: The timestamp of this ChangelogEntry. # noqa: E501
+ :rtype: datetime
+ """
+ return self._timestamp
+
+ @timestamp.setter
+ def timestamp(self, timestamp):
+ """Sets the timestamp of this ChangelogEntry.
+
+
+ :param timestamp: The timestamp of this ChangelogEntry. # noqa: E501
+ :type: datetime
+ """
+ if timestamp is None:
+ raise ValueError("Invalid value for `timestamp`, must not be `None`") # noqa: E501
+
+ self._timestamp = timestamp
+
+ @property
+ def editgroup(self):
+ """Gets the editgroup of this ChangelogEntry. # noqa: E501
+
+
+ :return: The editgroup of this ChangelogEntry. # noqa: E501
+ :rtype: Editgroup
+ """
+ return self._editgroup
+
+ @editgroup.setter
+ def editgroup(self, editgroup):
+ """Sets the editgroup of this ChangelogEntry.
+
+
+ :param editgroup: The editgroup of this ChangelogEntry. # noqa: E501
+ :type: Editgroup
+ """
+
+ self._editgroup = editgroup
+
+ def to_dict(self):
+ """Returns the model properties as a dict"""
+ result = {}
+
+ for attr, _ in six.iteritems(self.swagger_types):
+ value = getattr(self, attr)
+ if isinstance(value, list):
+ result[attr] = list(map(
+ lambda x: x.to_dict() if hasattr(x, "to_dict") else x,
+ value
+ ))
+ elif hasattr(value, "to_dict"):
+ result[attr] = value.to_dict()
+ elif isinstance(value, dict):
+ result[attr] = dict(map(
+ lambda item: (item[0], item[1].to_dict())
+ if hasattr(item[1], "to_dict") else item,
+ value.items()
+ ))
+ else:
+ result[attr] = value
+
+ return result
+
+ def to_str(self):
+ """Returns the string representation of the model"""
+ return pprint.pformat(self.to_dict())
+
+ def __repr__(self):
+ """For `print` and `pprint`"""
+ return self.to_str()
+
+ def __eq__(self, other):
+ """Returns true if both objects are equal"""
+ if not isinstance(other, ChangelogEntry):
+ return False
+
+ return self.__dict__ == other.__dict__
+
+ def __ne__(self, other):
+ """Returns true if both objects are not equal"""
+ return not self == other
diff --git a/python/fatcat_client/models/entity_history_entry.py b/python/fatcat_client/models/entity_history_entry.py
new file mode 100644
index 00000000..4df733d0
--- /dev/null
+++ b/python/fatcat_client/models/entity_history_entry.py
@@ -0,0 +1,171 @@
+# coding: utf-8
+
+"""
+ fatcat
+
+ A scalable, versioned, API-oriented catalog of bibliographic entities and file metadata # noqa: E501
+
+ OpenAPI spec version: 0.1.0
+
+ Generated by: https://github.com/swagger-api/swagger-codegen.git
+"""
+
+
+import pprint
+import re # noqa: F401
+
+import six
+
+from fatcat_client.models.changelog_entry import ChangelogEntry # noqa: F401,E501
+from fatcat_client.models.editgroup import Editgroup # noqa: F401,E501
+from fatcat_client.models.entity_edit import EntityEdit # noqa: F401,E501
+
+
+class EntityHistoryEntry(object):
+ """NOTE: This class is auto generated by the swagger code generator program.
+
+ Do not edit the class manually.
+ """
+
+ """
+ Attributes:
+ swagger_types (dict): The key is attribute name
+ and the value is attribute type.
+ attribute_map (dict): The key is attribute name
+ and the value is json key in definition.
+ """
+ swagger_types = {
+ 'edit': 'EntityEdit',
+ 'editgroup': 'Editgroup',
+ 'changelog_entry': 'ChangelogEntry'
+ }
+
+ attribute_map = {
+ 'edit': 'edit',
+ 'editgroup': 'editgroup',
+ 'changelog_entry': 'changelog_entry'
+ }
+
+ def __init__(self, edit=None, editgroup=None, changelog_entry=None): # noqa: E501
+ """EntityHistoryEntry - a model defined in Swagger""" # noqa: E501
+
+ self._edit = None
+ self._editgroup = None
+ self._changelog_entry = None
+ self.discriminator = None
+
+ self.edit = edit
+ self.editgroup = editgroup
+ self.changelog_entry = changelog_entry
+
+ @property
+ def edit(self):
+ """Gets the edit of this EntityHistoryEntry. # noqa: E501
+
+
+ :return: The edit of this EntityHistoryEntry. # noqa: E501
+ :rtype: EntityEdit
+ """
+ return self._edit
+
+ @edit.setter
+ def edit(self, edit):
+ """Sets the edit of this EntityHistoryEntry.
+
+
+ :param edit: The edit of this EntityHistoryEntry. # noqa: E501
+ :type: EntityEdit
+ """
+ if edit is None:
+ raise ValueError("Invalid value for `edit`, must not be `None`") # noqa: E501
+
+ self._edit = edit
+
+ @property
+ def editgroup(self):
+ """Gets the editgroup of this EntityHistoryEntry. # noqa: E501
+
+
+ :return: The editgroup of this EntityHistoryEntry. # noqa: E501
+ :rtype: Editgroup
+ """
+ return self._editgroup
+
+ @editgroup.setter
+ def editgroup(self, editgroup):
+ """Sets the editgroup of this EntityHistoryEntry.
+
+
+ :param editgroup: The editgroup of this EntityHistoryEntry. # noqa: E501
+ :type: Editgroup
+ """
+ if editgroup is None:
+ raise ValueError("Invalid value for `editgroup`, must not be `None`") # noqa: E501
+
+ self._editgroup = editgroup
+
+ @property
+ def changelog_entry(self):
+ """Gets the changelog_entry of this EntityHistoryEntry. # noqa: E501
+
+
+ :return: The changelog_entry of this EntityHistoryEntry. # noqa: E501
+ :rtype: ChangelogEntry
+ """
+ return self._changelog_entry
+
+ @changelog_entry.setter
+ def changelog_entry(self, changelog_entry):
+ """Sets the changelog_entry of this EntityHistoryEntry.
+
+
+ :param changelog_entry: The changelog_entry of this EntityHistoryEntry. # noqa: E501
+ :type: ChangelogEntry
+ """
+ if changelog_entry is None:
+ raise ValueError("Invalid value for `changelog_entry`, must not be `None`") # noqa: E501
+
+ self._changelog_entry = changelog_entry
+
+ def to_dict(self):
+ """Returns the model properties as a dict"""
+ result = {}
+
+ for attr, _ in six.iteritems(self.swagger_types):
+ value = getattr(self, attr)
+ if isinstance(value, list):
+ result[attr] = list(map(
+ lambda x: x.to_dict() if hasattr(x, "to_dict") else x,
+ value
+ ))
+ elif hasattr(value, "to_dict"):
+ result[attr] = value.to_dict()
+ elif isinstance(value, dict):
+ result[attr] = dict(map(
+ lambda item: (item[0], item[1].to_dict())
+ if hasattr(item[1], "to_dict") else item,
+ value.items()
+ ))
+ else:
+ result[attr] = value
+
+ return result
+
+ def to_str(self):
+ """Returns the string representation of the model"""
+ return pprint.pformat(self.to_dict())
+
+ def __repr__(self):
+ """For `print` and `pprint`"""
+ return self.to_str()
+
+ def __eq__(self, other):
+ """Returns true if both objects are equal"""
+ if not isinstance(other, EntityHistoryEntry):
+ return False
+
+ return self.__dict__ == other.__dict__
+
+ def __ne__(self, other):
+ """Returns true if both objects are not equal"""
+ return not self == other
diff --git a/python/tests/codegen_tests/test_changelog_entry.py b/python/tests/codegen_tests/test_changelog_entry.py
new file mode 100644
index 00000000..a8401891
--- /dev/null
+++ b/python/tests/codegen_tests/test_changelog_entry.py
@@ -0,0 +1,40 @@
+# coding: utf-8
+
+"""
+ fatcat
+
+ A scalable, versioned, API-oriented catalog of bibliographic entities and file metadata # noqa: E501
+
+ OpenAPI spec version: 0.1.0
+
+ Generated by: https://github.com/swagger-api/swagger-codegen.git
+"""
+
+
+from __future__ import absolute_import
+
+import unittest
+
+import fatcat_client
+from fatcat_client.models.changelog_entry import ChangelogEntry # noqa: E501
+from fatcat_client.rest import ApiException
+
+
+class TestChangelogEntry(unittest.TestCase):
+ """ChangelogEntry unit test stubs"""
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def testChangelogEntry(self):
+ """Test ChangelogEntry"""
+ # FIXME: construct object with mandatory attributes with example values
+ # model = fatcat_client.models.changelog_entry.ChangelogEntry() # noqa: E501
+ pass
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/python/tests/codegen_tests/test_default_api.py b/python/tests/codegen_tests/test_default_api.py
index a1f22d8c..e3008898 100644
--- a/python/tests/codegen_tests/test_default_api.py
+++ b/python/tests/codegen_tests/test_default_api.py
@@ -101,18 +101,42 @@ class TestDefaultApi(unittest.TestCase):
"""
pass
+ def test_get_changelog(self):
+ """Test case for get_changelog
+
+ """
+ pass
+
+ def test_get_changelog_entry(self):
+ """Test case for get_changelog_entry
+
+ """
+ pass
+
def test_get_container(self):
"""Test case for get_container
"""
pass
+ def test_get_container_history(self):
+ """Test case for get_container_history
+
+ """
+ pass
+
def test_get_creator(self):
"""Test case for get_creator
"""
pass
+ def test_get_creator_history(self):
+ """Test case for get_creator_history
+
+ """
+ pass
+
def test_get_creator_releases(self):
"""Test case for get_creator_releases
@@ -143,6 +167,12 @@ class TestDefaultApi(unittest.TestCase):
"""
pass
+ def test_get_file_history(self):
+ """Test case for get_file_history
+
+ """
+ pass
+
def test_get_release(self):
"""Test case for get_release
@@ -155,6 +185,12 @@ class TestDefaultApi(unittest.TestCase):
"""
pass
+ def test_get_release_history(self):
+ """Test case for get_release_history
+
+ """
+ pass
+
def test_get_stats(self):
"""Test case for get_stats
@@ -167,6 +203,12 @@ class TestDefaultApi(unittest.TestCase):
"""
pass
+ def test_get_work_history(self):
+ """Test case for get_work_history
+
+ """
+ pass
+
def test_get_work_releases(self):
"""Test case for get_work_releases
diff --git a/python/tests/codegen_tests/test_entity_history_entry.py b/python/tests/codegen_tests/test_entity_history_entry.py
new file mode 100644
index 00000000..4c27c80f
--- /dev/null
+++ b/python/tests/codegen_tests/test_entity_history_entry.py
@@ -0,0 +1,40 @@
+# coding: utf-8
+
+"""
+ fatcat
+
+ A scalable, versioned, API-oriented catalog of bibliographic entities and file metadata # noqa: E501
+
+ OpenAPI spec version: 0.1.0
+
+ Generated by: https://github.com/swagger-api/swagger-codegen.git
+"""
+
+
+from __future__ import absolute_import
+
+import unittest
+
+import fatcat_client
+from fatcat_client.models.entity_history_entry import EntityHistoryEntry # noqa: E501
+from fatcat_client.rest import ApiException
+
+
+class TestEntityHistoryEntry(unittest.TestCase):
+ """EntityHistoryEntry unit test stubs"""
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def testEntityHistoryEntry(self):
+ """Test EntityHistoryEntry"""
+ # FIXME: construct object with mandatory attributes with example values
+ # model = fatcat_client.models.entity_history_entry.EntityHistoryEntry() # noqa: E501
+ pass
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/python/tests/routes.py b/python/tests/routes.py
index ec4eaf12..5a523efa 100644
--- a/python/tests/routes.py
+++ b/python/tests/routes.py
@@ -27,6 +27,12 @@ def test_all_views(app):
rv = app.get('/container/00000000-0000-0000-1111-000000000002')
assert rv.status_code == 200
+ rv = app.get('/container/00000000-0000-0000-1111-000000000002/history')
+ assert rv.status_code == 200
+
+ rv = app.get('/container/00000000-0000-0000-1111-000000000002/edit')
+ assert rv.status_code == 200
+
rv = app.get('/container/create')
assert rv.status_code == 200
@@ -42,6 +48,12 @@ def test_all_views(app):
rv = app.get('/creator/00000000-0000-0000-2222-000000000002')
assert rv.status_code == 200
+ rv = app.get('/creator/00000000-0000-0000-2222-000000000002/history')
+ assert rv.status_code == 200
+
+ rv = app.get('/creator/00000000-0000-0000-2222-000000000002/edit')
+ assert rv.status_code == 200
+
rv = app.get('/creator/lookup?orcid=0000-0003-2088-7465')
assert rv.status_code == 302
@@ -54,6 +66,15 @@ def test_all_views(app):
rv = app.get('/release/00000000-0000-0000-4444-000000000002')
assert rv.status_code == 200
+ rv = app.get('/release/00000000-0000-0000-4444-000000000002/history')
+ assert rv.status_code == 200
+
+ rv = app.get('/release/00000000-0000-0000-4444-000000000002/edit')
+ assert rv.status_code == 200
+
+ rv = app.get('/release/create')
+ assert rv.status_code == 200
+
rv = app.get('/release/lookup?doi=10.123/abc')
assert rv.status_code == 302
@@ -66,11 +87,14 @@ def test_all_views(app):
rv = app.get('/work/00000000-0000-0000-5555-000000000002')
assert rv.status_code == 200
- rv = app.get('/work/create')
+ rv = app.get('/work/00000000-0000-0000-5555-000000000002/history')
assert rv.status_code == 200
- #rv = app.get('/release/00000000-0000-0000-4444-000000000002/changelog')
- #assert rv.status_code == 200
+ rv = app.get('/work/00000000-0000-0000-5555-000000000002/edit')
+ assert rv.status_code == 200
+
+ rv = app.get('/work/create')
+ assert rv.status_code == 404
rv = app.get('/editgroup/1')
assert rv.status_code == 200