Exemplo n.º 1
0
def quick_assign(request, article):
    errors = []
    try:
        default_review_form_id = setting_handler.get_setting(
            'general', 'default_review_form', request.journal).processed_value
    except models.ReviewForm.DoesNotExist:
        errors.append('This journal has no default review form.')

    try:
        review_form = models.ReviewForm.objects.get(pk=default_review_form_id)
    except ValueError:
        errors.append('Default review form is not an integer.')

    try:
        default_visibility = setting_handler.get_setting(
            'general', 'default_review_visibility', request.journal).value
        default_due = setting_handler.get_setting('general',
                                                  'default_review_days',
                                                  request.journal).value
    except BaseException:
        errors.append(
            'This journal does not have either default visibilty or default due.'
        )

    user_id = request.POST.get('quick_assign')
    user = core_models.Account.objects.get(pk=user_id)

    if user not in request.journal.users_with_role('reviewer'):
        errors.append('This user is not a reviewer for this journal.')

    if not errors:
        new_assignment = models.ReviewAssignment.objects.create(
            article=article,
            reviewer=user,
            editor=request.user,
            review_round=article.current_review_round_object(),
            form=review_form,
            access_code=uuid4(),
            visibility=default_visibility,
            date_due=timezone.now() + timedelta(days=int(default_due)),
        )

        article.stage = submission_models.STAGE_UNDER_REVIEW
        article.save()

        email_content = get_reviewer_notification(request, article,
                                                  request.user, new_assignment)

        kwargs = {
            'user_message_content': email_content,
            'review_assignment': new_assignment,
            'request': request,
            'skip': False,
            'acknowledgement': False
        }

        event_logic.Events.raise_event(
            event_logic.Events.ON_REVIEWER_REQUESTED, **kwargs)
        event_logic.Events.raise_event(
            event_logic.Events.ON_REVIEWER_REQUESTED_ACKNOWLEDGE, **kwargs)

        return new_assignment

    else:
        for error in errors:
            messages.add_message(request, messages.WARNING, error)
Exemplo n.º 2
0
def supp_file_doi(request, article_id, supp_file_id):
    """
    Presents an interface for minting a supplementary file DOI
    :param request: HttpRequest
    :param article_id: Article object PK
    :param supp_file_id: SupplementaryFile PK
    :return: HttpResponse or HttpRedirect
    """
    article = get_object_or_404(
        submission_models.Article,
        pk=article_id,
        journal=request.journal,
    )
    supplementary_file = get_object_or_404(
        core_models.SupplementaryFile,
        pk=supp_file_id,
    )
    test_mode = setting_handler.get_setting('Identifiers', 'crossref_test',
                                            article.journal).processed_value

    if not article.get_doi():
        messages.add_message(
            request, messages.INFO,
            'Parent article must have a DOI before you can assign a'
            'supplementary file a DOI.')

    xml_context = {
        'supp_file':
        supplementary_file,
        'article':
        article,
        'batch_id':
        uuid.uuid4(),
        'timestamp':
        int(
            round((datetime.datetime.now() -
                   datetime.datetime(1970, 1, 1)).total_seconds())),
        'depositor_name':
        setting_handler.get_setting('Identifiers', 'crossref_name',
                                    article.journal).processed_value,
        'depositor_email':
        setting_handler.get_setting('Identifiers', 'crossref_email',
                                    article.journal).processed_value,
        'registrant':
        setting_handler.get_setting('Identifiers', 'crossref_registrant',
                                    article.journal).processed_value,
        'parent_doi':
        article.get_doi()
    }
    xml_content = render_to_string('identifiers/crossref_component.xml',
                                   xml_context, request)

    if request.POST:
        from identifiers import logic
        logic.register_crossref_component(article, xml_content,
                                          supplementary_file)

        supplementary_file.doi = '{0}.{1}'.format(article.get_doi(),
                                                  supplementary_file.pk)
        supplementary_file.save()
        return redirect(
            reverse('production_article', kwargs={'article_id': article.pk}))

    template = 'production/supp_file_doi.html'
    context = {
        'article': article,
        'supp_file': supplementary_file,
        'xml_content': xml_content,
        'test_mode': test_mode,
    }

    return render(request, template, context)
