bardo-copyright-db/api/response.py

202 lines
5.8 KiB
Python

from datetime import datetime
class Response():
def __init__(self, queryType, endpoint):
self.type = queryType
self.endpoint = endpoint
self.data = None
def createResponse(self, status, err=None):
if status != 200:
return {
'status': status,
'message': err.message
}
else:
return {
'status': status,
'data': self.data
}
@classmethod
def parseEntry(cls, dbEntry, xml=False):
response = {
'uuid': dbEntry.uuid,
'title': dbEntry.title,
'copies': dbEntry.copies,
'description': dbEntry.description,
'pub_date': Response.formatDate(dbEntry.pub_date),
'copy_date': Response.formatDate(dbEntry.copy_date),
'registrations': [
{
'number': r.regnum,
'date': Response.formatDate(r.reg_date)
}
for r in dbEntry.registrations
],
'authors': [a.name for a in dbEntry.authors],
'publishers': [p.name for p in dbEntry.publishers],
'source': {
'page': dbEntry.page,
'page_position': dbEntry.page_position,
'part': dbEntry.volume.part,
'group': dbEntry.volume.group,
'series': dbEntry.volume.series,
'volume': dbEntry.volume.volume,
'matter': dbEntry.volume.material,
'url': dbEntry.volume.source,
'year': dbEntry.volume.year
},
'lccns': [l.lccn for l in dbEntry.lccns]
}
if '3' in response['source']['series']:
startNum = dbEntry.volume.start_number
endNum = dbEntry.volume.end_number
if startNum == endNum:
outNum = startNum
else:
outNum = '{}-{}'.format(startNum, endNum)
response['source']['number'] = outNum
response['renewals'] = [
cls.parseRenewal(ren, source=xml)
for reg in dbEntry.registrations
for ren in reg.renewals
]
if xml:
response['xml'] = dbEntry.xml_sources[0].xml_source
return response
@classmethod
def parseRenewal(cls, dbRenewal, source=False):
renewal = {
'type': 'renewal',
'uuid': dbRenewal.uuid,
'title': dbRenewal.title,
'author': dbRenewal.author,
'claimants': [
{'name': c.name, 'type': c.claimant_type}
for c in dbRenewal.claimants
],
'new_matter': dbRenewal.new_matter,
'renewal_num': dbRenewal.renewal_num,
'renewal_date': Response.formatDate(dbRenewal.renewal_date),
'notes': dbRenewal.notes,
'volume': dbRenewal.volume,
'part': dbRenewal.part,
'number': dbRenewal.number,
'page': dbRenewal.page
}
if source:
renewal['source'] = dbRenewal.source
return renewal
@staticmethod
def formatDate(date):
if date:
return datetime.strftime(date, '%Y-%m-%d')
return None
class SingleResponse(Response):
def __init__(self, queryType, endpoint):
super().__init__(queryType, endpoint)
self.result = None
def createDataBlock(self):
self.data = self.result
class MultiResponse(Response):
def __init__(self, queryType, total, endpoint, query, page, perPage):
super().__init__(queryType, endpoint)
self.total = total
self.query = query
self.page = page
self.perPage = perPage
self.results = []
def addResult(self, result):
self.results.append(result)
def extendResults(self, results):
self.results.extend(results)
def createDataBlock(self):
self.data = {
'total': self.total,
'query': self.createQuery(),
'paging': self.createPaging(),
'results': self.results
}
def createQuery(self):
return {
'endpoint': self.endpoint,
'term': self.query
}
def createPaging(self):
paging = {}
if self.type == 'text':
urlRoot = '{}?query={}'.format(self.endpoint, self.query)
else:
urlRoot = self.endpoint
if self.page > 0:
paging['first'] = '{}&page={}&per_page={}'.format(
urlRoot,
0,
self.perPage
)
else:
paging['first'] = None
prevPage = self.page - 1
if prevPage >= 0:
paging['previous'] = '{}&page={}&per_page={}'.format(
urlRoot,
prevPage,
self.perPage
)
else:
paging['previous'] = None
nextPage = self.page + 1
if (nextPage * self.perPage) < self.total:
paging['next'] = '{}&page={}&per_page={}'.format(
urlRoot,
nextPage,
self.perPage
)
else:
paging['next'] = None
lastPage = int((self.total - self.perPage) / self.perPage)
if (
self.page * self.perPage < self.total and
self.total > self.perPage
):
paging['last'] = '{}&page={}&per_page={}'.format(
urlRoot,
lastPage,
self.perPage
)
else:
paging['last'] = None
return paging
@staticmethod
def parsePaging(reqArgs):
perPage = int(reqArgs.get('per_page', 10))
page = int(reqArgs.get('page', 0))
return page, perPage