From cd7fa161db5661296680b5ec2e99e9829b1ec4b8 Mon Sep 17 00:00:00 2001
From: Jorran de Wit <jorrandewit@outlook.com>
Date: Mon, 6 Mar 2017 08:21:03 +0100
Subject: [PATCH] Make needed changes for app moves

---
 scipost/admin.py                     |  80 +++--
 scipost/feeds.py                     |   2 +-
 scipost/forms.py                     |   4 +-
 scipost/models.py                    | 473 ++++++++++++---------------
 scipost/templates/scipost/index.html |   2 +-
 scipost/urls.py                      |   1 -
 scipost/views.py                     |  14 +-
 7 files changed, 265 insertions(+), 311 deletions(-)

diff --git a/scipost/admin.py b/scipost/admin.py
index 799517e9b..ccb5be7f2 100644
--- a/scipost/admin.py
+++ b/scipost/admin.py
@@ -5,60 +5,74 @@ from django.contrib.auth.models import User, Permission
 
 from guardian.admin import GuardedModelAdmin
 
-from scipost.models import *
+from scipost.models import Contributor, Remark, List,\
+                           DraftInvitation, Node, Arc, Graph, Team, AffiliationObject,\
+                           SupportingPartner, SPBMembershipAgreement, RegistrationInvitation,\
+                           AuthorshipClaim, PrecookedEmail
+from virtualmeetings.models import VGM, Feedback, Nomination, Motion
+
 
 class ContributorInline(admin.StackedInline):
     model = Contributor
 
+
 class UserAdmin(UserAdmin):
     inlines = [
         ContributorInline,
         ]
     search_fields = ['last_name', 'email']
 
+
 admin.site.unregister(User)
 admin.site.register(User, UserAdmin)
 
 
-class VGMAdmin(admin.ModelAdmin):
-    search_fields = ['start_date']
-
-admin.site.register(VGM, VGMAdmin)
-
-
-class FeedbackAdmin(admin.ModelAdmin):
-    search_fields = ['feedback', 'by']
-
-admin.site.register(Feedback, FeedbackAdmin)
-
-
-class NominationAdmin(admin.ModelAdmin):
-    search_fields = ['last_name', 'first_name', 'by']
-
-admin.site.register(Nomination, NominationAdmin)
-
-
-class MotionAdmin(admin.ModelAdmin):
-    search_fields = ['background', 'motion', 'put_forward_by']
-
-admin.site.register(Motion, MotionAdmin)
+# class VGMAdmin(admin.ModelAdmin):
+#     search_fields = ['start_date']
+#
+#
+# admin.site.register(VGM, VGMAdmin)
+#
+#
+# class FeedbackAdmin(admin.ModelAdmin):
+#     search_fields = ['feedback', 'by']
+#
+#
+# admin.site.register(Feedback, FeedbackAdmin)
+#
+#
+# class NominationAdmin(admin.ModelAdmin):
+#     search_fields = ['last_name', 'first_name', 'by']
+#
+#
+# admin.site.register(Nomination, NominationAdmin)
+#
+#
+# class MotionAdmin(admin.ModelAdmin):
+#     search_fields = ['background', 'motion', 'put_forward_by']
+#
+#
+# admin.site.register(Motion, MotionAdmin)
 
 
 class RemarkAdmin(admin.ModelAdmin):
     search_fields = ['contributor', 'remark']
 
+
 admin.site.register(Remark, RemarkAdmin)
 
 
 class DraftInvitationAdmin(admin.ModelAdmin):
     search_fields = ['first_name', 'last_name', 'email', 'processed']
 
+
 admin.site.register(DraftInvitation, DraftInvitationAdmin)
 
 
 class RegistrationInvitationAdmin(admin.ModelAdmin):
     search_fields = ['first_name', 'last_name', 'email', 'invitation_key']
 
+
 admin.site.register(RegistrationInvitation, RegistrationInvitationAdmin)
 
 
@@ -69,34 +83,26 @@ admin.site.register(Permission)
 class PrecookedEmailAdmin(admin.ModelAdmin):
     search_fields = ['email_subject', 'email_text', 'emailed_to']
 