Exemplo n.º 3
0
def create_article_with_review_content(article_dict, journal, auth_file,
                                       base_url):
    date_started = timezone.make_aware(
        dateparser.parse(article_dict.get('date_submitted')))

    # Create a base article
    article = models.Article(
        journal=journal,
        title=article_dict.get('title'),
        abstract=article_dict.get('abstract'),
        language=article_dict.get('language'),
        stage=models.STAGE_UNDER_REVIEW,
        is_import=True,
        date_submitted=date_started,
    )

    article.save()

    # Check for editors and assign them as section editors.
    editors = article_dict.get('editors', [])

    for editor in editors:
        try:
            account = core_models.Account.objects.get(email=editor)
            account.add_account_role('section-editor', journal)
            review_models.EditorAssignment.objects.create(
                article=article, editor=account, editor_type='section-editor')
            logger.info('Editor added to article')
        except Exception as e:
            logger.error('Editor account was not found.')
            logger.exception(e)

    # Add a new review round
    round = review_models.ReviewRound.objects.create(article=article,
                                                     round_number=1)

    # Add keywords
    keywords = article_dict.get('keywords')
    if keywords:
        for keyword in keywords.split(';'):
            word, created = models.Keyword.objects.get_or_create(word=keyword)
            article.keywords.add(word)

    # Add authors
    for author in article_dict.get('authors'):
        try:
            author_record = core_models.Account.objects.get(
                email=author.get('email'))
        except core_models.Account.DoesNotExist:
            author_record = core_models.Account.objects.create(
                email=author.get('email'),
                first_name=author.get('first_name'),
                last_name=author.get('last_name'),
                institution=author.get('affiliation'),
                biography=author.get('bio'),
            )

        # If we have a country, fetch its record
        if author.get('country'):
            try:
                country = core_models.Country.objects.get(
                    code=author.get('country'))
                author_record.country = country
                author_record.save()
            except core_models.Country.DoesNotExist:
                pass
        # Add authors to m2m and create an order record
        article.authors.add(author_record)
        models.ArticleAuthorOrder.objects.create(
            article=article,
            author=author_record,
            order=article.next_author_sort())

        # Set the primary author
        article.owner = core_models.Account.objects.get(
            email=article_dict.get('correspondence_author'))
        article.correspondence_author = article.owner

        # Get or create the article's section
        try:
            section = models.Section.objects.language().fallbacks('en').get(
                journal=journal, name=article_dict.get('section'))
        except models.Section.DoesNotExist:
            section = None

        article.section = section

        article.save()

    # Attempt to get the default review form
    form = setting_handler.get_setting('general',
                                       'default_review_form',
                                       journal,
                                       create=True).processed_value

    if not form:
        try:
            form = review_models.ReviewForm.objects.filter(journal=journal)[0]
        except Exception:
            form = None
            logger.error(
                'You must have at least one review form for the journal before'
                ' importing.')
            exit()

    for review in article_dict.get('reviews'):
        try:
            reviewer = core_models.Account.objects.get(
                email=review.get('email'))
        except core_models.Account.DoesNotExist:
            reviewer = core_models.Account.objects.create(
                email=review.get('email'),
                first_name=review.get('first_name'),
                last_name=review.get('last_name'),
            )

        # Parse the dates
        date_requested = timezone.make_aware(
            dateparser.parse(review.get('date_requested')))
        date_due = timezone.make_aware(dateparser.parse(
            review.get('date_due')))
        date_complete = timezone.make_aware(
            dateparser.parse(review.get('date_complete'))) if review.get(
                'date_complete') else None
        date_confirmed = timezone.make_aware(
            dateparser.parse(review.get('date_confirmed'))) if review.get(
                'date_confirmed') else None

        # If the review was declined, setup a date declined date stamp
        review.get('declined')
        if review.get('declined') == '1':
            date_declined = date_confirmed
            date_accepted = None
            date_complete = date_confirmed
        else:
            date_accepted = date_confirmed
            date_declined = None

        new_review = review_models.ReviewAssignment.objects.create(
            article=article,
            reviewer=reviewer,
            review_round=round,
            review_type='traditional',
            visibility='double-blind',
            date_due=date_due,
            date_requested=date_requested,
            date_complete=date_complete,
            date_accepted=date_accepted,
            access_code=uuid.uuid4(),
            form=form)

        if review.get('declined') or review.get('recommendation'):
            new_review.is_complete = True

        if review.get('recommendation'):
            new_review.decision = map_review_recommendation(
                review.get('recommendation'))

        if review.get('review_file_url'):
            filename, mime = shared.fetch_file(base_url,
                                               review.get('review_file_url'),
                                               None,
                                               None,
                                               article,
                                               None,
                                               handle_images=False,
                                               auth_file=auth_file)
            extension = os.path.splitext(filename)[1]

            review_file = shared.add_file(mime,
                                          extension,
                                          'Reviewer file',
                                          reviewer,
                                          filename,
                                          article,
                                          galley=False)
            new_review.review_file = review_file

        if review.get('comments'):
            filepath = core_files.create_temp_file(review.get('comments'),
                                                   'comment.txt')
            file = open(filepath, 'r', encoding="utf-8")
            comment_file = core_files.save_file_to_article(
                file,
                article,
                article.owner,
                label='Review Comments',
                save=False)

            new_review.review_file = comment_file

        new_review.save()

    # Get MS File
    ms_file = get_ojs_file(base_url, article_dict.get('manuscript_file_url'),
                           article, auth_file, 'MS File')
    article.manuscript_files.add(ms_file)

    # Get RV File
    rv_file = get_ojs_file(base_url, article_dict.get('review_file_url'),
                           article, auth_file, 'RV File')
    round.review_files.add(rv_file)

    # Get Supp Files
    if article_dict.get('supp_files'):
        for file in article_dict.get('supp_files'):
            file = get_ojs_file(base_url, file.get('url'), article, auth_file,
                                file.get('title'))
            article.data_figure_files.add(file)

    article.save()
    round.save()

    return article
