예제 #1
0
    def test_create_only_required_fields_with_valid_journal_success(self):
        # given
        # create a journal
        journal_doc = self._create_dummy_journal()
        issue_doc = self._create_dummy_issue(journal_doc)

        _id = self.generate_uuid_32_string()
        aid = self.generate_uuid_32_string()
        article_data = {
            '_id': _id,
            'aid': aid,
            'is_public': True,
            # requerido pelo Legendarium:
            'journal': journal_doc,
            'issue': issue_doc,
        }

        # when
        article_data = Article(**article_data)
        article_data.save()

        # then
        articles_count = Article.objects.all().count()
        self.assertEqual(_id, article_data._id)
        self.assertEqual(aid, article_data.aid)
        self.assertEqual(1, articles_count)
예제 #2
0
    def test_check_article_legend_output(self):
        # given
        # create a journal
        journal_doc = self._create_dummy_journal()
        issue_doc = self._create_dummy_issue(journal_doc)

        _id = self.generate_uuid_32_string()
        aid = self.generate_uuid_32_string()
        article_data = {
            '_id': _id,
            'aid': aid,
            'is_public': True,
            # requerido pelo Legendarium:
            'journal': journal_doc,
            'issue': issue_doc,
        }

        # when
        article_doc = Article(**article_data)
        article_doc.save()

        # then
        expected_legend = u"%s, %s %s(%s)" % (
            journal_doc.short_title, issue_doc.year,
            issue_doc.volume, issue_doc.number)
        self.assertEqual(expected_legend, article_doc.legend)
예제 #3
0
def get_article_by_pid_v2(v2, **kwargs):
    """
    Retorna um artigo considerando os parâmetros ``v2``.

    - ``v2``: string, contendo o PID do artigo versão 2, seja pid ou aop_pid
    """

    if not v2:
        raise ValueError(__('Obrigatório um pid.'))

    v2 = v2.upper()

    articles = Article.objects(pid=v2, is_public=True, **kwargs)
    if articles:
        return articles[0]

    articles = Article.objects(aop_pid=v2, is_public=True, **kwargs)
    if articles:
        return articles[0]

    articles = Article.objects(scielo_pids__other=v2, is_public=True, **kwargs)
    if articles:
        return articles[0]

    return None
예제 #4
0
    def test_check_article_legend_output(self):
        # given
        # create a journal
        journal_doc = self._create_dummy_journal()
        issue_doc = self._create_dummy_issue(journal_doc)

        _id = self.generate_uuid_32_string()
        aid = self.generate_uuid_32_string()
        article_data = {
            '_id': _id,
            'aid': aid,
            'is_public': True,
            # requerido pelo Legendarium:
            'journal': journal_doc,
            'issue': issue_doc,
        }

        # when
        article_doc = Article(**article_data)
        article_doc.save()

        # then
        expected_legend = u"%s, %s %s(%s)" % (journal_doc.short_title,
                                              issue_doc.year, issue_doc.volume,
                                              issue_doc.number)
        self.assertEqual(expected_legend, article_doc.legend)
예제 #5
0
    def test_check_article_url_with_elocation(self):
        # given
        # create a journal
        journal_doc = self._create_dummy_journal()
        issue_doc = self._create_dummy_issue(journal_doc)

        _id = self.generate_uuid_32_string()
        aid = self.generate_uuid_32_string()
        article_data = {
            '_id': _id,
            'aid': aid,
            'is_public': True,
            # requerido pelo Legendarium:
            'journal': journal_doc,
            'issue': issue_doc,
            'fpage_sequence': 'FPAGE_SEQ',
            'fpage': 'FPAGE',
            'lpage': 'LPAGE',
            'elocation': 'ELOCATION',
            'doi': 'DOI',
            'order': 1111,
        }

        # when
        article_doc = Article(**article_data)
        article_doc.save()

        # then
        self.assertEqual('ELOCATION', article_doc.url)
