From 4f6ad46a3d97472475afa193d953ef9792721b4b Mon Sep 17 00:00:00 2001
From: Jorran de Wit <jorrandewit@outlook.com>
Date: Sun, 15 Oct 2017 23:19:38 +0200
Subject: [PATCH] Pool construction part 4

---
 SciPost_v1/settings/base.py                   |  1 +
 journals/constants.py                         |  3 +-
 proceedings/__init__.py                       |  0
 proceedings/admin.py                          |  6 +++
 proceedings/apps.py                           |  5 +++
 proceedings/managers.py                       |  6 +++
 proceedings/migrations/0001_initial.py        | 27 +++++++++++++
 .../migrations/0002_auto_20171015_2235.py     | 39 +++++++++++++++++++
 proceedings/migrations/__init__.py            |  0
 proceedings/models.py                         | 25 ++++++++++++
 proceedings/tests.py                          |  3 ++
 proceedings/urls.py                           |  8 ++++
 proceedings/views.py                          |  9 +++++
 scipost/templates/scipost/personal_page.html  |  1 +
 submissions/admin.py                          |  3 +-
 submissions/forms.py                          | 21 ++++++++--
 .../migrations/0080_submission_proceedings.py | 22 +++++++++++
 .../migrations/0081_auto_20171015_2240.py     | 20 ++++++++++
 submissions/models.py                         |  2 +
 .../templates/submissions/new_submission.html |  7 +++-
 20 files changed, 201 insertions(+), 7 deletions(-)
 create mode 100644 proceedings/__init__.py
 create mode 100644 proceedings/admin.py
 create mode 100644 proceedings/apps.py
 create mode 100644 proceedings/managers.py
 create mode 100644 proceedings/migrations/0001_initial.py
 create mode 100644 proceedings/migrations/0002_auto_20171015_2235.py
 create mode 100644 proceedings/migrations/__init__.py
 create mode 100644 proceedings/models.py
 create mode 100644 proceedings/tests.py
 create mode 100644 proceedings/urls.py
 create mode 100644 proceedings/views.py
 create mode 100644 submissions/migrations/0080_submission_proceedings.py
 create mode 100644 submissions/migrations/0081_auto_20171015_2240.py

