From f5ed95527e1c149fa2b08665cb02244ede35fa53 Mon Sep 17 00:00:00 2001
From: "J.-S. Caux" <J.S.Caux@uva.nl>
Date: Sat, 26 Nov 2016 09:15:33 +0100
Subject: [PATCH] Prepare upgrade to Django 1.10: on_delete on ForeignKey and
 OneToOne

---
 commentaries/models.py |  5 +++--
 comments/models.py     | 13 +++++++------
 journals/models.py     | 16 +++++++++-------
 scipost/models.py      |  6 +++---
 scipost/urls.py        |  2 +-
 submissions/models.py  | 28 +++++++++++++++-------------
 theses/models.py       |  5 +++--
 7 files changed, 41 insertions(+), 34 deletions(-)

diff --git a/commentaries/models.py b/commentaries/models.py
index f406156ff..694b51c6b 100644
--- a/commentaries/models.py
+++ b/commentaries/models.py
@@ -19,9 +19,10 @@ class Commentary(models.Model):
     """
     A Commentary contains all the contents of a SciPost Commentary page for a given publication.
     """
-    requested_by = models.ForeignKey (Contributor, blank=True, null=True, related_name='requested_by')
+    requested_by = models.ForeignKey (Contributor, blank=True, null=True,
+                                      on_delete=models.CASCADE, related_name='requested_by')
     vetted = models.BooleanField(default=False)
-    vetted_by = models.ForeignKey (Contributor, blank=True, null=True)
+    vetted_by = models.ForeignKey (Contributor, blank=True, null=True, on_delete=models.CASCADE)
     type = models.CharField(max_length=9, choices=COMMENTARY_TYPES) # published paper or arxiv preprint
     discipline = models.CharField(max_length=20, choices=SCIPOST_DISCIPLINES, default='physics')
     domain = models.CharField(max_length=3, choices=SCIPOST_JOURNALS_DOMAINS)
diff --git a/comments/models.py b/comments/models.py
index b9189f578..d18801033 100644
--- a/comments/models.py
+++ b/comments/models.py
@@ -44,15 +44,16 @@ class Comment(models.Model):
     # -3: rejected (not useful)
     status = models.SmallIntegerField(default=0)
     vetted_by = models.ForeignKey(Contributor, blank=True, null=True,
+                                  on_delete=models.CASCADE,
                                   related_name='comment_vetted_by')
     # a Comment is either for a Commentary or Submission
-    commentary = models.ForeignKey(Commentary, blank=True, null=True)
-    submission = models.ForeignKey(Submission, blank=True, null=True)
-    thesislink = models.ForeignKey(ThesisLink, blank=True, null=True)
+    commentary = models.ForeignKey(Commentary, blank=True, null=True, on_delete=models.CASCADE)
+    submission = models.ForeignKey(Submission, blank=True, null=True, on_delete=models.CASCADE)
+    thesislink = models.ForeignKey(ThesisLink, blank=True, null=True, on_delete=models.CASCADE)
     is_author_reply = models.BooleanField(default=False)
-    in_reply_to_comment = models.ForeignKey('self', blank=True, null=True)
-    in_reply_to_report = models.ForeignKey(Report, blank=True, null=True)
-    author = models.ForeignKey(Contributor, default=1)
+    in_reply_to_comment = models.ForeignKey('self', blank=True, null=True, on_delete=models.CASCADE)
+    in_reply_to_report = models.ForeignKey(Report, blank=True, null=True, on_delete=models.CASCADE)
+    author = models.ForeignKey(Contributor, default=1, on_delete=models.CASCADE)
     anonymous = models.BooleanField(default=False, verbose_name='Publish anonymously')
     # Categories:
     is_cor = models.BooleanField(default=False, verbose_name='correction/erratum')
diff --git a/journals/models.py b/journals/models.py
index 098e58c91..8581d9d79 100644
--- a/journals/models.py
+++ b/journals/models.py
@@ -114,7 +114,7 @@ class Journal(models.Model):
 
 
 class Volume(models.Model):