예제 #6
0
    def test_create_only_required_fields_with_valid_journal_success(self):
        # given
        # create a journal
        journal_doc = self._create_dummy_journal()
        issue_doc = self._create_dummy_issue(journal_doc)

        _id = self.generate_uuid_32_string()
        aid = self.generate_uuid_32_string()
        article_data = {
            '_id': _id,
            'aid': aid,
            'is_public': True,
            # requerido pelo Legendarium:
            'journal': journal_doc,
            'issue': issue_doc,
        }

        # when
        article_data = Article(**article_data)
        article_data.save()

        # then
        articles_count = Article.objects.all().count()
        self.assertEqual(_id, article_data._id)
        self.assertEqual(aid, article_data.aid)
        self.assertEqual(1, articles_count)
예제 #7
0
    def test_check_article_pid_already_set(self):
        # given
        # create a journal
        journal_doc = self._create_dummy_journal()
        issue_doc = self._create_dummy_issue(journal_doc)

        _id = self.generate_uuid_32_string()
        aid = self.generate_uuid_32_string()
        article_data = {
            '_id': _id,
            'aid': aid,
            'is_public': True,
            # requerido pelo Legendarium:
            'journal': journal_doc,
            'issue': issue_doc,
            'order': 1111,
            'pid': "S0101-02022019000300123",
            'scielo_pids': {
                "v1": "S0101-0202(98)01100123",
                "v2": "S0101-02022019000300001",
                "v3": "azEglOE290cWcmloijsd",
            },
        }

        # when
        article_doc = Article(**article_data)
        article_doc.save()

        # then
        self.assertEqual(article_doc.pid, "S0101-02022019000300123")
예제 #8
0
파일: controllers.py 프로젝트: jfunez/opac
def count_elements_by_type_and_visibility(type, public_only=False):
    """
    Retorna a quantidade de registros indicado pelo @type.
    @params:
    - ``type``: O tipo de elemento que queremos contabilizar.
                Deve ser "journal" ou "issue" ou "article";
    - ``public_only``: Se for True, filtra na contagem somente os registros públicos,
                       caso contrario contabliza todos (públicos e não publicos);
    """

    if type == 'journal':
        if public_only:
            return Journal.objects(is_public=True).count()
        else:
            return Journal.objects.count()
    elif type == 'issue':
        if public_only:
            return Issue.objects(is_public=True).count()
        else:
            return Issue.objects.count()
    elif type == 'article':
        if public_only:
            return Article.objects(is_public=True).count()
        else:
            return Article.objects.count()
    else:
        raise ValueError(u"Parâmetro 'type' errado, tente: 'journal' ou 'issue' ou 'article'.")
예제 #9
0
def count_elements_by_type_and_visibility(type, public_only=False):
    """
    Retorna a quantidade de registros indicado pelo @type.
    @params:
    - ``type``: O tipo de elemento que queremos contabilizar.
                Deve ser "journal" ou "issue" ou "article";
    - ``public_only``: Se for True, filtra na contagem somente os registros públicos,
                       caso contrario contabliza todos (públicos e não publicos);
    """

    if type == 'journal':
        if public_only:
            return Journal.objects(is_public=True).count()
        else:
            return Journal.objects.count()
    elif type == 'issue':
        if public_only:
            return Issue.objects(is_public=True).count()
        else:
            return Issue.objects.count()
    elif type == 'article':
        if public_only:
            return Article.objects(is_public=True).count()
        else:
            return Article.objects.count()
    elif type == 'news':
        return News.objects.count()
    elif type == 'sponsor':
        return Sponsor.objects.count()
    elif type == 'pressrelease':
        return PressRelease.objects.count()
    else:
        raise ValueError("Parâmetro 'type' errado, tente: 'journal' ou 'issue' ou 'article'.")
예제 #10
0
def filter_articles_by_ids(ids):
    """
    Retorna uma lista de artigos aonde o atributo ``iid`` de cada um deles
    pertence a lista do parâmetro: ``iids``

    - ``iids``: lista de iids de fascículos a serem filtrados.
    """
    return Article.objects(_id__in=ids)