diff --git a/SciPost_v1/settings/base.py b/SciPost_v1/settings/base.py
index 963a51929..44532bc63 100644
--- a/SciPost_v1/settings/base.py
+++ b/SciPost_v1/settings/base.py
@@ -97,6 +97,7 @@ INSTALLED_APPS = (
     'submissions',
     'theses',
     'virtualmeetings',
+    'proceedings',
     'production',
     'partners',
     'funders',
diff --git a/journals/constants.py b/journals/constants.py
index 7673cf160..3c1d7b5b1 100644
--- a/journals/constants.py
+++ b/journals/constants.py
@@ -7,7 +7,8 @@ SCIPOST_JOURNAL_PHYSICS_PROC = 'SciPostPhysProc'
 # Journal open for submission
 SCIPOST_JOURNALS_SUBMIT = (
     (SCIPOST_JOURNAL_PHYSICS, 'SciPost Physics'),
-    (SCIPOST_JOURNAL_PHYSICS_LECTURE_NOTES, 'SciPost Physics Lecture Notes')
+    (SCIPOST_JOURNAL_PHYSICS_LECTURE_NOTES, 'SciPost Physics Lecture Notes'),
+    (SCIPOST_JOURNAL_PHYSICS_PROC, 'SciPost Proceedings')
 )
 
 # Journal closed for submission
diff --git a/proceedings/__init__.py b/proceedings/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/proceedings/admin.py b/proceedings/admin.py
new file mode 100644
index 000000000..e38d21c74
--- /dev/null
+++ b/proceedings/admin.py
@@ -0,0 +1,6 @@
+from django.contrib import admin
+
+from .models import Proceeding
+
+
+admin.site.register(Proceeding)
diff --git a/proceedings/apps.py b/proceedings/apps.py
new file mode 100644
index 000000000..dd2aa2625
--- /dev/null
+++ b/proceedings/apps.py
@@ -0,0 +1,5 @@
+from django.apps import AppConfig
+
+
+class ProceedingsConfig(AppConfig):
+    name = 'proceedings'
diff --git a/proceedings/managers.py b/proceedings/managers.py
new file mode 100644
index 000000000..525428899
--- /dev/null
+++ b/proceedings/managers.py
@@ -0,0 +1,6 @@
+from django.db import models
+
+
+class ProceedingQuerySet(models.QuerySet):
+    def open_for_submission(self):
+        return self.filter(open_for_submission=True)
diff --git a/proceedings/migrations/0001_initial.py b/proceedings/migrations/0001_initial.py
new file mode 100644
index 000000000..e002e8846
--- /dev/null
+++ b/proceedings/migrations/0001_initial.py
@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.4 on 2017-10-15 20:31
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    initial = True
+
+    dependencies = [
+        ('journals', '0045_auto_20170925_2124'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='Proceeding',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('name', models.CharField(max_length=256)),
+                ('open_for_submission', models.BooleanField(default=True)),
+                ('journal', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='journals.Journal')),
+            ],
+        ),
+    ]
diff --git a/proceedings/migrations/0002_auto_20171015_2235.py b/proceedings/migrations/0002_auto_20171015_2235.py
new file mode 100644
index 000000000..ec27ccfd6
--- /dev/null
+++ b/proceedings/migrations/0002_auto_20171015_2235.py
@@ -0,0 +1,39 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.4 on 2017-10-15 20:35
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+import django.utils.timezone
+import scipost.db.fields
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('colleges', '0005_fellowship_guest'),
+        ('proceedings', '0001_initial'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='proceeding',
+            name='created',
+            field=models.DateTimeField(default=django.utils.timezone.now),
+        ),
+        migrations.AddField(
+            model_name='proceeding',
+            name='fellowships',
+            field=models.ManyToManyField(blank=True, related_name='proceedings', to='colleges.Fellowship'),
+        ),
+        migrations.AddField(
+            model_name='proceeding',
+            name='latest_activity',
+            field=scipost.db.fields.AutoDateTimeField(blank=True, default=django.utils.timezone.now, editable=False),
+        ),
+        migrations.AlterField(
+            model_name='proceeding',
+            name='journal',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='proceedings', to='journals.Journal'),
+        ),
+    ]
diff --git a/proceedings/migrations/__init__.py b/proceedings/migrations/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/proceedings/models.py b/proceedings/models.py
new file mode 100644
index 000000000..d82ab3b6a
--- /dev/null
+++ b/proceedings/models.py
@@ -0,0 +1,25 @@
+from django.db import models
+
+from scipost.behaviors import TimeStampedModel
+
+from .managers import ProceedingQuerySet
+
+
+class Proceeding(TimeStampedModel):
+    """
+    A Proceeding is a special kind of Journal Issue.
+    """
+    journal = models.ForeignKey('journals.Journal')
+    name = models.CharField(max_length=256)
+    open_for_submission = models.BooleanField(default=True)
+
+    fellowships = models.ManyToManyField('colleges.Fellowship', blank=True,
+                                         limit_choices_to={'guest': True})
+
+    objects = ProceedingQuerySet.as_manager()
+
+    class Meta:
+        default_related_name = 'proceedings'
+
+    def __str__(self):
+        return self.name
diff --git a/proceedings/tests.py b/proceedings/tests.py
new file mode 100644
index 000000000..7ce503c2d
--- /dev/null
+++ b/proceedings/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/proceedings/urls.py b/proceedings/urls.py
new file mode 100644
index 000000000..c8d7a6f39
--- /dev/null
+++ b/proceedings/urls.py
@@ -0,0 +1,8 @@
+from django.conf.urls import url
+
+from . import views
+
+urlpatterns = [
+    # Proceedings
+    url(r'^proceedings/$', views.proceedings, name='proceedings'),
+]
diff --git a/proceedings/views.py b/proceedings/views.py
new file mode 100644
index 000000000..46f9546ac
--- /dev/null
+++ b/proceedings/views.py
@@ -0,0 +1,9 @@
+from django.contrib.auth.decorators import login_required, permission_required
+from django.shortcuts import render
+
+
+@login_required
+@permission_required('scipost.can_manage_college_composition', raise_exception=True)
+def proceedings(request):
+    context = {}
+    return render(request, 'proceedings/index.html', context)
diff --git a/scipost/templates/scipost/personal_page.html b/scipost/templates/scipost/personal_page.html
index df6434f83..6d7d89104 100644
--- a/scipost/templates/scipost/personal_page.html
+++ b/scipost/templates/scipost/personal_page.html
@@ -310,6 +310,7 @@
                               <li><a href="{% url 'journals:manage_metadata' %}">Manage Publication metadata</a></li>
                               <li><a href="{% url 'journals:manage_report_metadata' %}">Manage Report metadata</a></li>
                               <li><a href="{% url 'journals:manage_comment_metadata' %}">Manage Comment metadata</a></li>
+                              <li><a href="{% url 'colleges:fellowships' %}">Manage Fellowships</a></li>
                             </ul>
                         {% endif %}
 
diff --git a/submissions/admin.py b/submissions/admin.py
index b8f7d412f..33976c2de 100644
--- a/submissions/admin.py
+++ b/submissions/admin.py
@@ -86,7 +86,8 @@ class SubmissionAdmin(GuardedModelAdmin):
                 'discipline',
                 'domain',
                 'subject_area',
