コード例 #1
0
def do_typeset_task(request, typeset_id):
    typeset_task = get_object_or_404(models.TypesetTask,
                                     pk=typeset_id,
                                     accepted__isnull=False,
                                     completed__isnull=True)

    article = typeset_task.assignment.article
    galleys = core_models.Galley.objects.filter(article=article)
    form = forms.TypesetterNote(instance=typeset_task)

    if request.POST:

        if 'complete' in request.POST:
            form = forms.TypesetterNote(request.POST, instance=typeset_task)
            if form.is_valid():
                task = form.save()
                task.completed = timezone.now()
                task.save()

                kwargs = {'typeset_task': typeset_task, 'request': request}
                event_logic.Events.raise_event(event_logic.Events.ON_TYPESET_COMPLETE, **kwargs)

                messages.add_message(request, messages.INFO, 'Typeset assignment complete.')
                return redirect(reverse('typesetter_requests'))

        new_galley = None
        if 'xml' in request.POST:
            for uploaded_file in request.FILES.getlist('xml-file'):
                new_galley = logic.save_galley(article, request, uploaded_file, True, "XML", False)

        if 'pdf' in request.POST:
            for uploaded_file in request.FILES.getlist('pdf-file'):
                new_galley = logic.save_galley(article, request, uploaded_file, True, "PDF", False)

        if 'other' in request.POST:
            for uploaded_file in request.FILES.getlist('other-file'):
                new_galley = logic.save_galley(article, request, uploaded_file, True, "Other", True)

        if new_galley:
            typeset_task.galleys_loaded.add(new_galley.file)

        return redirect(reverse('do_typeset_task', kwargs={'typeset_id': typeset_task.pk}))

    manuscripts = article.manuscript_files.filter(is_galley=False)
    data_files = article.data_figure_files.filter(is_galley=False)
    copyedit_files = logic.get_copyedit_files(article)

    template = 'production/typeset_task.html'
    context = {
        'typeset_task': typeset_task,
        'article': article,
        'manuscripts': manuscripts,
        'data_files': data_files,
        'production_assignment': typeset_task.assignment,
        'copyedit_files': copyedit_files,
        'galleys': galleys,
        'form': form,
    }

    return render(request, template, context)
コード例 #2
0
ファイル: logic.py プロジェクト: tingletech/janeway
def handle_file_upload(request, preprint):
    if 'file' in request.FILES:
        label = request.POST.get('label')
        for uploaded_file in request.FILES.getlist('file'):
            save_galley(
                preprint,
                request,
                uploaded_file,
                True,
                label=label,
            )
コード例 #3
0
ファイル: jats.py プロジェクト: mauromsl/imports
def import_jats_article(jats_contents,
                        journal,
                        persist=True,
                        filename=None,
                        owner=None):
    """ JATS import entrypoint
    :param jats_contents: (str) the JATS XML to be imported
    :param journal: Journal in which to import the article
    """
    jats_soup = BeautifulSoup((jats_contents), 'lxml')
    metadata_soup = jats_soup.find("article-meta")
    if not owner:
        owner = Account.objects.get(pk=1)

    # Gather metadata
    meta = {}
    meta["title"] = get_jats_title(metadata_soup)
    meta["abstract"] = get_jats_abstract(metadata_soup)
    meta["issue"], meta["volume"] = get_jats_issue(jats_soup)
    meta["keywords"] = get_jats_keywords(metadata_soup)
    meta["section_name"] = get_jats_section_name(jats_soup)
    meta["date_published"] = get_jats_pub_date(
        jats_soup) or datetime.date.today()
    meta["authors"] = []
    meta["date_submitted"] = None
    meta["date_accepted"] = None
    history_soup = metadata_soup.find("history")

    if history_soup:
        meta["date_submitted"] = get_jats_sub_date(history_soup)
        meta["date_accepted"] = get_jats_acc_date(history_soup)

    authors_soup = metadata_soup.find("contrib-group")
    author_notes = metadata_soup.find("author_notes")
    if authors_soup:
        meta["authors"] = get_jats_authors(authors_soup, author_notes)

    meta["identifiers"] = get_jats_identifiers(metadata_soup)

    if not persist:
        return meta
    else:
        # Persist Article
        article = save_article(journal, meta, owner=owner)
        # Save Galleys
        xml_file = ContentFile(jats_contents.encode("utf-8"))
        xml_file.name = filename or uuid.uuid4()
        request = DummyRequest(owner)
        save_galley(article, request, xml_file, True, "XML")