-admin.site.register(PrecookedEmail, PrecookedEmailAdmin)
-
-
-class NewsItemAdmin(admin.ModelAdmin):
-    search_fields = ['blurb', 'followup_link_text']
 
-admin.site.register(NewsItem, NewsItemAdmin)
+admin.site.register(PrecookedEmail, PrecookedEmailAdmin)
 
 
 class ListAdmin(GuardedModelAdmin):
     search_fields = ['owner', 'title']
 
-admin.site.register(List, ListAdmin)
 
+admin.site.register(List, ListAdmin)
 admin.site.register(Team)
 
-#admin.site.register(Graph)
-
-#admin.site.register(Node)
-
-#admin.site.register(Arc)
 
 class NodeInline(admin.StackedInline):
     model = Node
 
+
 class ArcInline(admin.StackedInline):
     model = Arc
 
+
 class GraphAdmin(GuardedModelAdmin):
     inlines = [
         NodeInline,
@@ -104,18 +110,21 @@ class GraphAdmin(GuardedModelAdmin):
         ]
     search_fields = ['owner___user__last_name', 'title']
 
+
 admin.site.register(Graph, GraphAdmin)
 
 
 class AffiliationObjectAdmin(admin.ModelAdmin):
     search_fields = ['country', 'institution', 'subunit']
 
+
 admin.site.register(AffiliationObject, AffiliationObjectAdmin)
 
 
 class SPBMembershipAgreementInline(admin.StackedInline):
     model = SPBMembershipAgreement
 
+
 class SupportingPartnerAdmin(admin.ModelAdmin):
     search_fields = ['institution', 'institution_acronym',
                      'institution_address', 'contact_person']
@@ -123,4 +132,5 @@ class SupportingPartnerAdmin(admin.ModelAdmin):
         SPBMembershipAgreementInline,
     ]
 
+
 admin.site.register(SupportingPartner, SupportingPartnerAdmin)
diff --git a/scipost/feeds.py b/scipost/feeds.py
index 297ea1c77..29ea0a31d 100644
--- a/scipost/feeds.py
+++ b/scipost/feeds.py
@@ -5,10 +5,10 @@ from django.utils.feedgenerator import Atom1Feed
 from django.core.urlresolvers import reverse
 from django.db.models import Q
 
-from scipost.models import NewsItem
 from scipost.models import subject_areas_dict
 from comments.models import Comment
 from journals.models import Publication
+from news.models import NewsItem
 from submissions.models import Submission, SUBMISSION_STATUS_PUBLICLY_INVISIBLE
 
 
diff --git a/scipost/forms.py b/scipost/forms.py
index 7c628d2f2..04f36192d 100644
--- a/scipost/forms.py
+++ b/scipost/forms.py
@@ -16,8 +16,8 @@ from .models import TITLE_CHOICES, SCIPOST_FROM_ADDRESSES, ARC_LENGTHS,\
                      Contributor, DraftInvitation, RegistrationInvitation,\
                      SupportingPartner, SPBMembershipAgreement,\
                      UnavailabilityPeriod, PrecookedEmail,\
-                     List, Team, Graph, Node,\
-                     Feedback, Nomination, Motion
+                     List, Team, Graph, Node
+from virtualmeetings.models import Feedback, Nomination, Motion
 
 from journals.models import Publication
 from submissions.models import SUBMISSION_STATUS_PUBLICLY_UNLISTED
diff --git a/scipost/models.py b/scipost/models.py
index a29a48f14..4bde7f7af 100644
--- a/scipost/models.py
+++ b/scipost/models.py
@@ -251,11 +251,11 @@ class UnavailabilityPeriod(models.Model):
 
 class Remark(models.Model):
     contributor = models.ForeignKey(Contributor, on_delete=models.CASCADE)