Exemplo n.º 4
0
def send_crossref_deposit(server, identifier):
    # todo: work out whether this is acceptance or publication
    # if it's acceptance, then we use "0" for volume and issue
    # if publication, then use real values
    # the code here is for acceptance

    from utils import setting_handler
    article = identifier.article
    error = False

    template_context = {
        'batch_id':
        uuid4(),
        'timestamp':
        int(
            round((datetime.datetime.now() -
                   datetime.datetime(1970, 1, 1)).total_seconds())),
        'depositor_name':
        setting_handler.get_setting(
            'Identifiers', 'crossref_name',
            identifier.article.journal).processed_value,
        'depositor_email':
        setting_handler.get_setting(
            'Identifiers', 'crossref_email',
            identifier.article.journal).processed_value,
        'registrant':
        setting_handler.get_setting(
            'Identifiers', 'crossref_registrant',
            identifier.article.journal).processed_value,
        'journal_title':
        identifier.article.journal.name,
        'journal_issn':
        identifier.article.journal.issn,
        'date_published':
        identifier.article.date_published,
        'issue':
        identifier.article.issue,
        'article_title':
        '{0}{1}{2}'.format(
            identifier.article.title,
            ' ' if identifier.article.subtitle is not None else '',
            identifier.article.subtitle
            if identifier.article.subtitle is not None else ''),
        'authors':
        identifier.article.authors.all(),
        'doi':
        identifier.identifier,
        'article_url':
        identifier.article.url,
        'now':
        timezone.now(),
    }

    pdfs = identifier.article.pdfs
    if len(pdfs) > 0:
        template_context['pdf_url'] = article.pdf_url

    if article.license:
        template_context["license"] = article.license.url

    template = 'identifiers/crossref.xml'
    crossref_template = render_to_string(template, template_context)
    logger.debug(crossref_template)

    util_models.LogEntry.add_entry('Submission',
                                   "Sending request to {1}: {0}".format(
                                       crossref_template, server),
                                   'Info',
                                   target=identifier.article)

    response = requests.post(
        server,
        data=crossref_template.encode('utf-8'),
        auth=(setting_handler.get_setting(
            'Identifiers', 'crossref_username',
            identifier.article.journal).processed_value,
              setting_handler.get_setting(
                  'Identifiers', 'crossref_password',
                  identifier.article.journal).processed_value),
        headers={"Content-Type": "application/vnd.crossref.deposit+xml"})

    if response.status_code != 200:
        util_models.LogEntry.add_entry('Error',
                                       "Error depositing: {0}. {1}".format(
                                           response.status_code,
                                           response.text),
                                       'Debug',
                                       target=identifier.article)

        status = "Error depositing: {code}, {text}".format(
            code=response.status_code, text=response.text)
        logger.error(status)
        logger.error(response.text)
        error = True
    else:
        token = response.json()['message']['batch-id']
        status = response.json()['message']['status']
        util_models.LogEntry.add_entry('Submission',
                                       "Deposited {0}. Status: {1}".format(
                                           token, status),
                                       'Info',
                                       target=identifier.article)
        status = "Status of {} in {}: {}".format(token, identifier.identifier,
                                                 status)
        logger.info(status)

    return status, error