コード例 #4
0
ファイル: logic.py プロジェクト: rhb123/janeway
def handle_file_upload(request, preprint):
    if 'xml' in request.POST:
        for uploaded_file in request.FILES.getlist('xml-file'):
            new_galley = save_galley(preprint, request, uploaded_file, True,
                                     "XML")

    if 'pdf' in request.POST:
        for uploaded_file in request.FILES.getlist('pdf-file'):
            new_galley = save_galley(preprint, request, uploaded_file, True,
                                     "PDF")

    if 'other' in request.POST:
        for uploaded_file in request.FILES.getlist('other-file'):
            new_galley = save_galley(preprint, request, uploaded_file, True,
                                     "Other")
コード例 #5
0
def import_galley_from_uri(article, uri, figures_uri=None):
    parsed = urlparse(uri)
    django_file = None
    if parsed.scheme == "file":
        if parsed.netloc:
            raise ValueError("Netlocs are not supported %s" % parsed.netloc)
        path = unquote(parsed.path)
        blob = read_local_file(path)
        django_file = ContentFile(blob)
        django_file.name = os.path.basename(path)
    else:
        raise NotImplementedError("Scheme not supported: %s" % parsed.scheme)

    if django_file:
        request = get_current_request()
        if request and request.user.is_authenticated():
            owner = request.user
        else:
            owner = core_models.Account.objects.filter(
                is_superuser=True).first()
            request = DummyRequest(user=owner)
        galley = save_galley(article, request, django_file, True)
        if figures_uri and galley.label in {"XML", "HTML"}:
            figures_path = unquote(urlparse(figures_uri).path)
            handle_zipped_galley_images(figures_path, galley, request)
コード例 #6
0
ファイル: views.py プロジェクト: BirkbeckCTP/pandoc_plugin
def convert_file(request, article_id=None, file_id=None):
    """
    Try to get article's manuscript file (should be docx or rtf), convert to markdown, then convert to html,
    save new files in applicable locations, register as Galley objects in database. Refresh submission page with new galley objects.
    If request is GET, render button to convert.
    """

    # retrieve article and selected manuscript
    article = get_object_or_404(sub_models.Article, pk=article_id)
    manuscript = get_object_or_404(core_models.File,
                                   pk=file_id,
                                   article_id=article.pk)
    file_path = manuscript.self_article_path()

    plugin = models.Plugin.objects.get(name=plugin_settings.SHORT_NAME)
    extract_images = setting_handler.get_plugin_setting(
        plugin,
        'pandoc_extract_images',
        request.journal,
        create=True,
        pretty='Pandoc extract images',
        types='boolean').processed_value

    try:
        html, images = convert.generate_html_from_doc(file_path,
                                                      extract_images)
    except (TypeError, convert.PandocError) as err:
        messages.add_message(request, messages.ERROR, err)
        return HttpResponseRedirect(request.META.get('HTTP_REFERER'))

    stripped, _ = os.path.splitext(file_path)
    output_path = stripped + '.html'
    with open(output_path, mode="w", encoding="utf-8") as html_file:
        print(html, file=html_file)

    galley = logic.save_galley(
        article,
        request,
        output_path,
        True,
        'HTML',
        save_to_disk=False,
    )
    messages.add_message(request, messages.INFO, "HTML generated succesfully")

    for image in images:
        image_name = os.path.basename(image)
        with open(image, 'rb') as image_reader:
            image_file = ContentFile(image_reader.read())
            image_file.name = image_name
            logic.save_galley_image(galley,
                                    request,
                                    image_file,
                                    image_name,
                                    fixed=False)

    return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