예제 #11
0
def get_article_by_aid(aid, **kwargs):
    """
    Retorna um artigo considerando os parâmetros ``aid`` e ``kwargs``.

    - ``aid``: string, chave primaria do artigo (ex.: ``14a278af8d224fa2a09a901123ca78ba``);
    - ``kwargs``: parâmetros de filtragem.
    """

    return Article.objects(aid=aid, **kwargs).first()
예제 #12
0
def get_articles_by_iid(iid, is_public=True):
    """
    Retorna uma lista de artigos aonde o atributo ``iid`` de cada um deles
    é igual ao parâmetro: ``iid``.

    - ``iid``: chave primaria de fascículo para escolher os artigos.
    """

    return Article.objects(issue=iid, is_public=is_public)
예제 #13
0
def get_articles_by_iid(iid, **kwargs):
    """
    Retorna uma lista de artigos aonde o atributo ``iid`` de cada um deles
    é igual ao parâmetro: ``iid``.

    - ``iid``: chave primaria de fascículo para escolher os artigos.
    - ``kwargs``: parâmetros de filtragem.
    """

    return Article.objects(issue=iid, **kwargs)
예제 #14
0
def get_article_by_oap_pid(aop_pid, **kwargs):
    """
    Retorna um artigo considerando os parâmetros ``aop_pid``.

    - ``aop_pid``: string, contendo o OAP_PID do artigo.
    """

    if not aop_pid:
        raise ValueError(__('Obrigatório um aop_pid.'))

    return Article.objects(aop_pid=aop_pid, **kwargs).first()
예제 #15
0
def get_article_by_url_seg(url_seg_article, **kwargs):
    """
    Retorna um artigo considerando os parâmetros ``url_seg_article`` e ``kwargs``.

    - ``url_seg_article``: string, segmento do url do artigo;
    - ``kwargs``: parâmetros de filtragem.
    """

    if not url_seg_article:
        raise ValueError(__('Obrigatório um url_seg_article.'))

    return Article.objects(url_segment=url_seg_article, **kwargs).first()
예제 #16
0
파일: controllers.py 프로젝트: jfunez/opac
def get_article_by_aid(aid, **kwargs):
    """
    Retorna um artigo considerando os parâmetros ``aid`` e ``kwargs``.

    - ``aid``: string, chave primaria do artigo (ex.: ``14a278af8d224fa2a09a901123ca78ba``);
    - ``kwargs``: parâmetros de filtragem.
    """

    if not aid:
        raise ValueError(__(u'Obrigatório um aid.'))

    return Article.objects(aid=aid, **kwargs).first()
예제 #17
0
def get_article_by_url_seg(url_seg_article, **kwargs):
    """
    Retorna um artigo considerando os parâmetros ``url_seg_article`` e ``kwargs``.

    - ``url_seg_article``: string, segmento do url do artigo;
    - ``kwargs``: parâmetros de filtragem.
    """

    if not url_seg_article:
        raise ValueError(__(u'Obrigatório um url_seg_article.'))

    return Article.objects(url_segment=url_seg_article, **kwargs).first()
예제 #18
0
def get_article_by_aid(aid, **kwargs):
    """
    Retorna um artigo considerando os parâmetros ``aid`` e ``kwargs``.

    - ``aid``: string, chave primaria do artigo (ex.: ``14a278af8d224fa2a09a901123ca78ba``);
    - ``kwargs``: parâmetros de filtragem.
    """

    if not aid:
        raise ValueError(__('Obrigatório um aid.'))

    return Article.objects(aid=aid, **kwargs).first()
