SciPost Code Repository

Skip to content
Snippets Groups Projects
views.py 4.14 KiB
Newer Older
__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3"


from django.contrib import messages
from django.contrib.auth.decorators import permission_required
from django.shortcuts import get_object_or_404, render, redirect
from django.views.generic.detail import DetailView
from django.views.generic.list import ListView

from journals.models import Publication
from journals.forms import PublicationDynSelForm
from profiles.models import Profile
from profiles.forms import ProfileSelectForm, ProfileDynSelForm
from .models import Series, Collection, CollectionPublicationsTable


class SeriesListView(ListView):
    """
    List view for Series.
    """
    model = Series


class SeriesDetailView(DetailView):
    """
    Detail view for a Series.
    """
    model = Series


class CollectionDetailView(DetailView):
    """
    Detail view for a Collection.
    """
    model = Collection

    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(*args, **kwargs)
        context["expected_author_form"] = ProfileSelectForm()
@permission_required("scipost.can_manage_series")
def _hx_collection_expected_authors(request, slug):
    collection = get_object_or_404(Collection, slug=slug)
            "action_url_name": "series:_hx_collection_expected_author_action",
            "action_url_base_kwargs": {"slug": collection.slug, "action": "add"},
            "action_target_element_id": "profiles",
            "action_target_swap": "innerHTML",
    context = {"collection": collection, "profile_search_form": form}
    return render(request, "series/_hx_collection_expected_authors.html", context)
@permission_required("scipost.can_manage_series")
def _hx_collection_expected_author_action(request, slug, profile_id, action):
    collection = get_object_or_404(Collection, slug=slug)
    profile = get_object_or_404(Profile, pk=profile_id)
    if action == "add":
        collection.expected_authors.add(profile)
    if action == "remove":
        # If this person already has a Publication, abort
        if collection.publications.filter(authors__profile=profile).exists():
            messages.error(
                request, f"{profile} is author of a Publication; removal aborted."
            )
        else:
            collection.expected_authors.remove(profile)
    return redirect(
        reverse(
            "series:_hx_collection_expected_authors", kwargs={"slug": collection.slug}
        )
    )
@permission_required("scipost.can_manage_series")
def _hx_collection_publications(request, slug):
    collection = get_object_or_404(Collection, slug=slug)
    form = PublicationDynSelForm(
        initial={
            "action_url_name": "series:_hx_collection_publication_action",
            "action_url_base_kwargs": {"slug": collection.slug, "action": "add"},
            "action_target_element_id": "publications",
    context = {"collection": collection, "publication_search_form": form}
    return render(request, "series/_hx_collection_publications.html", context)
@permission_required("scipost.can_manage_series")
def _hx_collection_publication_action(request, slug, doi_label, action):
    collection = get_object_or_404(Collection, slug=slug)
    publication = get_object_or_404(Publication, doi_label=doi_label)
    if action == "add":
        collection.cleanup_ordering()
        cpt, created = CollectionPublicationsTable.objects.get_or_create(
            collection=collection, publication=publication
        )
            messages.success(
                request, f"Added {publication.doi_label} to the Collection."
            )
            messages.error(request, f"{publication.doi_label} is already listed.")
    if action == "remove":
        CollectionPublicationsTable.objects.filter(
            collection=collection, publication=publication
        ).delete()
        collection.cleanup_ordering()
        # todo: cleanup order
    return redirect(
        reverse("series:_hx_collection_publications", kwargs={"slug": collection.slug})
    )