コード例 #7
0
ファイル: views.py プロジェクト: mdlincoln/janeway
def production_article(request, article_id):
    """
    Displays typesetting tasks, Galleys and allows new Galleys to be uploaded.
    :param request: HttpRequest object
    :param article_id: Article object PK
    :return: HttpResponse object
    """
    article = get_object_or_404(submission_models.Article, pk=article_id)
    production_assignment = models.ProductionAssignment.objects.get(article=article)
    galleys = logic.get_all_galleys(production_assignment.article)

    if request.POST:

        if 'xml' in request.POST:
            for uploaded_file in request.FILES.getlist('xml-file'):
                logic.save_galley(article, request, uploaded_file, True, "XML", False)

        if 'pdf' in request.POST:
            for uploaded_file in request.FILES.getlist('pdf-file'):
                logic.save_galley(article, request, uploaded_file, True, "PDF", False)

        if 'other' in request.POST:
            for uploaded_file in request.FILES.getlist('other-file'):
                logic.save_galley(article, request, uploaded_file, True, "Other", True)

        if 'prod' in request.POST:
            for uploaded_file in request.FILES.getlist('prod-file'):
                logic.save_prod_file(article, request, uploaded_file, 'Production Ready File')

        if 'supp' in request.POST:
            label = request.POST.get('label', 'Supplementary File')
            for uploaded_file in request.FILES.getlist('supp-file'):
                logic.save_supp_file(article, request, uploaded_file, label)

        return redirect(reverse('production_article', kwargs={'article_id': article.pk}))

    manuscripts = article.manuscript_files.filter(is_galley=False)
    data_files = article.data_figure_files.filter(is_galley=False)
    copyedit_files = logic.get_copyedit_files(article)

    template = 'production/assigned_article.html'
    context = {
        'article': article,
        'manuscripts': manuscripts,
        'data_files': data_files,
        'production_assignment': production_assignment,
        'copyedit_files': copyedit_files,
        'typeset_tasks': production_assignment.typesettask_set.all().order_by('-id'),
        'galleys': galleys,
        'complete_message': logic.get_complete_template(request, article, production_assignment)
    }

    return render(request, template, context)
コード例 #8
0
def production_article(request, article_id):
    article = get_object_or_404(submission_models.Article, pk=article_id)
    production_assignment = models.ProductionAssignment.objects.get(
        article=article)
    galleys = logic.get_all_galleys(production_assignment.article)

    if request.POST:

        if 'xml' in request.POST:
            for uploaded_file in request.FILES.getlist('xml-file'):
                logic.save_galley(article, request, uploaded_file, True, "XML",
                                  False)

        if 'pdf' in request.POST:
            for uploaded_file in request.FILES.getlist('pdf-file'):
                logic.save_galley(article, request, uploaded_file, True, "PDF",
                                  False)

        if 'other' in request.POST:
            for uploaded_file in request.FILES.getlist('other-file'):
                logic.save_galley(article, request, uploaded_file, True,
                                  "Other", True)

        return redirect(
            reverse('production_article', kwargs={'article_id': article.pk}))

    manuscripts = article.manuscript_files.filter(is_galley=False)
    data_files = article.data_figure_files.filter(is_galley=False)
    copyedit_files = logic.get_copyedit_files(article)

    template = 'production/assigned_article.html'
    context = {
        'article':
        article,
        'manuscripts':
        manuscripts,
        'data_files':
        data_files,
        'production_assignment':
        production_assignment,
        'copyedit_files':
        copyedit_files,
        'typeset_tasks':
        production_assignment.typesettask_set.all().order_by('-id'),
        'galleys':
        galleys,
        'complete_message':
        logic.get_complete_template(request, article, production_assignment)
    }

    return render(request, template, context)
