| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 | # SPDX-License-Identifier: AGPL-3.0-or-later""" PDBe (Protein Data Bank in Europe)"""from json import loadsfrom flask_babel import gettext# aboutabout = {    "website": 'https://www.ebi.ac.uk/pdbe',    "wikidata_id": 'Q55823905',    "official_api_documentation": 'https://www.ebi.ac.uk/pdbe/api/doc/search.html',    "use_official_api": True,    "require_api_key": False,    "results": 'JSON',}categories = ['science']hide_obsolete = False# status codes of unpublished entriespdb_unpublished_codes = ['HPUB', 'HOLD', 'PROC', 'WAIT', 'AUTH', 'AUCO', 'REPL', 'POLC', 'REFI', 'TRSF', 'WDRN']# url for api querypdbe_solr_url = 'https://www.ebi.ac.uk/pdbe/search/pdb/select?'# base url for resultspdbe_entry_url = 'https://www.ebi.ac.uk/pdbe/entry/pdb/{pdb_id}'# link to preview image of structurepdbe_preview_url = 'https://www.ebi.ac.uk/pdbe/static/entry/{pdb_id}_deposited_chain_front_image-200x200.png'def request(query, params):    params['url'] = pdbe_solr_url    params['method'] = 'POST'    params['data'] = {        'q': query,        'wt': "json"  # request response in parsable format    }    return paramsdef construct_body(result):    # set title    title = result['title']    # construct content body    content = """{title} - {authors} {journal} ({volume}) {page} ({year})"""    # replace placeholders with actual content    try:        if result['journal']:            content = content.format(                title=result['citation_title'],                authors=result['entry_author_list'][0], journal=result['journal'], volume=result['journal_volume'],                page=result['journal_page'], year=result['citation_year'])        else:            content = content.format(                title=result['citation_title'],                authors=result['entry_author_list'][0], journal='', volume='', page='', year=result['release_year'])        img_src = pdbe_preview_url.format(pdb_id=result['pdb_id'])    except (KeyError):        content = None        img_src = None    # construct url for preview image    try:        img_src = pdbe_preview_url.format(pdb_id=result['pdb_id'])    except (KeyError):        img_src = None    return [title, content, img_src]def response(resp):    results = []    json = loads(resp.text)['response']['docs']    # parse results    for result in json:        # catch obsolete entries and mark them accordingly        if result['status'] in pdb_unpublished_codes:            continue        if hide_obsolete:            continue        if result['status'] == 'OBS':            # expand title to add some sort of warning message            title = gettext('{title} (OBSOLETE)').format(title=result['title'])            try:                superseded_url = pdbe_entry_url.format(pdb_id=result['superseded_by'])            except:                continue            # since we can't construct a proper body from the response, we'll make up our own            msg_superseded = gettext("This entry has been superseded by")            content = '{msg_superseded}: {url} ({pdb_id})'.format(                msg_superseded=msg_superseded,                url=superseded_url,                pdb_id=result['superseded_by'])            # obsoleted entries don't have preview images            img_src = None        else:            title, content, img_src = construct_body(result)        results.append({            'url': pdbe_entry_url.format(pdb_id=result['pdb_id']),            'title': title,            'content': content,            'img_src': img_src        })    return results
 |