예제 #19
0
def get_article_by_aid(aid, journal_url_seg, lang=None, gs_abstract=False, **kwargs):
    """
    Retorna um artigo considerando os parâmetros ``aid`` e ``kwargs``.

    - ``aid``: string, chave primaria do artigo (ex.: ``14a278af8d224fa2a09a901123ca78ba``);
    - ``kwargs``: parâmetros de filtragem.
    """
    if not aid:
        raise ValueError(__('Obrigatório um aid.'))

    articles = Article.objects(pk=aid, is_public=True, **kwargs)
    if not articles:
        articles = Article.objects(
            scielo_pids__other=aid, is_public=True, **kwargs)

    if articles:
        article = articles[0]
    else:
        raise ArticleNotFoundError(aid)

    if not article.issue.is_public:
        raise IssueIsNotPublishedError(article.issue.unpublish_reason)

    if not article.journal.is_public:
        raise JournalIsNotPublishedError(article.journal.unpublish_reason)

    if article.journal.url_segment != journal_url_seg:
        raise ArticleJournalNotFoundError(article.journal.url_segment)

    if gs_abstract:
        abstract_languages = _abstract_languages(article.abstracts)
        if not abstract_languages or (lang not in abstract_languages):
            raise ArticleAbstractNotFoundError(lang)
    else:
        lang = lang or article.original_language
        valid_langs = [article.original_language] + article.languages
        if lang not in valid_langs:
            raise ArticleLangNotFoundError(str(valid_langs))

    return article
예제 #20
0
def get_article_by_issue_article_seg(iid, url_seg_article, **kwargs):
    """
    Retorna um artigo considerando os parâmetros ``iid``, ``url_seg_article`` e
    ``kwargs``.

    - ``iid``: string, id do número;
    - ``url_seg_article``: string, segmento do url do artigo;
    - ``kwargs``: parâmetros de filtragem.
    """
    if not iid and url_seg_article:
        raise ValueError(__('Obrigatório um iid and url_seg_article.'))

    return Article.objects(issue=iid, url_segment=url_seg_article, **kwargs).first()
예제 #21
0
def get_article_by_scielo_pid(scielo_pid, **kwargs):
    """
    Retorna um artigo considerando os parâmetros ``scielo_pid``.

    - ``scielo_pid``: string, contendo o PID do artigo versão 1, 2 ou 3
    """

    if not scielo_pid:
        raise ValueError(__('Obrigatório um pid.'))

    return Article.objects(
        (Q(scielo_pids__v1=scielo_pid) | Q(scielo_pids__v2=scielo_pid)
         | Q(scielo_pids__v3=scielo_pid)), **kwargs).first()
예제 #22
0
def get_article_by_issue_article_seg(iid, url_seg_article, **kwargs):
    """
    Retorna um artigo considerando os parâmetros ``iid``, ``url_seg_article`` e
    ``kwargs``.

    - ``iid``: string, id do fascículo;
    - ``url_seg_article``: string, segmento do url do artigo;
    - ``kwargs``: parâmetros de filtragem.
    """

    if not iid and url_seg_article:
        raise ValueError(__(u'Obrigatório um iid and url_seg_article.'))

    return Article.objects(issue=iid, url_segment=url_seg_article, **kwargs).first()
예제 #23
0
    def test_check_article_url_with_order(self):
        # given
        # create a journal
        journal_doc = self._create_dummy_journal()
        issue_doc = self._create_dummy_issue(journal_doc)

        _id = self.generate_uuid_32_string()
        aid = self.generate_uuid_32_string()
        article_data = {
            '_id': _id,
            'aid': aid,
            'is_public': True,
            # requerido pelo Legendarium:
            'journal': journal_doc,
            'issue': issue_doc,
            'order': 1111,
        }

        # when
        article_doc = Article(**article_data)
        article_doc.save()

        # then
        self.assertEqual('o1111', article_doc.url)
예제 #24
0
def get_article_by_pid_v1(v1, **kwargs):
    """
    Retorna um artigo considerando os parâmetros ``v1``.

    - ``v1``: string, contendo o PID do artigo versão 1, 2 ou 3
    """

    if not v1:
        raise ValueError(__('Obrigatório um pid.'))

    return Article.objects(
        scielo_pids__v1=v1,
        is_public=True,
        **kwargs
    ).first()