コード例 #9
0
ファイル: views.py プロジェクト: cmu-lib/pandoc_plugin
def convert(request, article_id=None, file_id=None):
    '''
    If request is POST, try to get article's manuscript file (should be docx or rtf), convert to markdown, then convert to html,
    save new files in applicable locations, register as Galley objects in database. Refresh submission page with new galley objects.
    If request is GET, render button to convert.
    '''

    # Argument added to all calls to pandoc that caps the size of Pandoc's heap,
    # preventing maliciously formatted files from triggering a runaway
    # conversion process.
    memory_limit = ['+RTS', '-M512M', '-RTS']
    base_pandoc_command = ['pandoc'] + memory_limit

    # if post, get the original manuscript file, convert to html
    if request.method == "POST":

        # retrieve article and selected manuscript
        article = get_object_or_404(sub_models.Article, pk=article_id)
        manuscript = get_object_or_404(core_models.File, pk=file_id)

        orig_path = manuscript.self_article_path()

        # generate a filename for the intermediate md file - raise error if unexpected manuscript file type
        stripped_path, exten = os.path.splitext(orig_path)

        if exten not in ['.docx', '.rtf']:
            messages.add_message(
                request, messages.ERROR,
                'The Pandoc plugin currently only supports .docx and .rtf filetypes'
            )
            return HttpResponseRedirect(request.META.get('HTTP_REFERER'))

        if request.POST.get('convert_html'):

            output_path = stripped_path + '.html'

            pandoc_command = base_pandoc_command + [
                '-s', orig_path, '-t', 'html'
            ]

            try:
                pandoc_return = subprocess.run(pandoc_command,
                                               stdout=subprocess.PIPE,
                                               stderr=subprocess.PIPE,
                                               check=True)
            except subprocess.CalledProcessError as e:
                messages.add_message(
                    request, messages.ERROR,
                    'Pandoc encountered the following error when executing the command {cmd}: {err}'
                    .format(cmd=e.cmd, err=e.stderr))
                return HttpResponseRedirect(request.META.get('HTTP_REFERER'))

            pandoc_soup = BeautifulSoup(pandoc_return.stdout, 'html.parser')

            for img in pandoc_soup.find_all("img"):
                # Pandoc adds `media/` to the src attributes of all the img tags it creates. We want to remove that prefix and leave only the base filename.
                img["src"] = img["src"].replace("media/", "")
                # Pandoc also guesses at the height/width attributes of images. We wish to strip those style tags
                del img["style"]

            # Write revised HTML to file
            with open(output_path, mode="w", encoding="utf-8") as html_file:
                print(pandoc_soup, file=html_file)

            logic.save_galley(article,
                              request,
                              output_path,
                              True,
                              'HTML',
                              False,
                              save_to_disk=False)

            # TODO: make new file child of manuscript file

        return redirect(
            reverse('production_article', kwargs={'article_id': article.pk}))

    # render buttons if GET request
    else:
        return reverse('production_article',
                       kwargs={'article_id': request.article.pk})


