diff --git a/journals/models/publication.py b/journals/models/publication.py index d7a254f1575a24aa79598bd65bc58dd97424c6aa..93620907075eed41e9bbb30b690ac0f95112cbe2 100644 --- a/journals/models/publication.py +++ b/journals/models/publication.py @@ -359,11 +359,6 @@ class Publication(models.Model): else: return 0 - def get_similar_publications(self): - """Return 4 Publications with same subject area.""" - return Publication.objects.published().filter( - subject_area=self.subject_area).exclude(id=self.id)[:4] - def get_issue_related_publications(self): """Return 4 Publications within same Issue.""" return Publication.objects.published().filter( diff --git a/journals/templates/partials/journals/publication_li_content.html b/journals/templates/partials/journals/publication_li_content.html index 35e052b23a0101efacf99adf877b46e06c37eb0c..505dde17df870f7bbbe04661f19709391ec35821 100644 --- a/journals/templates/partials/journals/publication_li_content.html +++ b/journals/templates/partials/journals/publication_li_content.html @@ -1,5 +1,11 @@ <div class="li publication"> - <h5 class="subject"><a href="{% url 'journals:publications' %}?subject={{ publication.subject_area }}" class="muted-link">{{ publication.get_subject_area_display }}</a></h5> + <h5 class="subject"> + <a href="{% url 'journals:publications' %}?field={{ publication.acad_field.slug }}" class="muted-link">{{ publication.acad_field }}</a>: + {% for specialty in publication.specialties.all %} + <a href="{% url 'journals:publications' %}?specialty={{ specialty.slug }}" class="muted-link">{{ specialty }}</a> + {% if not forloop.last %}<strong> • </strong>{% endif %} + {% endfor %} + </h5> <h3 class="title"><a href="{{ publication.get_absolute_url }}">{{ publication.title }}</a></h3> <p class="authors">{{ publication.author_list }}</p> diff --git a/ontology/models/branch.py b/ontology/models/branch.py index 9fe4b56796052178f76f09827e729622b18f62c4..34db6ca1ebd85fbf6018c36bb54d3b9c1ac360b6 100644 --- a/ontology/models/branch.py +++ b/ontology/models/branch.py @@ -5,6 +5,7 @@ __license__ = "AGPL v3" from django.db import models from journals.models import Journal +from submissions.models import Submission class Branch(models.Model): @@ -37,3 +38,7 @@ class Branch(models.Model): @property def journals(self): return Journal.objects.filter(college__acad_field__branch=self.id) + + @property + def submissions(self): + return Submission.objects.public_newest().filter(acad_field__branch=self.id) diff --git a/scipost/models.py b/scipost/models.py index fffbb902bf9e3b43de41651cfabc7dd4dcd3e209..054bbbb7e9b6f38773fe8d1ca4c1fb64016dbd43 100644 --- a/scipost/models.py +++ b/scipost/models.py @@ -158,12 +158,6 @@ class Contributor(models.Model): self.activation_key = hashlib.sha1(salt + feed).hexdigest() self.key_expires = timezone.now() + datetime.timedelta(days=2) - def expertises_as_string(self): - """Return joined expertises.""" - if self.expertises: - return ', '.join([subject_areas_dict[exp].lower() for exp in self.expertises]) - return '' - def conflict_of_interests(self): if not self.profile: return ConflictOfInterest.objects.none() diff --git a/scipost/templates/scipost/navbar.html b/scipost/templates/scipost/navbar.html index 780e0f187ceb0db2323e5b6b210ca3d5d12243ec..5e41387a1dcfd64d3ad23adb03fdfd9da2f3d760 100644 --- a/scipost/templates/scipost/navbar.html +++ b/scipost/templates/scipost/navbar.html @@ -86,44 +86,32 @@ </div> </div> <div class="dropdown-divider"></div> - <span class="dropdown-item dropdown-headline"><strong>Physics</strong></span> - <div class="row"> - <div class="col-md-6"> - <div class="dropdown-item"><a href="{% url 'submissions:submissions' %}?subject_area=Phys:AE">Atomic, Molecular and Optical Physics - Experiment</a> <i class="fa fa-angle-right" aria-hidden="true"></i></div> - - <div class="dropdown-item"><a href="{% url 'submissions:submissions' %}?subject_area=Phys:AT">Atomic, Molecular and Optical Physics - Theory</a> <i class="fa fa-angle-right" aria-hidden="true"></i></div> - - <div class="dropdown-item"><a href="{% url 'submissions:submissions' %}?subject_area=Phys:BI">Biophysics</a> <i class="fa fa-angle-right" aria-hidden="true"></i></div> - - <div class="dropdown-item"><a href="{% url 'submissions:submissions' %}?subject_area=Phys:CE">Condensed Matter Physics - Experiment</a> <i class="fa fa-angle-right" aria-hidden="true"></i></div> - - <div class="dropdown-item"><a href="{% url 'submissions:submissions' %}?subject_area=Phys:CT">Condensed Matter Physics - Theory</a> <i class="fa fa-angle-right" aria-hidden="true"></i></div> - - <div class="dropdown-item"><a href="{% url 'submissions:submissions' %}?subject_area=Phys:CC">Condensed Matter Physics - Computational</a> <i class="fa fa-angle-right" aria-hidden="true"></i></div> - - <div class="dropdown-item"><a href="{% url 'submissions:submissions' %}?subject_area=Phys:FD">Fluid Dynamics</a> <i class="fa fa-angle-right" aria-hidden="true"></i></div> - - <div class="dropdown-item"><a href="{% url 'submissions:submissions' %}?subject_area=Phys:GR">Gravitation, Cosmology and Astroparticle Physics</a> <i class="fa fa-angle-right" aria-hidden="true"></i></div> - </div> - <div class="col-md-6"> - <div class="dropdown-item"><a href="{% url 'submissions:submissions' %}?subject_area=Phys:HE">High-Energy Physics - Experiment</a> <i class="fa fa-angle-right" aria-hidden="true"></i></div> - - <div class="dropdown-item"><a href="{% url 'submissions:submissions' %}?subject_area=Phys:HT">High-Energy Physics - Theory</a> <i class="fa fa-angle-right" aria-hidden="true"></i></div> - - <div class="dropdown-item"><a href="{% url 'submissions:submissions' %}?subject_area=Phys:HP">High-Energy Physics - Phenomenology</a> <i class="fa fa-angle-right" aria-hidden="true"></i></div> - - <div class="dropdown-item"><a href="{% url 'submissions:submissions' %}?subject_area=Phys:MP">Mathematical Physics</a> <i class="fa fa-angle-right" aria-hidden="true"></i></div> - - <div class="dropdown-item"><a href="{% url 'submissions:submissions' %}?subject_area=Phys:NE">Nuclear Physics - Experiment</a> <i class="fa fa-angle-right" aria-hidden="true"></i></div> - - <div class="dropdown-item"><a href="{% url 'submissions:submissions' %}?subject_area=Phys:NT">Nuclear Physics - Theory</a> <i class="fa fa-angle-right" aria-hidden="true"></i></div> - - <div class="dropdown-item"><a href="{% url 'submissions:submissions' %}?subject_area=Phys:QP">Quantum Physics</a> <i class="fa fa-angle-right" aria-hidden="true"></i></div> - - <div class="dropdown-item"><a href="{% url 'submissions:submissions' %}?subject_area=Phys:SM">Statistical and Soft Matter Physics</a> <i class="fa fa-angle-right" aria-hidden="true"></i></div> - </div> - - </div> + <table class="table table-bordered table-secondary"> + <thead class="thead-dark"> + <tr> + <th class="px-2 py-1"><small>Branch of Science</small></th> + <th class="px-2 py-1"><small>Fields <em>(click to see field-specific detailed list)</em></small></th> + </tr> + </thead> + <tbody> + {% for branch in branches %} + {% if branch.submissions.all|length > 0 %} + <tr> + <td class="align-middle"> + <small>{{ branch.name }}</small> + </td> + <td> + {% for acad_field in branch.academic_fields.all %} + {% if acad_field.submissions.all|length > 0 %} + <a href={% url 'submissions:submissions' %}?field={{ acad_field.slug }} class="btn btn-primary btn-sm"><small>{{ acad_field.name }}</small></a> + {% endif %} + {% endfor %} + </td> + </tr> + {% endif %} + {% endfor %} + </tbody> + </table> </div> </li> diff --git a/submissions/factories.py b/submissions/factories.py index 0c8dd0b897be31f41267de68dda0a5144ac6f3b2..f4bb7a0df88eea6ed469d04c937845fd4f6355b2 100644 --- a/submissions/factories.py +++ b/submissions/factories.py @@ -7,10 +7,11 @@ import pytz import random from comments.factories import SubmissionCommentFactory -from scipost.constants import SCIPOST_SUBJECT_AREAS, SCIPOST_APPROACHES +from scipost.constants import SCIPOST_APPROACHES from scipost.models import Contributor from journals.models import Journal from common.helpers import random_scipost_report_doi_label +from ontology.models import Specialty from .constants import ( STATUS_UNASSIGNED, STATUS_EIC_ASSIGNED, STATUS_INCOMING, STATUS_PUBLISHED, @@ -32,7 +33,7 @@ class SubmissionFactory(factory.django.DjangoModelFactory): title = factory.Faker('sentence') abstract = factory.Faker('paragraph', nb_sentences=10) list_of_changes = factory.Faker('paragraph', nb_sentences=10) - subject_area = factory.Iterator(SCIPOST_SUBJECT_AREAS[0][1], getter=lambda c: c[0]) + acad_field = factory.SubFactory('ontology.factories.AcademicFieldFactory') approaches = factory.Iterator(SCIPOST_APPROACHES, getter=lambda c: [c[0],]) abstract = factory.Faker('paragraph') author_comments = factory.Faker('paragraph') @@ -55,8 +56,16 @@ class SubmissionFactory(factory.django.DjangoModelFactory): if Journal.objects.count() < 3: from journals.factories import JournalFactory JournalFactory.create_batch(3) + if Specialty.objects.count() < 5: + from ontology.factories import SpecialtyFactory + SpecialtyFactory.create_batch(5) return super().create(**kwargs) + @factory.post_generation + def add_specialties(self, create, extracted, **kwargs): + if create: + self.specialties.set(Specialty.objects.order_by('?')[:3]) + @factory.post_generation def contributors(self, create, extracted, **kwargs): contribs = Contributor.objects.all() @@ -160,7 +169,8 @@ class ResubmittedSubmissionFactory(EICassignedSubmissionFactory): self.editor_in_charge = submission.editor_in_charge self.submitted_to = submission.submitted_to self.title = submission.title - self.subject_area = submission.subject_area + self.acad_field = submission.acad_field + self.specialties = submission.specialties self.approaches = submission.approaches self.title = submission.title self.authors.set(self.authors.all()) @@ -212,7 +222,8 @@ class ResubmissionFactory(EICassignedSubmissionFactory): self.editor_in_charge = submission.editor_in_charge self.submitted_to = submission.submitted_to self.title = submission.title - self.subject_area = submission.subject_area + self.acad_field = submission.acad_field + self.specialties = submission.specialties self.approaches = submission.approaches self.title = submission.title self.authors.set(self.authors.all()) diff --git a/submissions/templates/partials/submissions/pool/submission_info_table_extended.html b/submissions/templates/partials/submissions/pool/submission_info_table_extended.html index 2173d7df63bef44f16a47cc1cf343b4425adf756..adf3ffe8e535b7e53c4475f937e47e64e5b016bd 100644 --- a/submissions/templates/partials/submissions/pool/submission_info_table_extended.html +++ b/submissions/templates/partials/submissions/pool/submission_info_table_extended.html @@ -8,7 +8,7 @@ <td>As Contributors</td> <td> {% for author in submission.authors.all %} - {% if not forloop.first %}<span class="text-blue">·</span> {% endif %}<a href="{% url 'scipost:contributor_info' author.id %}">{{author.user.first_name}} {{author.user.last_name}}</a> + {% if not forloop.first %}<span class="text-blue">·</span> {% endif %}<a href="{% url 'scipost:contributor_info' author.id %}">{{ author.user.first_name }} {{ author.user.last_name }}</a> {% empty %} (none claimed) {% endfor %} @@ -17,12 +17,18 @@ <tr> <td>Submitted by</td> <td> - {{submission.submitted_by.user.first_name}} {{submission.submitted_by.user.last_name}} + {{ submission.submitted_by.user.first_name }} {{ submission.submitted_by.user.last_name }} </td> </tr> <tr> - <td>Subject area</td> - <td>{{submission.get_subject_area_display}}</td> + <td>Specialties</td> + <td> + <ul class="m-0 pl-4"> + {% for specialty in submission.specialties.all %} + <li>{{ specialty }}</li> + {% endfor %} + </ul> + </td> </tr> {% if submission.approaches %} <tr> diff --git a/submissions/templates/partials/submissions/submission_li.html b/submissions/templates/partials/submissions/submission_li.html index 4341d4931fc0fa3ab4806bea482ecf48a28d6f8d..0c904ba9d139221f9e1c81d62f23763dcf7dbf6d 100644 --- a/submissions/templates/partials/submissions/submission_li.html +++ b/submissions/templates/partials/submissions/submission_li.html @@ -1,5 +1,11 @@ <div class="li submission"> - <h5 class="subject"><a href="{% url 'submissions:submissions' %}?subject_area={{ submission.subject_area }}" class="muted-link">{{ submission.get_subject_area_display }}</a></h5> + <h5 class="subject"> + <a href="{% url 'submissions:submissions' %}?field={{ submission.acad_field.slug }}" class="muted-link">{{ submission.acad_field }}</a>: + {% for specialty in submission.specialties.all %} + <a href="{% url 'submissions:submissions' %}?specialty={{ specialty.slug }}" class="muted-link">{{ specialty }}</a> + {% if not forloop.last %}<strong> • </strong>{% endif %} + {% endfor %} + </h5> <h3 class="title"><a href="{{ submission.get_absolute_url }}">{{ submission.title }}</a></h3> <p class="authors">by {{ submission.author_list }}</p> {% block card_footer %}{% endblock %} diff --git a/submissions/tests/test_utils.py b/submissions/tests/test_utils.py index c86e5998b50e5effce04d9244f3defd8b171ae32..06449e8b2116f2360bcb992b0e1640fe8dca6f49 100644 --- a/submissions/tests/test_utils.py +++ b/submissions/tests/test_utils.py @@ -18,8 +18,6 @@ from ..factories import UnassignedSubmissionFactory, ResubmissionFactory # NOTED AS BROKEN 2019-11-08 -# factory.errors.InvalidDeclarationError: Received deep context for unknown fields: {'dates__submission': datetime.date(2019, 11, 8)} (known=['abstract', 'approaches', 'author_comments', 'author_list', 'is_current', 'latest_activity', 'list_of_changes', 'preprint', 'remarks_for_editors', 'status', 'subject_area', 'submission_date', 'submitted_by', 'submitted_to', 'thread_hash', 'title']) - # class TestDefaultSubmissionCycle(TestCase): # """Test all steps in the Submission default cycle.""" @@ -65,7 +63,6 @@ from ..factories import UnassignedSubmissionFactory, ResubmissionFactory # NOTED AS BROKEN 2019-11-08 -# factory.errors.InvalidDeclarationError: Received deep context for unknown fields: {'dates__submission': datetime.date(2019, 11, 8)} (known=['abstract', 'approaches', 'author_comments', 'author_list', 'editor_in_charge', 'is_current', 'latest_activity', 'list_of_changes', 'open_for_commenting', 'open_for_reporting', 'preprint', 'remarks_for_editors', 'status', 'subject_area', 'submission_date', 'submitted_by', 'submitted_to', 'thread_hash', 'title', 'vn_nr']) # class TestResubmissionSubmissionCycle(TestCase): # ''' # This TestCase should act as a master test to check all steps in the @@ -106,7 +103,6 @@ from ..factories import UnassignedSubmissionFactory, ResubmissionFactory # NOTED AS BROKEN 2019-11-08 -# factory.errors.InvalidDeclarationError: Received deep context for unknown fields: {'dates__submission': datetime.date(2019, 11, 8)} (known=['abstract', 'approaches', 'author_comments', 'author_list', 'editor_in_charge', 'is_current', 'latest_activity', 'list_of_changes', 'open_for_commenting', 'open_for_reporting', 'preprint', 'refereeing_cycle', 'remarks_for_editors', 'status', 'subject_area', 'submission_date', 'submitted_by', 'submitted_to', 'thread_hash', 'title', 'vn_nr']) # class TestResubmissionDirectSubmissionCycle(TestCase): # ''' # This TestCase should act as a master test to check all steps in the diff --git a/submissions/views.py b/submissions/views.py index f7743345d2fd648e0d0d627cd2628d4243e91660..fb0689332c400f35db88739593c77a0f15fc2cde 100644 --- a/submissions/views.py +++ b/submissions/views.py @@ -372,9 +372,12 @@ class SubmissionListView(PaginationMixin, ListView): """Return queryset, filtered with GET request data if given.""" queryset = Submission.objects.public_newest() self.form = self.form(self.request.GET) + if 'field' in self.request.GET: + queryset=queryset.filter(acad_field__slug=self.request.GET['field']) + if 'specialty' in self.request.GET: + queryset=queryset.filter(specialties__slug=self.request.GET['specialty']) if 'to_journal' in self.request.GET: queryset = queryset.filter( - latest_activity__gte=timezone.now() + datetime.timedelta(days=-60), submitted_to__doi_label=self.request.GET['to_journal'] ) elif self.form.is_valid() and self.form.has_changed():