Skip to content
Draft
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions config/menu.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@

"article_subm",

"doi_manager",
"pid_provider",
"django_celery_beat",
"xml_validation",
Expand Down
19 changes: 19 additions & 0 deletions doi_manager/forms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from django import forms
from django.utils.translation import gettext_lazy as _

from .models import CrossRefConfiguration


class CrossRefConfigurationForm(forms.ModelForm):
class Meta:
model = CrossRefConfiguration
fields = [
"depositor_name",
"depositor_email_address",
"registrant",
"prefix",
"password",
]
widgets = {
"password": forms.PasswordInput(),
}
22 changes: 22 additions & 0 deletions doi_manager/migrations/0004_crossrefconfiguration_password.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("doi_manager", "0003_alter_crossrefconfiguration_created_and_more"),
]

operations = [
migrations.AddField(
model_name="crossrefconfiguration",
name="password",
field=models.CharField(
blank=True,
help_text="Password for authenticating with the CrossRef deposit API.",
max_length=64,
null=True,
verbose_name="Password",
),
),
]
52 changes: 48 additions & 4 deletions doi_manager/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,61 @@


class CrossRefConfiguration(CommonControlField):
prefix = models.CharField(_("Prefix"), null=True, blank=True, max_length=10)
depositor_name = models.CharField(_("Depositor Name"), null=True, blank=True, max_length=64)
depositor_email_address = models.EmailField(_("Depositor e-mail"), null=True, blank=True, max_length=64)
registrant = models.CharField(_("Registrant"), null=True, blank=True, max_length=64)
prefix = models.CharField(
_("Prefix"),
null=True,
blank=True,
max_length=10,
help_text=_("DOI prefix assigned to the journal (e.g. 10.1590)."),
)
depositor_name = models.CharField(
_("Depositor Name"),
null=True,
blank=True,
max_length=64,
help_text=_("Name of the organization depositing the DOI metadata with CrossRef."),
)
depositor_email_address = models.EmailField(
_("Depositor e-mail"),
null=True,
blank=True,
max_length=64,
help_text=_("E-mail address of the depositor, used by CrossRef for deposit notifications."),
)
registrant = models.CharField(
_("Registrant"),
null=True,
blank=True,
max_length=64,
help_text=_("Name of the registrant organization responsible for the DOI prefix."),
)
password = models.CharField(
_("Password"),
null=True,
blank=True,
max_length=64,
help_text=_("Password for authenticating with the CrossRef deposit API."),
)

autocomplete_search_field = "prefix"

def autocomplete_label(self):
return str(self)

def __str__(self):
if self.prefix:
return self.prefix
if self.depositor_name:
return self.depositor_name
return _("CrossRef Configuration")

base_form_class = CoreAdminModelForm
panels = [
FieldPanel("depositor_name"),
FieldPanel("depositor_email_address"),
FieldPanel("registrant"),
FieldPanel("prefix"),
FieldPanel("password"),
]

@property
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
{% extends "wagtailadmin/base.html" %}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot estamos adotando wagtail, então use a facilidade do framework que não necessitaria de template. Podemos criar o Form e adicionar os fields e depois do save pode-se criar o modelo em questão

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removidos o template customizado, views.py, forms.py e o hook register_admin_urls. O CrossRefConfigurationViewSet (herdando de CommonControlFieldViewSet / SnippetViewSet) já fornece toda a interface de criação/edição nativamente pelo Wagtail — o form_valid com save_all(user) cuida de registrar o creator/updater. Commit: 3ea6cdd

{% load i18n %}
{% load wagtailadmin_tags %}

{% block titletag %}{% trans "Create CrossRef Configuration" %}{% endblock %}

{% block content %}
{% include "wagtailadmin/shared/header.html" with title=_("Create CrossRef Configuration") icon="cog" %}

<div class="nice-padding">
<p>
{% blocktrans with journal=journal %}
Create a new CrossRef configuration and link it to journal <strong>{{ journal }}</strong>.
{% endblocktrans %}
</p>

<form action="" method="POST" novalidate>
{% csrf_token %}

{% for field in form %}
<div class="field {% if field.errors %}error{% endif %}">
<label class="field__label{% if field.field.required %} required{% endif %}" for="{{ field.id_for_label }}">
{{ field.label }}
</label>
{% if field.help_text %}
<p class="help">{{ field.help_text }}</p>
{% endif %}
{{ field }}
{% for error in field.errors %}
<p class="error-message">{{ error }}</p>
{% endfor %}
</div>
{% endfor %}