# NEED LOGIC FOR IF HTML ALREADY GENERATED
コード例 #10
0
ファイル: views.py プロジェクト: hackman104/back_content
def article(request, article_id):
    article = get_object_or_404(models.Article,
                                pk=article_id,
                                journal=request.journal)
    article_form = forms.ArticleInfo(instance=article)
    author_form = forms.AuthorForm()
    pub_form = bc_forms.PublicationInfo(instance=article)
    remote_form = bc_forms.RemoteArticle(instance=article)
    modal = None

    if request.POST:
        if 'save_section_1' in request.POST:
            article_form = forms.ArticleInfo(request.POST, instance=article)

            if article_form.is_valid():
                article_form.save()
                return redirect(
                    reverse('bc_article', kwargs={'article_id': article.pk}))

        if 'save_section_2' in request.POST:
            correspondence_author = request.POST.get('main-author', None)

            if correspondence_author:
                author = core_models.Account.objects.get(
                    pk=correspondence_author)
                article.correspondence_author = author
                article.save()
                return redirect(
                    reverse('bc_article', kwargs={'article_id': article.pk}))

        if 'save_section_4' in request.POST:
            pub_form = bc_forms.PublicationInfo(request.POST, instance=article)

            if pub_form.is_valid():
                pub_form.save()
                if article.primary_issue:
                    article.primary_issue.articles.add(article)

                if article.date_published:
                    article.stage = models.STAGE_READY_FOR_PUBLICATION
                    article.save()
                return redirect(
                    reverse('bc_article', kwargs={'article_id': article.pk}))

        if 'save_section_5' in request.POST:
            remote_form = bc_forms.RemoteArticle(request.POST,
                                                 instance=article)

            if remote_form.is_valid():
                remote_form.save()
                return redirect(
                    reverse('bc_article', kwargs={'article_id': article.pk}))

        if 'xml' in request.POST:
            for uploaded_file in request.FILES.getlist('xml-file'):
                prod_logic.save_galley(article, request, uploaded_file, True,
                                       "XML", False)

        if 'pdf' in request.POST:
            for uploaded_file in request.FILES.getlist('pdf-file'):
                prod_logic.save_galley(article, request, uploaded_file, True,
                                       "PDF", False)

        if 'other' in request.POST:
            for uploaded_file in request.FILES.getlist('other-file'):
                prod_logic.save_galley(article, request, uploaded_file, True,
                                       "Other", True)

        if 'add_author' in request.POST:
            author_form = forms.AuthorForm(request.POST)
            modal = 'author'

            author_exists = logic.check_author_exists(
                request.POST.get('email'))
            if author_exists:
                article.authors.add(author_exists)
                messages.add_message(
                    request, messages.SUCCESS,
                    '%s added to the article' % author_exists.full_name())
                return redirect(
                    reverse('bc_article', kwargs={'article_id': article_id}))
            else:
                if author_form.is_valid():
                    new_author = author_form.save(commit=False)
                    new_author.username = new_author.email
                    new_author.set_password(shared.generate_password())
                    new_author.save()
                    new_author.add_account_role(role_slug='author',
                                                journal=request.journal)
                    article.authors.add(new_author)
                    messages.add_message(
                        request, messages.SUCCESS,
                        '%s added to the article' % new_author.full_name())

                    return redirect(
                        reverse('bc_article',
                                kwargs={'article_id': article_id}))

        if 'publish' in request.POST:
            if not article.stage == models.STAGE_PUBLISHED:
                id_logic.generate_crossref_doi_with_pattern(article)
                article.stage = models.STAGE_PUBLISHED
                article.snapshot_authors(article)
                article.save()

            if plugin_settings.IS_WORKFLOW_PLUGIN:
                workflow_kwargs = {
                    'handshake_url': 'bc_article',
                    'request': request,
                    'article': article,
                    'switch_stage': True
                }
                return event_logic.Events.raise_event(
                    event_logic.Events.ON_WORKFLOW_ELEMENT_COMPLETE,
                    task_object=article,
                    **workflow_kwargs)
            else:
                return redirect(reverse('bc_index'))

    template = 'back_content/article.html'
    context = {
        'article': article,
        'article_form': article_form,
        'form': author_form,
        'pub_form': pub_form,
        'galleys': prod_logic.get_all_galleys(article),
        'remote_form': remote_form,
        'modal': modal
    }

    return render(request, template, context)
