From cf6b5fc0a27e7fe7323344a92fc0b781be422c9d Mon Sep 17 00:00:00 2001
From: "J.-S. Caux" <J.S.Caux@uva.nl>
Date: Thu, 14 Jan 2016 18:25:47 +0100
Subject: [PATCH] App consolidation: reports merged into submissions

---
 SciPost_v1/settings.py                        |  2 +-
 SciPost_v1/urls.py                            |  2 +-
 commentaries/migrations/0001_initial.py       | 18 ++--
 comments/migrations/0001_initial.py           | 41 +++++----
 comments/models.py                            |  3 +-
 ratings/migrations/0001_initial.py            | 15 ++--
 ratings/models.py                             |  3 +-
 reports/__init__.py                           |  0
 reports/admin.py                              |  5 --
 reports/forms.py                              | 35 --------
 reports/migrations/0001_initial.py            | 43 ----------
 reports/migrations/__init__.py                |  0
 reports/models.py                             | 62 --------------
 reports/tests.py                              |  3 -
 reports/urls.py                               | 12 ---
 reports/views.py                              | 83 -------------------
 scipost/templates/scipost/personal_page.html  |  2 +-
 scipost/views.py                              |  4 +-
 submissions/admin.py                          |  2 +
 submissions/forms.py                          | 34 ++++++++
 submissions/migrations/0001_initial.py        | 48 +++++++++--
 submissions/models.py                         | 52 +++++++++++-
 .../templates/submissions}/submit_report.html |  2 +-
 .../submissions}/submit_report_ack.html       |  0
 .../vet_submitted_report_ack.html             |  2 +-
 .../submissions}/vet_submitted_reports.html   |  2 +-
 submissions/urls.py                           |  5 ++
 submissions/views.py                          | 69 +++++++++++++++
 28 files changed, 246 insertions(+), 303 deletions(-)
 delete mode 100644 reports/__init__.py
 delete mode 100644 reports/admin.py
 delete mode 100644 reports/forms.py
 delete mode 100644 reports/migrations/0001_initial.py
 delete mode 100644 reports/migrations/__init__.py
 delete mode 100644 reports/models.py
 delete mode 100644 reports/tests.py
 delete mode 100644 reports/urls.py
 delete mode 100644 reports/views.py
 rename {reports/templates/reports => submissions/templates/submissions}/submit_report.html (92%)
 rename {reports/templates/reports => submissions/templates/submissions}/submit_report_ack.html (100%)
 rename {reports/templates/reports => submissions/templates/submissions}/vet_submitted_report_ack.html (67%)
 rename {reports/templates/reports => submissions/templates/submissions}/vet_submitted_reports.html (92%)

diff --git a/SciPost_v1/settings.py b/SciPost_v1/settings.py
index 797c834c1..141bd2ca4 100644
--- a/SciPost_v1/settings.py
+++ b/SciPost_v1/settings.py
@@ -59,7 +59,7 @@ INSTALLED_APPS = (
 #    'contributors',
     'journals',
     'ratings',
-    'reports',
+#    'reports',
     'scipost',
     'submissions',
 )
diff --git a/SciPost_v1/urls.py b/SciPost_v1/urls.py
index 3d8ea9cf8..2f59a7489 100644
--- a/SciPost_v1/urls.py
+++ b/SciPost_v1/urls.py
@@ -25,6 +25,6 @@ urlpatterns = [
 #    url(r'^contributors/', include('contributors.urls', namespace="contributors")),
     url(r'^journals/', include('journals.urls', namespace="journals")),
     url(r'^ratings/', include('ratings.urls', namespace="ratings")),
-    url(r'^reports/', include('reports.urls', namespace="reports")),
+#    url(r'^reports/', include('reports.urls', namespace="reports")),
     url(r'^submissions/', include('submissions.urls', namespace="submissions")),
 ]
diff --git a/commentaries/migrations/0001_initial.py b/commentaries/migrations/0001_initial.py
index b4993173d..e798f7a3c 100644
--- a/commentaries/migrations/0001_initial.py
+++ b/commentaries/migrations/0001_initial.py
@@ -15,7 +15,7 @@ class Migration(migrations.Migration):
         migrations.CreateModel(
             name='Commentary',
             fields=[
-                ('id', models.AutoField(primary_key=True, auto_created=True, verbose_name='ID', serialize=False)),
+                ('id', models.AutoField(verbose_name='ID', serialize=False, primary_key=True, auto_created=True)),
                 ('vetted', models.BooleanField(default=False)),
                 ('type', models.CharField(max_length=9)),
                 ('open_for_commenting', models.BooleanField(default=True)),
@@ -26,19 +26,19 @@ class Migration(migrations.Migration):
                 ('pub_date', models.DateField(verbose_name='date of original publication')),
                 ('pub_abstract', models.TextField()),
                 ('nr_clarity_ratings', models.IntegerField(default=0)),
-                ('clarity_rating', models.DecimalField(max_digits=3, null=True, default=0, decimal_places=0)),
+                ('clarity_rating', models.DecimalField(default=0, null=True, decimal_places=0, max_digits=3)),
                 ('nr_validity_ratings', models.IntegerField(default=0)),
-                ('validity_rating', models.DecimalField(max_digits=3, null=True, default=0, decimal_places=0)),
+                ('validity_rating', models.DecimalField(default=0, null=True, decimal_places=0, max_digits=3)),
                 ('nr_rigour_ratings', models.IntegerField(default=0)),
-                ('rigour_rating', models.DecimalField(max_digits=3, null=True, default=0, decimal_places=0)),
+                ('rigour_rating', models.DecimalField(default=0, null=True, decimal_places=0, max_digits=3)),
                 ('nr_originality_ratings', models.IntegerField(default=0)),
-                ('originality_rating', models.DecimalField(max_digits=3, null=True, default=0, decimal_places=0)),
+                ('originality_rating', models.DecimalField(default=0, null=True, decimal_places=0, max_digits=3)),
                 ('nr_significance_ratings', models.IntegerField(default=0)),
-                ('significance_rating', models.DecimalField(max_digits=3, null=True, default=0, decimal_places=0)),
+                ('significance_rating', models.DecimalField(default=0, null=True, decimal_places=0, max_digits=3)),
                 ('latest_activity', models.DateTimeField(default=django.utils.timezone.now)),
-                ('authors', models.ManyToManyField(to='scipost.Contributor', blank=True, related_name='authors_com')),
-                ('requested_by', models.ForeignKey(blank=True, related_name='requested_by', to='scipost.Contributor', null=True)),
-                ('vetted_by', models.ForeignKey(blank=True, to='scipost.Contributor', null=True)),
+                ('authors', models.ManyToManyField(related_name='authors_com', blank=True, to='scipost.Contributor')),
+                ('requested_by', models.ForeignKey(null=True, blank=True, related_name='requested_by', to='scipost.Contributor')),
+                ('vetted_by', models.ForeignKey(null=True, blank=True, to='scipost.Contributor')),
             ],
         ),
     ]
