diff --git a/.bootstraprc b/.bootstraprc index f02ac6f2dbbc5fcc9fdb13a3ae9119cf053e20a3..95797d1f5be8628d017643165dad241005c3f17a 100644 --- a/.bootstraprc +++ b/.bootstraprc @@ -10,6 +10,7 @@ "extractStyles": true, "styles": { "alert": true, + "card": true, "mixins": true, "normalize": true, "reboot": true, @@ -18,6 +19,7 @@ "buttons": true, "dropdown": true, "button-group": true, + "list-group": true, "input-group": true, "nav": true, "navbar": true, diff --git a/README.md b/README.md index 840f8eb6cf8a0ee49903a730e08ce4489d9b70dc..da09e066c26eea7bc0ad388464ef197014d84910 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ The complete scientific publication portal ## Dependencies -SciPost is written in Python 3.5 using Django and requires PostgreSQL 9.3 or +SciPost is written in Python 3.5 using Django and requires PostgreSQL 9.4 or higher. Python dependencies are listed in `requirements.txt`. Frontend dependencies are managed by [NPM](https://www.npmjs.com/) in package.json. ## Getting started @@ -29,7 +29,7 @@ Now install dependencies: ``` ### Frontend dependencies -[NPM](https://www.npmjs.com/) will take care of frontend dependencies. To install all packages now run: +[NPM](https://www.npmjs.com/) (version 4.0 or higher; tested on v4.1.2) will take care of frontend dependencies. To install all packages now run: ```shell (scipostenv) $ npm install diff --git a/SciPost_v1/urls.py b/SciPost_v1/urls.py index 11c640116c6bffe41466958b01638c47d83103c9..9de4150622f5359fb55acdd2d0c9da1378d37d9c 100644 --- a/SciPost_v1/urls.py +++ b/SciPost_v1/urls.py @@ -31,6 +31,7 @@ urlpatterns = [ url(r'^submission/', include('submissions.urls', namespace="submissions")), url(r'^theses/', include('theses.urls', namespace="theses")), url(r'^thesis/', include('theses.urls', namespace="theses")), + url(r'^meetings/', include('virtualmeetings.urls', namespace="virtualmeetings")), url(r'^news/', include('news.urls', namespace="news")), ] diff --git a/scipost/admin.py b/scipost/admin.py index ccb5be7f2600f04a7c149736635d12225bef97aa..c59e7aebfd7a5b43a50053c578e40a3497045370 100644 --- a/scipost/admin.py +++ b/scipost/admin.py @@ -3,13 +3,12 @@ from django.contrib import admin from django.contrib.auth.admin import UserAdmin from django.contrib.auth.models import User, Permission -from guardian.admin import GuardedModelAdmin - -from scipost.models import Contributor, Remark, List,\ - DraftInvitation, Node, Arc, Graph, Team, AffiliationObject,\ +from scipost.models import Contributor, Remark,\ + DraftInvitation,\ + AffiliationObject,\ SupportingPartner, SPBMembershipAgreement, RegistrationInvitation,\ - AuthorshipClaim, PrecookedEmail -from virtualmeetings.models import VGM, Feedback, Nomination, Motion + AuthorshipClaim, PrecookedEmail,\ + EditorialCollege, EditorialCollegeMember class ContributorInline(admin.StackedInline): @@ -27,34 +26,6 @@ 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 RemarkAdmin(admin.ModelAdmin): search_fields = ['contributor', 'remark'] @@ -87,33 +58,6 @@ class PrecookedEmailAdmin(admin.ModelAdmin): admin.site.register(PrecookedEmail, PrecookedEmailAdmin) -class ListAdmin(GuardedModelAdmin): - search_fields = ['owner', 'title'] - - -admin.site.register(List, ListAdmin) -admin.site.register(Team) - - -class NodeInline(admin.StackedInline): - model = Node - - -class ArcInline(admin.StackedInline): - model = Arc - - -class GraphAdmin(GuardedModelAdmin): - inlines = [ - NodeInline, - ArcInline, - ] - search_fields = ['owner___user__last_name', 'title'] - - -admin.site.register(Graph, GraphAdmin) - - class AffiliationObjectAdmin(admin.ModelAdmin): search_fields = ['country', 'institution', 'subunit'] @@ -134,3 +78,17 @@ class SupportingPartnerAdmin(admin.ModelAdmin): admin.site.register(SupportingPartner, SupportingPartnerAdmin) + + +class EditorialCollegeAdmin(admin.ModelAdmin): + search_fields = ['discipline', 'member'] + + +admin.site.register(EditorialCollege, EditorialCollegeAdmin) + + +class EditorialCollegeMemberAdmin(admin.ModelAdmin): + search_fields = ['name', 'subtitle', 'discipline'] + + +admin.site.register(EditorialCollegeMember, EditorialCollegeMemberAdmin) diff --git a/scipost/db/constants_migration_0043.py b/scipost/db/constants_migration_0043.py new file mode 100644 index 0000000000000000000000000000000000000000..deeea736aa2e6bd5cf8bc87c293bb76fabddb815 --- /dev/null +++ b/scipost/db/constants_migration_0043.py @@ -0,0 +1,49 @@ +collegeMembers = ( + {'name': 'Sabine Andergassen', 'title': 'Prof.', 'link': 'https://www.uni-tuebingen.de/en/faculties/faculty-of-science/departments/physics/institutes/institute-for-theoretical-physics/research-groups/andergassen-group.html', 'subtitle': 'Tübingen'}, + {'name': 'Fakher Assaad', 'title': 'Prof.', 'link': 'http://www.physik.uni-wuerzburg.de/~assaad/', 'subtitle': 'Würzbrug'}, + {'name': 'Claudio Attaccalite', 'title': 'Dr', 'link': 'http://www.attaccalite.com', 'subtitle': 'Marseille'}, + {'name': 'Denis Bartolo', 'title': 'Prof.', 'link': 'https://denis114.wordpress.com', 'subtitle': 'ENS Lyon'}, + {'name': 'Laura Baudis', 'title': 'Prof.', 'link': 'http://www.physik.unizh.ch/~lbaudis/index.html', 'subtitle': 'Zurich'}, + {'title': 'Prof.', 'link': 'http://www.lorentz.leidenuniv.nl/beenakker/', 'subtitle': 'Leiden', 'name': 'Carlo Beenakker'}, + {'title': 'Prof.', 'link': 'https://www.coulomb.univ-montp2.fr/perso/ludovic.berthier/', 'subtitle': 'Montpellier', 'name': 'Ludovic Berthier'}, + {'title': 'Prof.', 'link': 'http://ipht.cea.fr/Pisp/giulio.biroli/index_en.php', 'subtitle': 'CEA Saclay', 'name': 'Giulio Biroli'}, + {'title': 'Prof.', 'link': 'http://www.en.physik.uni-muenchen.de/personen/professoren/bloch/index.html', 'subtitle': 'LMU Munich', 'name': 'Immanuel Bloch'}, + {'title': 'Prof.', 'link': 'https://staff.fnwi.uva.nl/j.deboer/', 'subtitle': 'U. van Amsterdam', 'name': 'Jan de Boer'}, + {'title': 'Prof.', 'link': 'http://www.uva.nl/en/about-the-uva/organisation/staff-members/content/b/o/d.bonn/d.bonn.html', 'subtitle': 'U. van Amsterdam', 'name': 'Daniel Bonn'}, + {'title': 'Prof.', 'link': 'http://www.statphys.sissa.it/wordpress/?page_id=1731', 'subtitle': 'SISSA', 'name': 'Pasquale Calabrese'}, + {'title': 'Prof.', 'link': 'http://personalpages.to.infn.it/~caselle/index_en.html', 'subtitle': 'Torino', 'name': 'Michele Caselle'}, + {'title': 'Prof.', 'link': 'http://www.saha.ac.in/cmp/bikask.chakrabarti/bikas.html', 'subtitle': 'Kolkata', 'name': 'Bikas Chakrabarti'}, + {'title': 'Prof.', 'link': 'http://www.tcm.phy.cam.ac.uk/~nrc25/', 'subtitle': 'Cambridge', 'name': 'Nigel Cooper'}, + {'title': 'Prof.', 'link': 'http://physics.cornell.edu/csaba-csaki', 'subtitle': 'Cornell', 'name': 'Csaba Csaki'}, + {'title': 'Prof.', 'link': 'http://theory.tifr.res.in/~kedar/', 'subtitle': 'TIFR Mumbai', 'name': 'Kedar Damle'}, + {'title': 'Prof.', 'link': 'http://researchers.uq.edu.au/researcher/1134', 'subtitle': 'U. of Queensland', 'name': 'Matthew Davis'}, + {'title': 'Prof.', 'link': 'http://www-thphys.physics.ox.ac.uk/people/FabianEssler/', 'subtitle': 'U. of Oxford', 'name': 'Fabian Essler'}, + {'title': 'Prof.', 'link': 'http://www.pd.infn.it/~feruglio/', 'subtitle': 'Padova, INFN', 'name': 'Ferruccio Feruglio'}, + {'title': 'Prof.', 'link': 'http://www.ms.unimelb.edu.au/~jdgier@unimelb/', 'subtitle': 'U. of Melbourne', 'name': 'Jan de Gier'}, + {'title': 'Prof.', 'link': 'http://www.desy.de/about_desy/leading_scientists/beate_heinemann/index_eng.html', 'subtitle': 'DESY; Freiburg', 'name': 'Beate Heinemann'}, + {'title': 'Prof.', 'link': 'http://katzgraber.org', 'subtitle': 'Texas A&M', 'name': 'Helmut Katzgraber'}, + {'title': 'Prof.', 'link': 'https://web.physik.rwth-aachen.de/~mkraemer/', 'subtitle': 'RWTH Aachen', 'name': 'Michael Krämer'}, + {'title': 'Prof.', 'link': 'https://www.pmmh.espci.fr/~jorge/', 'subtitle': 'PMMH Paris, CNRS', 'name': 'Jorge Kurchan'}, + {'title': 'Prof.', 'link': 'https://vivo.brown.edu/display/glandsbe', 'subtitle': 'Brown Univ.', 'name': 'Greg Landsberg'}, + {'title': 'Prof.', 'link': 'https://www.mpg.de/6812374/chem_physik_fester_stoffe_mackenzie', 'subtitle': 'MPICPS Dresden, St-Andrews', 'name': 'Andrew P. MacKenzie'}, + {'title': 'Prof.', 'link': 'http://www.ens-lyon.fr/PHYSIQUE/presentation/annuaire/maillet-jean-michel', 'subtitle': 'ENS Lyon', 'name': 'Jean Michel Maillet'}, + {'title': 'Prof.', 'link': 'https://www.mpg.de/343435/physik_komplexer_systeme_wissM28', 'subtitle': 'MPIPKS Dresden', 'name': 'Roderich Moessner'}, + {'title': 'Prof.', 'link': 'https://www.uibk.ac.at/exphys/ultracold/people/christoph.naegerl/', 'subtitle': 'Innsbruck', 'name': 'Hanns-Christoph Nägerl'}, + {'title': 'Prof.', 'link': 'http://www.physics.miami.edu/~nepomechie/', 'subtitle': 'U. of Miami', 'name': 'Rafael Nepomechie'}, + {'title': 'Prof.', 'link': 'https://staff.fnwi.uva.nl/b.nienhuis/', 'subtitle': 'U. van Amsterdam', 'name': 'Bernard Nienhuis'}, + {'title': 'Prof.', 'link': 'http://www.lpthe.jussieu.fr/~pioline/', 'subtitle': 'LPTHE Jussieu', 'name': 'Boris Pioline'}, + {'title': 'Prof.', 'link': 'https://www.uu.nl/staff/RHHGvanRoij/0', 'subtitle': 'Utrecht', 'name': 'René van Roij'}, + {'title': 'Prof.', 'link': 'http://www.thp.uni-koeln.de/rosch', 'subtitle': 'U. of Cologne', 'name': 'Achim Rosch'}, + {'title': 'Prof.', 'link': 'http://saleur.sandvox.net', 'subtitle': 'CEA Saclay/USC', 'name': 'Hubert Saleur'}, + {'title': 'Prof.', 'link': 'http://www.phy.ohiou.edu/people/faculty/sandler.html', 'subtitle': 'Ohio', 'name': 'Nancy Sandler'}, + {'title': 'Dr.', 'link': 'http://www.sussex.ac.uk/profiles/320359', 'subtitle': 'Sussex', 'name': 'Veronica Sanz'}, + {'title': 'Prof.', 'link': 'http://www-thphys.physics.ox.ac.uk/people/SubirSarkar/', 'subtitle': 'Oxford; Niels Bohr Institute', 'name': 'Subir Sarkar'}, + {'title': 'Prof.', 'link': 'https://staff.fnwi.uva.nl/c.j.m.schoutens/', 'subtitle': 'U. van Amsterdam', 'name': 'Kareljan Schoutens'}, + {'title': 'Dr', 'link': 'http://www.phys.ens.fr/~guilhem/', 'subtitle': 'ENS Paris', 'name': 'Guilhem Semerjian'}, + {'title': 'Prof.', 'link': 'http://www-thphys.physics.ox.ac.uk/people/SteveSimon/', 'subtitle': 'U. of Oxford', 'name': 'Steve Simon'}, + {'title': 'Prof.', 'link': 'http://bec.science.unitn.it/infm-bec/people/stringari.html', 'subtitle': 'Trento', 'name': 'Sandro Stringari'}, + {'title': 'Prof.', 'link': 'http://www.damtp.cam.ac.uk/user/tong/', 'subtitle': 'Cambridge', 'name': 'David Tong'}, + {'title': 'Prof.', 'link': 'http://www.physique.usherbrooke.ca/pages/en/node/3412', 'subtitle': 'Sherbrooke', 'name': 'André-Marie Tremblay'}, + {'title': 'Prof.', 'link': 'http://trivediresearch.org.ohio-state.edu', 'subtitle': 'Ohio State U.', 'name': 'Nandini Trivedi'}, + {'title': 'Prof.', 'link': 'http://vergassolalab.ucsd.edu', 'subtitle': 'UC Sand Diego', 'name': 'Massimo Vergassola'}, +) diff --git a/scipost/factories.py b/scipost/factories.py index e32c408deb837497d49cfbffff1e8e8c49b76b23..8a747b60bc4112ba7df013156173ed3d36285e60 100644 --- a/scipost/factories.py +++ b/scipost/factories.py @@ -1,9 +1,10 @@ import factory +import random from django.contrib.auth import get_user_model from django.contrib.auth.models import Group -from .models import Contributor +from .models import Contributor, EditorialCollege, EditorialCollegeMember class ContributorFactory(factory.django.DjangoModelFactory): @@ -48,3 +49,22 @@ class UserFactory(factory.django.DjangoModelFactory): self.groups.add(group) else: self.groups.add(Group.objects.get(name="Registered Contributors")) + + +class EditorialCollegeFactory(factory.django.DjangoModelFactory): + class Meta: + model = EditorialCollege + django_get_or_create = ('discipline', ) + + discipline = random.choice(['Physics', 'Chemistry', 'Medicine']) + + +class EditorialCollegeMemberFactory(factory.django.DjangoModelFactory): + class Meta: + model = EditorialCollegeMember + + title = factory.Faker('prefix') + name = factory.Faker('name') + link = factory.Faker('url') + subtitle = factory.Faker('company') + college = factory.Iterator(EditorialCollege.objects.all()) diff --git a/scipost/forms.py b/scipost/forms.py index b1fb349c3b77db8289ca530b3eb26ea3b02409e3..3a85ac22032944518aae6cb8a7230eee68005bb9 100644 --- a/scipost/forms.py +++ b/scipost/forms.py @@ -1,7 +1,6 @@ from django import forms from django.contrib.auth.models import User, Group -from django.db.models import Q from django_countries import countries from django_countries.widgets import CountrySelectWidget @@ -12,11 +11,10 @@ from crispy_forms.helper import FormHelper from crispy_forms.layout import Layout, Div, Field, HTML, Submit from .constants import SCIPOST_DISCIPLINES, SCIPOST_SUBJECT_AREAS -from .models import TITLE_CHOICES, SCIPOST_FROM_ADDRESSES, ARC_LENGTHS,\ - Contributor, DraftInvitation, RegistrationInvitation,\ - SupportingPartner, SPBMembershipAgreement,\ - UnavailabilityPeriod, PrecookedEmail,\ - List, Team, Graph, Node +from .models import TITLE_CHOICES, SCIPOST_FROM_ADDRESSES,\ + Contributor, DraftInvitation, RegistrationInvitation,\ + SupportingPartner, SPBMembershipAgreement,\ + UnavailabilityPeriod, PrecookedEmail from virtualmeetings.models import Feedback, Nomination, Motion from journals.models import Publication @@ -260,80 +258,6 @@ class SendPrecookedEmailForm(forms.Form): from_address = forms.ChoiceField(choices=SCIPOST_FROM_ADDRESSES) -class CreateListForm(forms.ModelForm): - class Meta: - model = List - fields = ['title', 'description', 'private'] - - def __init__(self, *args, **kwargs): - super(CreateListForm, self).__init__(*args, **kwargs) - self.fields['title'].widget.attrs.update( - {'size': 30, 'placeholder': 'Descriptive title for the new List'}) - self.fields['private'].widget.attrs.update({'placeholder': 'Private?'}) - - -class CreateTeamForm(forms.ModelForm): - class Meta: - model = Team - fields = ['name'] - - def __init__(self, *args, **kwargs): - super(CreateTeamForm, self).__init__(*args, **kwargs) - self.fields['name'].widget.attrs.update( - {'size': 30, 'placeholder': 'Descriptive name for the new Team'}) - - -class AddTeamMemberForm(forms.Form): - def __init__(self, *args, **kwargs): - super(AddTeamMemberForm, self).__init__(*args, **kwargs) - self.fields['last_name'].widget.attrs.update( - {'size': 20, 'placeholder': 'Search in contributors database'}) - - last_name = forms.CharField() - - -class CreateGraphForm(forms.ModelForm): - class Meta: - model = Graph - fields = ['title', 'description', 'private'] - - def __init__(self, *args, **kwargs): - super(CreateGraphForm, self).__init__(*args, **kwargs) - self.fields['title'].widget.attrs.update( - {'size': 30, 'placeholder': 'Descriptive title for the new Graph'}) - self.fields['description'].widget.attrs.update({'placeholder': 'Detailed description'}) - - -class ManageTeamsForm(forms.Form): - teams_with_access = forms.ModelMultipleChoiceField(queryset=None) - - def __init__(self, *args, **kwargs): - contributor = kwargs.pop('contributor') - super(ManageTeamsForm, self).__init__(*args, **kwargs) - self.fields['teams_with_access'].queryset = Team.objects.filter( - Q(leader=contributor) | Q(members__in=[contributor])) - self.fields['teams_with_access'].widget.attrs.update( - {'placeholder': 'Team(s) to be given access rights:'}) - - -class CreateNodeForm(forms.ModelForm): - class Meta: - model = Node - fields = ['name', 'description'] - - -class CreateArcForm(forms.Form): - source = forms.ModelChoiceField(queryset=None) - target = forms.ModelChoiceField(queryset=None) - length = forms.ChoiceField(choices=ARC_LENGTHS) - - def __init__(self, *args, **kwargs): - graph = kwargs.pop('graph') - super(CreateArcForm, self).__init__(*args, **kwargs) - self.fields['source'].queryset = Node.objects.filter(graph=graph) - self.fields['target'].queryset = Node.objects.filter(graph=graph) - - ############################# # Supporting Partners Board # ############################# @@ -392,59 +316,59 @@ class SPBMembershipForm(forms.ModelForm): css_class="row"), ) - -################# -# VGMs, Motions # -################# - -class FeedbackForm(forms.ModelForm): - class Meta: - model = Feedback - fields = ['feedback'] - - -class NominationForm(forms.ModelForm): - class Meta: - model = Nomination - fields = ['first_name', 'last_name', - 'discipline', 'expertises', 'webpage'] - - def __init__(self, *args, **kwargs): - super(NominationForm, self).__init__(*args, **kwargs) - self.fields['expertises'].widget = forms.SelectMultiple(choices=SCIPOST_SUBJECT_AREAS) - - -class MotionForm(forms.ModelForm): - class Meta: - model = Motion - fields = ['category', 'background', 'motion'] - - def __init__(self, *args, **kwargs): - super(MotionForm, self).__init__(*args, **kwargs) - self.fields['background'].label = '' - self.fields['background'].widget.attrs.update( - {'rows': 8, 'cols': 100, - 'placeholder': 'Provide useful background information on your Motion.'}) - self.fields['motion'].label = '' - self.fields['motion'].widget.attrs.update( - {'rows': 8, 'cols': 100, - 'placeholder': 'Phrase your Motion as clearly and succinctly as possible.'}) - self.helper = FormHelper() - self.helper.layout = Layout( - Field('category'), - Div( - Div(HTML('<p>Background:</p>'), - css_class="col-2"), - Div( - Field('background'), - css_class="col-10"), - css_class="row"), - Div( - Div(HTML('<p>Motion:</p>'), - css_class="col-2"), - Div( - Field('motion'), - css_class="col-10"), - css_class="row"), - Submit('submit', 'Submit'), - ) +# +# ################# +# # VGMs, Motions # +# ################# +# +# class FeedbackForm(forms.ModelForm): +# class Meta: +# model = Feedback +# fields = ['feedback'] +# +# +# class NominationForm(forms.ModelForm): +# class Meta: +# model = Nomination +# fields = ['first_name', 'last_name', +# 'discipline', 'expertises', 'webpage'] +# +# def __init__(self, *args, **kwargs): +# super(NominationForm, self).__init__(*args, **kwargs) +# self.fields['expertises'].widget = forms.SelectMultiple(choices=SCIPOST_SUBJECT_AREAS) +# +# +# class MotionForm(forms.ModelForm): +# class Meta: +# model = Motion +# fields = ['category', 'background', 'motion'] +# +# def __init__(self, *args, **kwargs): +# super(MotionForm, self).__init__(*args, **kwargs) +# self.fields['background'].label = '' +# self.fields['background'].widget.attrs.update( +# {'rows': 8, 'cols': 100, +# 'placeholder': 'Provide useful background information on your Motion.'}) +# self.fields['motion'].label = '' +# self.fields['motion'].widget.attrs.update( +# {'rows': 8, 'cols': 100, +# 'placeholder': 'Phrase your Motion as clearly and succinctly as possible.'}) +# self.helper = FormHelper() +# self.helper.layout = Layout( +# Field('category'), +# Div( +# Div(HTML('<p>Background:</p>'), +# css_class="col-2"), +# Div( +# Field('background'), +# css_class="col-10"), +# css_class="row"), +# Div( +# Div(HTML('<p>Motion:</p>'), +# css_class="col-2"), +# Div( +# Field('motion'), +# css_class="col-10"), +# css_class="row"), +# Submit('submit', 'Submit'), +# ) diff --git a/scipost/management/commands/populate_db.py b/scipost/management/commands/populate_db.py index 26e2d1a3ac72011e41781b943cedfd7e015b137d..ae0f171dc7c06a291340290217697f787fc1aa61 100644 --- a/scipost/management/commands/populate_db.py +++ b/scipost/management/commands/populate_db.py @@ -1,20 +1,17 @@ from django.core.management.base import BaseCommand -from django.contrib.auth.models import User -from ...models import Contributor +from ...factories import EditorialCollegeFactory, EditorialCollegeMemberFactory class Command(BaseCommand): - def add_arguments(self, parser): - parser.add_argument( - '--username', type=str, required=True, - help='Username of user to use for contributor model') + def create_editorial_college(self): + EditorialCollegeFactory.create_batch(5) + self.stdout.write(self.style.SUCCESS('Successfully created Editorial College\'s.')) - def create_contributor(self, username): - user = User.objects.get(username=username) - contributor = Contributor(user=user, status=1, title="MR") - contributor.vetted_by = contributor - contributor.save() + def create_editorial_college_members(self): + EditorialCollegeMemberFactory.create_batch(20) + self.stdout.write(self.style.SUCCESS('Successfully created Editorial College Members.')) - def handle(self, *args, **options): - self.create_contributor(options['username']) + def handle(self, *args, **kwargs): + self.create_editorial_college() + self.create_editorial_college_members() diff --git a/scipost/management/commands/setup_contributor.py b/scipost/management/commands/setup_contributor.py new file mode 100644 index 0000000000000000000000000000000000000000..26e2d1a3ac72011e41781b943cedfd7e015b137d --- /dev/null +++ b/scipost/management/commands/setup_contributor.py @@ -0,0 +1,20 @@ +from django.core.management.base import BaseCommand +from django.contrib.auth.models import User + +from ...models import Contributor + + +class Command(BaseCommand): + def add_arguments(self, parser): + parser.add_argument( + '--username', type=str, required=True, + help='Username of user to use for contributor model') + + def create_contributor(self, username): + user = User.objects.get(username=username) + contributor = Contributor(user=user, status=1, title="MR") + contributor.vetted_by = contributor + contributor.save() + + def handle(self, *args, **options): + self.create_contributor(options['username']) diff --git a/scipost/migrations/0040_auto_20170317_1659.py b/scipost/migrations/0040_auto_20170317_1659.py new file mode 100644 index 0000000000000000000000000000000000000000..69ce2c10f3d5e8411bc1311db64e802bd9a5b399 --- /dev/null +++ b/scipost/migrations/0040_auto_20170317_1659.py @@ -0,0 +1,106 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.3 on 2017-03-17 15:59 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('scipost', '0039_auto_20170306_0804'), + ] + + operations = [ + migrations.RemoveField( + model_name='arc', + name='added_by', + ), + migrations.RemoveField( + model_name='arc', + name='graph', + ), + migrations.RemoveField( + model_name='arc', + name='source', + ), + migrations.RemoveField( + model_name='arc', + name='target', + ), + migrations.RemoveField( + model_name='graph', + name='owner', + ), + migrations.RemoveField( + model_name='graph', + name='teams_with_access', + ), + migrations.RemoveField( + model_name='list', + name='commentaries', + ), + migrations.RemoveField( + model_name='list', + name='comments', + ), + migrations.RemoveField( + model_name='list', + name='owner', + ), + migrations.RemoveField( + model_name='list', + name='submissions', + ), + migrations.RemoveField( + model_name='list', + name='teams_with_access', + ), + migrations.RemoveField( + model_name='list', + name='thesislinks', + ), + migrations.RemoveField( + model_name='node', + name='added_by', + ), + migrations.RemoveField( + model_name='node', + name='commentaries', + ), + migrations.RemoveField( + model_name='node', + name='graph', + ), + migrations.RemoveField( + model_name='node', + name='submissions', + ), + migrations.RemoveField( + model_name='node', + name='thesislinks', + ), + migrations.RemoveField( + model_name='team', + name='leader', + ), + migrations.RemoveField( + model_name='team', + name='members', + ), + migrations.DeleteModel( + name='Arc', + ), + migrations.DeleteModel( + name='Graph', + ), + migrations.DeleteModel( + name='List', + ), + migrations.DeleteModel( + name='Node', + ), + migrations.DeleteModel( + name='Team', + ), + ] diff --git a/scipost/migrations/0041_editorialcollege_editorialcollegemember.py b/scipost/migrations/0041_editorialcollege_editorialcollegemember.py new file mode 100644 index 0000000000000000000000000000000000000000..8fd915aa3ac27a8311554631bbfb25a306338886 --- /dev/null +++ b/scipost/migrations/0041_editorialcollege_editorialcollegemember.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.3 on 2017-03-18 20:08 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + +class Migration(migrations.Migration): + + dependencies = [ + ('scipost', '0040_auto_20170317_1659'), + ] + + operations = [ + migrations.CreateModel( + name='EditorialCollege', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('discipline', models.CharField(max_length=255)), + ], + ), + migrations.CreateModel( + name='EditorialCollegeMember', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255)), + ('title', models.CharField(blank=True, max_length=10)), + ('link', models.URLField(blank=True)), + ('subtitle', models.CharField(blank=True, max_length=255)), + ('discipline', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='member', to='scipost.EditorialCollege')), + ], + ), + ] diff --git a/scipost/migrations/0042_auto_20170318_2119.py b/scipost/migrations/0042_auto_20170318_2119.py new file mode 100644 index 0000000000000000000000000000000000000000..faa0e56370414289d2a3988a3c3e166c5c2131d1 --- /dev/null +++ b/scipost/migrations/0042_auto_20170318_2119.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.3 on 2017-03-18 20:19 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('scipost', '0041_editorialcollege_editorialcollegemember'), + ] + + operations = [ + migrations.AlterField( + model_name='editorialcollege', + name='discipline', + field=models.CharField(max_length=255, unique=True), + ), + ] diff --git a/scipost/migrations/0043_auto_20170318_2237.py b/scipost/migrations/0043_auto_20170318_2237.py new file mode 100644 index 0000000000000000000000000000000000000000..e8bcfa55845b746bc3b616fc4418fc75af9aed1f --- /dev/null +++ b/scipost/migrations/0043_auto_20170318_2237.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.3 on 2017-03-18 21:37 +from __future__ import unicode_literals + +from django.db import migrations + +from ..db.constants_migration_0043 import collegeMembers + + +def fill_editorial_college(apps, schema_editor): + EditorialCollege = apps.get_model('scipost', 'EditorialCollege') + EditorialMember = apps.get_model('scipost', 'EditorialCollegeMember') + college, new = EditorialCollege.objects.get_or_create(discipline='Physics') + for member in collegeMembers: + EditorialMember.objects.get_or_create(discipline=college, **member) + + +class Migration(migrations.Migration): + + dependencies = [ + ('scipost', '0042_auto_20170318_2119'), + ] + + operations = [ + migrations.RunPython(fill_editorial_college), + ] diff --git a/scipost/migrations/0044_auto_20170319_0940.py b/scipost/migrations/0044_auto_20170319_0940.py new file mode 100644 index 0000000000000000000000000000000000000000..6a7dae3567634825d7841eb7b8ec774a27eafa1b --- /dev/null +++ b/scipost/migrations/0044_auto_20170319_0940.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.3 on 2017-03-19 08:40 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('scipost', '0043_auto_20170318_2237'), + ] + + operations = [ + migrations.RenameField( + model_name='editorialcollegemember', + old_name='discipline', + new_name='college', + ), + ] diff --git a/scipost/models.py b/scipost/models.py index 119cd4ca97bba8bcb05694673499dc7ba9965a07..fcec39e5f0185cabdfaa401d04f9baca13809ead 100644 --- a/scipost/models.py +++ b/scipost/models.py @@ -4,7 +4,6 @@ from django import forms from django.contrib.auth.models import User from django.contrib.postgres.fields import ArrayField from django.db import models -from django.shortcuts import get_object_or_404 from django.template import Template, Context from django.utils import timezone from django.utils.safestring import mark_safe @@ -428,233 +427,6 @@ class PrecookedEmail(models.Model): return self.email_subject -######### -# Lists # -######### - -class List(models.Model): - """ - A collection of commentaries, submissions, thesislinks, comments, etc - defined by a Contributor, for use in Graphs, etc - """ - owner = models.ForeignKey(Contributor, on_delete=models.CASCADE) - private = models.BooleanField(default=True) - teams_with_access = models.ManyToManyField('scipost.Team', blank=True) - title = models.CharField(max_length=100) - description = models.TextField(blank=True, null=True) - created = models.DateTimeField(default=timezone.now) - submissions = models.ManyToManyField('submissions.Submission', blank=True, - related_name='list_submissions') - commentaries = models.ManyToManyField('commentaries.Commentary', blank=True, - related_name='list_commentaries') - thesislinks = models.ManyToManyField('theses.ThesisLink', blank=True, - related_name='list_thesislinks') - comments = models.ManyToManyField('comments.Comment', blank=True, - related_name='list_comments') - - class Meta: - default_permissions = ['add', 'view', 'change', 'delete'] - - def __str__(self): - return '%s (owner: %s %s)' % (self.title[:30], - self.owner.user.first_name, self.owner.user.last_name) - - def header(self): - context = Context({'id': self.id, 'title': self.title, - 'first_name': self.owner.user.first_name, - 'last_name': self.owner.user.last_name}) - template = Template(''' - <p>List <a href="{% url 'scipost:list' list_id=id %}">{{ title }} - </a> (owner: {{ first_name }} {{ last_name }})</p> - ''') - return template.render(context) - - def header_as_li(self): - context = Context({'id': self.id, 'title': self.title, - 'first_name': self.owner.user.first_name, - 'last_name': self.owner.user.last_name}) - template = Template(''' - <li><p>List <a href="{% url 'scipost:list' list_id=id %}"> - {{ title }}</a> (owner: {{ first_name }} {{ last_name }})</p></li> - ''') - return template.render(context) - - def contents(self): - context = Context({}) - output = '<p>' + self.description + '</p>' - output += '<hr class="hr6"/>' - emptylist = True - if self.submissions.exists(): - emptylist = False - output += '<p>Submissions:<ul>' - for submission in self.submissions.all(): - output += submission.simple_header_as_li() - output += '</ul></p>' - if self.commentaries.exists(): - emptylist = False - output += '<p>Commentaries:<ul>' - for commentary in self.commentaries.all(): - output += commentary.simple_header_as_li() - output += '</ul></p>' - if self.thesislinks.exists(): - emptylist = False - output += '<p>Thesislinks:<ul>' - for thesislink in self.thesislinks.all(): - output += thesislink.simple_header_as_li() - output += '</ul></p>' - if self.comments.exists(): - emptylist = False - output += '<p>Comments:<ul>' - for comment in self.comments.all(): - output += comment.simple_header_as_li() - output += '</ul></p>' - if emptylist: - output += '<br/><h3>This List is empty.</h3>' - template = Template(output) - return template.render(context) - - -######### -# Teams # -######### - -class Team(models.Model): - """ - Team of Contributors, to enable private collaborations. - """ - leader = models.ForeignKey(Contributor, on_delete=models.CASCADE) - members = models.ManyToManyField(Contributor, blank=True, related_name='team_members') - name = models.CharField(max_length=100) - established = models.DateField(default=timezone.now) - - class Meta: - default_permissions = ['add', 'view', 'change', 'delete'] - - def __str__(self): - return (self.name + ' (led by ' + self.leader.user.first_name + ' ' - + self.leader.user.last_name + ')') - - def header_as_li(self): - context = Context({'name': self.name, }) - output = ('<li><p>Team {{ name }}, led by ' + self.leader.user.first_name + ' ' - + self.leader.user.last_name + '</p>') - output += '<p>Members: ' - if not self.members.all(): - output += '(none yet, except for the leader)' - else: - for member in self.members.all(): - output += member.user.first_name + ' ' + member.user.last_name + ', ' - output += '</p></li>' - template = Template(output) - return template.render(context) - - -########## -# Graphs # -########## - -class Graph(models.Model): - """ - A Graph is a collection of Nodes with directed arrows, - representing e.g. a reading list, exploration path, etc. - If private, only the teams in teams_with_access can see/edit it. - """ - owner = models.ForeignKey(Contributor, on_delete=models.CASCADE) - private = models.BooleanField(default=True) - teams_with_access = models.ManyToManyField(Team, blank=True) - title = models.CharField(max_length=100) - description = models.TextField(blank=True, null=True) - created = models.DateTimeField(default=timezone.now) - - class Meta: - default_permissions = ['add', 'view', 'change', 'delete'] - - def __str__(self): - return '%s (owner: %s %s)' % (self.title[:30], - self.owner.user.first_name, self.owner.user.last_name) - - def header_as_li(self): - context = Context({'id': self.id, 'title': self.title, - 'first_name': self.owner.user.first_name, - 'last_name': self.owner.user.last_name}) - template = Template(''' - <li><p>Graph <a href="{% url 'scipost:graph' graph_id=id %}"> - {{ title }}</a> (owner: {{ first_name }} {{ last_name }})</li> - ''') - return template.render(context) - - def contents(self): - context = Context({}) - output = self.description - template = Template(output) - return template.render(context) - - -class Node(models.Model): - """ - Node of a graph (directed). - Each node is composed of a set of submissions, commentaries, thesislinks. - Accessibility rights are set in the Graph ForeignKey. - """ - graph = models.ForeignKey(Graph, on_delete=models.CASCADE, default=None) - added_by = models.ForeignKey(Contributor, on_delete=models.CASCADE, default=None) - created = models.DateTimeField(default=timezone.now) - name = models.CharField(max_length=100) - description = models.TextField(blank=True, null=True) - submissions = models.ManyToManyField('submissions.Submission', blank=True, - related_name='node_submissions') - commentaries = models.ManyToManyField('commentaries.Commentary', blank=True, - related_name='node_commentaries') - thesislinks = models.ManyToManyField('theses.ThesisLink', blank=True, - related_name='node_thesislinks') - - class Meta: - default_permissions = ['add', 'view', 'change', 'delete'] - - def __str__(self): - return self.graph.title[:20] + ': ' + self.name[:20] - - def header_as_p(self): - context = Context({'graph_id': self.graph.id, 'id': self.id, 'name': self.name}) - output = ('<p class="node_p" id="node_id{{ id }}">' - '<a href="{% url \'scipost:graph\' graph_id=graph_id %}">{{ name }}</a></p>') - template = Template(output) - return template.render(context) - - def contents(self): - context = Context({'graph_id': self.graph.id, - 'id': self.id, 'name': self.name, - 'description': self.description}) - output = ('<div class="node_contents node_id{{ id }}">' - + '<h3>{{ name }}</h3><p>{{ description }}</p></div>') - template = Template(output) - return template.render(context) - - def contents_small(self): - output = '<div style="font-size: 60%">' + self.contents + '</div>' - template = Template(output) - return template.render() - - -ARC_LENGTHS = [ - # (4, '4'), (8, '8'), (16, '16'), (32, '32'), (64, '64'), (128, '128') - (1, '1'), (2, '2'), (3, '3'), (4, '4'), (5, '5'), (6, '6'), (7, '7'), (8, '8'), - ] - - -class Arc(models.Model): - """ - Arc of a graph, linking two nodes. - The length is user-adjustable. - """ - graph = models.ForeignKey(Graph, on_delete=models.CASCADE, default=None) - added_by = models.ForeignKey(Contributor, on_delete=models.CASCADE, default=None) - created = models.DateTimeField(default=timezone.now) - source = models.ForeignKey(Node, on_delete=models.CASCADE, related_name='source') - target = models.ForeignKey(Node, on_delete=models.CASCADE, related_name='target') - length = models.PositiveSmallIntegerField(choices=ARC_LENGTHS, default=32) - - ####################### # Affiliation Objects # ####################### @@ -739,3 +511,30 @@ class SPBMembershipAgreement(models.Model): return (str(self.partner) + ' [' + spb_membership_duration_dict[self.duration] + ' from ' + self.start_date.strftime('%Y-%m-%d') + ']') + + +###################### +# Static info models # +###################### + +class EditorialCollege(models.Model): + '''A SciPost Editorial College for a specific discipline.''' + discipline = models.CharField(max_length=255, unique=True) + + def __str__(self): + return self.discipline + + +class EditorialCollegeMember(models.Model): + """ + Editorial College Members for non-functional use! + This model is used for static information purposes only. + """ + name = models.CharField(max_length=255) + title = models.CharField(max_length=10, blank=True) + link = models.URLField(blank=True) + subtitle = models.CharField(max_length=255, blank=True) + college = models.ForeignKey('scipost.EditorialCollege', related_name='member') + + def __str__(self): + return ('%s %s' % (self.title, self.name)).strip() diff --git a/scipost/templates/scipost/VGMs.html b/scipost/templates/scipost/VGMs.html index 493eefde5df67e226514048c5410da811aae0b57..a482a21dfadd11a7121e88458dd9bdb2df7ef9a0 100644 --- a/scipost/templates/scipost/VGMs.html +++ b/scipost/templates/scipost/VGMs.html @@ -16,7 +16,7 @@ <ul> {% for VGM in VGM_list %} - <li><a href="{% url 'scipost:VGM_detail' VGM_id=VGM.id %}">{{ VGM }}</a></li> + <li><a href="{% url 'virtualmeetings:VGM_detail' VGM_id=VGM.id %}">{{ VGM }}</a></li> {% endfor %} </ul> diff --git a/scipost/templates/scipost/_college_member.html b/scipost/templates/scipost/_college_member.html new file mode 100644 index 0000000000000000000000000000000000000000..a6114acacd1314b63b3ceba601656172e7c686c8 --- /dev/null +++ b/scipost/templates/scipost/_college_member.html @@ -0,0 +1,4 @@ +{% if member.link %}<a target="_blank" href="{{ member.link }}">{% endif %}{{ member }}{% if member.link %}</a>{% endif %} +{% if member.subtitle %} +<br/>({{member.subtitle}}) +{% endif %} diff --git a/scipost/templates/scipost/about.html b/scipost/templates/scipost/about.html index 03d7103478b3c093637a4c33bcfb65cda022698a..9cf2dc027ace1a9f8ef569e76cb6165ab00f28f6 100644 --- a/scipost/templates/scipost/about.html +++ b/scipost/templates/scipost/about.html @@ -4,39 +4,66 @@ {% load staticfiles %} -{% block bodysup %} +{% block content %} + + +<div class="row"> + <div class="col-md-6"> + <div class="row"> + <div class="col-12"> + <div class="panel"> + <h2>About SciPost</h2> + </div> + </div> + <div class="col-12"> + <a href="{% url 'scipost:FAQ' %}">Frequently asked questions</a> + </div> + </div> + {# <h3><a href="{% url 'scipost:FAQ' %}">Frequently asked questions</a></h3>#} -<section> - <div class="row"> - <div class="col-6"> - <div class="flex-container"> - <div class="flex-greybox"> - <h1>About SciPost</h1> - </div> - </div> - {#<h4>Read the original <a href="{% static 'scipost/info/SciPost_Description.pdf' %}">SciPost description document</a>.</h4>#} - <h4><a href="{% url 'scipost:FAQ' %}">Frequently asked questions</a>.</h4> + <p>SciPost is a complete scientific publication portal.</p> + <p>It is purely online-based, and offers freely, openly, globally and perpetually accessible science.</p> + <p>Being managed by professional scientists, and making use of editor-solicited and contributed reviews, its Journals aim at the highest achievable standards of refereeing.</p> + <p>SciPost Commentaries allow Contributors to seamlessly comment on all existing literature.</p> </div> - <div class="col-6"> - <p>SciPost is a complete scientific publication portal.</p> - <p>It is purely online-based, and offers freely, openly, globally and perpetually accessible science.</p> - <p>Being managed by professional scientists, and making use of editor-solicited and contributed reviews, its Journals aim at the highest achievable standards of refereeing.</p> - <p>SciPost Commentaries allow Contributors to seamlessly comment on all existing literature.</p> + <div class="col-md-6"> + + <div class="row"> + <div class="col-12"> + <div class="panel"> + <h2>Acknowledgements</h2> + </div> + </div> + </div> + + <h2>SciPost is endorsed by</h2> + + <div class="row"> + <div class="col-md-6"> + <a href="http://www.nwo.nl/en"><img src="{% static 'scipost/images/NWO_logo_EN.jpg' %}" alt="NWO logo" width='300px' /></a> + <p id="NWOOpenAccess" class="mt-3">All articles published in SciPost Journals fulfill the Gold standard Open Access requirements of the NWO, as stipulated on the NWO’s <a href="http://www.nwo.nl/en/policies/open+science">Open Science page</a>.</p> + </div> + <div class="col-md-6"> + <a href="http://www.fom.nl/live/english/home.pag"><img src="{% static 'scipost/images/FOMlogo_fc.jpg' %}" alt="FOM logo" width='100px' /></a> + <p style="font-size: 50%">FOM is part of NWO</p> + </div> + </div> </div> - </div> -</section> +</div> -<section> - <hr class="hr12"> - <div class="flex-container"> - <div class="flex-greybox"> - <h1>Guiding principles</h1> +<hr> +<div class="row"> + <div class="col-12"> + <div class="panel"> + <h2>Guiding principles</h2> </div> </div> +</div> + - <div class="row"> - <div class="col-5"> +<div class="row"> + <div class="col-md-6"> <ul> <li><em>Two-way open access</em><br/> Publicly-funded science should be openly accessible to scientists and the general public, perpetually, worldwide. Conversely, scientists should not have to pay publishing charges to disseminate the fruits of their research efforts.</li> <li><em>Non-profit</em><br/>Academics do not perform research for profit, and by extension the publication of their scientific results should not involve commercial profit-making.</li> @@ -46,84 +73,60 @@ <li><em>Post-publication evaluation</em><br/> Peer evaluation does not stop at the moment of publication.</li> </ul> </div> - <div class="col-1"></div> - <div class="col-6"> - <br/><br/> - <p>The first principle is reflected in the fact that all publications and related content on SciPost.org are accessible to anybody with an internet connection. Moreover, publishing in SciPost entails no author charges.</p> + <div class="col-md-6"> + <p class="mt-md-4">The first principle is reflected in the fact that all publications and related content on SciPost.org are accessible to anybody with an internet connection. Moreover, publishing in SciPost entails no author charges.</p> <p>The second principle is reflected in SciPost’s not-for-profit status. SciPost is financially backed by national granting agencies, universities, foundations and individuals.</p> <p>The third principle is implemented by having only active scientists involved in SciPost’s decision-making and editorial processes.</p> <p>The fourth and fifth principles are implemented using SciPost’s maximally stringent peer-witnessed refereeing process.</p> <p>The sixth principle is implemented in the form of Commentary Pages associated to publications. These can either be SciPost Publications, or papers published elsewhere.</p> </div> - </div> -</section> - -<section> - <hr class="hr12"> - <div class="flex-container"> - <div class="flex-greybox"> - <h2>Acknowledgements</h2> - </div> - </div> - <div class="row"> - <div class="col-3"> - <h1>SciPost is endorsed by</h1> - </div> - <div class="col-4"> - <a href="http://www.nwo.nl/en"><img src="{% static 'scipost/images/NWO_logo_EN.jpg' %}" alt="NWO logo" width='300px' /></a> - <p id="NWOOpenAccess">All articles published in SciPost Journals fulfill the Gold standard Open Access requirements of the NWO, as stipulated on the NWO’s <a href="http://www.nwo.nl/en/policies/open+science">Open Science page</a>.</p> - </div> - <div class="col-1"> - </div> - <div class="col-4"> - <a href="http://www.fom.nl/live/english/home.pag"><img src="{% static 'scipost/images/FOMlogo_fc.jpg' %}" alt="FOM logo" width='100px' /></a> - <p style="font-size: 50%">FOM is part of NWO</p> - </div> +</div> - </div> -</section> -<section> - <hr class="hr12"> - <div class="flex-container"> - <div class="flex-greybox"> - <h1>The SciPost Team</h1> +<hr> +<div class="row"> + <div class="col-12"> + <div class="panel"> + <h2>The SciPost Team</h2> + </div> </div> - </div> - - <div class="flex-container"> - <div class="flex-whitebox"> +</div> +<div class="row"> + <div class="col-md-3 offset-md-1"> <h3><a href="{% url 'scipost:foundation' %}">The SciPost Foundation</a></h3> <ul> - <li>Chairman: Prof. J.-S. Caux</li> - <li>Secretary: Dr J. van Mameren</li> - <li>Treasurer: Dr J. van Wezel</li> + <li>Chairman: Prof. J.-S. Caux</li> + <li>Secretary: Dr J. van Mameren</li> + <li>Treasurer: Dr J. van Wezel</li> </ul> </div> - <div class="flex-whitebox"> + <div class="col-md-6"> <h3>Code Development and Server Maintenance</h3> <ul> - <li>Lead programmer: J.-S. Caux</li> - <li>Dev team: J. de Wit, G. Kapteijns, M. Moeys and B. Ponsioen</li> + <li>Lead programmer: J.-S. Caux</li> + <li>Dev team: J. de Wit, G. Kapteijns, M. Moeys and B. Ponsioen</li> </ul> </div> - </div> +</div> - <hr class="hr12"> - <div class="flex-container"> - <div class="flex-greybox"> - <h1 id="advisory_board">Advisory Board</h1> +<hr> +<div class="row"> + <div class="col-12"> + <div class="panel"> + <h2 id="advisory_board">Advisory Board</h2> </div> </div> - <div class="flex-container"> - <div class="flex-whitebox"> +</div> + +<div class="row"> + <div class="col-md-3 offset-md-1"> <ul> <li>Prof. <a href="http://www.nikhef.nl/~h02/">J. J. Engelen</a><br/>(U. van Amsterdam)</li> <li>Prof. <a href="https://www.asc.ox.ac.uk/person/18">P. Fendley</a><br/>(Oxford; <a href="https://www.asc.ox.ac.uk/all-souls-college-oxford">All Souls College</a>)</li> <li>Prof. <a href="http://www.ru.nl/highenergyphysics/ehep/persons/sijbrand_de_jong/">S. J. de Jong</a><br/>(Radboud Univ. Nijmegen,<br/>President CERN Council)</li> </ul> </div> - <div class="flex-whitebox"> + <div class="col-md-3"> <ul> <li>Prof. <a href="http://www.ens-lyon.fr/PHYSIQUE/presentation/annuaire/maillet-jean-michel">J. M. Maillet</a><br/>(ENS Lyon)</li> <li>Prof. <a href="http://people.sissa.it/~mussardo/">G. Mussardo</a><br/>(SISSA)</li> @@ -131,7 +134,7 @@ <li>Prof. <a href="http://atomchip.org/general-information/people/schmiedmayer/">J. Schmiedmayer</a><br/>(TU Vienna)</li> </ul> </div> - <div class="flex-whitebox"> + <div class="col-md-3"> <ul> <li>Prof. <a href="http://www.professoren.tum.de/en/spohn-herbert/">H. Spohn</a><br/>(TU Munich)</li> <li>Prof. <a href="http://www.comp.phys.ethz.ch/people/troyer.html">M. Troyer</a><br/>(ETH Zurich)</li> @@ -139,85 +142,36 @@ <li>Prof. <a href="https://staff.fnwi.uva.nl/j.t.m.walraven/walraven/JookWalraven.htm">J. T. M. Walraven</a><br/>(U. van Amsterdam)</li> </ul> </div> - </div> +</div> - <hr class="hr12"> - <div class="flex-container"> - <div class="flex-greybox"> - <h1 id="editorial_college_physics">Editorial College (Physics)</h1> - </div> - </div> - <div class="flex-container"> - <div class="flex-whitebox"> - <ul> - <li>Prof. <a href="https://www.uni-tuebingen.de/en/faculties/faculty-of-science/departments/physics/institutes/institute-for-theoretical-physics/research-groups/andergassen-group.html">Sabine Andergassen</a><br/>(Tübingen)</li> - <li>Prof. <a href="http://www.physik.uni-wuerzburg.de/~assaad/">Fakher Assaad</a><br/>(Würzbrug)</li> - <li>Dr <a href="http://www.attaccalite.com">Claudio Attaccalite</a><br/>(Marseille)</li> - <li>Prof. <a href="https://denis114.wordpress.com">Denis Bartolo</a><br/>(ENS Lyon)</li> - <li>Prof. <a href="http://www.physik.unizh.ch/~lbaudis/index.html">Laura Baudis</a><br/>(Zurich)</li> - <li>Prof. <a href="http://www.lorentz.leidenuniv.nl/beenakker/">Carlo Beenakker</a><br/>(Leiden)</li> - <li>Prof. <a href="https://www.coulomb.univ-montp2.fr/perso/ludovic.berthier/">Ludovic Berthier</a><br/>(Montpellier)</li> - <li>Prof. <a href="http://ipht.cea.fr/Pisp/giulio.biroli/index_en.php">Giulio Biroli</a><br/>(CEA Saclay)</li> - <li>Prof. <a href="http://www.en.physik.uni-muenchen.de/personen/professoren/bloch/index.html">Immanuel Bloch</a><br/>(LMU Munich)</li> - <li>Prof. <a href="https://staff.fnwi.uva.nl/j.deboer/">Jan de Boer</a><br/>(U. van Amsterdam)</li> - <li>Prof. <a href="http://www.uva.nl/en/about-the-uva/organisation/staff-members/content/b/o/d.bonn/d.bonn.html">Daniel Bonn</a><br/>(U. van Amsterdam)</li> - <li>Prof. <a href="http://www.statphys.sissa.it/wordpress/?page_id=1731">Pasquale Calabrese</a><br/>(SISSA)</li> - <li>Prof. <a href="http://personalpages.to.infn.it/~caselle/index_en.html">Michele Caselle</a><br/>(Torino)</li> - <li>Prof. <a href="http://www.saha.ac.in/cmp/bikask.chakrabarti/bikas.html">Bikas Chakrabarti</a><br/>(Kolkata)</li> - <li>Prof. <a href="http://www.tcm.phy.cam.ac.uk/~nrc25/">Nigel Cooper</a><br/>(Cambridge)</li> - </ul> - </div> - <div class="flex-whitebox"> - <ul> - <li>Prof. <a href="http://physics.cornell.edu/csaba-csaki">Csaba Csaki</a><br/>(Cornell)</li> - <li>Prof. <a href="http://theory.tifr.res.in/~kedar/">Kedar Damle</a><br/>(TIFR Mumbai)</li> - <li>Prof. <a href="http://researchers.uq.edu.au/researcher/1134">Matthew Davis</a><br/>(U. of Queensland)</li> - <li>Prof. <a href="http://www-thphys.physics.ox.ac.uk/people/FabianEssler/">Fabian Essler</a><br/>(U. of Oxford)</li> - <li>Prof. <a href="http://www.pd.infn.it/~feruglio/">Ferruccio Feruglio</a><br/>(Padova, INFN)</li> - <li>Prof. <a href="http://www.ms.unimelb.edu.au/~jdgier@unimelb/">Jan de Gier</a><br/>(U. of Melbourne)</li> - <li>Prof. <a href="http://www.desy.de/about_desy/leading_scientists/beate_heinemann/index_eng.html">Beate Heinemann</a><br/>(DESY; Freiburg)</li> - <li>Prof. <a href="http://katzgraber.org">Helmut Katzgraber</a><br/>(Texas A&M)</li> - <li>Prof. <a href="https://web.physik.rwth-aachen.de/~mkraemer/">Michael Krämer</a><br/>(RWTH Aachen)</li> - <li>Prof. <a href="https://www.pmmh.espci.fr/~jorge/">Jorge Kurchan</a><br/>(<a href="https://www.pmmh.espci.fr/?-Home-">PMMH</a> Paris, CNRS)</li> - <li>Prof. <a href="https://vivo.brown.edu/display/glandsbe">Greg Landsberg</a><br/>(Brown Univ.)</li> - <li>Prof. <a href="https://www.mpg.de/6812374/chem_physik_fester_stoffe_mackenzie">Andrew P. MacKenzie</a><br/>(MPICPS Dresden, St-Andrews)</li> - <li>Prof. <a href="http://www.ens-lyon.fr/PHYSIQUE/presentation/annuaire/maillet-jean-michel">Jean Michel Maillet</a><br/>(ENS Lyon)</li> - <li>Prof. <a href="https://www.mpg.de/343435/physik_komplexer_systeme_wissM28">Roderich Moessner</a><br/>(MPIPKS Dresden)</li> - <li>Prof. <a href="https://www.uibk.ac.at/exphys/ultracold/people/christoph.naegerl/">Hanns-Christoph Nägerl</a><br/>(Innsbruck)</li> - <li>Prof. <a href="http://www.physics.miami.edu/~nepomechie/">Rafael Nepomechie</a><br/>(U. of Miami)</li> - </ul> - </div> - <div class="flex-whitebox"> - <ul> - <li>Prof. <a href="https://staff.fnwi.uva.nl/b.nienhuis/">Bernard Nienhuis</a><br/>(U. van Amsterdam)</li> - <!--<li>Prof. <a href="http://www.kip.uni-heidelberg.de/people/index.php?num=552">Markus Oberthaler</a><br/>(U. Heidelberg)</li>--> - <li>Prof. <a href="http://www.lpthe.jussieu.fr/~pioline/">Boris Pioline</a><br/>(LPTHE Jussieu)</li> - <li>Prof. <a href="https://www.uu.nl/staff/RHHGvanRoij/0">René van Roij</a><br/>(Utrecht)</li> - <li>Prof. <a href="http://www.thp.uni-koeln.de/rosch">Achim Rosch</a><br/>(U. of Cologne)</li> - <li>Prof. <a href="http://saleur.sandvox.net">Hubert Saleur</a><br/>(CEA Saclay/USC)</li> - <li>Prof. <a href="http://www.phy.ohiou.edu/people/faculty/sandler.html">Nancy Sandler</a><br/>(Ohio)</li> - <li>Dr. <a href="http://www.sussex.ac.uk/profiles/320359">Veronica Sanz</a><br/>(Sussex)</li> - <li>Prof. <a href="http://www-thphys.physics.ox.ac.uk/people/SubirSarkar/">Subir Sarkar</a><br/>(Oxford; Niels Bohr Institute)</li> - <li>Prof. <a href="https://staff.fnwi.uva.nl/c.j.m.schoutens/">Kareljan Schoutens</a><br/>(U. van Amsterdam)</li> - <li>Dr <a href="http://www.phys.ens.fr/~guilhem/">Guilhem Semerjian</a><br/>(ENS Paris)</li> - <li>Prof. <a href="http://www-thphys.physics.ox.ac.uk/people/SteveSimon/">Steve Simon</a><br/>(U. of Oxford)</li> - <li>Prof. <a href="http://bec.science.unitn.it/infm-bec/people/stringari.html">Sandro Stringari</a><br/>(Trento)</li> - <li>Prof. <a href="http://www.damtp.cam.ac.uk/user/tong/">David Tong</a><br/>(Cambridge)</li> - <li>Prof. <a href="http://www.physique.usherbrooke.ca/pages/en/node/3412">André-Marie Tremblay</a><br/>(Sherbrooke)</li> - <li>Prof. <a href="http://trivediresearch.org.ohio-state.edu">Nandini Trivedi</a><br/>(Ohio State U.)</li> - <li>Prof. <a href="http://vergassolalab.ucsd.edu">Massimo Vergassola</a><br/>(UC Sand Diego)</li> - </ul> - </div> +<hr> +{% for college in object_list %} - <br/> - <div> - <h2 style="color: red">We are currently building our Editorial College</h2> - <h3 style="color: red">We welcome your nominations for Editorial Fellows in all fields of Physics</h3> +<div class="row"> + <div class="col-12"> + <div class="panel"> + <h2>Editorial College ({{ college }})</h2> + </div> </div> - </div> +</div> + +<div class="row"> + {% for member in college.member.all %} + <div class="col-md-4 py-1"> + {% include 'scipost/_college_member.html' with member=member %} + </div> + {% endfor %} +</div> -</section> +{% endfor %} +<br/> +<div class="row"> + <div class="col-12"> + <h2 style="color: red">We are currently building our Editorial College</h2> + <h3 style="color: red">We welcome your nominations for Editorial Fellows in all fields of Physics</h3> + </div> +</div> -{% endblock bodysup %} +{% endblock content %} diff --git a/scipost/templates/scipost/add_team_member.html b/scipost/templates/scipost/add_team_member.html deleted file mode 100644 index a8a592cc75873ed4bb3ea444d03660988266219f..0000000000000000000000000000000000000000 --- a/scipost/templates/scipost/add_team_member.html +++ /dev/null @@ -1,40 +0,0 @@ -{% extends 'scipost/base.html' %} - -{% block pagetitle %}: add team member{% endblock pagetitle %} - -{% block bodysup %} - -<section> - <h1>Add Members to Team</h1> - <ul> - {{ team.header_as_li }} - </ul> - - {% if contributors_found %} - <h3>Identified as contributor:</h3> - <table> - {% for contributor in contributors_found %} - <tr> - <td>{{ contributor.user.first_name }} {{ contributor.user.last_name }}</td> - <td> </td> - <td><a href="{% url 'scipost:add_team_member' team_id=team.id contributor_id=contributor.id %}">Add to the Team</a></td> - </tr> - {% endfor %} - </table> - {% elif add_team_member_form.has_changed %} - <p>No Contributor with this last name could be identified.</p> - {% else %} - <p>Add a member to the Team:</p> - <form action="{% url 'scipost:add_team_member' team_id=team.id %}" method="post"> - {% csrf_token %} - <table> - {{ add_team_member_form.as_table }} - </table> - <input type="submit" value="Search" /> - </form> - {% endif %} - - -</section> - -{% endblock bodysup %} diff --git a/scipost/templates/scipost/create_graph.html b/scipost/templates/scipost/create_graph.html deleted file mode 100644 index e3c4bc54d4127179a5af4f5ff3e6a2da7f8711a6..0000000000000000000000000000000000000000 --- a/scipost/templates/scipost/create_graph.html +++ /dev/null @@ -1,22 +0,0 @@ -{% extends 'scipost/base.html' %} - -{% block pagetitle %}: create graph{% endblock pagetitle %} - -{% block bodysup %} - -<section> - {% if graphcreated %} - <p>{{ message }}</p> - {% else %} - <h1>Create a new Graph</h1> - <form action="{% url 'scipost:create_graph' %}" method="post"> - {% csrf_token %} - <table> - {{ create_graph_form.as_table }} - </table> - <input type="submit" value="Create Graph" /> - </form> - {% endif %} -</section> - -{% endblock bodysup %} diff --git a/scipost/templates/scipost/create_list.html b/scipost/templates/scipost/create_list.html deleted file mode 100644 index 68a59e631271c4f617cfca562dfa01fa1dae786d..0000000000000000000000000000000000000000 --- a/scipost/templates/scipost/create_list.html +++ /dev/null @@ -1,22 +0,0 @@ -{% extends 'scipost/base.html' %} - -{% block pagetitle %}: create list{% endblock pagetitle %} - -{% block bodysup %} - -<section> - {% if listcreated %} - <p>{{ message }}</p> - {% else %} - <h1>Create a new List</h1> - <form action="{% url 'scipost:create_list' %}" method="post"> - {% csrf_token %} - <table> - {{ create_list_form.as_table }} - </table> - <input type="submit" value="Create List" /> - </form> - {% endif %} -</section> - -{% endblock bodysup %} diff --git a/scipost/templates/scipost/create_team.html b/scipost/templates/scipost/create_team.html deleted file mode 100644 index 97559b0057663c046b9971c85c643e2090f23889..0000000000000000000000000000000000000000 --- a/scipost/templates/scipost/create_team.html +++ /dev/null @@ -1,30 +0,0 @@ -{% extends 'scipost/base.html' %} - -{% block pagetitle %}: create team{% endblock pagetitle %} - -{% block bodysup %} - -<section> - {% if teamcreated %} - <p>{{ message }}</p> - - <form action="{% url 'scipost:add_team_member' team_id=team.id %}" method="post"> - {% csrf_token %} - <table> - {{ add_team_member_form.as_table }} - </table> - <input type="submit" value="Search" /> - </form> - {% else %} - <h1>Create a new collaborative Team</h1> - <form action="{% url 'scipost:create_team' %}" method="post"> - {% csrf_token %} - <table> - {{ create_team_form.as_table }} - </table> - <input type="submit" value="Create Team" /> - </form> - {% endif %} -</section> - -{% endblock bodysup %} diff --git a/scipost/templates/scipost/edit_graph_node.html b/scipost/templates/scipost/edit_graph_node.html deleted file mode 100644 index 09e9db0715bcd8aa10e8a0d945860607fd3d1846..0000000000000000000000000000000000000000 --- a/scipost/templates/scipost/edit_graph_node.html +++ /dev/null @@ -1,27 +0,0 @@ -{% extends 'scipost/base.html' %} - -{% block pagetitle %}: edit graph node{% endblock pagetitle %} - -{% block bodysup %} - -<section> - <h1>Edit Graph Node</h1> - - {% if errormessage %} - <p>{{ errormessage }}</p> - - {% else %} - - <form action="{% url 'scipost:edit_graph_node' node_id=node.id %}" method="post"> - {% csrf_token %} - <table> - {{ edit_node_form.as_table }} - </table> - <input type="submit" value="Submit" /> - </form> - - {% endif %} - -</section> - -{% endblock bodysup %} diff --git a/scipost/templates/scipost/graph.html b/scipost/templates/scipost/graph.html deleted file mode 100644 index 19679c37de056cc2074777d62ed8810462f1b08b..0000000000000000000000000000000000000000 --- a/scipost/templates/scipost/graph.html +++ /dev/null @@ -1,263 +0,0 @@ -{% extends 'scipost/base.html' %} - -{% block pagetitle %}: graph{% endblock pagetitle %} - -{% block headsup %} - -<style> - - .overlay { - fill: none; - pointer-events: all; - } - -.arc { - fill: none; - stroke: #666; - stroke-width: 1.5px; -} - -circle { - fill: #ccc; - stroke: #333; - stroke-width: 1.5px; -} - -text { - font: 12px sans-serif; - pointer-events: none; - text-shadow: 0 1px 0 #fff, 1px 0 0 #fff, 0 -1px 0 #fff, -1px 0 0 #fff; -} -</style> - -{% endblock headsup %} - -{% block bodysup %} - - -<script src="//d3js.org/d3.v3.min.js"></script> -<script> - -$(document).ready(function(){ - -$(".node_contents").hide(); -$(".delete_node").hide(); - -$("#NodeForm").hide(); -$("#ArcForm").hide(); -$("#ManageTeamsForm").hide(); - -$("#ManageTeamsFormButton").click(function(){ -$("#ManageTeamsForm").toggle(); -$("#NodeForm").hide(); -$("#ArcForm").hide(); -}); - -$("#NodeFormButton").click(function(){ -$("#ManageTeamsForm").hide(); -$("#NodeForm").toggle(); -$("#ArcForm").hide(); -}); - -$("#ArcFormButton").click(function(){ -$("#ManageTeamsForm").hide(); -$("#NodeForm").hide(); -$("#ArcForm").toggle(); -}); -}); - - -d3.json("{% url 'scipost:api_graph' graph_id=graph.id %}", function(error, json) { - if (error) return console.warn(error); - -var nodesjson = json['nodes']; -var nodes = []; -nodesjson.forEach(function(node) { - nodes[node.name] = node; - nodes[node.name].x = 300 + 100 * Math.random(); - nodes[node.name].y = 150 + 100 * Math.random(); -}); - -var arcsjson = json['arcs']; -var arcs = []; -arcsjson.forEach(function(arc) { - arcs[arc.id] = arc; - arcs[arc.id].source = nodes[arc.source]; - arcs[arc.id].target = nodes[arc.target]; - arcs[arc.id].length = arc.length; -}); - -function arclength(arc) { - return arc.length * 50; -} - -var width = 600; -var height = 300; - -var force = d3.layout.force() - .nodes(d3.values(nodes)) -// .links(arcs) - .links(d3.values(arcs)) - .size([width, height]) - .friction(0.9) - .linkStrength(1) -// .linkDistance(80) - .linkDistance(arclength) - .charge(-40) - .gravity(0.1) - .theta(0.8) - .alpha(0.1) - .on("tick", tick) - .start(); - - -var svg = d3.select("#graphic").append("svg") - .attr("width", width) -.attr("height", height) -.append("g") -.call(d3.behavior.zoom().on("zoom", zoom)) -.on("dblclick.zoom", null) -//.on("mousedown.zoom", null) -.append("g"); - -svg.append("rect") -.attr("class", "overlay") -.attr("width", width) -.attr("height", height); - -function zoom() { -svg.attr("transform", "translate(" + d3.event.translate + ")scale(" + d3.event.scale + ")"); -} - -svg.append("defs").append("marker") - .attr("id", "arrowhead") - .attr("viewBox", "0 -5 10 10") - .attr("refX", 15) - .attr("refY", -1.5) - .attr("markerWidth", 6) - .attr("markerHeight", 6) - .attr("orient", "auto") - .append("path") - .attr("d", "M0,-5L10,0L0,5"); - -var path = svg.append("g").selectAll("path") - .data(force.links()) - .enter().append("path") - .attr("class", "arc") - .attr("marker-end", "url(#arrowhead)"); - -var circle = svg.append("g").selectAll("circle") - .data(force.nodes()) - .enter().append("circle") - .attr("r", 6) - .attr("id", function(d) { return d.id; }) -.call(force.drag); - - -circle.on("click", function(){ - d3.selectAll("circle").style("fill", "#ccc"); - d3.select(this).style("fill", "blue"); - $(".node_contents").hide(); - $(".delete_node").hide(); - $(".node_id" + $(this).attr("id")).show(); -}); - -var text = svg.append("g").selectAll("text") - .data(force.nodes()) - .enter().append("text") - .attr("x", 8) - .attr("y", ".31em") - .text(function(d) { return d.name; }); - -// Use elliptical arc path segments to doubly-encode directionality. -function tick() { - path.attr("d", linkArc); - circle.attr("transform", transform); - text.attr("transform", transform); -} - -function linkArc(d) { - var dx = d.target.x - d.source.x, - dy = d.target.y - d.source.y, - dr = Math.sqrt(dx * dx + dy * dy); - return "M" + d.source.x + "," + d.source.y + "A" + dr + "," + dr + " 0 0,1 " + d.target.x + "," + d.target.y; -} - -function transform(d) { - return "translate(" + d.x + "," + d.y + ")"; -} - - -}); - - -</script> - - - -<section> - <h1>Graph</h1> - {{ graph }} - {% if graph.private %} - <h3>Teams with access:</h3> - <ul> - {% for team in graph.teams_with_access.all %} - {{ team.header_as_li }} - {% endfor %} - </ul> - {% endif %} - - - {% load guardian_tags %} - {% get_obj_perms request.user for graph as "graph_perms" %} - {% if "change_graph" in graph_perms %} - - <div class="row"> - <div class="col-2"> - {% if graph.private %} - <button class="GraphButton" id="ManageTeamsFormButton"><h1>Manage Team(s)</h1></button> - <form action="{% url 'scipost:graph' graph_id=graph.id %}" method="post" id="ManageTeamsForm"> - {% csrf_token %} - {{ attach_teams_form }} - <input type="submit" value="Submit" /> - </form> - {% endif %} - <button class="GraphButton" id="NodeFormButton"><h1>Add a Node</h1></button> - <form action="{% url 'scipost:graph' graph_id=graph.id %}" method="post" id="NodeForm"> - {% csrf_token %} - <table> - {{ create_node_form.as_table }} - </table> - <input type="submit" value="Create Node" /> - </form> - <button class="GraphButton" id="ArcFormButton"><h1>Add an Arc</h1></button> - <form action="{% url 'scipost:graph' graph_id=graph.id %}" method="post" id="ArcForm"> - {% csrf_token %} - <table> - {{ create_arc_form.as_table }} - </table> - <input type="submit" value="Create Arc" /> - </form> - </div> - <div class="col-10"> - <div id="graphic"></div> - </div> - </div> - <hr class="hr6"/> - <br/> - - {% endif %} - - {{ graph.contents }} - - - {% for node in nodes %} - {{ node.contents }} - <a href="{% url 'scipost:edit_graph_node' node_id=node.id %}" class="node_contents node_id{{ node.id }}" style="margin: 10px;">Edit this Node's contents</a> - <a href="{% url 'scipost:delete_graph_node' node_id=node.id %}" class="delete_node node_id{{ node.id }}" style="color: red; margin: 10px;">Delete this Node</a> - {% endfor %} - - -</section> - -{% endblock bodysup %} diff --git a/scipost/templates/scipost/list.html b/scipost/templates/scipost/list.html deleted file mode 100644 index 2ef95a3ddec56248a25e0ace8db3bc053675d9aa..0000000000000000000000000000000000000000 --- a/scipost/templates/scipost/list.html +++ /dev/null @@ -1,103 +0,0 @@ -{% extends 'scipost/base.html' %} - -{% block pagetitle %}: list{% endblock pagetitle %} - -{% block headsup %} - -{% endblock headsup %} - -{% block bodysup %} - - -<section> - <h1>List detail</h1> - - {{ list.header }} - <br/> - - {% load guardian_tags %} - {% get_obj_perms request.user for list as "list_perms" %} - - {% include 'scipost/list_contents.html' %} - - {% if "change_list" in list_perms %} - - <hr class="hr6"/> - <h3>Add elements to this List</h3> - <form action="{% url 'scipost:list' list_id=list.id %}" method="post"> - {% csrf_token %} - <table> - {{ search_for_list_form.as_table }} - </table> - <input type="submit" name="Submit"> - </form> - - {% if search_for_list_form.has_changed %} - <h1>Search results</h1> - {% endif %} - - {% if commentary_search_list %} - <br /> - <hr class="hr12"> - <h3>Commentaries:</h3> - <ul> - {% for commentary in commentary_search_list %} - {{ commentary.header_as_li }} - <form action="{% url 'scipost:list_add_element' list_id=list.id type='C' element_id=commentary.id %}" method="post"> - {% csrf_token %} - <input class="AddItemToList" type="submit" value="Add"/> - </form> - {% endfor %} - </ul> - {% endif %} - - {% if submission_search_list %} - <br /> - <hr class="hr12"> - <h3>Submissions:</h3> - <ul> - {% for submission in submission_search_list %} - {{ submission.header_as_li }} - <form action="{% url 'scipost:list_add_element' list_id=list.id type='S' element_id=submission.id %}" method="post"> - {% csrf_token %} - <input class="AddItemToList" type="submit" value="Add"/> - </form> - {% endfor %} - </ul> - {% endif %} - - {% if thesislink_search_list %} - <br /> - <hr class="hr12"> - <h3>Theses:</h3> - <ul> - {% for thesislink in thesislink_search_list %} - - {% include 'theses/_thesislink_header_as_li.html' with thesislink=thesislink %} - <form action="{% url 'scipost:list_add_element' list_id=list.id type='T' element_id=thesislink.id %}" method="post"> - {% csrf_token %} - <input class="AddItemToList" type="submit" value="Add"/> - </form> - {% endfor %} - </ul> - {% endif %} - - {% if comment_search_list %} - <br /> - <hr class="hr12"> - <h3>Comments:</h3> - <ul> - {% for comment in comment_search_list %} - {{ comment.header_as_li }} - <form action="{% url 'scipost:list_add_element' list_id=list.id type='c' element_id=comment.id %}" method="post"> - {% csrf_token %} - <input class="AddItemToList" type="submit" value="Add"/> - </form> - {% endfor %} - </ul> - {% endif %} - - {% endif %} -</section> - -{% endblock bodysup %} diff --git a/scipost/templates/scipost/list_contents.html b/scipost/templates/scipost/list_contents.html deleted file mode 100644 index 8d4f05232cf3576286743794cfc6962bcbffb857..0000000000000000000000000000000000000000 --- a/scipost/templates/scipost/list_contents.html +++ /dev/null @@ -1,85 +0,0 @@ - -{% if not "change_list" in list_perms %} - - {{ list.contents }} - -{% else %} - - <p>Description: - <p>{{ list.description }}</p> - </p> - - - <hr class="hr6"/> - - {% if list.submissions.exists or list.commentaries.exists or list.thesislinks.exists or list.comments.exists %} - - {% if list.submissions.exists %} - <p>Submissions: - <ul> - {% for sub in list.submissions.all %} - {{ sub.simple_header_as_li }} - {% if "change_list" in list_perms %} - <form action="{% url 'scipost:list_remove_element' list_id=list.id type='S' element_id=sub.id %}" method="post"> - {% csrf_token %} - <input class="RemoveItemFromList" type="submit" value="Remove"/> - </form> - {% endif %} - {% endfor %} - </ul> - </p> - {% endif %} - - {% if list.commentaries.exists %} - <p>Commentaries: - <ul> - {% for com in list.commentaries.all %} - {{ com.simple_header_as_li }} - {% if "change_list" in list_perms %} - <form action="{% url 'scipost:list_remove_element' list_id=list.id type='C' element_id=com.id %}" method="post"> - {% csrf_token %} - <input class="RemoveItemFromList" type="submit" value="Remove"/> - </form> - {% endif %} - {% endfor %} - </ul> - </p> - {% endif %} - - {% if list.thesislinks.exists %} - <p>Thesis links: - <ul> - {% for tl in list.thesislinks.all %} - {{ tl.simple_header_as_li }} - {% if "change_list" in list_perms %} - <form action="{% url 'scipost:list_remove_element' list_id=list.id type='T' element_id=tl.id %}" method="post"> - {% csrf_token %} - <input class="RemoveItemFromList" type="submit" value="Remove"/> - </form> - {% endif %} - {% endfor %} - </ul> - </p> - {% endif %} - - {% if list.comments.exists %} - <p>Comments: - <ul> - {% for comment in list.comments.all %} - {{ comment.simple_header_as_li }} - {% if "change_list" in list_perms %} - <form action="{% url 'scipost:list_remove_element' list_id=list.id type='c' element_id=comment.id %}" method="post"> - {% csrf_token %} - <input class="RemoveItemFromList" type="submit" value="Remove"/> - </form> - {% endif %} - {% endfor %} - </ul> - </p> - {% endif %} - - {% else %} - <br/><h3>This List is empty.</h3> - {% endif %} - -{% endif %} diff --git a/scipost/templates/scipost/personal_page.html b/scipost/templates/scipost/personal_page.html index 2506e6f5f49f8fddd69695fc4e08fee6b2a39079..8969b01a8ce301c6bddb8bac6625ce3f8a127410 100644 --- a/scipost/templates/scipost/personal_page.html +++ b/scipost/templates/scipost/personal_page.html @@ -62,24 +62,6 @@ $(".TabSection").hide(); $("#AuthorReplies").show(); }); - $("#ListsTab").click(function(){ - $(".TabItem").attr("class", "TabItem inactive"); - $("#ListsTab").attr("class", "TabItem active"); - $(".TabSection").hide(); - $("#Lists").show(); - }); - $("#TeamsTab").click(function(){ - $(".TabItem").attr("class", "TabItem inactive"); - $("#TeamsTab").attr("class", "TabItem active"); - $(".TabSection").hide(); - $("#Teams").show(); - }); - $("#GraphsTab").click(function(){ - $(".TabItem").attr("class", "TabItem inactive"); - $("#GraphsTab").attr("class", "TabItem active"); - $(".TabSection").hide(); - $("#Graphs").show(); - }); }); </script> @@ -110,7 +92,7 @@ <div class="col-12"> <ul class="personalTabMenu"> <li><a class="TabItem" id="AccountTab">Account</a></li> - {% if 'Editorial Administrators' not in user_groups or 'Advisory Board' not in user_groups or 'Editorial College' not in user_groups or 'Vetting Editors' not in user_groups or 'Ambassadors' not in user_groups or 'Junior Ambassadors' not in user_groups %} + {% if 'Editorial Administrators' in user_groups or 'Advisory Board' in user_groups or 'Editorial College' in user_groups or 'Vetting Editors' in user_groups or 'Ambassadors' in user_groups or 'Junior Ambassadors' in user_groups %} <li><a class="TabItem" id="EdActionTab">Editorial Actions</a></li> {% endif %} <li><a class="TabItem" id="RefereeingTab">Refereeing</a></li> @@ -119,15 +101,6 @@ <li><a class="TabItem" id="ThesesTab">Theses</a></li> <li><a class="TabItem" id="CommentsTab">Comments</a></li> <li><a class="TabItem" id="AuthorRepliesTab">Author Replies</a></li> - {% if 'Testers' in user_groups %} - <li><a class="TabItem" id="ListsTab">Lists</a></li> - {% endif %} - {% if 'Testers' in user_groups %} - <li><a class="TabItem" id="TeamsTab">Teams</a></li> - {% endif %} - {% if 'Testers' in user_groups %} - <li><a class="TabItem" id="GraphsTab">Graphs</a></li> - {% endif %} </ul> </div> </div> @@ -310,7 +283,7 @@ {% if perms.scipost.can_attend_VGMs %} <h3>Virtual General Meetings</h3> <ul> - <li><a href="{% url 'scipost:VGMs' %}">List of VGMs</a></li> + <li><a href="{% url 'virtualmeetings:VGMs' %}">List of VGMs</a></li> </ul> {% endif %} </div> @@ -521,108 +494,6 @@ </div> {% endif %} -<div class="TabSection" id="Lists"> - <div class="row"> - <div class="col-12"> - <div class="panel"> - <h2>Lists</h2> - <ul class="mb-0"> - <li><a href="{% url 'scipost:create_list' %}">Create a new List</a></li> - </ul> - </div> - </div> - </div> - <div class="row"> - <div class="col-12"> - {% if lists_owned %} - <h3>Lists you own:</h3> - <ul> - {% for list in lists_owned %} - {{ list.header_as_li }} - {% endfor %} - </ul> - {% endif %} - {% if lists %} - <h3>Lists to which you have access:</h3> - <ul> - {% for list in lists %} - {{ list.header_as_li }} - {% endfor %} - </ul> - {% endif %} - </div> - </div> -</div> - -<div class="TabSection" id="Teams"> - <div class="row"> - <div class="col-12"> - <div class="panel"> - <h2>Teams</h2> - <ul class="mb-0"> - <li><a href="{% url 'scipost:create_team' %}">Create a new Team</a></li> - </ul> - </div> - </div> - </div> - <div class="row"> - <div class="col-12"> - {% if teams_led %} - <h3>Teams you are leading:</h3> - <ul> - {% for team in teams_led %} - {{ team.header_as_li }} - <a href="{% url 'scipost:add_team_member' team_id=team.id %}">Add a member</a> - {% endfor %} - </ul> - {% endif %} - {% if teams %} - <h3>Teams of which you are a member:</h3> - <ul> - {% for team in teams %} - {{ team.header_as_li }} - {% endfor %} - </ul> - {% endif %} - </div> - </div> -</div> - -<div class="TabSection" id="Graphs"> - <div class="row"> - <div class="col-12"> - <div class="panel"> - <h2>Graphs</h2> - <ul class="mb-0"> - <li><a href="{% url 'scipost:create_graph' %}">Create a new Graph</a></li> - </ul> - </div> - </div> - </div> - <div class="row"> - <div class="col-12"> - - {% if graphs_owned %} - <h3>Graphs you own:</h3> - <ul> - {% for graph in graphs_owned %} - {{ graph.header_as_li }} - {% endfor %} - </ul> - {% endif %} - {% if graphs_private %} - <h3>Private graphs which you can access:</h3> - <ul> - {% for graph in graphs_private %} - {{ graph.header_as_li }} - {% endfor %} - </ul> - {% endif %} - - </div> - </div> -</div> - {% endif %} {% endblock content %} diff --git a/scipost/test_views.py b/scipost/test_views.py new file mode 100644 index 0000000000000000000000000000000000000000..d6b766630eb0b24ef0fab244bd89681ac24cb90a --- /dev/null +++ b/scipost/test_views.py @@ -0,0 +1,154 @@ +from django.core.urlresolvers import reverse +from django.contrib.auth.models import Group +from django.test import TestCase, Client, tag + +from commentaries.factories import UnvettedCommentaryFactory, VettedCommentaryFactory,\ + UnpublishedVettedCommentaryFactory +from commentaries.forms import CommentarySearchForm +from commentaries.models import Commentary + +from .factories import ContributorFactory,\ + EditorialCollegeMemberFactory, EditorialCollegeFactory +from .models import EditorialCollege, EditorialCollegeMember + + +class RequestCommentaryTest(TestCase): + """Test cases for `request_commentary` view method""" + fixtures = ['permissions', 'groups', 'contributors'] + + def setUp(self): + self.view_url = reverse('commentaries:request_commentary') + self.login_url = reverse('scipost:login') + self.redirected_login_url = '%s?next=%s' % (self.login_url, self.view_url) + + def test_get_requests(self): + """Test different GET requests on view""" + # Anoymous user should redirect to login page + request = self.client.get(self.view_url) + self.assertRedirects(request, self.redirected_login_url) + + # Registered Contributor should get 200 + self.client.login(username="Test", password="testpw") + request = self.client.get(self.view_url) + self.assertEquals(request.status_code, 200) + + def test_post_invalid_forms(self): + """Test different kind of invalid RequestCommentaryForm submits""" + self.client.login(username="Test", password="testpw") + request = self.client.post(self.view_url) + self.assertEquals(request.status_code, 200) + + +class VetCommentaryRequestsTest(TestCase): + """Test cases for `vet_commentary_requests` view method""" + fixtures = ['groups', 'permissions'] + + def setUp(self): + self.view_url = reverse('commentaries:vet_commentary_requests') + self.login_url = reverse('scipost:login') + self.password = 'test123' + self.contributor = ContributorFactory(user__password=self.password) + + def set_required_permissions_and_login(self): + '''Set the required permissions to testuser to access vet_commentary_requests.''' + group = Group.objects.get(name="Vetting Editors") + self.contributor.user.groups.add(group) + self.client.login(username=self.contributor.user.username, password=self.password) + + def test_user_permissions(self): + """Test view permission is restricted to Vetting Editors.""" + # Anoymous user + response = self.client.get(self.view_url) + self.assertEquals(response.status_code, 403) + + # Wrong permissions group + self.client.login(username=self.contributor.user.username, password=self.password) + response = self.client.get(self.view_url) + self.assertEquals(response.status_code, 403) + + # Right permissions group + self.set_required_permissions_and_login() + response = self.client.get(self.view_url) + self.assertEquals(response.status_code, 200) + + def test_get_valid_unvetted_commentaries(self): + """Test if valid commentaries are sent back to user, if exists.""" + self.set_required_permissions_and_login() + + # No Commentary exists! + response = self.client.get(self.view_url) + self.assertTrue('commentary_to_vet' in response.context) + self.assertEquals(response.context['commentary_to_vet'], None) + + # Only vetted Commentaries exist! + VettedCommentaryFactory() + response = self.client.get(self.view_url) + self.assertEquals(response.context['commentary_to_vet'], None) + + # Unvetted Commentaries do exist! + UnvettedCommentaryFactory() + response = self.client.get(self.view_url) + self.assertTrue(type(response.context['commentary_to_vet']) is Commentary) + + +class BrowseCommentariesTest(TestCase): + """Test cases for `browse` view.""" + fixtures = ['groups', 'permissions'] + + def setUp(self): + VettedCommentaryFactory(discipline='physics') + self.view_url = reverse('commentaries:browse', kwargs={ + 'discipline': 'physics', + 'nrweeksback': '1' + }) + + def test_response_list(self): + '''Test if the browse view is passing commentaries to anoymous users.''' + response = self.client.get(self.view_url) + self.assertEquals(response.status_code, 200) + + # The created vetted Commentary is found! + self.assertTrue(response.context['commentary_browse_list'].count() >= 1) + # The search form is passed trough the view... + self.assertTrue(type(response.context['form']) is CommentarySearchForm) + + +class CommentaryDetailTest(TestCase): + fixtures = ['permissions', 'groups'] + + def setUp(self): + self.client = Client() + self.commentary = UnpublishedVettedCommentaryFactory() + self.target = reverse( + 'commentaries:commentary', + kwargs={'arxiv_or_DOI_string': self.commentary.arxiv_or_DOI_string} + ) + + def test_status_code_200(self): + response = self.client.get(self.target) + self.assertEqual(response.status_code, 200) + + +@tag('static-info', 'full') +class AboutViewTest(TestCase): + def setUp(self): + self.client = Client() + self.target = reverse('scipost:about') + + # Create College with 10 members + self.college = EditorialCollegeFactory() + EditorialCollegeMemberFactory.create_batch(10) + + def test_status_code_200_including_members(self): + response = self.client.get(self.target) + self.assertEqual(response.status_code, 200) + + # College exists in context + self.assertTrue('object_list' in response.context) + college = response.context['object_list'][0] + self.assertTrue(isinstance(college, EditorialCollege)) + + # Members exist in college + self.assertTrue(college.member.count() >= 10) + last_member = college.member.last() + self.assertTrue(isinstance(last_member, EditorialCollegeMember)) diff --git a/scipost/urls.py b/scipost/urls.py index 1ed0f1b6a55fccc4f199d49d5b767102ec62833b..a26c8e095200ce2820533e6bb50a0edd08632c92 100644 --- a/scipost/urls.py +++ b/scipost/urls.py @@ -17,7 +17,7 @@ urlpatterns = [ name='acknowledgement'), ## Info - url(r'^about$', TemplateView.as_view(template_name='scipost/about.html'), name='about'), + url(r'^about$', views.AboutView.as_view(), 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'), name='foundation'), @@ -171,27 +171,6 @@ urlpatterns = [ views.Fellow_activity_overview, name='Fellow_activity_overview'), - ############################ - # Virtual General Meetings # - ############################ - url(r'^VGMs$', views.VGMs, name='VGMs'), - url(r'^VGM/(?P<VGM_id>[0-9]+)/$', views.VGM_detail, name='VGM_detail'), - url(r'^feedback/(?P<VGM_id>[0-9]+)$', - views.feedback, name='feedback'), - url(r'^add_remark_on_feedback/(?P<VGM_id>[0-9]+)/(?P<feedback_id>[0-9]+)$', - views.add_remark_on_feedback, name='add_remark_on_feedback'), - url(r'^nominate_Fellow/(?P<VGM_id>[0-9]+)$', - views.nominate_Fellow, name='nominate_Fellow'), - url(r'^add_remark_on_nomination/(?P<VGM_id>[0-9]+)/(?P<nomination_id>[0-9]+)$', - views.add_remark_on_nomination, name='add_remark_on_nomination'), - url(r'^vote_on_nomination/(?P<nomination_id>[0-9]+)/(?P<vote>[AND])$', - views.vote_on_nomination, name='vote_on_nomination'), - url(r'^put_motion_forward/(?P<VGM_id>[0-9]+)$', - views.put_motion_forward, name='put_motion_forward'), - url(r'^add_remark_on_motion/(?P<motion_id>[0-9]+)$', - views.add_remark_on_motion, name='add_remark_on_motion'), - url(r'^vote_on_motion/(?P<motion_id>[0-9]+)/(?P<vote>[AND])$', - views.vote_on_motion, name='vote_on_motion'), ################ # Publications # @@ -236,33 +215,6 @@ urlpatterns = [ name='howto_production'), - ######### - # Lists # - ######### - - url(r'^create_list$', views.create_list, name='create_list'), - url(r'^list/(?P<list_id>[0-9]+)$', views.list, name='list'), - url(r'^list_add_element/(?P<list_id>[0-9]+)/(?P<type>[SCTc])/(?P<element_id>[0-9]+)$', - views.list_add_element, name='list_add_element'), - url(r'^list_remove_element/(?P<list_id>[0-9]+)/(?P<type>[SCTc])/(?P<element_id>[0-9]+)$', - views.list_remove_element, name='list_remove_element'), - - # Teams - url(r'^create_team$', views.create_team, name='create_team'), - url(r'^add_team_member/(?P<team_id>[0-9]+)$', views.add_team_member, name='add_team_member'), - url(r'^add_team_member/(?P<team_id>[0-9]+)/(?P<contributor_id>[0-9]+)$', - views.add_team_member, name='add_team_member'), - - # Graphs - url(r'^create_graph$', views.create_graph, name='create_graph'), - url(r'^graph/(?P<graph_id>[0-9]+)$', views.graph, name='graph'), - url(r'^edit_graph_node/(?P<node_id>[0-9]+)$', - views.edit_graph_node, name='edit_graph_node'), - url(r'^delete_graph_node/(?P<node_id>[0-9]+)$', - views.delete_graph_node, name='delete_graph_node'), - url(r'^api/graph/(?P<graph_id>[0-9]+)$', views.api_graph, name='api_graph'), - - ############################# # Supporting Partners Board # ############################# diff --git a/scipost/views.py b/scipost/views.py index 295f62b52a930e54af13098bbcc530adb54e488e..5800d6a4deeef9d443940a2931ce08a388b68de5 100644 --- a/scipost/views.py +++ b/scipost/views.py @@ -10,37 +10,31 @@ from django.contrib.auth import authenticate, login, logout from django.contrib.auth.decorators import login_required from django.contrib.auth.models import Group from django.contrib.auth.views import password_reset, password_reset_confirm -from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist, PermissionDenied +from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist from django.core import mail from django.core.mail import EmailMessage, EmailMultiAlternatives from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.core.urlresolvers import reverse from django.db.models import Q -from django.http import HttpResponseRedirect, JsonResponse +from django.http import HttpResponseRedirect from django.shortcuts import redirect from django.template import Context, Template from django.utils.http import is_safe_url +from django.views.generic.list import ListView from guardian.decorators import permission_required -from guardian.decorators import permission_required_or_403 -from guardian.shortcuts import assign_perm from .constants import SCIPOST_SUBJECT_AREAS from .models import Contributor, CitationNotification, UnavailabilityPeriod,\ - DraftInvitation, RegistrationInvitation, Remark,\ - List, Team, Graph, Node, Arc,\ + DraftInvitation, RegistrationInvitation,\ title_dict, SciPost_from_addresses_dict,\ - AuthorshipClaim, SupportingPartner, SPBMembershipAgreement + AuthorshipClaim, SupportingPartner, SPBMembershipAgreement, EditorialCollege from .forms import AuthenticationForm, DraftInvitationForm, UnavailabilityPeriodForm,\ RegistrationForm, RegistrationInvitationForm, AuthorshipClaimForm,\ ModifyPersonalMessageForm, SearchForm, VetRegistrationForm, reg_ref_dict,\ UpdatePersonalDataForm, UpdateUserDataForm, PasswordChangeForm,\ EmailGroupMembersForm, EmailParticularForm, SendPrecookedEmailForm,\ - CreateListForm, CreateTeamForm,\ - AddTeamMemberForm, CreateGraphForm,\ - ManageTeamsForm, CreateNodeForm, CreateArcForm,\ - SupportingPartnerForm, SPBMembershipForm,\ - FeedbackForm, MotionForm, NominationForm, RemarkForm + SupportingPartnerForm, SPBMembershipForm from .utils import Utils, EMAIL_FOOTER, SCIPOST_SUMMARY_FOOTER, SCIPOST_SUMMARY_FOOTER_HTML from commentaries.models import Commentary @@ -54,8 +48,8 @@ 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 +# from virtualmeetings.models import VGM, Feedback, Nomination, Motion +# from virtualmeetings.constants import motion_categories_dict ############## @@ -1022,13 +1016,7 @@ def personal_page(request): own_authorreplies = (Comment.objects .filter(author=contributor, is_author_reply=True) .order_by('-date_submitted')) - lists_owned = List.objects.filter(owner=contributor) - lists = List.objects.filter(teams_with_access__members__in=[contributor]) - teams_led = Team.objects.select_related('leader__user').filter(leader=contributor) - teams = Team.objects.select_related('leader__user').filter(members__in=[contributor]) - graphs_owned = Graph.objects.filter(owner=contributor) - graphs_private = Graph.objects.filter(Q(teams_with_access__leader=contributor) - | Q(teams_with_access__members__in=[contributor])) + appellation = title_dict[contributor.title] + ' ' + contributor.user.last_name context = { 'contributor': contributor, @@ -1056,12 +1044,6 @@ def personal_page(request): 'own_commentaries': own_commentaries, 'own_thesislinks': own_thesislinks, 'own_comments': own_comments, 'own_authorreplies': own_authorreplies, - 'lists_owned': lists_owned, - 'lists': lists, - 'teams_led': teams_led, - 'teams': teams, - 'graphs_owned': graphs_owned, - 'graphs_private': graphs_private, } return render(request, 'scipost/personal_page.html', context) @@ -1484,501 +1466,241 @@ def Fellow_activity_overview(request, Fellow_id=None): context['assignments_of_Fellow'] = assignments_of_Fellow return render(request, 'scipost/Fellow_activity_overview.html', context) - -@login_required -@permission_required('scipost.can_attend_VGMs', return_403=True) -def VGMs(request): - VGM_list = VGM.objects.all().order_by('start_date') - context = {'VGM_list': VGM_list} - return render(request, 'scipost/VGMs.html', context) - - -@login_required -@permission_required('scipost.can_attend_VGMs', return_403=True) -def VGM_detail(request, VGM_id): - VGM_instance = get_object_or_404(VGM, id=VGM_id) - VGM_information = Template(VGM_instance.information).render(Context({})) - feedback_received = Feedback.objects.filter(VGM=VGM_instance).order_by('date') - feedback_form = FeedbackForm() - current_Fellows = Contributor.objects.filter( - user__groups__name='Editorial College').order_by('user__last_name') - sent_inv_Fellows = RegistrationInvitation.objects.filter( - invitation_type='F', responded=False) - pending_inv_Fellows = sent_inv_Fellows.filter(declined=False).order_by('last_name') - declined_inv_Fellows = sent_inv_Fellows.filter(declined=True).order_by('last_name') - nomination_form = NominationForm() - nominations = Nomination.objects.filter(accepted=None).order_by('last_name') - motion_form = MotionForm() - remark_form = RemarkForm() - context = { - 'VGM': VGM_instance, - 'VGM_information': VGM_information, - 'feedback_received': feedback_received, - 'feedback_form': feedback_form, - 'current_Fellows': current_Fellows, - 'pending_inv_Fellows': pending_inv_Fellows, - 'declined_inv_Fellows': declined_inv_Fellows, - 'nominations': nominations, - 'nomination_form': nomination_form, - 'motion_categories_dict': motion_categories_dict, - 'motion_form': motion_form, - 'remark_form': remark_form, - } - return render(request, 'scipost/VGM_detail.html', context) - - -@login_required -@permission_required('scipost.can_attend_VGMs', return_403=True) -def feedback(request, VGM_id=None): - if request.method == 'POST': - feedback_form = FeedbackForm(request.POST) - if feedback_form.is_valid(): - feedback = Feedback(by=request.user.contributor, - date=timezone.now().date(), - feedback=feedback_form.cleaned_data['feedback'],) - if VGM_id: - VGM_instance = get_object_or_404(VGM, id=VGM_id) - feedback.VGM = VGM_instance - feedback.save() - ack_message = 'Your feedback has been received.' - context = {'ack_message': ack_message} - if VGM_id: - context['followup_message'] = 'Return to the ' - context['followup_link'] = reverse('scipost:VGM_detail', - kwargs={'VGM_id': VGM_id}) - context['followup_link_label'] = 'VGM page' - return render(request, 'scipost/acknowledgement.html', context) - else: - errormessage = 'The form was not filled properly.' - return render(request, 'scipost/error.html', {'errormessage': errormessage}) - else: - errormessage = 'This view can only be posted to.' - return render(request, 'scipost/error.html', {'errormessage': errormessage}) - - -@login_required -@permission_required('scipost.can_attend_VGMs', raise_exception=True) -def add_remark_on_feedback(request, VGM_id, feedback_id): - # contributor = request.user.contributor - feedback = get_object_or_404(Feedback, pk=feedback_id) - if request.method == 'POST': - remark_form = RemarkForm(request.POST) - if remark_form.is_valid(): - remark = Remark(contributor=request.user.contributor, - feedback=feedback, - date=timezone.now(), - remark=remark_form.cleaned_data['remark']) - remark.save() - return HttpResponseRedirect('/VGM/' + str(VGM_id) + - '/#feedback_id' + str(feedback.id)) - else: - errormessage = 'The form was invalidly filled.' - return render(request, 'scipost/error.html', {'errormessage': errormessage}) - else: - errormessage = 'This view can only be posted to.' - return render(request, 'scipost/error.html', {'errormessage': errormessage}) - - -@login_required -@permission_required('scipost.can_attend_VGMs', return_403=True) -def nominate_Fellow(request, VGM_id): - VGM_instance = get_object_or_404(VGM, id=VGM_id) - if request.method == 'POST': - nomination_form = NominationForm(request.POST) - if nomination_form.is_valid(): - nomination = Nomination( - VGM=VGM_instance, - by=request.user.contributor, - date=timezone.now().date(), - first_name=nomination_form.cleaned_data['first_name'], - last_name=nomination_form.cleaned_data['last_name'], - discipline=nomination_form.cleaned_data['discipline'], - expertises=nomination_form.cleaned_data['expertises'], - webpage=nomination_form.cleaned_data['webpage'], - voting_deadline=VGM_instance.end_date + datetime.timedelta(days=7), - ) - nomination.save() - nomination.update_votes(request.user.contributor.id, 'A') - ack_message = 'The nomination has been registered.' - context = {'ack_message': ack_message, - 'followup_message': 'Return to the ', - 'followup_link': reverse('scipost:VGM_detail', kwargs={'VGM_id': VGM_id}), - 'followup_link_label': 'VGM page'} - return render(request, 'scipost/acknowledgement.html', context) - else: - errormessage = 'The form was not filled properly.' - return render(request, 'scipost/error.html', {'errormessage': errormessage}) - else: - errormessage = 'This view can only be posted to.' - return render(request, 'scipost/error.html', {'errormessage': errormessage}) - - -@login_required -@permission_required('scipost.can_attend_VGMs', raise_exception=True) -def add_remark_on_nomination(request, VGM_id, nomination_id): - # contributor = request.user.contributor - nomination = get_object_or_404(Nomination, pk=nomination_id) - if request.method == 'POST': - remark_form = RemarkForm(request.POST) - if remark_form.is_valid(): - remark = Remark(contributor=request.user.contributor, - nomination=nomination, - date=timezone.now(), - remark=remark_form.cleaned_data['remark']) - remark.save() - return HttpResponseRedirect('/VGM/' + str(VGM_id) + - '/#nomination_id' + str(nomination.id)) - else: - errormessage = 'The form was invalidly filled.' - return render(request, 'scipost/error.html', {'errormessage': errormessage}) - else: - errormessage = 'This view can only be posted to.' - return render(request, 'scipost/error.html', {'errormessage': errormessage}) - - -@login_required -@permission_required('scipost.can_attend_VGMs', raise_exception=True) -def vote_on_nomination(request, nomination_id, vote): - contributor = request.user.contributor - nomination = get_object_or_404(Nomination, pk=nomination_id) - if timezone.now() > nomination.voting_deadline: - errormessage = 'The voting deadline on this nomination has passed.' - return render(request, 'scipost/error.html', {'errormessage': errormessage}) - nomination.update_votes(contributor.id, vote) - return HttpResponseRedirect('/VGM/' + str(nomination.VGM.id) + - '/#nomination_id' + str(nomination.id)) - - -@login_required -@permission_required('scipost.can_attend_VGMs', return_403=True) -def put_motion_forward(request, VGM_id): - VGM_instance = get_object_or_404(VGM, id=VGM_id) - if timezone.now().date() > VGM_instance.end_date: - errormessage = 'This VGM has ended. No new motions can be put forward.' - return render(request, 'scipost/error.html', {'errormessage': errormessage}) - if request.method == 'POST': - motion_form = MotionForm(request.POST) - if motion_form.is_valid(): - motion = Motion( - category=motion_form.cleaned_data['category'], - VGM=VGM_instance, - background=motion_form.cleaned_data['background'], - motion=motion_form.cleaned_data['motion'], - put_forward_by=request.user.contributor, - date=timezone.now().date(), - voting_deadline=VGM_instance.end_date + datetime.timedelta(days=7), - ) - motion.save() - motion.update_votes(request.user.contributor.id, 'A') - ack_message = 'Your motion has been registered.' - context = {'ack_message': ack_message, - 'followup_message': 'Return to the ', - 'followup_link': reverse('scipost:VGM_detail', kwargs={'VGM_id': VGM_id}), - 'followup_link_label': 'VGM page'} - return render(request, 'scipost/acknowledgement.html', context) - else: - errormessage = 'The form was not filled properly.' - return render(request, 'scipost/error.html', {'errormessage': errormessage}) - else: - errormessage = 'This view can only be posted to.' - return render(request, 'scipost/error.html', {'errormessage': errormessage}) - - -@login_required -@permission_required('scipost.can_attend_VGMs', raise_exception=True) -def add_remark_on_motion(request, motion_id): - # contributor = request.user.contributor - motion = get_object_or_404(Motion, pk=motion_id) - if request.method == 'POST': - remark_form = RemarkForm(request.POST) - if remark_form.is_valid(): - remark = Remark(contributor=request.user.contributor, - motion=motion, - date=timezone.now(), - remark=remark_form.cleaned_data['remark']) - remark.save() - return HttpResponseRedirect('/VGM/' + str(motion.VGM.id) + - '/#motion_id' + str(motion.id)) - else: - errormessage = 'The form was invalidly filled.' - return render(request, 'scipost/error.html', {'errormessage': errormessage}) - else: - errormessage = 'This view can only be posted to.' - return render(request, 'scipost/error.html', {'errormessage': errormessage}) - - -@login_required -@permission_required('scipost.can_attend_VGMs', raise_exception=True) -def vote_on_motion(request, motion_id, vote): - contributor = request.user.contributor - motion = get_object_or_404(Motion, pk=motion_id) - if timezone.now() > motion.voting_deadline: - errormessage = 'The voting deadline on this motion has passed.' - return render(request, 'scipost/error.html', {'errormessage': errormessage}) - motion.update_votes(contributor.id, vote) - return HttpResponseRedirect('/VGM/' + str(motion.VGM.id) + - '/#motion_id' + str(motion.id)) - - -######### -# Lists # -######### - -@permission_required('scipost.add_list', return_403=True) -def create_list(request): - listcreated = False - message = None - if request.method == "POST": - create_list_form = CreateListForm(request.POST) - if create_list_form.is_valid(): - newlist = List(owner=request.user.contributor, - title=create_list_form.cleaned_data['title'], - description=create_list_form.cleaned_data['description'], - private=create_list_form.cleaned_data['private'], - created=timezone.now()) - newlist.save() - listcreated = True - assign_perm('scipost.change_list', request.user, newlist) - assign_perm('scipost.view_list', request.user, newlist) - assign_perm('scipost.delete_list', request.user, newlist) - message = 'List %s was successfully created.' % create_list_form.cleaned_data['title'] - else: - create_list_form = CreateListForm() - context = {'create_list_form': create_list_form, 'listcreated': listcreated, - 'message': message} - return render(request, 'scipost/create_list.html', context) - - -@permission_required_or_403('scipost.view_list', (List, 'id', 'list_id')) -def list(request, list_id): - list = get_object_or_404(List, pk=list_id) - context = {'list': list} - if request.method == "POST": - search_for_list_form = SearchForm(request.POST) - if search_for_list_form.is_valid(): - context.update(documentsSearchResults(search_for_list_form.cleaned_data['query'])) - else: - search_for_list_form = SearchForm() - context.update({'search_for_list_form': search_for_list_form}) - return render(request, 'scipost/list.html', context) - - -@permission_required_or_403('scipost.change_list', (List, 'id', 'list_id')) -def list_add_element(request, list_id, type, element_id): - list = get_object_or_404(List, pk=list_id) - if type == 'C': - commentary = get_object_or_404(Commentary, pk=element_id) - list.commentaries.add(commentary) - elif type == 'S': - submission = get_object_or_404(Submission, pk=element_id) - list.submissions.add(submission) - elif type == 'T': - thesislink = get_object_or_404(ThesisLink, pk=element_id) - list.thesislinks.add(thesislink) - elif type == 'c': - comment = get_object_or_404(Comment, pk=element_id) - list.comments.add(comment) - return redirect(reverse('scipost:list', kwargs={'list_id': list_id})) - - -@permission_required_or_403('scipost.change_list', (List, 'id', 'list_id')) -def list_remove_element(request, list_id, type, element_id): - list = get_object_or_404(List, pk=list_id) - if type == 'C': - commentary = get_object_or_404(Commentary, pk=element_id) - list.commentaries.remove(commentary) - elif type == 'S': - submission = get_object_or_404(Submission, pk=element_id) - list.submissions.remove(submission) - elif type == 'T': - thesislink = get_object_or_404(ThesisLink, pk=element_id) - list.thesislinks.remove(thesislink) - elif type == 'c': - comment = get_object_or_404(Comment, pk=element_id) - list.comments.remove(comment) - return redirect(reverse('scipost:list', kwargs={'list_id': list_id})) - - -######### -# Teams # -######### - -@permission_required('scipost.add_team', return_403=True) -def create_team(request): - if request.method == "POST": - create_team_form = CreateTeamForm(request.POST) - if create_team_form.is_valid(): - newteam = Team(leader=request.user.contributor, - name=create_team_form.cleaned_data['name'], - established=timezone.now()) - newteam.save() - assign_perm('scipost.change_team', request.user, newteam) - assign_perm('scipost.view_team', request.user, newteam) - assign_perm('scipost.delete_team', request.user, newteam) - return redirect(reverse('scipost:add_team_member', kwargs={'team_id': newteam.id})) - else: - create_team_form = CreateTeamForm() - add_team_member_form = AddTeamMemberForm() - context = {'create_team_form': create_team_form, - 'add_team_member_form': add_team_member_form} - return render(request, 'scipost/create_team.html', context) - - -@permission_required_or_403('scipost.change_team', (Team, 'id', 'team_id')) -def add_team_member(request, team_id, contributor_id=None): - team = get_object_or_404(Team, pk=team_id) - contributors_found = None - if contributor_id is not None: - contributor = get_object_or_404(Contributor, pk=contributor_id) - team.members.add(contributor) - team.save() - assign_perm('scipost.view_team', contributor.user, team) - return redirect(reverse('scipost:add_team_member', kwargs={'team_id': team_id})) - if request.method == "POST": - add_team_member_form = AddTeamMemberForm(request.POST) - if add_team_member_form.is_valid(): - contributors_found = Contributor.objects.filter( - user__last_name__icontains=add_team_member_form.cleaned_data['last_name']) - else: - add_team_member_form = AddTeamMemberForm() - context = {'team': team, 'add_team_member_form': add_team_member_form, - 'contributors_found': contributors_found} - return render(request, 'scipost/add_team_member.html', context) - - -########## -# Graphs # -########## - -@permission_required('scipost.add_graph', return_403=True) -def create_graph(request): - graphcreated = False - message = None - if request.method == "POST": - create_graph_form = CreateGraphForm(request.POST) - if create_graph_form.is_valid(): - newgraph = Graph(owner=request.user.contributor, - title=create_graph_form.cleaned_data['title'], - description=create_graph_form.cleaned_data['description'], - private=create_graph_form.cleaned_data['private'], - created=timezone.now()) - newgraph.save() - assign_perm('scipost.change_graph', request.user, newgraph) - assign_perm('scipost.view_graph', request.user, newgraph) - assign_perm('scipost.delete_graph', request.user, newgraph) - graphcreated = True - message = ('Graph ' + create_graph_form.cleaned_data['title'] - + ' was successfully created.') - else: - create_graph_form = CreateGraphForm() - context = {'create_graph_form': create_graph_form, 'graphcreated': graphcreated, - 'message': message} - return render(request, 'scipost/create_graph.html', context) - - -@permission_required_or_403('scipost.view_graph', (Graph, 'id', 'graph_id')) -def graph(request, graph_id): - graph = get_object_or_404(Graph, pk=graph_id) - nodes = Node.objects.filter(graph=graph) - if request.method == "POST": - attach_teams_form = ManageTeamsForm(request.POST, - contributor=request.user.contributor, - initial={ - 'teams_with_access': graph.teams_with_access.all()} - ) - create_node_form = CreateNodeForm(request.POST) - create_arc_form = CreateArcForm(request.POST, graph=graph) - if attach_teams_form.has_changed() and attach_teams_form.is_valid(): - graph.teams_with_access = attach_teams_form.cleaned_data['teams_with_access'] - graph.save() - elif create_node_form.has_changed() and create_node_form.is_valid(): - newnode = Node(graph=graph, - added_by=request.user.contributor, - created=timezone.now(), - name=create_node_form.cleaned_data['name'], - description=create_node_form.cleaned_data['description']) - newnode.save() - elif create_arc_form.has_changed() and create_arc_form.is_valid(): - sourcenode = create_arc_form.cleaned_data['source'] - targetnode = create_arc_form.cleaned_data['target'] - if sourcenode != targetnode: - newarc = Arc(graph=graph, - added_by=request.user.contributor, - created=timezone.now(), - source=sourcenode, - target=targetnode, - length=create_arc_form.cleaned_data['length'] - ) - newarc.save() - else: - attach_teams_form = ManageTeamsForm(contributor=request.user.contributor, - initial={ - 'teams_with_access': graph.teams_with_access.all()} - ) - create_node_form = CreateNodeForm() - create_arc_form = CreateArcForm(graph=graph) - context = {'graph': graph, 'nodes': nodes, - 'attach_teams_form': attach_teams_form, - 'create_node_form': create_node_form, - 'create_arc_form': create_arc_form} - return render(request, 'scipost/graph.html', context) - - -def edit_graph_node(request, node_id): - node = get_object_or_404(Node, pk=node_id) - errormessage = '' - if not request.user.has_perm('scipost.change_graph', node.graph): - errormessage = 'You do not have permission to edit this graph.' - elif request.method == "POST": - edit_node_form = CreateNodeForm(request.POST, instance=node) - if edit_node_form.is_valid(): - node.name = edit_node_form.cleaned_data['name'] - node.description = edit_node_form.cleaned_data['description'] - node.save() - create_node_form = CreateNodeForm() - create_arc_form = CreateArcForm(graph=node.graph) - context = {'create_node_form': create_node_form, - 'create_arc_form': create_arc_form} - return redirect(reverse('scipost:graph', kwargs={'graph_id': node.graph.id}), context) - else: - edit_node_form = CreateNodeForm(instance=node) - context = {'graph': graph, 'node': node, 'edit_node_form': edit_node_form, - 'errormessage': errormessage} - return render(request, 'scipost/edit_graph_node.html', context) - - -def delete_graph_node(request, node_id): - node = get_object_or_404(Node, pk=node_id) - if not request.user.has_perm('scipost.change_graph', node.graph): - raise PermissionDenied - else: - # Remove all the graph arcs - Arc.objects.filter(source=node).delete() - Arc.objects.filter(target=node).delete() - # Delete node itself - node.delete() - return redirect(reverse('scipost:graph', kwargs={'graph_id': node.graph.id})) - - -@permission_required_or_403('scipost.view_graph', (Graph, 'id', 'graph_id')) -def api_graph(request, graph_id): - """ Produce JSON data to plot graph """ - graph = get_object_or_404(Graph, pk=graph_id) - nodes = Node.objects.filter(graph=graph) - arcs = Arc.objects.filter(graph=graph) - nodesjson = [] - arcsjson = [] - - for node in nodes: - nodesjson.append({'name': node.name, 'id': node.id}) - - for arc in arcs: - arcsjson.append({'id': arc.id, - 'source': arc.source.name, 'source_id': arc.source.id, - 'target': arc.target.name, 'target_id': arc.target.id, - 'length': arc.length}) - return JsonResponse({'nodes': nodesjson, 'arcs': arcsjson}, safe=False) - +# +# @login_required +# @permission_required('scipost.can_attend_VGMs', return_403=True) +# def VGMs(request): +# VGM_list = VGM.objects.all().order_by('start_date') +# context = {'VGM_list': VGM_list} +# return render(request, 'scipost/VGMs.html', context) +# +# +# @login_required +# @permission_required('scipost.can_attend_VGMs', return_403=True) +# def VGM_detail(request, VGM_id): +# VGM_instance = get_object_or_404(VGM, id=VGM_id) +# VGM_information = Template(VGM_instance.information).render(Context({})) +# feedback_received = Feedback.objects.filter(VGM=VGM_instance).order_by('date') +# feedback_form = FeedbackForm() +# current_Fellows = Contributor.objects.filter( +# user__groups__name='Editorial College').order_by('user__last_name') +# sent_inv_Fellows = RegistrationInvitation.objects.filter( +# invitation_type='F', responded=False) +# pending_inv_Fellows = sent_inv_Fellows.filter(declined=False).order_by('last_name') +# declined_inv_Fellows = sent_inv_Fellows.filter(declined=True).order_by('last_name') +# nomination_form = NominationForm() +# nominations = Nomination.objects.filter(accepted=None).order_by('last_name') +# motion_form = MotionForm() +# remark_form = RemarkForm() +# context = { +# 'VGM': VGM_instance, +# 'VGM_information': VGM_information, +# 'feedback_received': feedback_received, +# 'feedback_form': feedback_form, +# 'current_Fellows': current_Fellows, +# 'pending_inv_Fellows': pending_inv_Fellows, +# 'declined_inv_Fellows': declined_inv_Fellows, +# 'nominations': nominations, +# 'nomination_form': nomination_form, +# 'motion_categories_dict': motion_categories_dict, +# 'motion_form': motion_form, +# 'remark_form': remark_form, +# } +# return render(request, 'scipost/VGM_detail.html', context) +# +# +# @login_required +# @permission_required('scipost.can_attend_VGMs', return_403=True) +# def feedback(request, VGM_id=None): +# if request.method == 'POST': +# feedback_form = FeedbackForm(request.POST) +# if feedback_form.is_valid(): +# feedback = Feedback(by=request.user.contributor, +# date=timezone.now().date(), +# feedback=feedback_form.cleaned_data['feedback'],) +# if VGM_id: +# VGM_instance = get_object_or_404(VGM, id=VGM_id) +# feedback.VGM = VGM_instance +# feedback.save() +# ack_message = 'Your feedback has been received.' +# context = {'ack_message': ack_message} +# if VGM_id: +# context['followup_message'] = 'Return to the ' +# context['followup_link'] = reverse('scipost:VGM_detail', +# kwargs={'VGM_id': VGM_id}) +# context['followup_link_label'] = 'VGM page' +# return render(request, 'scipost/acknowledgement.html', context) +# else: +# errormessage = 'The form was not filled properly.' +# return render(request, 'scipost/error.html', {'errormessage': errormessage}) +# else: +# errormessage = 'This view can only be posted to.' +# return render(request, 'scipost/error.html', {'errormessage': errormessage}) +# +# +# @login_required +# @permission_required('scipost.can_attend_VGMs', raise_exception=True) +# def add_remark_on_feedback(request, VGM_id, feedback_id): +# # contributor = request.user.contributor +# feedback = get_object_or_404(Feedback, pk=feedback_id) +# if request.method == 'POST': +# remark_form = RemarkForm(request.POST) +# if remark_form.is_valid(): +# remark = Remark(contributor=request.user.contributor, +# feedback=feedback, +# date=timezone.now(), +# remark=remark_form.cleaned_data['remark']) +# remark.save() +# return HttpResponseRedirect('/VGM/' + str(VGM_id) + +# '/#feedback_id' + str(feedback.id)) +# else: +# errormessage = 'The form was invalidly filled.' +# return render(request, 'scipost/error.html', {'errormessage': errormessage}) +# else: +# errormessage = 'This view can only be posted to.' +# return render(request, 'scipost/error.html', {'errormessage': errormessage}) +# +# +# @login_required +# @permission_required('scipost.can_attend_VGMs', return_403=True) +# def nominate_Fellow(request, VGM_id): +# VGM_instance = get_object_or_404(VGM, id=VGM_id) +# if request.method == 'POST': +# nomination_form = NominationForm(request.POST) +# if nomination_form.is_valid(): +# nomination = Nomination( +# VGM=VGM_instance, +# by=request.user.contributor, +# date=timezone.now().date(), +# first_name=nomination_form.cleaned_data['first_name'], +# last_name=nomination_form.cleaned_data['last_name'], +# discipline=nomination_form.cleaned_data['discipline'], +# expertises=nomination_form.cleaned_data['expertises'], +# webpage=nomination_form.cleaned_data['webpage'], +# voting_deadline=VGM_instance.end_date + datetime.timedelta(days=7), +# ) +# nomination.save() +# nomination.update_votes(request.user.contributor.id, 'A') +# ack_message = 'The nomination has been registered.' +# context = {'ack_message': ack_message, +# 'followup_message': 'Return to the ', +# 'followup_link': reverse('scipost:VGM_detail', kwargs={'VGM_id': VGM_id}), +# 'followup_link_label': 'VGM page'} +# return render(request, 'scipost/acknowledgement.html', context) +# else: +# errormessage = 'The form was not filled properly.' +# return render(request, 'scipost/error.html', {'errormessage': errormessage}) +# else: +# errormessage = 'This view can only be posted to.' +# return render(request, 'scipost/error.html', {'errormessage': errormessage}) +# +# +# @login_required +# @permission_required('scipost.can_attend_VGMs', raise_exception=True) +# def add_remark_on_nomination(request, VGM_id, nomination_id): +# # contributor = request.user.contributor +# nomination = get_object_or_404(Nomination, pk=nomination_id) +# if request.method == 'POST': +# remark_form = RemarkForm(request.POST) +# if remark_form.is_valid(): +# remark = Remark(contributor=request.user.contributor, +# nomination=nomination, +# date=timezone.now(), +# remark=remark_form.cleaned_data['remark']) +# remark.save() +# return HttpResponseRedirect('/VGM/' + str(VGM_id) + +# '/#nomination_id' + str(nomination.id)) +# else: +# errormessage = 'The form was invalidly filled.' +# return render(request, 'scipost/error.html', {'errormessage': errormessage}) +# else: +# errormessage = 'This view can only be posted to.' +# return render(request, 'scipost/error.html', {'errormessage': errormessage}) +# +# +# @login_required +# @permission_required('scipost.can_attend_VGMs', raise_exception=True) +# def vote_on_nomination(request, nomination_id, vote): +# contributor = request.user.contributor +# nomination = get_object_or_404(Nomination, pk=nomination_id) +# if timezone.now() > nomination.voting_deadline: +# errormessage = 'The voting deadline on this nomination has passed.' +# return render(request, 'scipost/error.html', {'errormessage': errormessage}) +# nomination.update_votes(contributor.id, vote) +# return HttpResponseRedirect('/VGM/' + str(nomination.VGM.id) + +# '/#nomination_id' + str(nomination.id)) +# +# +# @login_required +# @permission_required('scipost.can_attend_VGMs', return_403=True) +# def put_motion_forward(request, VGM_id): +# VGM_instance = get_object_or_404(VGM, id=VGM_id) +# if timezone.now().date() > VGM_instance.end_date: +# errormessage = 'This VGM has ended. No new motions can be put forward.' +# return render(request, 'scipost/error.html', {'errormessage': errormessage}) +# if request.method == 'POST': +# motion_form = MotionForm(request.POST) +# if motion_form.is_valid(): +# motion = Motion( +# category=motion_form.cleaned_data['category'], +# VGM=VGM_instance, +# background=motion_form.cleaned_data['background'], +# motion=motion_form.cleaned_data['motion'], +# put_forward_by=request.user.contributor, +# date=timezone.now().date(), +# voting_deadline=VGM_instance.end_date + datetime.timedelta(days=7), +# ) +# motion.save() +# motion.update_votes(request.user.contributor.id, 'A') +# ack_message = 'Your motion has been registered.' +# context = {'ack_message': ack_message, +# 'followup_message': 'Return to the ', +# 'followup_link': reverse('scipost:VGM_detail', kwargs={'VGM_id': VGM_id}), +# 'followup_link_label': 'VGM page'} +# return render(request, 'scipost/acknowledgement.html', context) +# else: +# errormessage = 'The form was not filled properly.' +# return render(request, 'scipost/error.html', {'errormessage': errormessage}) +# else: +# errormessage = 'This view can only be posted to.' +# return render(request, 'scipost/error.html', {'errormessage': errormessage}) +# +# +# @login_required +# @permission_required('scipost.can_attend_VGMs', raise_exception=True) +# def add_remark_on_motion(request, motion_id): +# # contributor = request.user.contributor +# motion = get_object_or_404(Motion, pk=motion_id) +# if request.method == 'POST': +# remark_form = RemarkForm(request.POST) +# if remark_form.is_valid(): +# remark = Remark(contributor=request.user.contributor, +# motion=motion, +# date=timezone.now(), +# remark=remark_form.cleaned_data['remark']) +# remark.save() +# return HttpResponseRedirect('/VGM/' + str(motion.VGM.id) + +# '/#motion_id' + str(motion.id)) +# else: +# errormessage = 'The form was invalidly filled.' +# return render(request, 'scipost/error.html', {'errormessage': errormessage}) +# else: +# errormessage = 'This view can only be posted to.' +# return render(request, 'scipost/error.html', {'errormessage': errormessage}) +# +# +# @login_required +# @permission_required('scipost.can_attend_VGMs', raise_exception=True) +# def vote_on_motion(request, motion_id, vote): +# contributor = request.user.contributor +# motion = get_object_or_404(Motion, pk=motion_id) +# if timezone.now() > motion.voting_deadline: +# errormessage = 'The voting deadline on this motion has passed.' +# return render(request, 'scipost/error.html', {'errormessage': errormessage}) +# motion.update_votes(contributor.id, vote) +# return HttpResponseRedirect('/VGM/' + str(motion.VGM.id) + +# '/#motion_id' + str(motion.id)) +# ############################# # Supporting Partners Board # @@ -2031,3 +1753,9 @@ def SPB_membership_request(request): 'SP_form': SP_form, 'membership_form': membership_form, } return render(request, 'scipost/SPB_membership_request.html', context) + + +class AboutView(ListView): + model = EditorialCollege + template_name = 'scipost/about.html' + queryset = EditorialCollege.objects.prefetch_related('member') diff --git a/submissions/migrations/0030_auto_20170313_1643.py b/submissions/migrations/0030_auto_20170313_1643.py new file mode 100644 index 0000000000000000000000000000000000000000..efe09bb63ba9a8c5faada45bf663b180cd5b0b02 --- /dev/null +++ b/submissions/migrations/0030_auto_20170313_1643.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.3 on 2017-03-13 15:43 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('submissions', '0029_auto_20170131_1425'), + ] + + operations = [ + migrations.AlterField( + model_name='report', + name='submission', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reports', to='submissions.Submission'), + ), + ] diff --git a/submissions/views.py b/submissions/views.py index 553e344673c0f4b4ddcf79b1c25bf4d19b2c8cc3..e3edda4495e5da2776d546a26cb9940a3e52150b 100644 --- a/submissions/views.py +++ b/submissions/views.py @@ -291,7 +291,7 @@ def submission_detail(request, arxiv_identifier_w_vn_nr): form = CommentForm() - reports = submission.reports.prefetch_related('reports') + reports = submission.reports.all() try: author_replies = Comment.objects.filter(submission=submission, is_author_reply=True, diff --git a/virtualmeetings/urls.py b/virtualmeetings/urls.py index 556a7eb2b1e4dca34f7330c19ab6779aaac8a080..3a83c873c8df2e5747441ea9a6a7c2d00390e4b8 100644 --- a/virtualmeetings/urls.py +++ b/virtualmeetings/urls.py @@ -1,6 +1,4 @@ - -from django.conf.urls import include, url -from django.views.generic import TemplateView +from django.conf.urls import url from . import views