コード例 #11
0
def do_typeset_task(request, typeset_id):
    """
    Displays a form for completing typeset tasks
    :param request: HttpRequest object
    :param typeset_id: TypesetTask object PK
    :return: HttpResponse or HttpRedirect
    """
    typeset_task = get_object_or_404(
        models.TypesetTask,
        pk=typeset_id,
        accepted__isnull=False,
        completed__isnull=True,
        assignment__article__journal=request.journal,
    )

    article = typeset_task.assignment.article
    galleys = core_models.Galley.objects.filter(article=article)
    form = forms.TypesetterNote(instance=typeset_task)

    if request.POST:

        if 'complete' in request.POST:
            form = forms.TypesetterNote(request.POST, instance=typeset_task)
            if form.is_valid():
                task = form.save()
                task.completed = timezone.now()
                task.save()

                kwargs = {
                    'typeset_task': typeset_task,
                    'request': request,
                }
                event_logic.Events.raise_event(
                    event_logic.Events.ON_TYPESET_COMPLETE,
                    **kwargs,
                )

                messages.add_message(
                    request,
                    messages.INFO,
                    'Typeset assignment complete.',
                )
                return redirect(reverse('typesetter_requests'))

        new_galley = None
        if 'file' in request.FILES:
            label = request.POST.get('label')
            for uploaded_file in request.FILES.getlist('file'):
                try:
                    new_galley = logic.save_galley(
                        article,
                        request,
                        uploaded_file,
                        True,
                        label=label,
                    )
                except UnicodeDecodeError:
                    messages.add_message(request, messages.ERROR,
                                         "Uploaded file is not UTF-8 encoded")

        if 'source' in request.POST:
            for uploaded_file in request.FILES.getlist('source-file'):
                logic.save_source_file(
                    article,
                    request,
                    uploaded_file,
                )

        if new_galley:
            typeset_task.galleys_loaded.add(new_galley.file)

        if not request.FILES:
            messages.add_message(request, messages.WARNING,
                                 'No files uploaded.')

        return redirect(
            reverse('do_typeset_task', kwargs={'typeset_id': typeset_task.pk}))

    manuscripts = article.manuscript_files.filter(is_galley=False)
    data_files = article.data_figure_files.filter(is_galley=False)
    copyedit_files = logic.get_copyedit_files(article)

    template = 'production/typeset_task.html'
    context = {
        'typeset_task': typeset_task,
        'article': article,
        'manuscripts': manuscripts,
        'data_files': data_files,
        'production_assignment': typeset_task.assignment,
        'copyedit_files': copyedit_files,
        'galleys': galleys,
        'form': form,
    }

    return render(request, template, context)
コード例 #12
0
def production_article(request, article_id):
    """
    Displays typesetting tasks, Galleys and allows new Galleys to be uploaded.
    :param request: HttpRequest object
    :param article_id: Article object PK
    :return: HttpResponse object
    """
    article = get_object_or_404(
        submission_models.Article,
        pk=article_id,
        journal=request.journal,
    )

    try:
        production_assignment = models.ProductionAssignment.objects.get(
            article=article)
    except models.ProductionAssignment.DoesNotExist:
        return redirect(
            reverse(
                'production_non_workflow_assign',
                kwargs={'article_id': article.pk},
            ))

    galleys = logic.get_all_galleys(production_assignment.article)

    if request.POST:
        try:
            if 'file' in request.FILES:
                label = request.POST.get('label', None)
                for uploaded_file in request.FILES.getlist('file'):
                    logic.save_galley(
                        article,
                        request,
                        uploaded_file,
                        True,
                        label=label,
                    )
        except TypeError as exc:
            messages.add_message(request, messages.ERROR, str(exc))
        except UnicodeDecodeError:
            messages.add_message(request, messages.ERROR,
                                 "Uploaded file is not UTF-8 encoded")

        if 'prod' in request.POST:
            for uploaded_file in request.FILES.getlist('prod-file'):
                logic.save_prod_file(
                    article,
                    request,
                    uploaded_file,
                    'Production Ready File',
                )

        if 'supp' in request.POST:
            label = request.POST.get('label', 'Supplementary File')
            for uploaded_file in request.FILES.getlist('supp-file'):
                logic.save_supp_file(article, request, uploaded_file, label)

        if 'source' in request.POST:
            for uploaded_file in request.FILES.getlist('source-file'):
                logic.save_source_file(
                    article,
                    request,
                    uploaded_file,
                )
        if not request.FILES:
            messages.add_message(request, messages.WARNING,
                                 'No files uploaded.')

        return redirect(
            reverse('production_article', kwargs={'article_id': article.pk}))

    manuscripts = article.manuscript_files.filter(is_galley=False)
    data_files = article.data_figure_files.filter(is_galley=False)
    copyedit_files = logic.get_copyedit_files(article)

    template = 'production/assigned_article.html'
    context = {
        'article':
        article,
        'manuscripts':
        manuscripts,
        'data_files':
        data_files,
        'production_assignment':
        production_assignment,
        'copyedit_files':
        copyedit_files,
        'typeset_tasks':
        production_assignment.typesettask_set.all().order_by('-id'),
        'galleys':
        galleys,
        'complete_message':
        logic.get_complete_template(request, article, production_assignment)
    }

    return render(request, template, context)