diff --git a/comments/migrations/0001_initial.py b/comments/migrations/0001_initial.py
index 100a47806..cda402bda 100644
--- a/comments/migrations/0001_initial.py
+++ b/comments/migrations/0001_initial.py
@@ -7,38 +7,37 @@ from django.db import migrations, models
 class Migration(migrations.Migration):
 
     dependencies = [
-        ('reports', '0001_initial'),
-        ('commentaries', '0001_initial'),
         ('scipost', '0001_initial'),
         ('submissions', '0001_initial'),
+        ('commentaries', '0001_initial'),
     ]
 
     operations = [
         migrations.CreateModel(
             name='AuthorReply',
             fields=[
-                ('id', models.AutoField(primary_key=True, auto_created=True, verbose_name='ID', serialize=False)),
+                ('id', models.AutoField(verbose_name='ID', serialize=False, primary_key=True, auto_created=True)),
                 ('status', models.SmallIntegerField(default=0)),
                 ('reply_text', models.TextField()),
                 ('date_submitted', models.DateTimeField(verbose_name='date submitted')),
                 ('nr_relevance_ratings', models.IntegerField(default=0)),
-                ('relevance_rating', models.DecimalField(max_digits=3, null=True, default=0, decimal_places=0)),
+                ('relevance_rating', models.DecimalField(default=0, null=True, decimal_places=0, max_digits=3)),
                 ('nr_importance_ratings', models.IntegerField(default=0)),
-                ('importance_rating', models.DecimalField(max_digits=3, null=True, default=0, decimal_places=0)),
+                ('importance_rating', models.DecimalField(default=0, null=True, decimal_places=0, max_digits=3)),
                 ('nr_clarity_ratings', models.IntegerField(default=0)),
-                ('clarity_rating', models.DecimalField(max_digits=3, null=True, default=0, decimal_places=0)),
+                ('clarity_rating', models.DecimalField(default=0, null=True, decimal_places=0, max_digits=3)),
                 ('nr_validity_ratings', models.IntegerField(default=0)),
-                ('validity_rating', models.DecimalField(max_digits=3, null=True, default=0, decimal_places=0)),
+                ('validity_rating', models.DecimalField(default=0, null=True, decimal_places=0, max_digits=3)),
                 ('nr_rigour_ratings', models.IntegerField(default=0)),
-                ('rigour_rating', models.DecimalField(max_digits=3, null=True, default=0, decimal_places=0)),
+                ('rigour_rating', models.DecimalField(default=0, null=True, decimal_places=0, max_digits=3)),
                 ('author', models.ForeignKey(to='scipost.Contributor')),
-                ('commentary', models.ForeignKey(blank=True, to='commentaries.Commentary', null=True)),
+                ('commentary', models.ForeignKey(null=True, blank=True, to='commentaries.Commentary')),
             ],
         ),
         migrations.CreateModel(
             name='Comment',
             fields=[
-                ('id', models.AutoField(primary_key=True, auto_created=True, verbose_name='ID', serialize=False)),
+                ('id', models.AutoField(verbose_name='ID', serialize=False, primary_key=True, auto_created=True)),
                 ('status', models.SmallIntegerField(default=0)),
                 ('is_rem', models.BooleanField(default=False, verbose_name='remark')),
                 ('is_que', models.BooleanField(default=False, verbose_name='question')),
@@ -51,34 +50,34 @@ class Migration(migrations.Migration):
                 ('comment_text', models.TextField()),
                 ('date_submitted', models.DateTimeField(verbose_name='date submitted')),
                 ('nr_relevance_ratings', models.IntegerField(default=0)),
-                ('relevance_rating', models.DecimalField(max_digits=3, null=True, default=0, decimal_places=0)),
+                ('relevance_rating', models.DecimalField(default=0, null=True, decimal_places=0, max_digits=3)),
                 ('nr_importance_ratings', models.IntegerField(default=0)),
-                ('importance_rating', models.DecimalField(max_digits=3, null=True, default=0, decimal_places=0)),
+                ('importance_rating', models.DecimalField(default=0, null=True, decimal_places=0, max_digits=3)),
                 ('nr_clarity_ratings', models.IntegerField(default=0)),
-                ('clarity_rating', models.DecimalField(max_digits=3, null=True, default=0, decimal_places=0)),
+                ('clarity_rating', models.DecimalField(default=0, null=True, decimal_places=0, max_digits=3)),
                 ('nr_validity_ratings', models.IntegerField(default=0)),
-                ('validity_rating', models.DecimalField(max_digits=3, null=True, default=0, decimal_places=0)),
+                ('validity_rating', models.DecimalField(default=0, null=True, decimal_places=0, max_digits=3)),
                 ('nr_rigour_ratings', models.IntegerField(default=0)),
-                ('rigour_rating', models.DecimalField(max_digits=3, null=True, default=0, decimal_places=0)),
+                ('rigour_rating', models.DecimalField(default=0, null=True, decimal_places=0, max_digits=3)),
                 ('author', models.ForeignKey(to='scipost.Contributor')),
-                ('commentary', models.ForeignKey(blank=True, to='commentaries.Commentary', null=True)),
-                ('in_reply_to', models.ForeignKey(blank=True, to='comments.Comment', null=True)),
-                ('submission', models.ForeignKey(blank=True, to='submissions.Submission', null=True)),
+                ('commentary', models.ForeignKey(null=True, blank=True, to='commentaries.Commentary')),
+                ('in_reply_to', models.ForeignKey(null=True, blank=True, to='comments.Comment')),
+                ('submission', models.ForeignKey(null=True, blank=True, to='submissions.Submission')),
             ],
         ),
         migrations.AddField(
             model_name='authorreply',
             name='in_reply_to_comment',
-            field=models.ForeignKey(blank=True, to='comments.Comment', null=True),
+            field=models.ForeignKey(null=True, blank=True, to='comments.Comment'),
         ),
         migrations.AddField(
             model_name='authorreply',
             name='in_reply_to_report',
-            field=models.ForeignKey(blank=True, to='reports.Report', null=True),
+            field=models.ForeignKey(null=True, blank=True, to='submissions.Report'),
         ),
         migrations.AddField(
             model_name='authorreply',
             name='submission',
-            field=models.ForeignKey(blank=True, to='submissions.Submission', null=True),
+            field=models.ForeignKey(null=True, blank=True, to='submissions.Submission'),
         ),
     ]