Exemplo n.º 5
0
def register_crossref_component(article, xml, supp_file):
    from utils import setting_handler

    test_url = CROSSREF_TEST_URL
    live_url = CROSSREF_LIVE_URL

    use_crossref = setting_handler.get_setting('Identifiers', 'use_crossref',
                                               article.journal).processed_value

    if not use_crossref:
        logger.info(
            "[DOI] Not using Crossref DOIs on this journal. Aborting registration."
        )
        return

    test_mode = setting_handler.get_setting('Identifiers', 'crossref_test',
                                            article.journal).processed_value

    server = test_url if test_mode else live_url

    if test_mode:
        util_models.LogEntry.add_entry(
            'Submission',
            "DOI component registration running in test mode",
            'Info',
            target=article)
    else:
        util_models.LogEntry.add_entry(
            'Submission',
            "DOI component registration running in live mode",
            'Info',
            target=article)

    response = requests.post(
        server,
        data=xml.encode('utf-8'),
        auth=(setting_handler.get_setting('Identifiers', 'crossref_username',
                                          article.journal).processed_value,
              setting_handler.get_setting('Identifiers', 'crossref_password',
                                          article.journal).processed_value),
        headers={"Content-Type": "application/vnd.crossref.deposit+xml"})

    if response.status_code != 200:
        util_models.LogEntry.add_entry('Error',
                                       "Error depositing: {0}. {1}".format(
                                           response.status_code,
                                           response.text),
                                       'Debug',
                                       target=article)
        logger.error("Error depositing: {}".format(response.status_code))
        logger.error(response.text, file=sys.stderr)
    else:
        token = response.json()['message']['batch-id']
        status = response.json()['message']['status']
        util_models.LogEntry.add_entry('Submission',
                                       "Deposited {0}. Status: {1}".format(
                                           token, status),
                                       'Info',
                                       target=article)
        logger.info("Status of {} in {}: {}".format(
            token, '{0}.{1}'.format(article.get_doi(), supp_file.pk), status))
Exemplo n.º 6
0
 def issn(self):
     return setting_handler.get_setting('general',
                                        'journal_issn',
                                        self,
                                        create=False,
                                        fallback='en').value
Exemplo n.º 7
0
def edit_metadata(request, article_id):
    """
    Allows the Editors and Production Managers to edit an Article's metadata/
    :param request: request object
    :param article_id: PK of an Article
    :return: contextualised django template
    """
    article = get_object_or_404(models.Article, pk=article_id)
    submission_summary = setting_handler.get_setting(
        'general',
        'submission_summary',
        request.journal,
    ).processed_value
    info_form = forms.ArticleInfo(
        instance=article,
        submission_summary=submission_summary,
        pop_disabled_fields=False,
    )
    frozen_author, modal = None, None
    return_param = request.GET.get('return')
    reverse_url = '{0}?return={1}'.format(
        reverse('edit_metadata', kwargs={'article_id': article.pk}),
        return_param,
    )

    if request.GET.get('author'):
        frozen_author, modal = logic.get_author(request, article)
        author_form = forms.EditFrozenAuthor(instance=frozen_author)
    else:
        author_form = forms.EditFrozenAuthor()

    if request.POST:
        if 'add_funder' in request.POST:
            funder = models.Funder(name=request.POST.get('funder_name',
                                                         default=''),
                                   fundref_id=request.POST.get('funder_doi',
                                                               default=''),
                                   funding_id=request.POST.get('grant_number',
                                                               default=''))

            funder.save()
            article.funders.add(funder)
            article.save()

        if 'metadata' in request.POST:
            info_form = forms.ArticleInfo(
                request.POST,
                instance=article,
                submission_summary=submission_summary,
                pop_disabled_fields=False,
            )

            if info_form.is_valid():
                info_form.save(request=request)
                messages.add_message(
                    request,
                    messages.SUCCESS,
                    'Metadata updated.',
                )
                return redirect(reverse_url)

        if 'author' in request.POST:
            author_form = forms.EditFrozenAuthor(
                request.POST,
                instance=frozen_author,
            )

            if author_form.is_valid():
                saved_author = author_form.save()
                saved_author.article = article
                saved_author.save()
                messages.add_message(
                    request,
                    messages.SUCCESS,
                    'Author {0} updated.'.format(saved_author.full_name()),
                )
                return redirect(reverse_url)

        if 'delete' in request.POST:
            frozen_author_id = request.POST.get('delete')
            frozen_author = get_object_or_404(models.FrozenAuthor,
                                              pk=frozen_author_id,
                                              article=article,
                                              article__journal=request.journal)
            frozen_author.delete()
            messages.add_message(
                request,
                messages.SUCCESS,
                'Frozen Author deleted.',
            )
            return redirect(reverse_url)

    template = 'submission/edit/metadata.html'
    context = {
        'article': article,
        'info_form': info_form,
        'author_form': author_form,
        'modal': modal,
        'frozen_author': frozen_author,
        'return': return_param
    }

    return render(request, template, context)