-    in_journal = models.ForeignKey(Journal)
+    in_journal = models.ForeignKey(Journal, on_delete=models.CASCADE)
     number = models.PositiveSmallIntegerField(unique=True)
     start_date = models.DateField(default=timezone.now)
     until_date = models.DateField(default=timezone.now)
@@ -125,7 +125,7 @@ class Volume(models.Model):
 
 
 class Issue(models.Model):
-    in_volume = models.ForeignKey(Volume)
+    in_volume = models.ForeignKey(Volume, on_delete=models.CASCADE)
     number = models.PositiveSmallIntegerField(unique=True)
     start_date = models.DateField(default=timezone.now)
     until_date = models.DateField(default=timezone.now)
@@ -153,14 +153,15 @@ class Issue(models.Model):
 
 
 class Publication(models.Model):
-    accepted_submission = models.OneToOneField('submissions.Submission')
-    in_issue = models.ForeignKey(Issue)
+    accepted_submission = models.OneToOneField('submissions.Submission', on_delete=models.CASCADE)
+    in_issue = models.ForeignKey(Issue, on_delete=models.CASCADE)
     paper_nr = models.PositiveSmallIntegerField()
     discipline = models.CharField(max_length=20, choices=SCIPOST_DISCIPLINES, default='physics')
     domain = models.CharField(max_length=3, choices=SCIPOST_JOURNALS_DOMAINS)
     subject_area = models.CharField(max_length=10, choices=SCIPOST_SUBJECT_AREAS,
                                     verbose_name='Primary subject area', default='Phys:QP')
