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)
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, )
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")
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")
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)
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'))
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)
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)
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
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)
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)
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)
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)
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)