Exemplo n.º 8
0
 def get_setting(self, group_name, setting_name):
     return setting_handler.get_setting(group_name,
                                        setting_name,
                                        self,
                                        create=False).processed_value
Exemplo n.º 9
0
 def publisher(self):
     return setting_handler.get_setting('general',
                                        'publisher_name',
                                        self,
                                        create=False,
                                        fallback='en').value
Exemplo n.º 10
0
def configure(request):
    token = setting_handler.get_setting("plugin",
                                        "doaj_api_token",
                                        journal=request.journal)
    journals = {}
    push_enabled = False
    if request.journal:
        push_enabled = setting_handler.get_setting(
            "plugin",
            "doaj_publish_push",
            journal=request.journal,
            default=False,
        )
    else:
        for journal in request.press.journals():
            enabled = setting_handler.get_setting(
                "plugin",
                "doaj_publish_push",
                journal=journal,
                default=False,
            )
            if enabled:
                journals[journal] = True
            else:
                journals[journal] = False

    if token.journal == request.journal:
        initial_token = token.value
    else:
        initial_token = None
    token_form = core_forms.EditKey(
        key_type=token.setting.types,
        value=initial_token or None,
    )
    if request.POST:
        token_form
        posted_codes = set(request.POST.getlist("journal_push", []))
        posted_token = request.POST.get("value")
        if posted_token:
            setting_handler.save_setting("plugin",
                                         "doaj_api_token",
                                         journal=request.journal,
                                         value=posted_token)
        if request.journal:
            #If blank, delete potential override
            if not posted_token and token.journal:
                token.delete()
            if request.journal.code in posted_codes:
                setting_handler.save_setting(
                    "plugin",
                    "doaj_publish_push",
                    journal=request.journal,
                    value=True,
                )
            else:
                push_enabled = setting_handler.get_setting(
                    "plugin",
                    "doaj_publish_push",
                    journal=request.journal,
                    default=False,
                )
                if push_enabled:
                    push_enabled.delete()
        else:
            for journal in request.press.journals():
                if journal.code in posted_codes:
                    setting_handler.save_setting(
                        "plugin",
                        "doaj_publish_push",
                        journal=journal,
                        value=True,
                    )
                else:
                    enabled = setting_handler.get_setting(
                        "plugin",
                        "doaj_publish_push",
                        journal=journal,
                        default=False,
                    )
                    if enabled:
                        enabled.delete()
        return redirect(reverse("doaj_configure"))

    template = 'doaj_transporter/configure.html'
    context = {
        "token_form": token_form,
        "token": token,
        "journals": journals,
        "push_enabled": push_enabled,
    }

    return render(request, template, context)