<div class="footer">
<button type="submit" class="button button-longrunning">
<span>{% trans "Create and link to journal" %}</span>
</button>
<a href="{{ journal_edit_url }}" class="button button-secondary">
{% trans "Cancel" %}
</a>
</div>
</form>
</div>
{% endblock %}
45 changes: 45 additions & 0 deletions doi_manager/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
from django.contrib.auth.decorators import login_required
from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404, render
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
from wagtail.admin import messages

from journal.models import Journal

from .forms import CrossRefConfigurationForm


@login_required
def create_crossref_configuration(request, journal_pk):
"""
View to create a new CrossRefConfiguration and link it to a Journal.

Accessible to journal editors who need to create a CrossRefConfiguration
when none is available for selection via the AutocompletePanel.
"""
journal = get_object_or_404(Journal, pk=journal_pk)
journal_edit_url = reverse("wagtailsnippets_journal_journal:edit", args=[journal_pk])

if request.method == "POST":
form = CrossRefConfigurationForm(request.POST)
if form.is_valid():
config = form.save(commit=False)
config.creator = request.user
config.save()
journal.crossref_configuration = config
journal.save(update_fields=["crossref_configuration"])
messages.success(
request,
_("CrossRef configuration created and linked to the journal successfully."),
)
return HttpResponseRedirect(journal_edit_url)
else:
form = CrossRefConfigurationForm()

context = {
"form": form,
"journal": journal,
"journal_edit_url": journal_edit_url,
}
return render(request, "doi_manager/create_crossref_configuration.html", context)
80 changes: 80 additions & 0 deletions doi_manager/wagtail_hooks.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
from django.http import HttpResponseRedirect
from django.urls import path
from django.utils.translation import gettext_lazy as _
from wagtail import hooks
from wagtail.snippets.models import register_snippet
from wagtail.snippets.views.snippets import CreateView, EditView

from config.menu import get_menu_order
from core.viewsets import CommonControlFieldViewSet

from .models import CrossRefConfiguration
from .views import create_crossref_configuration


class CrossRefConfigurationCreateView(CreateView):
def form_valid(self, form):
self.object = form.save_all(self.request.user)
return HttpResponseRedirect(self.get_success_url())


class CrossRefConfigurationEditView(EditView):
def form_valid(self, form):
self.object = form.save_all(self.request.user)
return HttpResponseRedirect(self.get_success_url())


class CrossRefConfigurationViewSet(CommonControlFieldViewSet):
model = CrossRefConfiguration
menu_label = _("CrossRef Configuration")
menu_icon = "cog"
menu_order = get_menu_order("doi_manager")
add_to_settings_menu = False
add_view_class = CrossRefConfigurationCreateView
edit_view_class = CrossRefConfigurationEditView

list_display = [
"prefix",
"depositor_name",
"depositor_email_address",
"registrant",
"updated",
]
search_fields = [
"prefix",
"depositor_name",
"depositor_email_address",
"registrant",
]
list_export = [
"prefix",
"depositor_name",
"depositor_email_address",
"registrant",
"updated",
]
export_filename = "crossref_configurations"


register_snippet(CrossRefConfigurationViewSet)


@hooks.register("register_admin_urls")
def register_doi_manager_urls():
return [
path(
"doi-manager/crossref-configuration/create-for-journal/<int:journal_pk>/",
create_crossref_configuration,
name="doi_manager_create_crossref_configuration",
),
]


@hooks.register("register_permissions")
def register_crossref_configuration_permissions():
content_type = ContentType.objects.get_for_model(
CrossRefConfiguration, for_concrete_model=False
)
return Permission.objects.filter(content_type=content_type)
1 change: 1 addition & 0 deletions journal/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -628,6 +628,7 @@ def autocomplete_custom_queryset_filter(search_term):
FieldPanel("title"),
FieldPanel("short_title"),
InlinePanel("other_titles", label=_("Other titles"), classname="collapsed"),
AutocompletePanel("crossref_configuration"),
]

panels_scope_and_about = [
Expand Down
2 changes: 2 additions & 0 deletions journal/proxys.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ class JournalProxyEditor(Journal):
FieldPanel("publishing_model"),
# Campo não deve ficar visível para o perfil da equipe editorial / editores
# InlinePanel("other_titles", label=_("Other titles")),
# CrossRef configuration for DOI deposit
AutocompletePanel("crossref_configuration"),
]

panels_scope_and_about = [
Expand Down