diff --git a/comments/models.py b/comments/models.py
index 4fde04c53..73e848200 100644
--- a/comments/models.py
+++ b/comments/models.py
@@ -12,8 +12,7 @@ from .models import *
 
 from commentaries.models import Commentary
 from scipost.models import Contributor
-from reports.models import Report
-from submissions.models import Submission
+from submissions.models import Submission, Report
 
 
 COMMENT_CATEGORIES = (
diff --git a/ratings/migrations/0001_initial.py b/ratings/migrations/0001_initial.py
index 2de2375d8..43fc9d064 100644
--- a/ratings/migrations/0001_initial.py
+++ b/ratings/migrations/0001_initial.py
@@ -7,18 +7,17 @@ from django.db import migrations, models
 class Migration(migrations.Migration):
 
     dependencies = [
-        ('reports', '0001_initial'),
-        ('commentaries', '0001_initial'),
         ('scipost', '0001_initial'),
         ('submissions', '0001_initial'),
         ('comments', '0001_initial'),
+        ('commentaries', '0001_initial'),
     ]
 
     operations = [
         migrations.CreateModel(
             name='AuthorReplyRating',
             fields=[
-                ('id', models.AutoField(primary_key=True, auto_created=True, verbose_name='ID', serialize=False)),
+                ('id', models.AutoField(verbose_name='ID', serialize=False, primary_key=True, auto_created=True)),
                 ('relevance', models.PositiveSmallIntegerField(default=0, null=True, verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')))),
                 ('importance', models.PositiveSmallIntegerField(default=0, null=True, verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')))),
                 ('clarity', models.PositiveSmallIntegerField(default=0, null=True, verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')))),
@@ -34,7 +33,7 @@ class Migration(migrations.Migration):
         migrations.CreateModel(
             name='CommentaryRating',
             fields=[
-                ('id', models.AutoField(primary_key=True, auto_created=True, verbose_name='ID', serialize=False)),
+                ('id', models.AutoField(verbose_name='ID', serialize=False, primary_key=True, auto_created=True)),
                 ('clarity', models.PositiveSmallIntegerField(default=0, null=True, verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')))),
                 ('validity', models.PositiveSmallIntegerField(default=0, null=True, verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')))),
                 ('rigour', models.PositiveSmallIntegerField(default=0, null=True, verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')))),
@@ -50,7 +49,7 @@ class Migration(migrations.Migration):
         migrations.CreateModel(
             name='CommentRating',
             fields=[
-                ('id', models.AutoField(primary_key=True, auto_created=True, verbose_name='ID', serialize=False)),
+                ('id', models.AutoField(verbose_name='ID', serialize=False, primary_key=True, auto_created=True)),
                 ('relevance', models.PositiveSmallIntegerField(default=0, null=True, verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')))),
                 ('importance', models.PositiveSmallIntegerField(default=0, null=True, verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')))),
                 ('clarity', models.PositiveSmallIntegerField(default=0, null=True, verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')))),
@@ -66,14 +65,14 @@ class Migration(migrations.Migration):
         migrations.CreateModel(
             name='ReportRating',
             fields=[
-                ('id', models.AutoField(primary_key=True, auto_created=True, verbose_name='ID', serialize=False)),
+                ('id', models.AutoField(verbose_name='ID', serialize=False, primary_key=True, auto_created=True)),
                 ('relevance', models.PositiveSmallIntegerField(default=0, null=True, verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')))),
                 ('importance', models.PositiveSmallIntegerField(default=0, null=True, verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')))),
                 ('clarity', models.PositiveSmallIntegerField(default=0, null=True, verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')))),
                 ('validity', models.PositiveSmallIntegerField(default=0, null=True, verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')))),
                 ('rigour', models.PositiveSmallIntegerField(default=0, null=True, verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')))),
                 ('rater', models.ForeignKey(to='scipost.Contributor')),
-                ('report', models.ForeignKey(to='reports.Report')),
+                ('report', models.ForeignKey(to='submissions.Report')),
             ],
             options={
                 'abstract': False,
@@ -82,7 +81,7 @@ class Migration(migrations.Migration):
         migrations.CreateModel(
             name='SubmissionRating',
             fields=[
-                ('id', models.AutoField(primary_key=True, auto_created=True, verbose_name='ID', serialize=False)),
+                ('id', models.AutoField(verbose_name='ID', serialize=False, primary_key=True, auto_created=True)),
                 ('clarity', models.PositiveSmallIntegerField(default=0, null=True, verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')))),
                 ('validity', models.PositiveSmallIntegerField(default=0, null=True, verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')))),
                 ('rigour', models.PositiveSmallIntegerField(default=0, null=True, verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')))),
diff --git a/ratings/models.py b/ratings/models.py
index 1a5a35781..5a3f15b94 100644
--- a/ratings/models.py
+++ b/ratings/models.py
@@ -8,8 +8,7 @@ from .models import *
 from commentaries.models import Commentary
 from comments.models import Comment, AuthorReply
 from scipost.models import Contributor
-from reports.models import Report
-from submissions.models import Submission
+from submissions.models import Submission, Report
 
 
 RATING_CHOICES = (
diff --git a/reports/__init__.py b/reports/__init__.py
deleted file mode 100644
index e69de29bb..000000000
diff --git a/reports/admin.py b/reports/admin.py
deleted file mode 100644
index e065522b4..000000000
--- a/reports/admin.py
+++ /dev/null
@@ -1,5 +0,0 @@
-from django.contrib import admin
-
-from reports.models import *
-
-admin.site.register(Report)
diff --git a/reports/forms.py b/reports/forms.py
deleted file mode 100644
index 7a3c308a1..000000000
--- a/reports/forms.py
+++ /dev/null
@@ -1,35 +0,0 @@
-from django import forms
-
-from .models import *
-
-from ratings.models import *
-
-REPORT_ACTION_CHOICES = (
-#    (0, 'modify'), 
-    (1, 'accept'), 
-    (2, 'refuse (give reason below)'),
-    )
-
-REPORT_REFUSAL_CHOICES = (
-    (0, '-'),
-    (-1, 'unclear'),
-    (-2, 'incorrect'),
-    (-3, 'not useful'),
-    (-4, 'not academic in style'),
-    )
-
-
-
-class ReportForm(forms.Form):
-    qualification = forms.ChoiceField(RATING_CHOICES, label='Your degree of qualification in assessing this Submission')
-    strengths = forms.CharField(widget=forms.Textarea(), required=False)
-    weaknesses = forms.CharField(widget=forms.Textarea(), required=False)
-    report = forms.CharField(widget=forms.Textarea(), required=False)
-    requested_changes = forms.CharField(widget=forms.Textarea(), required=False)
-    recommendation = forms.ChoiceField(choices=REPORT_REC)
-
-class VetReportForm(forms.Form):
-    action_option = forms.ChoiceField(widget=forms.RadioSelect, choices=REPORT_ACTION_CHOICES, required=True, label='Action')
-    refusal_reason = forms.ChoiceField(choices=REPORT_REFUSAL_CHOICES)
-    email_response_field = forms.CharField(widget=forms.Textarea(), label='Justification (optional)', required=False)
-
diff --git a/reports/migrations/0001_initial.py b/reports/migrations/0001_initial.py
deleted file mode 100644
index cd7a3ddce..000000000
--- a/reports/migrations/0001_initial.py
+++ /dev/null
@@ -1,43 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import unicode_literals
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('scipost', '0001_initial'),
-        ('submissions', '0001_initial'),
-    ]
-
-    operations = [
-        migrations.CreateModel(
-            name='Report',
-            fields=[
-                ('id', models.AutoField(primary_key=True, auto_created=True, verbose_name='ID', serialize=False)),
-                ('status', models.SmallIntegerField(default=0)),
-                ('qualification', models.PositiveSmallIntegerField(default=0)),
-                ('strengths', models.TextField()),
-                ('weaknesses', models.TextField()),
-                ('report', models.TextField()),
-                ('requested_changes', models.TextField()),
-                ('recommendation', models.SmallIntegerField(choices=[(1, 'Publish as Tier I (top 10% of papers in this journal)'), (2, 'Publish as Tier II (top 50% of papers in this journal)'), (3, 'Publish as Tier III (meets the criteria of this journal)'), (-1, 'Ask for minor revision'), (-2, 'Ask for major revision'), (-3, 'Reject')])),
-                ('date_invited', models.DateTimeField(blank=True, null=True, verbose_name='date invited')),
-                ('date_submitted', models.DateTimeField(verbose_name='date submitted')),
-                ('nr_relevance_ratings', models.IntegerField(default=0)),
-                ('relevance_rating', models.DecimalField(max_digits=3, null=True, default=0, decimal_places=0)),
-                ('nr_importance_ratings', models.IntegerField(default=0)),
-                ('importance_rating', models.DecimalField(max_digits=3, null=True, default=0, decimal_places=0)),
-                ('nr_clarity_ratings', models.IntegerField(default=0)),
-                ('clarity_rating', models.DecimalField(max_digits=3, null=True, default=0, decimal_places=0)),
-                ('nr_validity_ratings', models.IntegerField(default=0)),
-                ('validity_rating', models.DecimalField(max_digits=3, null=True, default=0, decimal_places=0)),
-                ('nr_rigour_ratings', models.IntegerField(default=0)),
-                ('rigour_rating', models.DecimalField(max_digits=3, null=True, default=0, decimal_places=0)),
-                ('author', models.ForeignKey(to='scipost.Contributor')),
-                ('invited_by', models.ForeignKey(blank=True, related_name='invited_by', to='scipost.Contributor', null=True)),
-                ('submission', models.ForeignKey(to='submissions.Submission')),
-            ],
-        ),
-    ]
diff --git a/reports/migrations/__init__.py b/reports/migrations/__init__.py
deleted file mode 100644
index e69de29bb..000000000
diff --git a/reports/models.py b/reports/models.py
deleted file mode 100644
index 1d2e41291..000000000
--- a/reports/models.py
+++ /dev/null
@@ -1,62 +0,0 @@
-from django.utils import timezone
-from django.db import models
-from django.contrib.auth.models import User
-
-from .models import *
-
-#from commentaries.models import *
-#from comments.models import *
-#from contributors.models import *
-#from journals.models import *
-#from ratings.models import *
-#from submissions.models import *
-
-#from commentaries.models import Commentary
-from scipost.models import Contributor
-#from reports.models import Report
-from submissions.models import Submission
-
-
-REPORT_REC = (
-    (1, 'Publish as Tier I (top 10% of papers in this journal)'),
-    (2, 'Publish as Tier II (top 50% of papers in this journal)'),
-    (3, 'Publish as Tier III (meets the criteria of this journal)'),
-    (-1, 'Ask for minor revision'),
-    (-2, 'Ask for major revision'),
-    (-3, 'Reject')
-    )
-
-
-class Report(models.Model):    
-    """ Both types of reports, invited or contributed. """
-    # status:
-    # 1: vetted (by Contributor with rank >= 2) 
-    # 0: unvetted
-    # -1: rejected (unclear)
-    # -2: rejected (incorrect)
-    # -3: rejected (not useful)
-    status = models.SmallIntegerField(default=0)
-    submission = models.ForeignKey(Submission)
-    author = models.ForeignKey(Contributor)
-    qualification = models.PositiveSmallIntegerField(default=0)
-    strengths = models.TextField()
-    weaknesses = models.TextField()
-    report = models.TextField()
-    requested_changes = models.TextField()
-    recommendation = models.SmallIntegerField(choices=REPORT_REC)
-    date_invited = models.DateTimeField('date invited', blank=True, null=True)
-    invited_by = models.ForeignKey(Contributor, blank=True, null=True, related_name='invited_by')
-    date_submitted = models.DateTimeField('date submitted')
-    # Aggregates of ratings applied to this report:
-    nr_relevance_ratings = models.IntegerField(default=0)
-    relevance_rating = models.DecimalField(default=0, max_digits=3, decimal_places=0, null=True)
-    nr_importance_ratings = models.IntegerField(default=0)
-    importance_rating = models.DecimalField(default=0, max_digits=3, decimal_places=0, null=True)
-    nr_clarity_ratings = models.IntegerField(default=0)
-    clarity_rating = models.DecimalField(default=0, max_digits=3, decimal_places=0, null=True)
-    nr_validity_ratings = models.IntegerField(default=0)
-    validity_rating = models.DecimalField(default=0, max_digits=3, decimal_places=0, null=True)
-    nr_rigour_ratings = models.IntegerField(default=0)
-    rigour_rating = models.DecimalField(default=0, max_digits=3, decimal_places=0, null=True)
-    
-
diff --git a/reports/tests.py b/reports/tests.py
deleted file mode 100644
index 7ce503c2d..000000000
--- a/reports/tests.py
+++ /dev/null
@@ -1,3 +0,0 @@
-from django.test import TestCase
-
-# Create your tests here.
diff --git a/reports/urls.py b/reports/urls.py
deleted file mode 100644
index 5885425f6..000000000
--- a/reports/urls.py
+++ /dev/null
@@ -1,12 +0,0 @@
-from django.conf.urls import include, url
-
-from . import views
-
-urlpatterns = [
-    # Reports
-    url(r'^submit_report/(?P<submission_id>[0-9]+)$', views.submit_report, name='submit_report'),
-    url(r'^submit_report_ack$', views.submit_report_ack, name='submit_report_ack'),
-    url(r'^vet_submitted_reports$', views.vet_submitted_reports, name='vet_submitted_reports'),
-    url(r'^vet_submitted_report_ack/(?P<report_id>[0-9]+)$', views.vet_submitted_report_ack, name='vet_submitted_report_ack'),
-
-]
diff --git a/reports/views.py b/reports/views.py
deleted file mode 100644
index 642d5ca47..000000000
--- a/reports/views.py
+++ /dev/null
@@ -1,83 +0,0 @@
-import datetime
-from django.utils import timezone
-from django.shortcuts import get_object_or_404, render
-from django.contrib.auth import authenticate, login, logout
-from django.contrib.auth.models import User
-from django.core.mail import send_mail
-from django.core.urlresolvers import reverse
-from django.http import HttpResponse, HttpResponseRedirect
-from django.views.decorators.csrf import csrf_protect
-from django.db.models import Avg
-
-from .models import *
-from .forms import *
-
-
-###########
-# Reports
-###########
-
-
-def submit_report(request, submission_id):
-    submission = get_object_or_404 (Submission, pk=submission_id)
-    if request.method == 'POST':
-        form = ReportForm(request.POST)
-        if form.is_valid():
-            author = Contributor.objects.get(user=request.user)
-            newreport = Report (
-                submission = submission,
-                author = author,
-                qualification = form.cleaned_data['qualification'],
-                strengths = form.cleaned_data['strengths'],
-                weaknesses = form.cleaned_data['weaknesses'],
-                report = form.cleaned_data['report'],
-                requested_changes = form.cleaned_data['requested_changes'],
-                recommendation = form.cleaned_data['recommendation'],
-                date_submitted = timezone.now(),
-                )
-            newreport.save()
-            author.nr_reports = Report.objects.filter(author=author).count()
-            author.save()
-            request.session['submission_id'] = submission_id
-            return HttpResponseRedirect(reverse('reports:submit_report_ack'))
-
-    else:
-        form = ReportForm()
-    context = {'submission': submission, 'form': form }
-    return render(request, 'reports/submit_report.html', context)
-
-
-def submit_report_ack(request):
-#    submission_id = request.session['submission_id']
-#    context = {'submission': Submission.objects.get(pk=submission_id) }
-    context = {}
-    return render(request, 'reports/submit_report_ack.html', context)
-
-
-def vet_submitted_reports(request):
-    contributor = Contributor.objects.get(user=request.user)
-    submitted_reports_to_vet = Report.objects.filter(status=0)
-    form = VetReportForm()
-    context = {'contributor': contributor, 'submitted_reports_to_vet': submitted_reports_to_vet, 'form': form }
-    return(render(request, 'reports/vet_submitted_reports.html', context))
-
-
-def vet_submitted_report_ack(request, report_id):
-    if request.method == 'POST':
-        form = VetReportForm(request.POST)
-        report = Report.objects.get(pk=report_id)
-        if form.is_valid():
-            if form.cleaned_data['action_option'] == '1':
-                # accept the report as is
-                report.status = 1
-                report.save()
-            elif form.cleaned_data['action_option'] == '2':
-                # the report is simply rejected
-                report.status = form.cleaned_data['refusal_reason']
-                report.save()
-                # email report author
-
-    context = {}
-    return render(request, 'reports/vet_submitted_report_ack.html', context)
-
-
diff --git a/scipost/templates/scipost/personal_page.html b/scipost/templates/scipost/personal_page.html
index f99c89238..c27fcd598 100644
--- a/scipost/templates/scipost/personal_page.html
+++ b/scipost/templates/scipost/personal_page.html
@@ -28,7 +28,7 @@
       <li><a href="{% url 'commentaries:vet_commentary_requests' %}">Vet Commentary Page requests</a> ({{ nr_commentary_page_requests_to_vet }})</li>
       <li><a href="{% url 'comments:vet_submitted_comments' %}">Vet submitted Comments</a> ({{ nr_comments_to_vet }})</li>
       <li><a href="{% url 'comments:vet_author_replies' %}">Vet submitted Author Replies</a> ({{ nr_author_replies_to_vet }})</li>
-      <li><a href="{% url 'reports:vet_submitted_reports' %}">Vet submitted Reports</a> ({{ nr_reports_to_vet }})</li>
+      <li><a href="{% url 'submissions:vet_submitted_reports' %}">Vet submitted Reports</a> ({{ nr_reports_to_vet }})</li>
     </ul>
   </div>
   {% if contributor.rank >= 3 %}
diff --git a/scipost/views.py b/scipost/views.py
index 16915ea80..7db4ab871 100644
--- a/scipost/views.py
+++ b/scipost/views.py
@@ -14,9 +14,7 @@ from .forms import *
 
 from commentaries.models import Commentary
 from comments.models import Comment, AuthorReply
-#from contributors.models import Contributor
-from reports.models import Report
-from submissions.models import Submission
+from submissions.models import Submission, Report
 
 
 #############
diff --git a/submissions/admin.py b/submissions/admin.py
index d384a66e9..e0bd05b21 100644
--- a/submissions/admin.py
+++ b/submissions/admin.py
@@ -3,3 +3,5 @@ from django.contrib import admin
 from submissions.models import *
 
 admin.site.register(Submission)
+
+admin.site.register(Report)
diff --git a/submissions/forms.py b/submissions/forms.py
index ff9e2a187..124d4e79a 100644
--- a/submissions/forms.py
+++ b/submissions/forms.py
@@ -2,6 +2,7 @@ from django import forms
 
 from .models import *
 
+from ratings.models import *
 
 class SubmissionForm(forms.Form):
     submitted_to_journal = forms.ChoiceField(choices=SCIPOST_JOURNALS_SUBMIT, required=True, label='SciPost Journal to submit to:')
@@ -20,3 +21,36 @@ class SubmissionSearchForm(forms.Form):
     title_keyword = forms.CharField(max_length=100, label="Title", required=False)
     abstract_keyword = forms.CharField(max_length=1000, required=False, label="Abstract")
 
+
+############
+# Reports:
+############
+
+REPORT_ACTION_CHOICES = (
+#    (0, 'modify'), 
+    (1, 'accept'), 
+    (2, 'refuse (give reason below)'),
+    )
+
+REPORT_REFUSAL_CHOICES = (
+    (0, '-'),
+    (-1, 'unclear'),
+    (-2, 'incorrect'),
+    (-3, 'not useful'),
+    (-4, 'not academic in style'),
+    )
+
+class ReportForm(forms.Form):
+    qualification = forms.ChoiceField(RATING_CHOICES, label='Your degree of qualification in assessing this Submission')
+    strengths = forms.CharField(widget=forms.Textarea(), required=False)
+    weaknesses = forms.CharField(widget=forms.Textarea(), required=False)
+    report = forms.CharField(widget=forms.Textarea(), required=False)
+    requested_changes = forms.CharField(widget=forms.Textarea(), required=False)
+    recommendation = forms.ChoiceField(choices=REPORT_REC)
+
+class VetReportForm(forms.Form):
+    action_option = forms.ChoiceField(widget=forms.RadioSelect, choices=REPORT_ACTION_CHOICES, required=True, label='Action')
+    refusal_reason = forms.ChoiceField(choices=REPORT_REFUSAL_CHOICES)
+    email_response_field = forms.CharField(widget=forms.Textarea(), label='Justification (optional)', required=False)
+
+
diff --git a/submissions/migrations/0001_initial.py b/submissions/migrations/0001_initial.py
index 87a9c4061..07ae59293 100644
--- a/submissions/migrations/0001_initial.py
+++ b/submissions/migrations/0001_initial.py
@@ -12,10 +12,37 @@ class Migration(migrations.Migration):
     ]
 
     operations = [
+        migrations.CreateModel(
+            name='Report',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, primary_key=True, auto_created=True)),
+                ('status', models.SmallIntegerField(default=0)),
+                ('qualification', models.PositiveSmallIntegerField(default=0)),
+                ('strengths', models.TextField()),
+                ('weaknesses', models.TextField()),
+                ('report', models.TextField()),
+                ('requested_changes', models.TextField()),
+                ('recommendation', models.SmallIntegerField(choices=[(1, 'Publish as Tier I (top 10% of papers in this journal)'), (2, 'Publish as Tier II (top 50% of papers in this journal)'), (3, 'Publish as Tier III (meets the criteria of this journal)'), (-1, 'Ask for minor revision'), (-2, 'Ask for major revision'), (-3, 'Reject')])),
+                ('date_invited', models.DateTimeField(null=True, verbose_name='date invited', blank=True)),
+                ('date_submitted', models.DateTimeField(verbose_name='date submitted')),
+                ('nr_relevance_ratings', models.IntegerField(default=0)),
+                ('relevance_rating', models.DecimalField(default=0, null=True, decimal_places=0, max_digits=3)),
+                ('nr_importance_ratings', models.IntegerField(default=0)),
+                ('importance_rating', models.DecimalField(default=0, null=True, decimal_places=0, max_digits=3)),
+                ('nr_clarity_ratings', models.IntegerField(default=0)),
+                ('clarity_rating', models.DecimalField(default=0, null=True, decimal_places=0, max_digits=3)),
+                ('nr_validity_ratings', models.IntegerField(default=0)),
+                ('validity_rating', models.DecimalField(default=0, null=True, decimal_places=0, max_digits=3)),
+                ('nr_rigour_ratings', models.IntegerField(default=0)),
+                ('rigour_rating', models.DecimalField(default=0, null=True, decimal_places=0, max_digits=3)),
+                ('author', models.ForeignKey(to='scipost.Contributor')),
+                ('invited_by', models.ForeignKey(null=True, blank=True, related_name='invited_by', to='scipost.Contributor')),
+            ],
+        ),
         migrations.CreateModel(
             name='Submission',
             fields=[
-                ('id', models.AutoField(primary_key=True, auto_created=True, verbose_name='ID', serialize=False)),
+                ('id', models.AutoField(verbose_name='ID', serialize=False, primary_key=True, auto_created=True)),
                 ('vetted', models.BooleanField(default=False)),
                 ('submitted_to_journal', models.CharField(choices=[('SciPost Physics Select', 'SciPost Physics Select'), ('SciPost Physics Letters', 'SciPost Physics Letters'), ('SciPost Physics X', 'SciPost Physics X (cross-division)'), ('SciPost Physics', 'SciPost Physics (Experimental, Theoretical and Computational)'), ('SciPost Physics Lecture Notes', 'SciPost Physics Lecture Notes')], max_length=30)),
                 ('domain', models.CharField(choices=[('E', 'Experimental'), ('T', 'Theoretical'), ('C', 'Computational')], default='E', max_length=1)),
@@ -29,19 +56,24 @@ class Migration(migrations.Migration):
                 ('arxiv_link', models.URLField(verbose_name='arXiv link (including version nr)')),
                 ('submission_date', models.DateField(verbose_name='date of original publication')),
                 ('nr_clarity_ratings', models.IntegerField(default=0)),
-                ('clarity_rating', models.DecimalField(max_digits=3, null=True, default=0, decimal_places=0)),
+                ('clarity_rating', models.DecimalField(default=0, null=True, decimal_places=0, max_digits=3)),
                 ('nr_validity_ratings', models.IntegerField(default=0)),
-                ('validity_rating', models.DecimalField(max_digits=3, null=True, default=0, decimal_places=0)),
+                ('validity_rating', models.DecimalField(default=0, null=True, decimal_places=0, max_digits=3)),
                 ('nr_rigour_ratings', models.IntegerField(default=0)),
-                ('rigour_rating', models.DecimalField(max_digits=3, null=True, default=0, decimal_places=0)),
+                ('rigour_rating', models.DecimalField(default=0, null=True, decimal_places=0, max_digits=3)),
                 ('nr_originality_ratings', models.IntegerField(default=0)),
-                ('originality_rating', models.DecimalField(max_digits=3, null=True, default=0, decimal_places=0)),
+                ('originality_rating', models.DecimalField(default=0, null=True, decimal_places=0, max_digits=3)),
                 ('nr_significance_ratings', models.IntegerField(default=0)),
-                ('significance_rating', models.DecimalField(max_digits=3, null=True, default=0, decimal_places=0)),
+                ('significance_rating', models.DecimalField(default=0, null=True, decimal_places=0, max_digits=3)),
                 ('latest_activity', models.DateTimeField(default=django.utils.timezone.now)),
-                ('authors', models.ManyToManyField(to='scipost.Contributor', blank=True, related_name='authors_sub')),
-                ('editor_in_charge', models.ForeignKey(blank=True, related_name='editor_in_charge', to='scipost.Contributor', null=True)),
+                ('authors', models.ManyToManyField(related_name='authors_sub', blank=True, to='scipost.Contributor')),
+                ('editor_in_charge', models.ForeignKey(null=True, blank=True, related_name='editor_in_charge', to='scipost.Contributor')),
                 ('submitted_by', models.ForeignKey(to='scipost.Contributor')),
             ],
         ),
+        migrations.AddField(
+            model_name='report',
+            name='submission',
+            field=models.ForeignKey(to='submissions.Submission'),
+        ),
     ]
diff --git a/submissions/models.py b/submissions/models.py
index 47d438f2a..940a5289c 100644
--- a/submissions/models.py
+++ b/submissions/models.py
@@ -8,6 +8,11 @@ from scipost.models import Contributor
 from journals.models import *
 
 
+
+###############
+# Submissions:
+###############
+
 SUBMISSION_STATUS = (
     (0, 'unassigned'),
     (1, 'editor in charge assigned'),
@@ -17,7 +22,6 @@ SUBMISSION_STATUS = (
     (5, 'editorial decision'),
     )
 
-
 class Submission(models.Model):
     submitted_by = models.ForeignKey(Contributor)
     vetted = models.BooleanField(default=False)
@@ -51,3 +55,49 @@ class Submission(models.Model):
     def __str__ (self):
         return self.title
 
+
+###########
+# Reports:
+###########
+
+REPORT_REC = (
+    (1, 'Publish as Tier I (top 10% of papers in this journal)'),
+    (2, 'Publish as Tier II (top 50% of papers in this journal)'),
+    (3, 'Publish as Tier III (meets the criteria of this journal)'),
+    (-1, 'Ask for minor revision'),
+    (-2, 'Ask for major revision'),
+    (-3, 'Reject')
+    )
+
+class Report(models.Model):    
+    """ Both types of reports, invited or contributed. """
+    # status:
+    # 1: vetted (by Contributor with rank >= 2) 
+    # 0: unvetted
+    # -1: rejected (unclear)
+    # -2: rejected (incorrect)
+    # -3: rejected (not useful)
+    status = models.SmallIntegerField(default=0)
+    submission = models.ForeignKey(Submission)
+    author = models.ForeignKey(Contributor)
+    qualification = models.PositiveSmallIntegerField(default=0)
+    strengths = models.TextField()
+    weaknesses = models.TextField()
+    report = models.TextField()
+    requested_changes = models.TextField()
+    recommendation = models.SmallIntegerField(choices=REPORT_REC)
+    date_invited = models.DateTimeField('date invited', blank=True, null=True)
+    invited_by = models.ForeignKey(Contributor, blank=True, null=True, related_name='invited_by')
+    date_submitted = models.DateTimeField('date submitted')
+    # Aggregates of ratings applied to this report:
+    nr_relevance_ratings = models.IntegerField(default=0)
+    relevance_rating = models.DecimalField(default=0, max_digits=3, decimal_places=0, null=True)
+    nr_importance_ratings = models.IntegerField(default=0)
+    importance_rating = models.DecimalField(default=0, max_digits=3, decimal_places=0, null=True)
+    nr_clarity_ratings = models.IntegerField(default=0)
+    clarity_rating = models.DecimalField(default=0, max_digits=3, decimal_places=0, null=True)
+    nr_validity_ratings = models.IntegerField(default=0)
+    validity_rating = models.DecimalField(default=0, max_digits=3, decimal_places=0, null=True)
+    nr_rigour_ratings = models.IntegerField(default=0)
+    rigour_rating = models.DecimalField(default=0, max_digits=3, decimal_places=0, null=True)
+    
diff --git a/reports/templates/reports/submit_report.html b/submissions/templates/submissions/submit_report.html
similarity index 92%
rename from reports/templates/reports/submit_report.html
rename to submissions/templates/submissions/submit_report.html
index 22d0214ea..7deb34a00 100644
--- a/reports/templates/reports/submit_report.html
+++ b/submissions/templates/submissions/submit_report.html
@@ -27,7 +27,7 @@
 
 <section>
   <h1>Your report:</h1>
-  <form action="{% url 'reports:submit_report' submission.id %}" method="post">
+  <form action="{% url 'submissions:submit_report' submission.id %}" method="post">
     {% csrf_token %}
     <table>
       <ul>
diff --git a/reports/templates/reports/submit_report_ack.html b/submissions/templates/submissions/submit_report_ack.html
similarity index 100%
rename from reports/templates/reports/submit_report_ack.html
rename to submissions/templates/submissions/submit_report_ack.html
diff --git a/reports/templates/reports/vet_submitted_report_ack.html b/submissions/templates/submissions/vet_submitted_report_ack.html
similarity index 67%
rename from reports/templates/reports/vet_submitted_report_ack.html
rename to submissions/templates/submissions/vet_submitted_report_ack.html
index b03cf25d0..5b7fb715d 100644
--- a/reports/templates/reports/vet_submitted_report_ack.html
+++ b/submissions/templates/submissions/vet_submitted_report_ack.html
@@ -6,7 +6,7 @@
 
 <section>
   <h1>SciPost submitted Report vetted.</h1>
-  <p><a href="{% url 'reports:vet_submitted_reports' %}">Back to submitted Reports page</a></p>
+  <p><a href="{% url 'submissions:vet_submitted_reports' %}">Back to submitted Reports page</a></p>
 </section>
 
 {% endblock bodysup %}
diff --git a/reports/templates/reports/vet_submitted_reports.html b/submissions/templates/submissions/vet_submitted_reports.html
similarity index 92%
rename from reports/templates/reports/vet_submitted_reports.html
rename to submissions/templates/submissions/vet_submitted_reports.html
index 910b7dfc2..e0238fb44 100644
--- a/reports/templates/reports/vet_submitted_reports.html
+++ b/submissions/templates/submissions/vet_submitted_reports.html
@@ -35,7 +35,7 @@
       <p>{{ report_to_vet.recommendation }}</p>
     </div>
     <div class="col-4">
-      <form action="{% url 'reports:vet_submitted_report_ack' report_id=report_to_vet.id %}" method="post">
+      <form action="{% url 'submissions:vet_submitted_report_ack' report_id=report_to_vet.id %}" method="post">
         {% csrf_token %}
         {{ form.as_ul }}
         <input type="submit" value="Submit" />
diff --git a/submissions/urls.py b/submissions/urls.py
index f5ac3fdd4..c8f0e06ce 100644
--- a/submissions/urls.py
+++ b/submissions/urls.py
@@ -11,4 +11,9 @@ urlpatterns = [
     url(r'^submit_manuscript_ack$', views.submit_manuscript_ack, name='submit_manuscript_ack'),
     url(r'^process_new_submissions$', views.process_new_submissions, name='process_new_submissions'),
     url(r'^process_new_submission_ack/(?P<submission_id>[0-9]+)$', views.process_new_submission_ack, name='process_new_submission_ack'),
+    # Reports
+    url(r'^submit_report/(?P<submission_id>[0-9]+)$', views.submit_report, name='submit_report'),
+    url(r'^submit_report_ack$', views.submit_report_ack, name='submit_report_ack'),
+    url(r'^vet_submitted_reports$', views.vet_submitted_reports, name='vet_submitted_reports'),
+    url(r'^vet_submitted_report_ack/(?P<report_id>[0-9]+)$', views.vet_submitted_report_ack, name='vet_submitted_report_ack'),
 ]
diff --git a/submissions/views.py b/submissions/views.py
index 9ce1914ce..a99ab95a3 100644
--- a/submissions/views.py
+++ b/submissions/views.py
@@ -19,6 +19,8 @@ from submissions.models import Submission
 from comments.forms import CommentForm
 from ratings.forms import CommentRatingForm, AuthorReplyRatingForm, ReportRatingForm, SubmissionRatingForm
 
+
+
 ###############
 # SUBMISSIONS:
 ###############
@@ -145,3 +147,70 @@ def submission_detail(request, submission_id):
     return render(request, 'submissions/submission_detail.html', context)
 
 
+
+###########
+# Reports
+###########
+
+def submit_report(request, submission_id):
+    submission = get_object_or_404 (Submission, pk=submission_id)
+    if request.method == 'POST':
+        form = ReportForm(request.POST)
+        if form.is_valid():
+            author = Contributor.objects.get(user=request.user)
+            newreport = Report (
+                submission = submission,
+                author = author,
+                qualification = form.cleaned_data['qualification'],
+                strengths = form.cleaned_data['strengths'],
+                weaknesses = form.cleaned_data['weaknesses'],
+                report = form.cleaned_data['report'],
+                requested_changes = form.cleaned_data['requested_changes'],
+                recommendation = form.cleaned_data['recommendation'],
+                date_submitted = timezone.now(),
+                )
+            newreport.save()
+            author.nr_reports = Report.objects.filter(author=author).count()
+            author.save()
+            request.session['submission_id'] = submission_id
+            return HttpResponseRedirect(reverse('reports:submit_report_ack'))
+
+    else:
+        form = ReportForm()
+    context = {'submission': submission, 'form': form }
+    return render(request, 'reports/submit_report.html', context)
+
+
+def submit_report_ack(request):
+#    submission_id = request.session['submission_id']
+#    context = {'submission': Submission.objects.get(pk=submission_id) }
+    context = {}
+    return render(request, 'reports/submit_report_ack.html', context)
+
+
+def vet_submitted_reports(request):
+    contributor = Contributor.objects.get(user=request.user)
+    submitted_reports_to_vet = Report.objects.filter(status=0)
+    form = VetReportForm()
+    context = {'contributor': contributor, 'submitted_reports_to_vet': submitted_reports_to_vet, 'form': form }
+    return(render(request, 'reports/vet_submitted_reports.html', context))
+
+
+def vet_submitted_report_ack(request, report_id):
+    if request.method == 'POST':
+        form = VetReportForm(request.POST)
+        report = Report.objects.get(pk=report_id)
+        if form.is_valid():
+            if form.cleaned_data['action_option'] == '1':
+                # accept the report as is
+                report.status = 1
+                report.save()
+            elif form.cleaned_data['action_option'] == '2':
+                # the report is simply rejected
+                report.status = form.cleaned_data['refusal_reason']
+                report.save()
+                # email report author
+
+    context = {}
+    return render(request, 'reports/vet_submitted_report_ack.html', context)
+
-- 
GitLab