Exemplo n.º 11
0
def send_email(subject,
               to,
               html,
               journal,
               request,
               bcc=None,
               cc=None,
               attachment=None,
               replyto=None):

    if journal:
        from_email = setting_handler.get_setting('email', 'from_address',
                                                 journal).value
        subject_setting = setting_handler.get_email_subject_setting(
            'email_subject', subject, journal)
        subject = "[{0}] {1}".format(
            journal.code, subject_setting if subject_setting else subject)
        html = "{0}<br />{1}".format(html, journal.name)
    else:
        from_email = request.press.main_contact

    if isinstance(to, str):
        if settings.DUMMY_EMAIL_DOMAIN in to:
            to = []
        else:
            to = [to]
    elif isinstance(to, Iterable):
        to = [
            email for email in to if not settings.DUMMY_EMAIL_DOMAIN in email
        ]

    if request and request.user and not request.user.is_anonymous():
        reply_to = [request.user.email]
        full_from_string = "{0} <{1}>".format(request.user.full_name(),
                                              from_email)
    else:
        reply_to = []
        if request:
            full_from_string = "{0} <{1}>".format(
                sanitize_from(request.site_type.name), from_email)
        else:
            full_from_string = from_email

    if replyto:
        reply_to = replyto

    msg = EmailMultiAlternatives(subject,
                                 strip_tags(html),
                                 full_from_string,
                                 to,
                                 bcc=bcc,
                                 cc=cc,
                                 reply_to=reply_to)
    msg.attach_alternative(html, "text/html")

    if request and request.FILES and request.FILES.getlist('attachment'):
        for file in request.FILES.getlist('attachment'):
            file.open()
            msg.attach(file.name, file.read(), file.content_type)
            file.close()

    return msg.send()
Exemplo n.º 12
0
def get_agreement_text(journal):
    pub_fees = setting_handler.get_setting('general', 'publication_fees', journal).value
    sub_check = setting_handler.get_setting('general', 'submission_checklist', journal).value
    copy_notice = setting_handler.get_setting('general', 'copyright_notice', journal).value

    return "{0}\n\n{1}\n\n{2}".format(pub_fees, sub_check, copy_notice)
Exemplo n.º 13
0
def get_settings_to_edit(group, journal):
    review_form_choices = list()
    for form in review_models.ReviewForm.objects.filter(journal=journal):
        review_form_choices.append([form.pk, form])

    if group == 'submission':
        settings = [{
            'name':
            'disable_journal_submission',
            'object':
            setting_handler.get_setting('general',
                                        'disable_journal_submission', journal)
        }, {
            'name':
            'abstract_required',
            'object':
            setting_handler.get_setting(
                'general',
                'abstract_required',
                journal,
            )
        }, {
            'name':
            'submission_intro_text',
            'object':
            setting_handler.get_setting('general', 'submission_intro_text',
                                        journal)
        }, {
            'name':
            'copyright_notice',
            'object':
            setting_handler.get_setting('general', 'copyright_notice', journal)
        }, {
            'name':
            'submission_checklist',
            'object':
            setting_handler.get_setting('general', 'submission_checklist',
                                        journal)
        }, {
            'name':
            'acceptance_criteria',
            'object':
            setting_handler.get_setting('general', 'acceptance_criteria',
                                        journal)
        }, {
            'name':
            'publication_fees',
            'object':
            setting_handler.get_setting('general', 'publication_fees', journal)
        }, {
            'name':
            'editors_for_notification',
            'object':
            setting_handler.get_setting('general', 'editors_for_notification',
                                        journal),
            'choices':
            journal.editor_pks()
        }, {
            'name':
            'user_automatically_author',
            'object':
            setting_handler.get_setting('general', 'user_automatically_author',
                                        journal),
        }, {
            'name':
            'submission_competing_interests',
            'object':
            setting_handler.get_setting('general',
                                        'submission_competing_interests',
                                        journal),
        }, {
            'name':
            'submission_summary',
            'object':
            setting_handler.get_setting('general', 'submission_summary',
                                        journal),
        }, {
            'name':
            'limit_manuscript_types',
            'object':
            setting_handler.get_setting('general', 'limit_manuscript_types',
                                        journal),
        }, {
            'name':
            'accepts_preprint_submissions',
            'object':
            setting_handler.get_setting('general',
                                        'accepts_preprint_submissions',
                                        journal),
        }, {
            'name':
            'focus_and_scope',
            'object':
            setting_handler.get_setting('general', 'focus_and_scope', journal),
        }, {
            'name':
            'publication_cycle',
            'object':
            setting_handler.get_setting('general', 'publication_cycle',
                                        journal),
        }, {
            'name':
            'peer_review_info',
            'object':
            setting_handler.get_setting('general', 'peer_review_info',
                                        journal),
        }, {
            'name':
            'copyright_submission_label',
            'object':
            setting_handler.get_setting('general',
                                        'copyright_submission_label', journal)
        }]
        setting_group = 'general'

    elif group == 'review':
        settings = [{
            'name':
            'reviewer_guidelines',
            'object':
            setting_handler.get_setting('general', 'reviewer_guidelines',
                                        journal),
        }, {
            'name':
            'default_review_visibility',
            'object':
            setting_handler.get_setting('general', 'default_review_visibility',
                                        journal),
            'choices':
            review_models.review_visibilty()
        }, {
            'name':
            'review_file_help',
            'object':
            setting_handler.get_setting('general', 'review_file_help',
                                        journal),
        }, {
            'name':
            'default_review_days',
            'object':
            setting_handler.get_setting('general', 'default_review_days',
                                        journal),
        }, {
            'name':
            'enable_one_click_access',
            'object':
            setting_handler.get_setting('general', 'enable_one_click_access',
                                        journal),
        }, {
            'name':
            'draft_decisions',
            'object':
            setting_handler.get_setting('general', 'draft_decisions', journal),
        }, {
            'name':
            'default_review_form',
            'object':
            setting_handler.get_setting('general', 'default_review_form',
                                        journal),
            'choices':
            review_form_choices
        }, {
            'name':
            'reviewer_form_download',
            'object':
            setting_handler.get_setting('general', 'reviewer_form_download',
                                        journal),
        }]
        setting_group = 'general'

    elif group == 'crossref':
        xref_settings = [
            'use_crossref', 'crossref_test', 'crossref_username',
            'crossref_password', 'crossref_email', 'crossref_name',
            'crossref_prefix', 'crossref_registrant', 'doi_display_prefix',
            'doi_display_suffix', 'doi_pattern'
        ]

        settings = process_setting_list(xref_settings, 'Identifiers', journal)
        setting_group = 'Identifiers'

    elif group == 'crosscheck':
        xref_settings = ['enable', 'username', 'password']

        settings = process_setting_list(xref_settings, 'crosscheck', journal)
        setting_group = 'crosscheck'

    elif group == 'journal':
        journal_settings = [
            'journal_name',
            'journal_issn',
            'journal_theme',
            'journal_description',
            'enable_editorial_display',
            'multi_page_editorial',
            'enable_editorial_images',
            'main_contact',
            'publisher_name',
            'publisher_url',
            'maintenance_mode',
            'maintenance_message',
            'auto_signature',
            'slack_logging',
            'slack_webhook',
            'twitter_handle',
            'switch_language',
            'google_analytics_code',
            'keyword_list_page',
        ]

        settings = process_setting_list(journal_settings, 'general', journal)
        settings[2]['choices'] = get_theme_list()
        setting_group = 'general'
        settings.append({
            'name':
            'from_address',
            'object':
            setting_handler.get_setting('email', 'from_address', journal),
        })

    elif group == 'proofing':
        proofing_settings = ['max_proofreaders']
        settings = process_setting_list(proofing_settings, 'general', journal)
        setting_group = 'general'
    else:
        settings = []
        setting_group = None

    return settings, setting_group
