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