-                'secondary_areas'),
+                'secondary_areas',
+                'proceeding'),
         }),
         ('Authors', {
             'classes': ('collapse',),
diff --git a/submissions/forms.py b/submissions/forms.py
index 65bf13df8..07768c64a 100644
--- a/submissions/forms.py
+++ b/submissions/forms.py
@@ -18,6 +18,7 @@ from .models import Submission, RefereeInvitation, Report, EICRecommendation, Ed
                     iThenticateReport
 
 from colleges.models import Fellowship
+from journals.constants import SCIPOST_JOURNAL_PHYSICS_PROC
 from scipost.constants import SCIPOST_SUBJECT_AREAS
 from scipost.services import ArxivCaller
 from scipost.models import Contributor
@@ -223,6 +224,7 @@ class RequestSubmissionForm(SubmissionChecks, forms.ModelForm):
             'is_resubmission',
             'discipline',
             'submitted_to_journal',
+            'proceeding',
             'submission_type',
             'domain',
             'subject_area',
@@ -257,6 +259,11 @@ class RequestSubmissionForm(SubmissionChecks, forms.ModelForm):
             self.fields['list_of_changes'].widget.attrs.update({
                 'placeholder': 'Give a point-by-point list of changes (will be viewable online)'})
 
+        # Proceedings submission
+        qs = self.fields['proceeding'].queryset.open_for_submission()
+        self.fields['proceeding'].queryset = qs
+        self.fields['proceeding'].empty_label = None
+
         # Update placeholder for the other fields
         self.fields['arxiv_link'].widget.attrs.update({
             'placeholder': 'ex.:  arxiv.org/abs/1234.56789v1'})
@@ -279,6 +286,10 @@ class RequestSubmissionForm(SubmissionChecks, forms.ModelForm):
         self.do_pre_checks(cleaned_data['arxiv_identifier_w_vn_nr'])
         self.arxiv_meets_regex(cleaned_data['arxiv_identifier_w_vn_nr'],
                                cleaned_data['submitted_to_journal'])
+
+        if self.cleaned_data['submitted_to_journal'] != SCIPOST_JOURNAL_PHYSICS_PROC:
+            del self.cleaned_data['proceeding']
+
         return cleaned_data
 
     def clean_author_list(self):
@@ -344,9 +355,13 @@ class RequestSubmissionForm(SubmissionChecks, forms.ModelForm):
         return submission
 
     def set_pool(self, submission):
-        fellows = Fellowship.objects.active().regular().filter(
-            contributor__discipline=submission.discipline)
-        submission.pool.set(fellows)
+        qs = Fellowship.objects.active()
+        fellows = qs.regular().filter(contributor__discipline=submission.discipline)
+        submission.fellows.set(fellows)
+
+        if submission.proceeding:
+            guest_fellows = qs.guests().filter(proceedings=submission.proceeding)
+            submission.fellows.add(*guest_fellows)
 
     @transaction.atomic
     def save(self):
diff --git a/submissions/migrations/0080_submission_proceedings.py b/submissions/migrations/0080_submission_proceedings.py
new file mode 100644
index 000000000..7e09124c8
--- /dev/null
+++ b/submissions/migrations/0080_submission_proceedings.py
@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.4 on 2017-10-15 20:31
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('proceedings', '0001_initial'),
+        ('submissions', '0079_auto_20171014_0951'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='submission',
+            name='proceedings',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='submissions', to='proceedings.Proceeding'),
+        ),
+    ]
diff --git a/submissions/migrations/0081_auto_20171015_2240.py b/submissions/migrations/0081_auto_20171015_2240.py
new file mode 100644
index 000000000..da143c529
--- /dev/null
+++ b/submissions/migrations/0081_auto_20171015_2240.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.4 on 2017-10-15 20:40
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('submissions', '0080_submission_proceedings'),
+    ]
+
+    operations = [
+        migrations.RenameField(
+            model_name='submission',
+            old_name='proceedings',
+            new_name='proceeding',
+        ),
+    ]
diff --git a/submissions/models.py b/submissions/models.py
index af7df0109..a95e05225 100644
--- a/submissions/models.py
+++ b/submissions/models.py
@@ -69,6 +69,8 @@ class Submission(models.Model):
     # Replace this by foreignkey?
     submitted_to_journal = models.CharField(max_length=30, choices=SCIPOST_JOURNALS_SUBMIT,
                                             verbose_name="Journal to be submitted to")
+    proceeding = models.ForeignKey('proceedings.Proceeding', null=True, blank=True,
+                                   related_name='submissions')
     title = models.CharField(max_length=300)
 
     # Authors which have been mapped to contributors:
diff --git a/submissions/templates/submissions/new_submission.html b/submissions/templates/submissions/new_submission.html
index 8e278f366..d24b3357b 100644
--- a/submissions/templates/submissions/new_submission.html
+++ b/submissions/templates/submissions/new_submission.html
@@ -10,12 +10,15 @@
 $(document).ready(function(){
   $('select#id_submitted_to_journal').on('change', function (){
       var selection = $(this).val();
+      $("#id_proceeding, #id_submission_type").parents('.form-group').hide()
+
       switch(selection){
         case "SciPostPhys":
           $("#id_submission_type").parents('.form-group').show()
           break;
-        default:
-          $("#id_submission_type").parents('.form-group').hide()
+        case "SciPostPhysProc":
+          $("#id_proceeding").parents('.form-group').show()
+          break;
       }
   }).trigger('change');
 });
-- 
GitLab