コード例 #13
0
ファイル: views.py プロジェクト: oncomouse/janeway
def manage_archive_article(request, article_id):
    from production import logic as production_logic
    from identifiers import models as identifier_models
    from submission import forms as submission_forms
    article = get_object_or_404(submission_models.Article, pk=article_id)
    galleys = production_logic.get_all_galleys(article)
    identifiers = identifier_models.Identifier.objects.filter(article=article)

    if request.POST:

        if 'xml' in request.POST:
            for uploaded_file in request.FILES.getlist('xml-file'):
                production_logic.save_galley(article, request, uploaded_file,
                                             True, "XML", False)

        if 'pdf' in request.POST:
            for uploaded_file in request.FILES.getlist('pdf-file'):
                production_logic.save_galley(article, request, uploaded_file,
                                             True, "PDF", False)

        if 'delete_note' in request.POST:
            note_id = int(request.POST['delete_note'])
            publisher_note = submission_models.PublisherNote.objects.get(
                pk=note_id)
            publisher_note.delete()

        if 'add_publisher_note' in request.POST:
            pn = submission_models.PublisherNote()
            pn.creator = request.user
            pn.sequence = 0
            pn_form = submission_forms.PublisherNoteForm(data=request.POST,
                                                         instance=pn)
            pn_form.save()

            article.publisher_notes.add(pn)
            article.save()

        if 'save_publisher_note' in request.POST:
            note_id = int(request.POST['save_publisher_note'])
            pn = submission_models.PublisherNote.objects.get(pk=note_id)
            pn_form = submission_forms.PublisherNoteForm(data=request.POST,
                                                         instance=pn)
            pn_form.save()

        if 'other' in request.POST:
            for uploaded_file in request.FILES.getlist('other-file'):
                production_logic.save_galley(article, request, uploaded_file,
                                             True, "Other", True)

        return redirect(
            reverse('manage_archive_article',
                    kwargs={'article_id': article.pk}))

    newnote_form = submission_forms.PublisherNoteForm()

    note_forms = []

    for publisher_note in article.publisher_notes.all():
        note_form = submission_forms.PublisherNoteForm(instance=publisher_note)
        note_forms.append(note_form)

    template = 'journal/manage/archive_article.html'
    context = {
        'article': article,
        'galleys': galleys,
        'identifiers': identifiers,
        'newnote_form': newnote_form,
        'note_forms': note_forms
    }

    return render(request, template, context)
