From a77150b8c1c1b62d90cf6f2adf33d0f9b28c9751 Mon Sep 17 00:00:00 2001 From: "J.-S. Caux" <J.S.Caux@uva.nl> Date: Sat, 29 Sep 2018 15:31:00 +0200 Subject: [PATCH] Add post-save link from Profile to Contributor --- .../templates/profiles/_profile_card.html | 4 +++ profiles/urls.py | 2 +- profiles/views.py | 26 ++++++++++++++++++- scipost/__init__.py | 5 ++++ scipost/apps.py | 18 +++++++++++++ scipost/signals.py | 21 +++++++++++++++ 6 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 scipost/apps.py create mode 100644 scipost/signals.py diff --git a/profiles/templates/profiles/_profile_card.html b/profiles/templates/profiles/_profile_card.html index 1a6c72672..6646b83f3 100644 --- a/profiles/templates/profiles/_profile_card.html +++ b/profiles/templates/profiles/_profile_card.html @@ -11,6 +11,10 @@ {% if profile.webpage %}<a href="{{ profile.webpage }}" target="_blank">webpage</a> {% else %}No personal webpage given {% endif %} + {% if profile.contributor %} + <br/> + Registered as Contributor (see <a href="{% url 'scipost:contributor_info' contributor_id=profile.contributor.id %}">info page</a>) + {% endif %} </p> </div> <div class="col-6"> diff --git a/profiles/urls.py b/profiles/urls.py index 01f07bc87..047dcb44d 100644 --- a/profiles/urls.py +++ b/profiles/urls.py @@ -8,7 +8,7 @@ from . import views urlpatterns = [ url( - r'^add/$', + r'^add/((?P<from_type>[a-z]+)/(?P<pk>[0-9]+))?$', views.ProfileCreateView.as_view(), name='profile_create' ), diff --git a/profiles/views.py b/profiles/views.py index 767a2f1ab..4b0cd5c70 100644 --- a/profiles/views.py +++ b/profiles/views.py @@ -3,12 +3,13 @@ __license__ = "AGPL v3" from django.core.urlresolvers import reverse_lazy -from django.shortcuts import render +from django.shortcuts import get_object_or_404, render from django.views.generic.edit import CreateView, UpdateView, DeleteView from django.views.generic.list import ListView from scipost.constants import SCIPOST_SUBJECT_AREAS from scipost.mixins import PermissionsMixin +from scipost.models import Contributor from .models import Profile from .forms import ProfileForm @@ -23,6 +24,29 @@ class ProfileCreateView(PermissionsMixin, CreateView): template_name = 'profiles/profile_form.html' success_url = reverse_lazy('profiles:profiles') + def get_initial(self): + """ + Provide initial data based on kwargs. + The data can come from a Contributor, Invitation, UnregisteredAuthor, ... + """ + initial = super().get_initial() + from_type = self.kwargs.get('from_type', None) + pk = self.kwargs.get('pk', None) + if pk: + pk = int(pk) + if from_type == 'contributor': + contributor = get_object_or_404(Contributor, pk=pk) + initial['title'] = contributor.title + initial['first_name'] = contributor.user.first_name + initial['last_name'] = contributor.user.last_name + initial['email'] = contributor.user.email + initial['discipline'] = contributor.discipline + initial['expertises'] = contributor.expertises + initial['orcid_id'] = contributor.orcid_id + initial['webpage'] = contributor.personalwebpage + initial['accepts_SciPost_emails'] = contributor.accepts_SciPost_emails + return initial + class ProfileUpdateView(PermissionsMixin, UpdateView): """ diff --git a/scipost/__init__.py b/scipost/__init__.py index e69de29bb..ba7a401ec 100644 --- a/scipost/__init__.py +++ b/scipost/__init__.py @@ -0,0 +1,5 @@ +__copyright__ = "Copyright 2016-2018, Stichting SciPost (SciPost Foundation)" +__license__ = "AGPL v3" + + +default_app_config = 'scipost.apps.SciPostConfig' diff --git a/scipost/apps.py b/scipost/apps.py new file mode 100644 index 000000000..dc85270be --- /dev/null +++ b/scipost/apps.py @@ -0,0 +1,18 @@ +__copyright__ = "Copyright 2016-2018, Stichting SciPost (SciPost Foundation)" +__license__ = "AGPL v3" + + +from django.apps import AppConfig +from django.db.models.signals import post_save + + +class SciPostConfig(AppConfig): + name = 'scipost' + + def ready(self): + super().ready() + + from . import signals + from profiles.models import Profile + post_save.connect(signals.link_created_profile_to_contributor, + sender=Profile) diff --git a/scipost/signals.py b/scipost/signals.py new file mode 100644 index 000000000..0b525541e --- /dev/null +++ b/scipost/signals.py @@ -0,0 +1,21 @@ +__copyright__ = "Copyright 2016-2018, Stichting SciPost (SciPost Foundation)" +__license__ = "AGPL v3" + + +from django.core.exceptions import ObjectDoesNotExist +from django.db.models.signals import post_save +from django.dispatch import receiver + +from profiles.models import Profile + +from .models import Contributor + + +@receiver(post_save, sender=Profile) +def link_created_profile_to_contributor(sender, instance, created, **kwargs): + """ + When a new Profile is created, it is linked to the corresponding + existing Contributor object. + """ + if created: + Contributor.objects.filter(user__email=instance.email).update(profile=instance) -- GitLab