-    feedback = models.ForeignKey('scipost.Feedback', on_delete=models.CASCADE,
+    feedback = models.ForeignKey('virtualmeetings.Feedback', on_delete=models.CASCADE,
                                  blank=True, null=True)
-    nomination = models.ForeignKey('scipost.Nomination', on_delete=models.CASCADE,
+    nomination = models.ForeignKey('virtualmeetings.Nomination', on_delete=models.CASCADE,
                                    blank=True, null=True)
-    motion = models.ForeignKey('scipost.Motion', on_delete=models.CASCADE,
+    motion = models.ForeignKey('virtualmeetings.Motion', on_delete=models.CASCADE,
                                blank=True, null=True)
     submission = models.ForeignKey('submissions.Submission',
                                    on_delete=models.CASCADE,
@@ -428,269 +428,218 @@ class PrecookedEmail(models.Model):
         return self.email_subject
 
 
-#############
-# NewsItems #
-#############
-
-class NewsItem(models.Model):
-    date = models.DateField()
-    headline = models.CharField(max_length=300)
-    blurb = models.TextField()
-    followup_link = models.URLField(blank=True, null=True)
-    followup_link_text = models.CharField(max_length=300, blank=True, null=True)
-
-    def __str__(self):
-        return self.date.strftime('%Y-%m-%d') + ', ' + self.headline
-
-    def descriptor_full(self):
-        """ For News page. """
-        descriptor = ('<div class="flex-greybox640">'
-                      '<h3 class="NewsHeadline">{{ headline }}</h3>'
-                      '<p>{{ date }}</p>'
-                      '<p>{{ blurb }}</p>'
-                      )
-        context = Context({'headline': self.headline,
-                           'date': self.date.strftime('%Y-%m-%d'),
-                           'blurb': self.blurb, })
-        if self.followup_link:
-            descriptor += '<p><a href="{{ followup_link }}">{{ followup_link_text }}</a></p>'
-            context['followup_link'] = self.followup_link
-            context['followup_link_text'] = self.followup_link_text
-        descriptor += '</div>'
-        template = Template(descriptor)
-        return template.render(context)
-
-    def descriptor_small(self):
-        """ For index page. """
-        descriptor = ('<h3 class="NewsHeadline">{{ headline }}</h3>'
-                      '<div class="p-2">'
-                      '<p>{{ date }}</p>'
-                      '<p>{{ blurb }}</p>'
-                      )
-        context = Context({'headline': self.headline,
-                           'date': self.date.strftime('%Y-%m-%d'),
-                           'blurb': self.blurb, })
-        if self.followup_link:
-            descriptor += '<p><a href="{{ followup_link }}">{{ followup_link_text }}</a></p>'
-            context['followup_link'] = self.followup_link
-            context['followup_link_text'] = self.followup_link_text
-        descriptor += '</div>'
-        template = Template(descriptor)
-        return template.render(context)
-
-
 #####################################
 # Virtual General Meetings, Motions #
 #####################################
 
-class VGM(models.Model):
-    """
-    Each year, a Virtual General Meeting is held during which operations at
-    SciPost are discussed. A VGM can be attended by Administrators,
-    Advisory Board members and Editorial Fellows.
-    """
-    start_date = models.DateField()
-    end_date = models.DateField()
-    information = models.TextField(default='')
-
-    def __str__(self):
-        return 'From %s to %s' % (self.start_date.strftime('%Y-%m-%d'),
-                                  self.end_date.strftime('%Y-%m-%d'))
-
-
-class Feedback(models.Model):
-    """
-    Feedback, suggestion or criticism on any aspect of SciPost.
-    """
-    VGM = models.ForeignKey(VGM, blank=True, null=True)
-    by = models.ForeignKey(Contributor)
-    date = models.DateField()
-    feedback = models.TextField()
-
-    def __str__(self):
-        return '%s: %s' % (self.by, self.feedback[:50])
-
-    def as_li(self):
-        html = ('<div class="Feedback">'
-                '<h3><em>by {{ by }}</em></h3>'
-                '<p>{{ feedback|linebreaks }}</p>'
-                '</div>')
-        context = Context({
-            'feedback': self.feedback,
-            'by': '%s %s' % (self.by.user.first_name,
-                             self.by.user.last_name)})
-        template = Template(html)
-        return template.render(context)
-
-
-class Nomination(models.Model):
-    """
-    Nomination to an Editorial Fellowship.
-    """
-    VGM = models.ForeignKey(VGM, blank=True, null=True)
-    by = models.ForeignKey(Contributor)
-    date = models.DateField()
-    first_name = models.CharField(max_length=30, default='')
-    last_name = models.CharField(max_length=30, default='')
-    discipline = models.CharField(max_length=20, choices=SCIPOST_DISCIPLINES,
-                                  default='physics', verbose_name='Main discipline')
-    expertises = ChoiceArrayField(
-        models.CharField(max_length=10, choices=SCIPOST_SUBJECT_AREAS),
-        blank=True, null=True)
-    webpage = models.URLField(default='')
-    nr_A = models.PositiveIntegerField(default=0)
-    in_agreement = models.ManyToManyField(Contributor,
-                                          related_name='in_agreement_with_nomination', blank=True)
-    nr_N = models.PositiveIntegerField(default=0)
-    in_notsure = models.ManyToManyField(Contributor,
-                                        related_name='in_notsure_with_nomination', blank=True)
-    nr_D = models.PositiveIntegerField(default=0)
-    in_disagreement = models.ManyToManyField(Contributor,
-                                             related_name='in_disagreement_with_nomination',
-                                             blank=True)
-    voting_deadline = models.DateTimeField('voting deadline', default=timezone.now)
-    accepted = models.NullBooleanField()
-
-    def __str__(self):
-        return '%s %s (nominated by %s)' % (self.first_name,
-                                            self.last_name,
-                                            self.by)
-
-    def as_li(self):
-        html = ('<div class="Nomination" id="nomination_id{{ nomination_id }}" '
-                'style="background-color: #eeeeee;">'
-                '<div class="row">'
-                '<div class="col-4">'
-                '<h3><em> {{ name }}</em></h3>'
-                '<p>Nominated by {{ proposer }}</p>'
-                '</div>'
-                '<div class="col-4">'
-                '<p><a href="{{ webpage }}">Webpage</a></p>'
-                '<p>Discipline: {{ discipline }}</p></div>'
-                '<div class="col-4"><p>expertise:<ul>')
-        for exp in self.expertises:
-            html += '<li>%s</li>' % subject_areas_dict[exp]
-        html += '</ul></div></div></div>'
-        context = Context({
-            'nomination_id': self.id,
-            'proposer': '%s %s' % (self.by.user.first_name,
-                                   self.by.user.last_name),
-            'name': self.first_name + ' ' + self.last_name,
-            'discipline': disciplines_dict[self.discipline],
-            'webpage': self.webpage,
-        })
-        template = Template(html)
-        return template.render(context)
-
-    def votes_as_ul(self):
-        template = Template('''
-        <ul class="opinionsDisplay">
-        <li style="background-color: #000099">Agree {{ nr_A }}</li>
-        <li style="background-color: #555555">Abstain {{ nr_N }}</li>
-        <li style="background-color: #990000">Disagree {{ nr_D }}</li>
-        </ul>
-        ''')
-        context = Context({'nr_A': self.nr_A, 'nr_N': self.nr_N, 'nr_D': self.nr_D})
-        return template.render(context)
-
-    def update_votes(self, contributor_id, vote):
-        contributor = get_object_or_404(Contributor, pk=contributor_id)
-        self.in_agreement.remove(contributor)
-        self.in_notsure.remove(contributor)
-        self.in_disagreement.remove(contributor)
-        if vote == 'A':
-            self.in_agreement.add(contributor)
-        elif vote == 'N':
-            self.in_notsure.add(contributor)
-        elif vote == 'D':
-            self.in_disagreement.add(contributor)
-        self.nr_A = self.in_agreement.count()
-        self.nr_N = self.in_notsure.count()
-        self.nr_D = self.in_disagreement.count()
-        self.save()
-
-
-MOTION_CATEGORIES = (
-    ('ByLawAmend', 'Amendments to by-laws'),
-    ('Workflow', 'Editorial workflow improvements'),
-    ('General', 'General'),
-)
-motion_categories_dict = dict(MOTION_CATEGORIES)
-
-
-class Motion(models.Model):
-    """
-    Motion instances are put forward to the Advisory Board and Editorial College
-    and detail suggested changes to rules, procedures etc.
-    They are meant to be voted on at the annual VGM.
-    """
-    category = models.CharField(max_length=10, choices=MOTION_CATEGORIES,
-                                default='General')
-    VGM = models.ForeignKey(VGM, blank=True, null=True)
-    background = models.TextField()
-    motion = models.TextField()
-    put_forward_by = models.ForeignKey(Contributor)
-    date = models.DateField()
-    nr_A = models.PositiveIntegerField(default=0)
-    in_agreement = models.ManyToManyField(Contributor,
-                                          related_name='in_agreement_with_motion', blank=True)
-    nr_N = models.PositiveIntegerField(default=0)
-    in_notsure = models.ManyToManyField(Contributor,
-                                        related_name='in_notsure_with_motion', blank=True)
-    nr_D = models.PositiveIntegerField(default=0)
-    in_disagreement = models.ManyToManyField(Contributor,
-                                             related_name='in_disagreement_with_motion',
-                                             blank=True)
-    voting_deadline = models.DateTimeField('voting deadline', default=timezone.now)
-    accepted = models.NullBooleanField()
-
-    def __str__(self):
-        return self.motion[:32]
-
-    def as_li(self):
-        html = ('<div class="Motion" id="motion_id{{ motion_id }}">'
-                '<h3><em>Motion {{ motion_id }}, put forward by {{ proposer }}</em></h3>'
-                '<h3>Background:</h3><p>{{ background|linebreaks }}</p>'
-                '<h3>Motion:</h3>'
-                '<div class="flex-container"><div class="flex-greybox">'
-                '<p style="background-color: #eeeeee;">{{ motion|linebreaks }}</p>'
-                '</div></div>'
-                '</div>')
-        context = Context({
-            'motion_id': self.id,
-            'proposer': '%s %s' % (self.put_forward_by.user.first_name,
-                                   self.put_forward_by.user.last_name),
-            'background': self.background,
-            'motion': self.motion, })
-        template = Template(html)
-        return template.render(context)
-
-    def votes_as_ul(self):
-        template = Template('''
-        <ul class="opinionsDisplay">
-        <li style="background-color: #000099">Agree {{ nr_A }}</li>
-        <li style="background-color: #555555">Abstain {{ nr_N }}</li>
-        <li style="background-color: #990000">Disagree {{ nr_D }}</li>
-        </ul>
-        ''')
-        context = Context({'nr_A': self.nr_A, 'nr_N': self.nr_N, 'nr_D': self.nr_D})
-        return template.render(context)
-
-    def update_votes(self, contributor_id, vote):
-        contributor = get_object_or_404(Contributor, pk=contributor_id)
-        self.in_agreement.remove(contributor)
-        self.in_notsure.remove(contributor)
-        self.in_disagreement.remove(contributor)
-        if vote == 'A':
-            self.in_agreement.add(contributor)
-        elif vote == 'N':
-            self.in_notsure.add(contributor)
-        elif vote == 'D':
-            self.in_disagreement.add(contributor)
-        self.nr_A = self.in_agreement.count()
-        self.nr_N = self.in_notsure.count()
-        self.nr_D = self.in_disagreement.count()
-        self.save()
+# class VGM(models.Model):
+#     """
+#     Each year, a Virtual General Meeting is held during which operations at
+#     SciPost are discussed. A VGM can be attended by Administrators,
+#     Advisory Board members and Editorial Fellows.
+#     """
+#     start_date = models.DateField()
+#     end_date = models.DateField()
+#     information = models.TextField(default='')
+#
+#     def __str__(self):
+#         return 'From %s to %s' % (self.start_date.strftime('%Y-%m-%d'),
+#                                   self.end_date.strftime('%Y-%m-%d'))
+#
+#
+# class Feedback(models.Model):
+#     """
+#     Feedback, suggestion or criticism on any aspect of SciPost.
+#     """
+#     VGM = models.ForeignKey(VGM, blank=True, null=True)
+#     by = models.ForeignKey(Contributor)
+#     date = models.DateField()
+#     feedback = models.TextField()
+#
+#     def __str__(self):
+#         return '%s: %s' % (self.by, self.feedback[:50])
+#
+#     def as_li(self):
+#         html = ('<div class="Feedback">'
+#                 '<h3><em>by {{ by }}</em></h3>'
+#                 '<p>{{ feedback|linebreaks }}</p>'
+#                 '</div>')
+#         context = Context({
+#             'feedback': self.feedback,
+#             'by': '%s %s' % (self.by.user.first_name,
+#                              self.by.user.last_name)})
+#         template = Template(html)
+#         return template.render(context)
+#
+#
+# class Nomination(models.Model):
+#     """
+#     Nomination to an Editorial Fellowship.
+#     """
+#     VGM = models.ForeignKey(VGM, blank=True, null=True)
+#     by = models.ForeignKey(Contributor)
+#     date = models.DateField()
+#     first_name = models.CharField(max_length=30, default='')
+#     last_name = models.CharField(max_length=30, default='')
+#     discipline = models.CharField(max_length=20, choices=SCIPOST_DISCIPLINES,
+#                                   default='physics', verbose_name='Main discipline')
+#     expertises = ChoiceArrayField(
+#         models.CharField(max_length=10, choices=SCIPOST_SUBJECT_AREAS),
+#         blank=True, null=True)
+#     webpage = models.URLField(default='')
+#     nr_A = models.PositiveIntegerField(default=0)
+#     in_agreement = models.ManyToManyField(Contributor,
+#                                           related_name='in_agreement_with_nomination', blank=True)
+#     nr_N = models.PositiveIntegerField(default=0)
+#     in_notsure = models.ManyToManyField(Contributor,
+#                                         related_name='in_notsure_with_nomination', blank=True)
+#     nr_D = models.PositiveIntegerField(default=0)
+#     in_disagreement = models.ManyToManyField(Contributor,
+#                                              related_name='in_disagreement_with_nomination',
+#                                              blank=True)
+#     voting_deadline = models.DateTimeField('voting deadline', default=timezone.now)
+#     accepted = models.NullBooleanField()
+#
+#     def __str__(self):
+#         return '%s %s (nominated by %s)' % (self.first_name,
+#                                             self.last_name,
+#                                             self.by)
+#
+#     def as_li(self):
+#         html = ('<div class="Nomination" id="nomination_id{{ nomination_id }}" '
+#                 'style="background-color: #eeeeee;">'
+#                 '<div class="row">'
+#                 '<div class="col-4">'
+#                 '<h3><em> {{ name }}</em></h3>'
+#                 '<p>Nominated by {{ proposer }}</p>'
+#                 '</div>'
+#                 '<div class="col-4">'
+#                 '<p><a href="{{ webpage }}">Webpage</a></p>'
+#                 '<p>Discipline: {{ discipline }}</p></div>'
+#                 '<div class="col-4"><p>expertise:<ul>')
+#         for exp in self.expertises:
+#             html += '<li>%s</li>' % subject_areas_dict[exp]
+#         html += '</ul></div></div></div>'
+#         context = Context({
+#             'nomination_id': self.id,
+#             'proposer': '%s %s' % (self.by.user.first_name,
+#                                    self.by.user.last_name),
+#             'name': self.first_name + ' ' + self.last_name,
+#             'discipline': disciplines_dict[self.discipline],
+#             'webpage': self.webpage,
+#         })
+#         template = Template(html)
+#         return template.render(context)
+#
+#     def votes_as_ul(self):
+#         template = Template('''
+#         <ul class="opinionsDisplay">
+#         <li style="background-color: #000099">Agree {{ nr_A }}</li>
+#         <li style="background-color: #555555">Abstain {{ nr_N }}</li>
+#         <li style="background-color: #990000">Disagree {{ nr_D }}</li>
+#         </ul>
+#         ''')
+#         context = Context({'nr_A': self.nr_A, 'nr_N': self.nr_N, 'nr_D': self.nr_D})
+#         return template.render(context)
+#
+#     def update_votes(self, contributor_id, vote):
+#         contributor = get_object_or_404(Contributor, pk=contributor_id)
+#         self.in_agreement.remove(contributor)
+#         self.in_notsure.remove(contributor)
+#         self.in_disagreement.remove(contributor)
+#         if vote == 'A':
+#             self.in_agreement.add(contributor)
+#         elif vote == 'N':
+#             self.in_notsure.add(contributor)
+#         elif vote == 'D':
+#             self.in_disagreement.add(contributor)
+#         self.nr_A = self.in_agreement.count()
+#         self.nr_N = self.in_notsure.count()
+#         self.nr_D = self.in_disagreement.count()
+#         self.save()
+#
+#
+# MOTION_CATEGORIES = (
+#     ('ByLawAmend', 'Amendments to by-laws'),
+#     ('Workflow', 'Editorial workflow improvements'),
+#     ('General', 'General'),
+# )
+# motion_categories_dict = dict(MOTION_CATEGORIES)
+#
+#
+# class Motion(models.Model):
+#     """
+#     Motion instances are put forward to the Advisory Board and Editorial College
+#     and detail suggested changes to rules, procedures etc.
+#     They are meant to be voted on at the annual VGM.
+#     """
+#     category = models.CharField(max_length=10, choices=MOTION_CATEGORIES,
+#                                 default='General')
+#     VGM = models.ForeignKey(VGM, blank=True, null=True)
+#     background = models.TextField()
+#     motion = models.TextField()
+#     put_forward_by = models.ForeignKey(Contributor)
+#     date = models.DateField()
+#     nr_A = models.PositiveIntegerField(default=0)
+#     in_agreement = models.ManyToManyField(Contributor,
+#                                           related_name='in_agreement_with_motion', blank=True)
+#     nr_N = models.PositiveIntegerField(default=0)
+#     in_notsure = models.ManyToManyField(Contributor,
+#                                         related_name='in_notsure_with_motion', blank=True)
+#     nr_D = models.PositiveIntegerField(default=0)
+#     in_disagreement = models.ManyToManyField(Contributor,
+#                                              related_name='in_disagreement_with_motion',
+#                                              blank=True)
+#     voting_deadline = models.DateTimeField('voting deadline', default=timezone.now)
+#     accepted = models.NullBooleanField()
+#
+#     def __str__(self):
+#         return self.motion[:32]
+#
+#     def as_li(self):
+#         html = ('<div class="Motion" id="motion_id{{ motion_id }}">'
+#                 '<h3><em>Motion {{ motion_id }}, put forward by {{ proposer }}</em></h3>'
+#                 '<h3>Background:</h3><p>{{ background|linebreaks }}</p>'
+#                 '<h3>Motion:</h3>'
+#                 '<div class="flex-container"><div class="flex-greybox">'
+#                 '<p style="background-color: #eeeeee;">{{ motion|linebreaks }}</p>'
+#                 '</div></div>'
+#                 '</div>')
+#         context = Context({
+#             'motion_id': self.id,
+#             'proposer': '%s %s' % (self.put_forward_by.user.first_name,
+#                                    self.put_forward_by.user.last_name),
+#             'background': self.background,
+#             'motion': self.motion, })
+#         template = Template(html)
+#         return template.render(context)
+#
+#     def votes_as_ul(self):
+#         template = Template('''
+#         <ul class="opinionsDisplay">
+#         <li style="background-color: #000099">Agree {{ nr_A }}</li>
+#         <li style="background-color: #555555">Abstain {{ nr_N }}</li>
+#         <li style="background-color: #990000">Disagree {{ nr_D }}</li>
+#         </ul>
+#         ''')
+#         context = Context({'nr_A': self.nr_A, 'nr_N': self.nr_N, 'nr_D': self.nr_D})
+#         return template.render(context)
+#
+#     def update_votes(self, contributor_id, vote):
+#         contributor = get_object_or_404(Contributor, pk=contributor_id)
+#         self.in_agreement.remove(contributor)
+#         self.in_notsure.remove(contributor)
+#         self.in_disagreement.remove(contributor)
+#         if vote == 'A':
+#             self.in_agreement.add(contributor)
+#         elif vote == 'N':
+#             self.in_notsure.add(contributor)
+#         elif vote == 'D':
+#             self.in_disagreement.add(contributor)
+#         self.nr_A = self.in_agreement.count()
+#         self.nr_N = self.in_notsure.count()
+#         self.nr_D = self.in_disagreement.count()
+#         self.save()
 
 
 #########
diff --git a/scipost/templates/scipost/index.html b/scipost/templates/scipost/index.html
index 8cf87d0cd..13a32d48d 100644
--- a/scipost/templates/scipost/index.html
+++ b/scipost/templates/scipost/index.html
@@ -9,7 +9,7 @@
         {% if latest_newsitems %}
         <div class="col-md-6 {% if user.is_authenticated %}col-lg-4{% else %}col-lg-3{% endif %}">
             <div class="panel">
-                <h1><a href="{% url 'scipost:news' %}">News</a><a style="float: right;" href="{% url 'scipost:feeds' %}"><img src="{% static 'scipost/images/feed-icon-14x14.png' %}" alt="Feed logo" width="14"></a></h1>
+                <h1><a href="{% url 'news:news' %}">News</a><a style="float: right;" href="{% url 'scipost:feeds' %}"><img src="{% static 'scipost/images/feed-icon-14x14.png' %}" alt="Feed logo" width="14"></a></h1>
                 <p>Latest news and announcements.</p>
                 {# <hr class="hr6"/>#}
                 <ul class="NewsItemsList">
diff --git a/scipost/urls.py b/scipost/urls.py
index e3b8c5731..1ed0f1b6a 100644
--- a/scipost/urls.py
+++ b/scipost/urls.py
@@ -17,7 +17,6 @@ urlpatterns = [
         name='acknowledgement'),
 
     ## Info
-    url(r'^news$', views.news, name='news'),
     url(r'^about$', TemplateView.as_view(template_name='scipost/about.html'), name='about'),
     url(r'^call$', TemplateView.as_view(template_name='scipost/call.html'), name='call'),
     url(r'^foundation$', TemplateView.as_view(template_name='scipost/foundation.html'),
diff --git a/scipost/views.py b/scipost/views.py
index 78635541d..496ceb09a 100644
--- a/scipost/views.py
+++ b/scipost/views.py
@@ -27,11 +27,10 @@ from guardian.shortcuts import assign_perm
 
 from .constants import SCIPOST_SUBJECT_AREAS
 from .models import Contributor, CitationNotification, UnavailabilityPeriod,\
-                    DraftInvitation, RegistrationInvitation, NewsItem,\
+                    DraftInvitation, RegistrationInvitation, Remark,\
                     List, Team, Graph, Node, Arc,\
                     title_dict, SciPost_from_addresses_dict,\
-                    AuthorshipClaim, SupportingPartner, SPBMembershipAgreement,\
-                    VGM, Feedback, Nomination, Remark, Motion, motion_categories_dict
+                    AuthorshipClaim, SupportingPartner, SPBMembershipAgreement
 from .forms import AuthenticationForm, DraftInvitationForm, UnavailabilityPeriodForm,\
                    RegistrationForm, RegistrationInvitationForm, AuthorshipClaimForm,\
                    ModifyPersonalMessageForm, SearchForm, VetRegistrationForm, reg_ref_dict,\
@@ -48,12 +47,15 @@ from commentaries.models import Commentary
 from commentaries.forms import CommentarySearchForm
 from comments.models import Comment
 from journals.models import Publication
+from news.models import NewsItem
 from submissions.models import SUBMISSION_STATUS_PUBLICLY_UNLISTED
 from submissions.models import Submission, EditorialAssignment
 from submissions.models import RefereeInvitation, Report, EICRecommendation
 from submissions.forms import SubmissionSearchForm
 from theses.models import ThesisLink
 from theses.forms import ThesisLinkSearchForm
+from virtualmeetings.models import VGM, Feedback, Nomination, Motion
+from virtualmeetings.constants import motion_categories_dict
 
 
 ##############
@@ -232,12 +234,6 @@ def base(request):
     return render(request, 'scipost/base.html')
 
 
-def news(request):
-    newsitems = NewsItem.objects.all().order_by('-date')
-    context = {'newsitems': newsitems}
-    return render(request, 'scipost/news.html', context)
-
-
 def feeds(request):
     context = {'subject_areas_physics': SCIPOST_SUBJECT_AREAS[0][1]}
     return render(request, 'scipost/feeds.html', context)
-- 
GitLab