コード例 #14
0
ファイル: views.py プロジェクト: BirkbeckCTP/back_content
def article(request, article_id):
    article = get_object_or_404(models.Article,
                                pk=article_id,
                                journal=request.journal)
    article_form = bc_forms.ArticleInfo(instance=article)
    author_form = forms.AuthorForm()
    pub_form = bc_forms.PublicationInfo(instance=article)
    remote_form = bc_forms.RemoteArticle(instance=article)
    existing_author_form = bc_forms.ExistingAuthor()
    modal = None

    if request.POST:
        if 'save_section_1' in request.POST:
            article_form = bc_forms.ArticleInfo(request.POST, instance=article)

            if article_form.is_valid():
                article_form.save()
                return redirect(
                    reverse('bc_article', kwargs={'article_id': article.pk}))

        if 'save_section_2' in request.POST:
            correspondence_author = request.POST.get('main-author', None)

            if correspondence_author:
                author = core_models.Account.objects.get(
                    pk=correspondence_author)
                article.correspondence_author = author
                article.save()
                return redirect(
                    reverse('bc_article', kwargs={'article_id': article.pk}))

        if 'save_section_4' in request.POST:
            pub_form = bc_forms.PublicationInfo(request.POST, instance=article)

            if pub_form.is_valid():
                pub_form.save()
                if article.primary_issue:
                    article.primary_issue.articles.add(article)

                if article.date_published:
                    article.stage = models.STAGE_READY_FOR_PUBLICATION
                    article.save()
                return redirect(
                    reverse('bc_article', kwargs={'article_id': article.pk}))

        if 'save_section_5' in request.POST:
            remote_form = bc_forms.RemoteArticle(request.POST,
                                                 instance=article)

            if remote_form.is_valid():
                remote_form.save()
                return redirect(
                    reverse('bc_article', kwargs={'article_id': article.pk}))

        if 'file' in request.FILES:
            label = request.POST.get('label')
            for uploaded_file in request.FILES.getlist('file'):
                prod_logic.save_galley(
                    article,
                    request,
                    uploaded_file,
                    is_galley=True,
                    label=label,
                )

        if 'existing_author' in request.POST:
            existing_author_form = bc_forms.ExistingAuthor(request.POST)
            if existing_author_form.is_valid():
                author = existing_author_form.cleaned_data.get('author')
                article.authors.add(author)
                messages.add_message(
                    request,
                    messages.SUCCESS,
                    'Author added to the article.',
                )
                models.ArticleAuthorOrder.objects.get_or_create(
                    article=article,
                    author=author,
                    defaults={
                        'order': article.next_author_sort(),
                    })
                return redirect(
                    reverse('bc_article', kwargs={'article_id': article_id}))

        if 'add_author' in request.POST:
            author_form = forms.AuthorForm(request.POST)
            modal = 'author'

            author = logic.check_author_exists(request.POST.get('email'))
            if author:
                article.authors.add(author)
                messages.add_message(
                    request,
                    messages.SUCCESS,
                    '%s added to the article' % author.full_name(),
                )
            else:
                if author_form.is_valid():
                    author = author_form.save(commit=False)
                    author.username = author.email
                    author.set_password(shared.generate_password())
                    author.save()
                    author.add_account_role(
                        role_slug='author',
                        journal=request.journal,
                    )
                    article.authors.add(author)
                    messages.add_message(
                        request,
                        messages.SUCCESS,
                        '%s added to the article' % author.full_name(),
                    )

            models.ArticleAuthorOrder.objects.get_or_create(
                article=article,
                author=author,
                defaults={
                    'order': article.next_author_sort(),
                })

            return redirect(
                reverse('bc_article', kwargs={'article_id': article_id}))

        if 'publish' in request.POST:
            crossref_enabled = request.journal.get_setting(
                'Identifiers',
                'use_crossref',
            )
            if not article.stage == models.STAGE_PUBLISHED:
                if crossref_enabled:
                    id_logic.generate_crossref_doi_with_pattern(article)
                article.stage = models.STAGE_PUBLISHED
                article.snapshot_authors(article)
                article.save()

            if plugin_settings.IS_WORKFLOW_PLUGIN:
                workflow_kwargs = {
                    'handshake_url': 'bc_article',
                    'request': request,
                    'article': article,
                    'switch_stage': True
                }
                return event_logic.Events.raise_event(
                    event_logic.Events.ON_WORKFLOW_ELEMENT_COMPLETE,
                    task_object=article,
                    **workflow_kwargs)
            else:
                return redirect(reverse('bc_index'))

    template = 'back_content/article.html'
    context = {
        'article': article,
        'article_form': article_form,
        'form': author_form,
        'pub_form': pub_form,
        'galleys': prod_logic.get_all_galleys(article),
        'remote_form': remote_form,
        'existing_author_form': existing_author_form,
        'modal': modal
    }

    return render(request, template, context)