예제 #25
0
파일: controllers.py 프로젝트: jfunez/opac
def get_articles_by_iid(iid, **kwargs):
    """
    Retorna uma lista de artigos aonde o atributo ``iid`` de cada um deles
    é igual ao parâmetro: ``iid``.

    - ``iid``: chave primaria de fascículo para escolher os artigos.
    - ``kwargs``: parâmetros de filtragem.

    Em caso de não existir itens retorna {}.
    """

    if not iid:
        raise ValueError(__(u'Obrigatório uma lista de iid.'))

    return Article.objects(issue=iid, **kwargs)
예제 #26
0
def get_article_by_aid(aid, is_public=True):
    """
    Retorna um artigo considerando os parâmetros ``aid`` e ``is_public``.

    - ``aid``: string, chave primaria do artigo (ex.: ``14a278af8d224fa2a09a901123ca78ba``);
    - ``is_public``: boolean, filtra por público e não público.
    """

    article = Article.objects(aid=aid).first()

    if article:

        article_public = article.is_public
        journal_public = article.journal.is_public
        issue_public = article.issue.is_public

        if all([article_public, journal_public, issue_public]):
            return article
예제 #27
0
def get_article_by_aop_url_segs(jid, url_seg_issue, url_seg_article, **kwargs):
    """
    Retorna um artigo considerando os parâmetros ``jid``, ``url_seg_issue``,
    ``url_seg_article`` e ``kwargs``.

    - ``jid``: string, id do journal;
    - ``url_seg_issue``: string, segmento do url do fascículo;
    - ``url_seg_article``: string, segmento do url do artigo;
    - ``kwargs``: parâmetros de filtragem.
    """
    if not (jid and url_seg_issue and url_seg_article):
        raise ValueError(__('Obrigatório um jid, url_seg_issue and url_seg_article.'))

    aop_url_segs = {
        "url_seg_article": url_seg_article,
        "url_seg_issue": url_seg_issue
    }

    return Article.objects(journal=jid, aop_url_segs=aop_url_segs, **kwargs).first()
예제 #28
0
def get_articles_by_iid(iid, **kwargs):
    """
    Retorna uma lista de artigos aonde o atributo ``iid`` de cada um deles
    é igual ao parâmetro: ``iid`` ordenado pelo atributo order.

    - ``iid``: chave primaria de número para escolher os artigos.
    - ``kwargs``: parâmetros de filtragem.

    Em caso de não existir itens retorna {}.

    """

    if not iid:
        raise ValueError(__('Obrigatório um iid.'))

    articles = Article.objects(issue=iid, **kwargs).order_by('order')
    if is_aop_issue(iid) or is_open_publication(articles):
        return articles.order_by('-publication_date')
    return articles
예제 #29
0
def get_articles_by_iid(iid, **kwargs):
    """
    Retorna uma lista de artigos aonde o atributo ``iid`` de cada um deles
    é igual ao parâmetro: ``iid`` ordenado pelo atributo order.

    - ``iid``: chave primaria de número para escolher os artigos.
    - ``kwargs``: parâmetros de filtragem.

    Em caso de não existir itens retorna {}.

    """
    if not iid:
        raise ValueError(__('Obrigatório um iid.'))

    # FIXME - Melhorar esta consulta
    # Em um fascículo em que não é aop nem publicação contínua
    # todas as datas são iguais, então, `order_by`,
    # poderia ser chamado uma única vez
    # No entanto, há um issue relacionado: #1435
    articles = Article.objects(issue=iid, **kwargs).order_by('order')
    if is_aop_issue(articles) or is_open_issue(articles):
        return articles.order_by('-publication_date')
    return articles
예제 #30
0
def get_articles_by_date_range(begin_date, end_date, page=1, per_page=100):
    """
    Retorna artigos criados ou atualizados durante o período entre start_date e end_date.
    """
    articles = Article.objects(Q(updated__gte=begin_date) & Q(updated__lte=end_date)).order_by('pid')
    return Pagination(articles, page, per_page)