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)
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)
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
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)
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)
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")
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'.")
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'.")
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)
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()
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)
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)
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()
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()
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()
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()
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()
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
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()
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()
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()
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)
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()
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)
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
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()
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
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
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)