-    secondary_areas = ChoiceArrayField(models.CharField(max_length=10, choices=SCIPOST_SUBJECT_AREAS),
+    secondary_areas = ChoiceArrayField(models.CharField(max_length=10,
+                                                        choices=SCIPOST_SUBJECT_AREAS),
                                        blank=True, null=True)
     title = models.CharField(max_length=300)
     author_list = models.CharField(max_length=1000, verbose_name="author list")
@@ -168,8 +169,9 @@ class Publication(models.Model):
     authors = models.ManyToManyField (Contributor, blank=True, related_name='authors_pub')
     authors_unregistered = models.ManyToManyField (UnregisteredAuthor, blank=True,
                                                    related_name='authors_unregistered')
-    first_author = models.ForeignKey (Contributor, blank=True, null=True)
+    first_author = models.ForeignKey (Contributor, blank=True, null=True, on_delete=models.CASCADE)
     first_author_unregistered = models.ForeignKey (UnregisteredAuthor, blank=True, null=True,
+                                                   on_delete=models.CASCADE,
                                                    related_name='first_author_unregistered')
     authors_claims = models.ManyToManyField (Contributor, blank=True,
                                              related_name='authors_pub_claims')
@@ -338,7 +340,7 @@ class Deposit(models.Model):
     current version of the metadata_xml field.
     All deposit history is thus contained here.
     """
-    publication = models.ForeignKey(Publication)
+    publication = models.ForeignKey(Publication, on_delete=models.CASCADE)
     doi_batch_id = models.CharField(max_length=40, default='')
     metadata_xml = models.TextField(blank=True, null=True)
     deposition_date = models.DateTimeField(default=timezone.now)
diff --git a/scipost/models.py b/scipost/models.py
index f566ccdba..87f37443c 100644
--- a/scipost/models.py
+++ b/scipost/models.py
@@ -184,7 +184,7 @@ class Contributor(models.Model):
     Permissions determine the sub-types.
     username, password, email, first_name and last_name are inherited from User.
     """
-    user = models.OneToOneField(User)
+    user = models.OneToOneField(User, on_delete=models.CASCADE)
     invitation_key = models.CharField(max_length=40, default='',
                                       blank=True, null=True)
     activation_key = models.CharField(max_length=40, default='')
@@ -885,7 +885,7 @@ class SupportingPartner(models.Model):
     institution_acronym = models.CharField(max_length=10)
     institution_address = models.CharField(max_length=1000)
     consortium_members = models.TextField(blank=True, null=True)
-    contact_person = models.ForeignKey(Contributor)
+    contact_person = models.ForeignKey(Contributor, on_delete=models.CASCADE)
 
     def __str__(self):
         return self.institution_acronym + ' (' + partner_status_dict[self.status] + ')'
@@ -912,7 +912,7 @@ class SPBMembershipAgreement(models.Model):
     Agreement for membership of the Supporting Partners Board.
     A new instance is created each time an Agreement is made or renewed.
     """
-    partner = models.ForeignKey(SupportingPartner)
+    partner = models.ForeignKey(SupportingPartner, on_delete=models.CASCADE)
     status = models.CharField(max_length=16, choices=SPB_MEMBERSHIP_AGREEMENT_STATUS)
     date_requested = models.DateField()
     start_date = models.DateField()
diff --git a/scipost/urls.py b/scipost/urls.py
index c67fe490e..d5d51881c 100644
--- a/scipost/urls.py
+++ b/scipost/urls.py
@@ -1,4 +1,4 @@
-from django.conf.urls import include, patterns, url
+from django.conf.urls import include, url
 from django.views.generic import TemplateView
 
 from . import views
diff --git a/submissions/models.py b/submissions/models.py
index 472ef8e8d..83a19c09e 100644
--- a/submissions/models.py
+++ b/submissions/models.py
@@ -77,8 +77,9 @@ submission_type_dict = dict(SUBMISSION_TYPE)
 class Submission(models.Model):
     is_current = models.BooleanField(default=True)
     is_resubmission = models.BooleanField(default=False)
-    submitted_by = models.ForeignKey(Contributor)
-    editor_in_charge = models.ForeignKey(Contributor, related_name='EIC', blank=True, null=True)
+    submitted_by = models.ForeignKey(Contributor, on_delete=models.CASCADE)
+    editor_in_charge = models.ForeignKey(Contributor, related_name='EIC', blank=True, null=True,
+                                         on_delete=models.CASCADE)
     submitted_to_journal = models.CharField(max_length=30, choices=SCIPOST_JOURNALS_SUBMIT,
                                             verbose_name="Journal to be submitted to")
     submission_type = models.CharField(max_length=10, choices=SUBMISSION_TYPE,
@@ -369,8 +370,8 @@ ASSIGNMENT_REFUSAL_REASONS = (
 assignment_refusal_reasons_dict = dict(ASSIGNMENT_REFUSAL_REASONS)
 
 class EditorialAssignment(models.Model):
-    submission = models.ForeignKey(Submission)
-    to = models.ForeignKey(Contributor)
+    submission = models.ForeignKey(Submission, on_delete=models.CASCADE)
+    to = models.ForeignKey(Contributor, on_delete=models.CASCADE)
     accepted = models.NullBooleanField(choices=ASSIGNMENT_NULLBOOL, default=None)
     # attribute `deprecated' becomes True if another Fellow becomes Editor-in-charge
     deprecated = models.BooleanField(default=False)
@@ -459,8 +460,9 @@ class EditorialAssignment(models.Model):
 
 
 class RefereeInvitation(models.Model):
-    submission = models.ForeignKey(Submission)
-    referee = models.ForeignKey(Contributor, related_name='referee', blank=True, null=True)
+    submission = models.ForeignKey(Submission, on_delete=models.CASCADE)
+    referee = models.ForeignKey(Contributor, related_name='referee', blank=True, null=True,
+                                on_delete=models.CASCADE)
     title = models.CharField(max_length=4, choices=TITLE_CHOICES)
     first_name = models.CharField(max_length=30, default='')
     last_name = models.CharField(max_length=30, default='')
@@ -469,7 +471,7 @@ class RefereeInvitation(models.Model):
     invitation_key = models.CharField(max_length=40, default='')
     date_invited = models.DateTimeField(default=timezone.now)
     invited_by = models.ForeignKey(Contributor, related_name='referee_invited_by',
-                                   blank=True, null=True)
+                                   blank=True, null=True, on_delete=models.CASCADE)
     nr_reminders = models.PositiveSmallIntegerField(default=0)
     date_last_reminded = models.DateTimeField(blank=True, null=True)
     accepted = models.NullBooleanField(choices=ASSIGNMENT_NULLBOOL, default=None)
@@ -575,15 +577,15 @@ class Report(models.Model):
     # -3: rejected (not useful)
     # -4: rejected (not academic in style)
     status = models.SmallIntegerField(default=0)
-    submission = models.ForeignKey(Submission)
+    submission = models.ForeignKey(Submission, on_delete=models.CASCADE)
     vetted_by = models.ForeignKey(Contributor, related_name="report_vetted_by",
-                                  blank=True, null=True)
+                                  blank=True, null=True, on_delete=models.CASCADE)
     # `invited' filled from RefereeInvitation objects at moment of report submission
     invited = models.BooleanField(default=False)
     # `flagged' if author of report has been flagged by submission authors (surname check only)
     flagged = models.BooleanField(default=False)
     date_submitted = models.DateTimeField('date submitted')
-    author = models.ForeignKey(Contributor)
+    author = models.ForeignKey(Contributor, on_delete=models.CASCADE)
     qualification = models.PositiveSmallIntegerField(choices=REFEREE_QUALIFICATION,
                                                      verbose_name="Qualification to referee this: I am ")
     # Text-based reporting
@@ -692,9 +694,9 @@ class EditorialCommunication(models.Model):
     Each individual communication between Editor-in-charge
     to and from Referees and Authors becomes an instance of this class.
     """
-    submission = models.ForeignKey(Submission)
+    submission = models.ForeignKey(Submission, on_delete=models.CASCADE)
     referee = models.ForeignKey(Contributor, related_name='referee_in_correspondence',
-                                blank=True, null=True)
+                                blank=True, null=True, on_delete=models.CASCADE)
     comtype = models.CharField(max_length=4, choices=ED_COMM_CHOICES)
     timestamp = models.DateTimeField(default=timezone.now)
     text = models.TextField()
