diff --git a/src/journal/admin.py b/src/journal/admin.py index 3951eb53f..a00a7a73c 100755 --- a/src/journal/admin.py +++ b/src/journal/admin.py @@ -120,11 +120,11 @@ def _section(self, obj): class FixedPubCheckItemsAdmin(admin_utils.ArticleFKModelAdmin): list_display = ('_article', '_journal', 'metadata', 'verify_doi', 'select_issue', 'set_pub_date', 'send_notifications', - 'select_render_galley', 'select_article_image', + 'preview_article', 'select_article_image', 'select_open_reviews') list_filter = ('article__journal', 'metadata', 'verify_doi', 'select_issue', 'set_pub_date', 'send_notifications', - 'select_render_galley', 'select_article_image', + 'preview_article', 'select_article_image', 'select_open_reviews') search_fields = ('article__pk', 'article__title', 'article__journal__code') raw_id_fields = ('article',) diff --git a/src/journal/logic.py b/src/journal/logic.py index 2c3d2bef5..4cdb2d2b2 100755 --- a/src/journal/logic.py +++ b/src/journal/logic.py @@ -146,7 +146,6 @@ def get_best_galley(article, galleys): except core_models.Galley.DoesNotExist: pass try: - image_galley = galleys.get( file__mime_type__in=files.IMAGE_MIMETYPES, public=True, diff --git a/src/journal/migrations/0067_remove_fixedpubcheckitems_select_render_galley_and_more.py b/src/journal/migrations/0067_remove_fixedpubcheckitems_select_render_galley_and_more.py new file mode 100644 index 000000000..2a9d8219e --- /dev/null +++ b/src/journal/migrations/0067_remove_fixedpubcheckitems_select_render_galley_and_more.py @@ -0,0 +1,22 @@ +# Generated by Django 4.2.15 on 2025-01-31 12:28 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('journal', '0066_issue_type_bleach_20240507_1359'), + ] + + operations = [ + migrations.RemoveField( + model_name='fixedpubcheckitems', + name='select_render_galley', + ), + migrations.AddField( + model_name='fixedpubcheckitems', + name='preview_article', + field=models.BooleanField(default=False), + ), + ] diff --git a/src/journal/models.py b/src/journal/models.py index 1e7c44e33..e4ee4e75b 100644 --- a/src/journal/models.py +++ b/src/journal/models.py @@ -1311,7 +1311,7 @@ class FixedPubCheckItems(models.Model): select_issue = models.BooleanField(default=False) set_pub_date = models.BooleanField(default=False) send_notifications = models.BooleanField(default=False) - select_render_galley = models.BooleanField(default=False) + preview_article = models.BooleanField(default=False) select_article_image = models.BooleanField(default=False) select_open_reviews = models.BooleanField(default=False) diff --git a/src/journal/urls.py b/src/journal/urls.py index 4502f7dfe..2f7447e8d 100755 --- a/src/journal/urls.py +++ b/src/journal/urls.py @@ -134,6 +134,11 @@ views.publish_article, name='publish_article'), re_path(r'^publish/article/(?P\d+)/check/$', views.publish_article_check, name='publish_article_check'), + re_path( + r'^publish/article/(?P\d+)/preview/$', + views.article_preview, + name='publish_article_preview', + ), # Issues re_path(r'^manage/issues/$', diff --git a/src/journal/views.py b/src/journal/views.py index 8b62c4176..5aec2981e 100755 --- a/src/journal/views.py +++ b/src/journal/views.py @@ -433,16 +433,20 @@ def collection_by_code(request, collection_code): )) -@decorators.frontend_enabled @article_exists -@article_stage_accepted_or_later_required -def article(request, identifier_type, identifier): - """ Renders an article. +def article_base_view( + request, + identifier_type, + identifier, + is_preview=False, +): + """Base view to handle article rendering logic. - :param request: the request associated with this call + :param request: the request object :param identifier_type: the identifier type :param identifier: the identifier - :return: a rendered template of the article + :param is_preview: flag to alter logic for preview (boolean) + :return: HttpResponse object """ article_object = submission_models.Article.get_article( request.journal, @@ -453,33 +457,31 @@ def article(request, identifier_type, identifier): content, tables_in_galley = None, None galleys = article_object.galley_set.filter(public=True) - # check if there is a galley file attached that needs rendering - if article_object.is_published: - galley = get_best_galley(article_object, galleys) - if galley: - content = galley.file_content(recover=True) - else: - content = '' - tables_in_galley = logic.get_all_tables_from_html(content) - store_article_access( - request, - article_object, - "view", - galley.type if galley else None) + galley = get_best_galley(article_object, galleys) + if galley: + content = galley.file_content(recover=True) else: - article_object.abstract = ( - "

This is an accepted article with a DOI pre-assigned" - " that is not yet published.

" - ) + (article_object.abstract or "") + content = '' + tables_in_galley = logic.get_all_tables_from_html(content) + store_article_access( + request, + article_object, + "view", + galley.type if galley else None, + ) if request.journal.disable_html_downloads: - # exclude any HTML galleys. galleys = galleys.exclude( file__mime_type='text/html', ) - template = 'journal/article.html' + if not is_preview and not article_object.is_published: + article_object.abstract = ( + "

This is an accepted article with a DOI pre-assigned" + " that is not yet published.

" + ) + (article_object.abstract or "") + context = { 'article': article_object, 'galleys': galleys, @@ -489,7 +491,43 @@ def article(request, identifier_type, identifier): 'tables_in_galley': tables_in_galley, } - return render(request, template, context) + return render(request, 'journal/article.html', context) + + +@decorators.frontend_enabled +@article_stage_accepted_or_later_required +def article(request, identifier_type, identifier): + """ + Renders a publicly accessible article. + + :param request: the request object + :param identifier_type: the identifier type [id, doi, pubid] + :param identifier: the identifier + :return: HttpResponse object + """ + return article_base_view( + request=request, + identifier_type=identifier_type, + identifier=identifier, + is_preview=False, + ) + + +@production_user_or_editor_required +def article_preview(request, article_id): + """ + Renders an article preview for editors and production staff. + + :param request: the request object + :param article_id: the Article object primary key + :return: HttpResponse object + """ + return article_base_view( + request=request, + identifier_type="id", + identifier=article_id, + is_preview=True, + ) def article_from_identifier(request, identifier_type, identifier): diff --git a/src/submission/forms.py b/src/submission/forms.py index 7c90a08f8..65e527a0f 100755 --- a/src/submission/forms.py +++ b/src/submission/forms.py @@ -257,7 +257,17 @@ def __init__(self, *args, **kwargs): class EditArticleMetadata(ArticleInfo): class Meta(ArticleInfo.Meta): - fields = ArticleInfo.Meta.fields + ('competing_interests', 'jats_article_type_override') + fields = ArticleInfo.Meta.fields + ( + 'competing_interests', + 'jats_article_type_override', + 'render_galley', + ) + + def __init__(self, *args, **kwargs): + super(EditArticleMetadata, self).__init__(*args, **kwargs) + if 'instance' in kwargs: + article = kwargs['instance'] + self.fields['render_galley'].queryset = article.galley_set.all() class AuthorForm(forms.ModelForm): diff --git a/src/submission/models.py b/src/submission/models.py index 9a544f929..cc1f69546 100755 --- a/src/submission/models.py +++ b/src/submission/models.py @@ -698,8 +698,17 @@ def jats_article_type(self): ) # Galley - render_galley = models.ForeignKey('core.Galley', related_name='render_galley', blank=True, null=True, - on_delete=models.SET_NULL) + render_galley = models.ForeignKey( + 'core.Galley', + related_name='render_galley', + blank=True, + null=True, + on_delete=models.SET_NULL, + help_text="Overrides the default galley rendered on the article " + "landing page. The default order Janeway selects a galley " + "to render is HTML, XML then any Image galleys. Other " + "galley types will not be rendered.", + ) # Dates date_started = models.DateTimeField(auto_now_add=True) diff --git a/src/templates/admin/journal/publish_article.html b/src/templates/admin/journal/publish_article.html index c2ba422e8..2fae623fb 100644 --- a/src/templates/admin/journal/publish_article.html +++ b/src/templates/admin/journal/publish_article.html @@ -89,22 +89,34 @@

Select open peer reviews to display

{% endif %} -
+
-   +  
-

Select a Galley for Rendering

-

If you have HTML or XML galleys, you can select which one will render by default.

+

Preview Article

+

Review how the article will appear to readers by opening the preview.

- - Select Galley + + + Open Preview
+
@@ -267,8 +279,6 @@

Confirm Article Set for Publication

"url": "{% url 'publish_article_check' article.pk %}", "data": data, "success": function(data) { - console.log(item.id) - console.log(data) if (data.id == true) { $("label[for='" + item.id +"']").wrapInner(""); $("#"+ item.id + "box").removeClass("warning"); diff --git a/src/templates/admin/submission/edit/metadata.html b/src/templates/admin/submission/edit/metadata.html index 0dcf7f11e..4050db64f 100644 --- a/src/templates/admin/submission/edit/metadata.html +++ b/src/templates/admin/submission/edit/metadata.html @@ -97,6 +97,9 @@

Edit Metadata

{{ info_form.jats_article_type_override }}
+
+ {{ info_form.render_galley|foundation }} +
{% if request.journal.submissionconfiguration.competing_interests %}