Exemplo n.º 14
0
def import_review_data(article_dict, article, client):
    # Add a new review round
    round, _ = review_models.ReviewRound.objects.get_or_create(
        article=article,
        round_number=1,
    )
    # Check for files at review level
    file_for_review_url = article_dict.get("review_file_url")
    fetched_file_for_review = client.fetch_file(file_for_review_url)
    if fetched_file_for_review:
        file_for_review = core_files.save_file_to_article(
            fetched_file_for_review,
            article,
            article.owner,
            label="File for Peer-Review",
        )
        round.review_files.add(file_for_review)

    # Attempt to get the default review form
    form = setting_handler.get_setting(
        'general',
        'default_review_form',
        article.journal,
    ).processed_value
    if form:
        form = review_models.ReviewForm.objects.get(id=form, )

    else:
        try:
            form = review_models.ReviewForm.objects.filter(
                journal=article.journal)[0]
        except Exception:
            form = None
            logger.error(
                'You must have at least one review form for the journal before'
                ' importing.')
            raise

    # Set for avoiding duplicate review files
    for review in article_dict.get('reviews'):
        reviewer = get_or_create_account(review)

        # Parse the dates
        date_requested = timezone.make_aware(
            dateparser.parse(review.get('date_requested')))
        date_due = timezone.make_aware(dateparser.parse(
            review.get('date_due')))
        date_complete = timezone.make_aware(
            dateparser.parse(review.get('date_complete'))) if review.get(
                'date_complete') else None
        date_confirmed = timezone.make_aware(
            dateparser.parse(review.get('date_confirmed'))) if review.get(
                'date_confirmed') else None
        date_declined = None

        review.get('declined')
        if review.get('declined') == '1':
            date_accepted = None
            date_declined = date_confirmed
        else:
            date_accepted = date_confirmed

        review_defaults = dict(review_type='traditional',
                               visibility='double-blind',
                               date_due=date_due,
                               date_requested=date_requested,
                               date_complete=date_complete,
                               date_accepted=date_accepted,
                               date_declined=date_declined,
                               access_code=uuid.uuid4(),
                               form=form)
        new_review, _ = review_models.ReviewAssignment.objects.get_or_create(
            article=article,
            reviewer=reviewer,
            review_round=round,
            defaults=review_defaults,
        )

        if review.get('declined') or review.get('recommendation'):
            new_review.is_complete = True

        if review.get('recommendation'):
            new_review.decision = REVIEW_RECOMMENDATION[
                review['recommendation']]

        # Check for files at article level
        review_file_url = review.get("review_file_url")
        if review_file_url:
            fetched_review_file = client.fetch_file(review_file_url)
            if fetched_review_file:
                review_file = core_files.save_file_to_article(
                    fetched_review_file,
                    article,
                    reviewer,
                    label="Review File",
                )
                new_review.review_file = review_file

        if review.get('comments'):
            handle_review_comment(article, new_review, review.get('comments'),
                                  form)

        new_review.save()

    # Get MS File
    manuscript_file_url = article_dict.get("manuscript_file_url")
    manuscript = client.fetch_file(manuscript_file_url, "manuscript")
    if manuscript:
        ms_file = core_files.save_file_to_article(manuscript,
                                                  article,
                                                  article.owner,
                                                  label="Manuscript")
        article.manuscript_files.add(ms_file)

    # Get Supp Files
    if article_dict.get('supp_files'):
        for supp in article_dict.get('supp_files'):
            supp = client.fetch_file(supp["url"], supp["title"])
            if supp:
                ms_file = core_files.save_file_to_article(
                    supp, article, article.owner, label="Supplementary File")
                article.data_figure_files.add(ms_file)
                round.review_files.add(ms_file)

    article.save()
    round.save()

    return article
