Ejemplo n.º 1
0
def validate_pagination_params(page, per_page, order):
    order = str(order).strip().upper()
    ensure(str(order).upper() in ["ASC", "DESC"], "unknown ordering %r" % order)

    ensure(all(map(utils.isint, [page, per_page])), "'page' and 'per-page' must be integers")

    return page, per_page, order
Ejemplo n.º 2
0
def add(art, event, value=None, datetime_event=None):
    utils.ensure(art, "need art")
    datetime_event = datetime_event or utils.utcnow()
    struct = {
        'event': event,
        'value': str(value),
        'datetime_event': datetime_event
    }
    create = update = True
    ae, created, updated = \
        create_or_update(models.ArticleEvent, struct, ['article', 'event', 'datetime_event'], create, update, article=art)
    return ae
Ejemplo n.º 3
0
def slurp(msid):
    "download the article page for a given elife doi, write content to disk"
    if os.path.exists(fname(msid)):
        return

    doi = "10.7554/eLife.%s" % str(msid).zfill(5)
    # ll: https://elifesciences.org/lookup/doi/10.7554/eLife.17267
    url = "https://elifesciences.org/lookup/doi/" + doi
    LOG.debug(url)
    resp = requests.get(url, allow_redirects=False)
    ensure(resp.status_code != 404, "404 fetching article: %s" % resp.status_code)
    art_info_url = resp.headers['Location'] + "/article-info"
    resp2 = requests.get(art_info_url)

    with open(fname(msid), 'wb') as handle:
        handle.write(resp2.content)
Ejemplo n.º 4
0
def associate(av, citation):
    ensure(
        isinstance(citation, dict) and 'uri' in citation,
        "expecting a valid external-link type citation, got: %r" % citation)
    data = {
        'articleversion': av,
        'uri': citation['uri'],
        'citation': citation,
    }
    key = ['articleversion', 'uri']
    avr, _, _ = create_or_update(models.ArticleVersionExtRelation,
                                 data,
                                 key,
                                 create=True,
                                 update=True)
    return avr
Ejemplo n.º 5
0
def latest_article_versions(page=1, per_page=-1, order='DESC', only_published=True):
    "returns a list of the most recent article versions for all articles."

    order = str(order).strip().upper()
    ensure(str(order).upper() in ['ASC', 'DESC'], "unknown ordering %r" % order)
    order_by = 'datetime_published'

    ensure(all(map(utils.isint, [page, per_page])), "'page' and 'per-page' must be integers")

    # sql limit+offset rules
    limit = per_page
    offset = per_page * (page - 1)

    # python slicing rules
    start = (page - 1) * per_page
    end = start + per_page

    if only_published:
        sql = """
        SELECT
           pav.id, pav.article_id, pav.title, pav.version, pav.status, pav.datetime_published,
           pav.datetime_record_created, pav.datetime_record_updated

        FROM publisher_articleversion pav,

          (SELECT pav2.article_id,
                  max(version) AS max_ver
           FROM publisher_articleversion pav2
           WHERE datetime_published IS NOT NULL
           GROUP BY pav2.article_id) as pav2

        WHERE
           pav.article_id = pav2.article_id AND pav.version = pav2.max_ver

        ORDER BY %s %s""" % (order_by, order)

        if per_page > 0:
            sql += """

        LIMIT %s

        OFFSET %s""" % (limit, offset)

        # quotes parameters :(
        #rq = models.ArticleVersion.objects.raw(sql, [order_by])
        q = models.ArticleVersion.objects.raw(sql)
        # print q.query
        # print [(v.article.manuscript_id, v.datetime_published) for v in q]
        return list(q)

    # this query only works if we're not excluding unpublished articles.
    # the max() function doesn't obey the filtering rules

    if order is 'DESC':
        order_by = '-' + order_by

    q = models.ArticleVersion.objects \
        .select_related('article') \
        .annotate(max_version=Max('article__articleversion__version')) \
        .filter(version=F('max_version')) \
        .order_by(order_by)

    if per_page > 0:
        q = q[start:end]

    return list(q)
Ejemplo n.º 6
0
def validate_pagination_params(page, per_page, order):
    order = str(order).strip().upper()
    # TODO: necessary? this duplicates api_v2_views.request_args a bit ...
    ensure(str(order).upper() in ['ASC', 'DESC'], "unknown ordering, expecting either 'asc' or 'desc'")
    ensure(all(map(utils.isint, [page, per_page])), "'page' and 'per-page' must be integers")
    return page, per_page, order