Changeset View
Changeset View
Standalone View
Standalone View
swh/web/api/views/origin.py
# Copyright (C) 2015-2018 The Software Heritage developers | # Copyright (C) 2015-2018 The Software Heritage developers | ||||
# See the AUTHORS file at the top-level directory of this distribution | # See the AUTHORS file at the top-level directory of this distribution | ||||
# License: GNU Affero General Public License version 3, or any later version | # License: GNU Affero General Public License version 3, or any later version | ||||
# See top-level LICENSE file for more information | # See top-level LICENSE file for more information | ||||
from distutils.util import strtobool | from distutils.util import strtobool | ||||
from functools import partial | |||||
from swh.web.common import service | from swh.web.common import service | ||||
from swh.web.common.exc import BadInputExc | from swh.web.common.exc import BadInputExc | ||||
from swh.web.common.origin_visits import get_origin_visits | from swh.web.common.origin_visits import get_origin_visits | ||||
from swh.web.common.utils import reverse | from swh.web.common.utils import reverse | ||||
from swh.web.api.apidoc import api_doc | from swh.web.api.apidoc import api_doc | ||||
from swh.web.api.apiurls import api_route | from swh.web.api.apiurls import api_route | ||||
from swh.web.api.views.utils import api_lookup | from swh.web.api.views.utils import api_lookup | ||||
def _enrich_origin(origin): | def _enrich_origin(origin): | ||||
if 'id' in origin: | if 'id' in origin: | ||||
o = origin.copy() | o = origin.copy() | ||||
o['origin_visits_url'] = \ | o['origin_visits_url'] = \ | ||||
reverse('api-origin-visits', url_args={'origin_id': origin['id']}) | reverse('api-origin-visits', url_args={'origin_id': origin['id']}) | ||||
return o | return o | ||||
return origin | return origin | ||||
def _enrich_origin_visit(origin_visit, *, | |||||
with_origin_url, with_origin_visit_url): | |||||
ov = origin_visit.copy() | |||||
if with_origin_url: | |||||
ov['origin_url'] = reverse('api-origin', | |||||
url_args={'origin_id': ov['origin']}) | |||||
if with_origin_visit_url: | |||||
ov['origin_visit_url'] = reverse('api-origin-visit', | |||||
url_args={'origin_id': ov['origin'], | |||||
'visit_id': ov['visit']}) | |||||
snapshot = ov['snapshot'] | |||||
if snapshot: | |||||
ov['snapshot_url'] = reverse('api-snapshot', | |||||
url_args={'snapshot_id': snapshot}) | |||||
else: | |||||
ov['snapshot_url'] = None | |||||
return ov | |||||
@api_route(r'/origins/', 'api-origins') | @api_route(r'/origins/', 'api-origins') | ||||
@api_doc('/origins/', noargs=True) | @api_doc('/origins/', noargs=True) | ||||
def api_origins(request): | def api_origins(request): | ||||
""" | """ | ||||
.. http:get:: /api/1/origins/ | .. http:get:: /api/1/origins/ | ||||
Get list of archived software origins. | Get list of archived software origins. | ||||
▲ Show 20 Lines • Show All 300 Lines • ▼ Show 20 Lines | def _lookup_origin_visits( | ||||
else: | else: | ||||
for i, v in enumerate(all_visits): | for i, v in enumerate(all_visits): | ||||
if v['visit'] == last_visit: | if v['visit'] == last_visit: | ||||
visits = all_visits[i+1:i+1+per_page] | visits = all_visits[i+1:i+1+per_page] | ||||
break | break | ||||
for v in visits: | for v in visits: | ||||
yield v | yield v | ||||
def _enrich_origin_visit(origin_visit): | |||||
ov = origin_visit.copy() | |||||
ov['origin_visit_url'] = reverse('api-origin-visit', | |||||
url_args={'origin_id': origin_id, | |||||
'visit_id': ov['visit']}) | |||||
snapshot = ov['snapshot'] | |||||
if snapshot: | |||||
ov['snapshot_url'] = reverse('api-snapshot', | |||||
url_args={'snapshot_id': snapshot}) | |||||
else: | |||||
ov['snapshot_url'] = None | |||||
return ov | |||||
results = api_lookup(_lookup_origin_visits, origin_id, | results = api_lookup(_lookup_origin_visits, origin_id, | ||||
notfound_msg='No origin {} found'.format(origin_id), | notfound_msg='No origin {} found'.format(origin_id), | ||||
enrich_fn=_enrich_origin_visit) | enrich_fn=partial(_enrich_origin_visit, | ||||
with_origin_url=False, | |||||
with_origin_visit_url=True)) | |||||
if results: | if results: | ||||
nb_results = len(results) | nb_results = len(results) | ||||
if nb_results == per_page: | if nb_results == per_page: | ||||
new_last_visit = results[-1]['visit'] | new_last_visit = results[-1]['visit'] | ||||
query_params = {} | query_params = {} | ||||
query_params['last_visit'] = new_last_visit | query_params['last_visit'] = new_last_visit | ||||
▲ Show 20 Lines • Show All 44 Lines • ▼ Show 20 Lines | .. http:get:: /api/1/origin/(origin_id)/visit/(visit_id)/ | ||||
:statuscode 404: requested origin or visit can not be found in the archive | :statuscode 404: requested origin or visit can not be found in the archive | ||||
**Example:** | **Example:** | ||||
.. parsed-literal:: | .. parsed-literal:: | ||||
:swh_web_api:`origin/1500/visit/1/` | :swh_web_api:`origin/1500/visit/1/` | ||||
""" # noqa | """ # noqa | ||||
def _enrich_origin_visit(origin_visit): | |||||
ov = origin_visit.copy() | |||||
ov['origin_url'] = reverse('api-origin', | |||||
url_args={'origin_id': ov['origin']}) | |||||
snapshot = ov['snapshot'] | |||||
if snapshot: | |||||
ov['snapshot_url'] = reverse('api-snapshot', | |||||
url_args={'snapshot_id': snapshot}) | |||||
else: | |||||
ov['snapshot_url'] = None | |||||
return ov | |||||
return api_lookup( | return api_lookup( | ||||
service.lookup_origin_visit, int(origin_id), int(visit_id), | service.lookup_origin_visit, int(origin_id), int(visit_id), | ||||
notfound_msg=('No visit {} for origin {} found' | notfound_msg=('No visit {} for origin {} found' | ||||
.format(visit_id, origin_id)), | .format(visit_id, origin_id)), | ||||
enrich_fn=_enrich_origin_visit) | enrich_fn=partial(_enrich_origin_visit, | ||||
with_origin_url=True, | |||||
with_origin_visit_url=False)) |