@@ -743,7 +745,7 @@ class EditorialCommunication(models.Model):
 
 # From the Editor-in-charge of a Submission
 class EICRecommendation(models.Model):
-    submission = models.ForeignKey(Submission)
+    submission = models.ForeignKey(Submission, on_delete=models.CASCADE)
     date_submitted = models.DateTimeField('date submitted', default=timezone.now)
     remarks_for_authors = models.TextField(blank=True, null=True)
     requested_changes = models.TextField(verbose_name="requested changes", blank=True, null=True)
diff --git a/theses/models.py b/theses/models.py
index 688ac76bd..f8d878a6a 100644
--- a/theses/models.py
+++ b/theses/models.py
@@ -19,9 +19,10 @@ thesis_type_dict = dict(THESIS_TYPES)
 class ThesisLink(models.Model):
     """ An URL pointing to a thesis """
     requested_by = models.ForeignKey (Contributor, blank=True, null=True,
-                                      related_name='thesislink_requested_by')
+                                      related_name='thesislink_requested_by',
+                                      on_delete=models.CASCADE)
     vetted = models.BooleanField(default=False)
-    vetted_by = models.ForeignKey (Contributor, blank=True, null=True)
+    vetted_by = models.ForeignKey (Contributor, blank=True, null=True, on_delete=models.CASCADE)
     type = models.CharField(max_length=3, choices=THESIS_TYPES)
     discipline = models.CharField(max_length=20, choices=SCIPOST_DISCIPLINES, default='physics')
     domain = models.CharField(max_length=3, choices=SCIPOST_JOURNALS_DOMAINS, blank=True)
-- 
GitLab