Exemplo n.º 15
0
    def handle(self, *args, **options):
        """Pulls forward links

        :param args: None
        :param options: None
        :return: None
        """
        date = options.get('date', '2000-01-01')
        journal_code = options.get('journal_code', None)

        if journal_code:
            journals = jm.Journal.objects.filter(code=journal_code)
        else:
            journals = jm.Journal.objects.all()

        for journal in journals:

            use_crossref = setting_handler.get_setting(
                'Identifiers',
                'use_crossref',
                journal,
            ).processed_value

            if use_crossref:

                usr = setting_handler.get_setting(
                    'Identifiers',
                    'crossref_username',
                    journal,
                ).value
                pwd = setting_handler.get_setting(
                    'Identifiers',
                    'crossref_password',
                    journal,
                ).value
                doi = setting_handler.get_setting(
                    'Identifiers',
                    'crossref_prefix',
                    journal,
                ).value

                payload = {
                    'usr': usr,
                    'pwd': pwd,
                    'doi': doi,
                    'startDate': date,
                }

                url = 'https://doi.crossref.org/servlet/getForwardLinks?{}'.format(
                    urlencode(payload))

                print(url)

                print('Making request.', end='... ')
                r = requests.get(url)
                print('[ok]')

                print('Souping response', end='... ')
                soup = BeautifulSoup(r.text, 'lxml')
                print('[ok]')

                print('Finding forward links', end='... ')
                forward_links = soup.find_all('forward_link')
                print('[ok]')

                print('Looping through links', end='... ')
                for link in forward_links:
                    type = link.doi.get('type')
                    doi = link.get('doi')

                    article = sm.Article.get_article(
                        journal,
                        'doi',
                        doi,
                    )

                    if article:
                        if type == 'journal_article':
                            process_article(link, article)
                        elif type == 'book_content':
                            process_book(link, article)
                        else:
                            print('Forward link type {} not supported'.format(
                                type))
                    else:
                        print('Article with doi {} not found.'.format(doi))

                print(len(forward_links))
Exemplo n.º 16
0
 def name(self):
     try:
         return setting_handler.get_setting('general', 'journal_name', self, create=False, fallback='en').value
     except IndexError:
         self.name = 'Janeway Journal'
         return self.name