diff --git a/journals/models.py b/journals/models.py index 0f833006d7d8c69b6f1337fac5f7d0474763e5f2..6acb9abe58f3680807d1526b587a6c4a54119f8c 100644 --- a/journals/models.py +++ b/journals/models.py @@ -2,6 +2,7 @@ from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.models import ContentType from django.contrib.postgres.fields import JSONField from django.db import models +from django.db.models import Avg, F from django.utils import timezone from django.urls import reverse @@ -51,28 +52,27 @@ class Journal(models.Model): def get_abbreviation_citation(self): return journal_name_abbrev_citation(self.name) - def nr_publications(self, Tier=None): + def nr_publications(self, tier=None): pubs = Publication.objects.filter(in_issue__in_volume__in_journal=self) - if Tier: - pubs.filter(accepted_submission__eicrecommendations__recommendation=Tier) + if tier: + pubs = pubs.filter(accepted_submission__eicrecommendations__recommendation=tier) return pubs.count() def avg_processing_duration(self): duration = Publication.objects.filter( in_issue__in_volume__in_journal=self).aggregate( avg=Avg(F('publication_date') - F('submission_date')))['avg'] - if not duration: return 0 - return duration.days + duration.seconds/86400 + return duration.total_seconds() / 86400 - def citation_rate(self, Tier=None): + def citation_rate(self, tier=None): """ Returns the citation rate in units of nr citations per article per year. """ pubs = Publication.objects.filter(in_issue__in_volume__in_journal=self) - if Tier: - pubs.filter(accepted_submission__eicrecommendations__recommendation=Tier) + if tier: + pubs.filter(accepted_submission__eicrecommendations__recommendation=tier) ncites = 0 - deltat = 1 # to avoid division by zero + deltat = 1 # to avoid division by zero for pub in pubs: if pub.citedby and pub.latest_citedby_update: ncites += len(pub.citedby) @@ -98,33 +98,32 @@ class Volume(models.Model): def doi_string(self): return '10.21468/' + self.doi_label - def nr_publications(self, Tier=None): + def nr_publications(self, tier=None): pubs = Publication.objects.filter(in_issue__in_volume=self) - if Tier: - pubs.filter(accepted_submission__eicrecommendations__recommendation=Tier) + if tier: + pubs.filter(accepted_submission__eicrecommendations__recommendation=tier) return pubs.count() def avg_processing_duration(self): duration = Publication.objects.filter( in_issue__in_volume=self).aggregate( avg=Avg(F('publication_date') - F('submission_date')))['avg'] - if not duration: return 0 - return duration.days + duration.seconds/86400 + return duration.total_seconds() / 86400 - def citation_rate(self): + def citation_rate(self, tier=None): """ Returns the citation rate in units of nr citations per article per year. """ pubs = Publication.objects.filter(in_issue__in_volume=self) - if Tier: - pubs.filter(accepted_submission__eicrecommendations__recommendation=Tier) + if tier: + pubs.filter(accepted_submission__eicrecommendations__recommendation=tier) ncites = 0 - deltat = 1 # to avoid division by zero + deltat = 1 # to avoid division by zero for pub in pubs: if pub.citedby and pub.latest_citedby_update: ncites += len(pub.citedby) deltat += (pub.latest_citedby_update.date() - pub.publication_date).days - return (ncites * 365.25/deltat) + return (ncites * 365.25 / deltat) class Issue(models.Model): @@ -177,29 +176,28 @@ class Issue(models.Model): return self.start_date <= timezone.now().date() and\ self.until_date >= timezone.now().date() - def nr_publications(self, Tier=None): - pubs = Publication.objects.filter(in_issue=self) - if Tier: - pubs.filter(accepted_submission__eicrecommendations__recommendation=Tier) - return pubs.count() + def nr_publications(self, tier=None): + publications = Publication.objects.filter(in_issue=self) + if tier: + publications.filter(accepted_submission__eicrecommendations__recommendation=tier) + return publications.count() def avg_processing_duration(self): duration = Publication.objects.filter( in_issue=self).aggregate( avg=Avg(F('publication_date') - F('submission_date')))['avg'] - if not duration: return 0 - return duration.days + duration.seconds/86400 + return duration.total_seconds() / 86400 - def citation_rate(self, Tier=None): + def citation_rate(self, tier=None): """ Returns the citation rate in units of nr citations per article per year. """ - pubs = Publication.objects.filter(in_issue=self) - if Tier: - pubs.filter(accepted_submission__eicrecommendations__recommendation=Tier) + publications = Publication.objects.filter(in_issue=self) + if tier: + publications.filter(accepted_submission__eicrecommendations__recommendation=tier) ncites = 0 - deltat = 1 # to avoid division by zero - for pub in pubs: + deltat = 1 # to avoid division by zero + for pub in publications: if pub.citedby and pub.latest_citedby_update: ncites += len(pub.citedby) deltat += (pub.latest_citedby_update.date() - pub.publication_date).days diff --git a/stats/templates/stats/statistics.html b/stats/templates/stats/statistics.html index 3f02a39811badcda9e139b5828cdd8885e5066d3..7e7b6a7285487e28646c470e953f785e9bcb60a9 100644 --- a/stats/templates/stats/statistics.html +++ b/stats/templates/stats/statistics.html @@ -107,28 +107,28 @@ <tr> {% if issue %} <td>{% issue.doi_label }}</td> - <td>{% nr_publications issue Tier=1 %}</td> - <td>{% nr_publications issue Tier=2 %}</td> - <td>{% nr_publications issue Tier=3 %}</td> - <td>{% citation_rate issue Tier=1 as cr %}{{ cr|floatformat:2 }}</td> - <td>{% citation_rate issue Tier=2 as cr %}{{ cr|floatformat:2 }}</td> - <td>{% citation_rate issue Tier=3 as cr %}{{ cr|floatformat:2 }}</td> + <td>{% nr_publications issue tier=1 %}</td> + <td>{% nr_publications issue tier=2 %}</td> + <td>{% nr_publications issue tier=3 %}</td> + <td>{% citation_rate issue tier=1 as cr %}{{ cr|floatformat:2 }}</td> + <td>{% citation_rate issue tier=2 as cr %}{{ cr|floatformat:2 }}</td> + <td>{% citation_rate issue tier=3 as cr %}{{ cr|floatformat:2 }}</td> {% elif volume %} <td>{{ volume.doi_label }}</td> - <td>{% nr_publications volume Tier=1 %}</td> - <td>{% nr_publications volume Tier=2 %}</td> - <td>{% nr_publications volume Tier=3 %}</td> - <td>{% citation_rate volume Tier=1 as cr %}{{ cr|floatformat:2 }}</td> - <td>{% citation_rate volume Tier=2 as cr %}{{ cr|floatformat:2 }}</td> - <td>{% citation_rate volume Tier=3 as cr %}{{ cr|floatformat:2 }}</td> + <td>{% nr_publications volume tier=1 %}</td> + <td>{% nr_publications volume tier=2 %}</td> + <td>{% nr_publications volume tier=3 %}</td> + <td>{% citation_rate volume tier=1 as cr %}{{ cr|floatformat:2 }}</td> + <td>{% citation_rate volume tier=2 as cr %}{{ cr|floatformat:2 }}</td> + <td>{% citation_rate volume tier=3 as cr %}{{ cr|floatformat:2 }}</td> {% else %} <td>{{ journal.doi_label }}</td> - <td>{% nr_publications journal Tier=1 %}</td> - <td>{% nr_publications journal Tier=2 %}</td> - <td>{% nr_publications journal Tier=3 %}</td> - <td>{% citation_rate journal Tier=1 as cr %}{{ cr|floatformat:2 }}</td> - <td>{% citation_rate journal Tier=2 as cr %}{{ cr|floatformat:2 }}</td> - <td>{% citation_rate journal Tier=3 as cr %}{{ cr|floatformat:2 }}</td> + <td>{% nr_publications journal tier=1 %}</td> + <td>{% nr_publications journal tier=2 %}</td> + <td>{% nr_publications journal tier=3 %}</td> + <td>{% citation_rate journal tier=1 as cr %}{{ cr|floatformat:2 }}</td> + <td>{% citation_rate journal tier=2 as cr %}{{ cr|floatformat:2 }}</td> + <td>{% citation_rate journal tier=3 as cr %}{{ cr|floatformat:2 }}</td> {% endif %} </tr> </table> diff --git a/stats/templatetags/stats_extras.py b/stats/templatetags/stats_extras.py index fb0b8cdf2048b6562b2d9e82258117b021db2f64..335c813cc216907cb5ee9828390e200a42969854 100644 --- a/stats/templatetags/stats_extras.py +++ b/stats/templatetags/stats_extras.py @@ -1,28 +1,21 @@ from django import template -from django.db.models import Avg, F - -from journals.models import Publication -from submissions.constants import SUBMISSION_STATUS_OUT_OF_POOL -from submissions.models import Submission register = template.Library() - @register.simple_tag def avg_processing_duration(obj, *args, **kwargs): - method = getattr(obj, avg_processing_duration) - return method(*args, **kwargs) + return getattr(obj, 'avg_processing_duration')(*args, **kwargs) + @register.simple_tag def nr_publications(obj, *args, **kwargs): - method = getattr(obj, nr_publications) - return method(*args, **kwargs) + return getattr(obj, 'nr_publications')(*args, **kwargs) + @register.simple_tag def citation_rate(obj, *args, **kwargs): - method = getattr(obj, citation_rate) - return method(*args, **kwargs) + return getattr(obj, 'citation_rate')(*args, **kwargs) @register.filter(name='submissions_count_distinct') diff --git a/stats/views.py b/stats/views.py index 11d7bd845e11df31b0c12fc591974163be366f78..dd416c843a34dfa75973cb963d437ddbd601ba5e 100644 --- a/stats/views.py +++ b/stats/views.py @@ -1,10 +1,9 @@ import datetime -from django.contrib.auth.decorators import login_required, permission_required +from django.contrib.auth.decorators import permission_required from django.shortcuts import get_object_or_404, render -from journals.constants import SCIPOST_JOURNALS_SUBMIT -from journals.models import Journal, Volume, Issue, Publication +from journals.models import Journal, Volume, Issue from submissions.models import Submission @@ -19,8 +18,9 @@ def statistics(request, journal_doi_label=None, volume_nr=None, issue_nr=None, y context['journal'] = journal if year: context['year'] = year - submissions = Submission.objects.filter(submitted_to_journal=journal_doi_label - ).originally_submitted(datetime.date(int(year), 1, 1), datetime.date(int(year), 12, 31)) + submissions = Submission.objects.filter( + submitted_to_journal=journal_doi_label).originally_submitted( + datetime.date(int(year), 1, 1), datetime.date(int(year), 12, 31)) context['submissions'] = submissions nr_ref_inv = 0 nr_acc = 0 @@ -29,8 +29,6 @@ def statistics(request, journal_doi_label=None, volume_nr=None, issue_nr=None, y nr_rep_obt = 0 nr_rep_obt_inv = 0 nr_rep_obt_con = 0 - nr_rep_ref = 0 - nr_aw_vet = 0 for submission in submissions: nr_ref_inv += submission.referee_invitations.count() nr_acc += submission.count_accepted_invitations()