SciPost Code Repository

Skip to content
Snippets Groups Projects
Commit 0849ab14 authored by Jorran de Wit's avatar Jorran de Wit
Browse files

Merge branch 'dev_JSC_20180127_stats_tiered'

parents 712c468c 22bcba8d
No related branches found
No related tags found
No related merge requests found
......@@ -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,14 +52,30 @@ class Journal(models.Model):
def get_abbreviation_citation(self):
return journal_name_abbrev_citation(self.name)
def citation_rate(self):
def nr_publications(self, tier=None):
publications = Publication.objects.filter(in_issue__in_volume__in_journal=self)
if tier:
publications = publications.filter(
accepted_submission__eicrecommendations__recommendation=tier)
return publications.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']
return duration.total_seconds() / 86400
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)
publications = Publication.objects.filter(in_issue__in_volume__in_journal=self)
if tier:
publications = 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
......@@ -83,18 +100,34 @@ class Volume(models.Model):
def doi_string(self):
return '10.21468/' + self.doi_label
def citation_rate(self):
def nr_publications(self, tier=None):
publications = Publication.objects.filter(in_issue__in_volume=self)
if tier:
publications = publications.filter(
accepted_submission__eicrecommendations__recommendation=tier)
return publications.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']
return duration.total_seconds() / 86400
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)
publications = Publication.objects.filter(in_issue__in_volume=self)
if tier:
publications = 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
return (ncites * 365.25/deltat)
return (ncites * 365.25 / deltat)
class Issue(models.Model):
......@@ -147,14 +180,30 @@ class Issue(models.Model):
return self.start_date <= timezone.now().date() and\
self.until_date >= timezone.now().date()
def citation_rate(self):
def nr_publications(self, tier=None):
publications = Publication.objects.filter(in_issue=self)
if tier:
publications = 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']
return duration.total_seconds() / 86400
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)
publications = Publication.objects.filter(in_issue=self)
if tier:
publications = 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
......
......@@ -41,78 +41,122 @@
</ul>
{% if journal %}
<h2>Results:</h2>
<table class="table">
<tr>
<th>DOI label</th>
{% if year %}
<th>Year</th>
<th>Nr submissions<br/>(distinct)</th>
<th>Nr submissions<br/>(including resubmissions)</th>
<th>Nr assignment failed</th>
<th>Nr accepted/<br/>published</th>
<th>Nr rejected</th>
<th>Nr withdrawn</th>
{% else %}
<th>Nr publications</th>
<th>Duration average</th>
<th>Citation rate (per paper per year)</ht>
{% endif %}
</tr>
<tr>
{% if issue %}
<td>{{ issue.doi_label }}</td>
<td>{{ issue|issue_nr_publications }}</td>
<td>{{ issue|issue_avg_processing_duration|floatformat:2 }} days</td>
<td>{{ issue|issue_citation_rate|floatformat:2 }}</td>
{% elif volume %}
<td>{{ volume.doi_label }}</td>
<td>{{ volume|volume_nr_publications }}</td>
<td>{{ volume|volume_avg_processing_duration|floatformat:2 }} days</td>
<td>{{ volume|volume_citation_rate|floatformat:2 }}</td>
{% else %}
<td>{{ journal.doi_label }}</td>
{% if year %}
<td>{{ year }}</td>
<td>{{ submissions|submissions_count_distinct }}</td>
<td>{{ submissions|length }}</td>
<td>{{ submissions.assignment_failed.count }}</td>
<td>{{ submissions.accepted.count|add:submissions.published.count }}</td>
<td>{{ submissions.rejected.count }}</td>
<td>{{ submissions.withdrawn.count }}</td>
{% else %}
<td>{{ journal|journal_nr_publications }}</td>
<td>{{ journal|journal_avg_processing_duration|floatformat:2 }} days</td>
<td>{{ journal|journal_citation_rate|floatformat:2 }}</td>
{% endif %}
{% endif %}
</tr>
</table>
<h2>Results:</h2>
<table class="table">
<tr>
<th>DOI label</th>
{% if year %}
<th>Year</th>
<th>Nr submissions<br/>(distinct)</th>
<th>Nr submissions<br/>(including resubmissions)</th>
<th>Nr assignment failed</th>
<th>Nr accepted/<br/>published</th>
<th>Nr rejected</th>
<th>Nr withdrawn</th>
{% else %}
<th>Nr publications</th>
<th>Duration average</th>
<th>Citation rate (per paper per year)</th>
{% endif %}
</tr>
<tr>
{% if issue %}
<td>{{ issue.doi_label }}</td>
<td>{% nr_publications issue %}</td>
<td>{% avg_processing_duration issue as avg %}{{ avg|floatformat:2 }} days</td>
<td>{% citation_rate issue as cr %}{{ cr|floatformat:2 %}</td>
{% elif volume %}
<td>{{ volume.doi_label }}</td>
<td>{% nr_publications volume %}</td>
<td>{% avg_processing_duration volume as avg %}{{ avg|floatformat:2 }} days</td>
<td>{% citation_rate volume as cr %}{{ cr|floatformat:2 }}</td>
{% else %}
<td>{{ journal.doi_label }}</td>
{% if year %}
<h2>Refereeing stats for {{ year }}</h2>
<table class="table">
<tr>
<th>Nr refereeing<br/>invitations</th>
<th>Nr accepted</th>
<th>Nr declined</th>
<th>Nr pending</th>
<th>Nr reports<br/>obtained</th>
<th>Nr obtained<br/>(invited)</th>
<th>Nr obtained<br/>(contributed)</th>
</tr>
<tr>
<td>{{ nr_ref_inv }}</td>
<td>{{ nr_acc }} ({% widthratio nr_acc nr_ref_inv 100 %}&#37;)</td>
<td>{{ nr_dec }} ({% widthratio nr_dec nr_ref_inv 100 %}&#37;)</td>
<td>{{ nr_pen }} ({% widthratio nr_pen nr_ref_inv 100 %}&#37;)</td>
<td>{{ nr_rep_obt }}</td>
<td>{{ nr_rep_obt_inv }} ({% widthratio nr_rep_obt_inv nr_rep_obt 100 %}&#37;)</td>
<td>{{ nr_rep_obt_con }} ({% widthratio nr_rep_obt_con nr_rep_obt 100 %}&#37;)</td>
</tr>
</table>
<td>{{ year }}</td>
<td>{{ submissions|submissions_count_distinct }}</td>
<td>{{ submissions|length }}</td>
<td>{{ submissions.assignment_failed.count }}</td>
<td>{{ submissions.accepted.count|add:submissions.published.count }}</td>
<td>{{ submissions.rejected.count }}</td>
<td>{{ submissions.withdrawn.count }}</td>
{% else %}
<td>{% nr_publications journal %}</td>
<td>{% avg_processing_duration journal as avg %}{{ avg|floatformat:2 }} days</td>
<td>{% citation_rate journal as cr %}{{ cr|floatformat:2 }}</td>
{% endif %}
{% endif %}
</tr>
</table>
<table class="table">
<tr>
<th>DOI label</th>
<th colspan="3">Nr per Tier</th>
<th colspan="3">Citation rate (per paper per year)</th>
</tr>
<tr>
<th></th>
<th>I</th>
<th>II</th>
<th>IIII</th>
<th>I</th>
<th>II</th>
<th>IIII</th>
</tr>
<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>
{% 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>
{% 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>
{% endif %}
</tr>
</table>
{% endif %}
{% if year %}
<h2>Refereeing stats for {{ year }}</h2>
<table class="table">
<tr>
<th>Nr refereeing<br/>invitations</th>
<th>Nr accepted</th>
<th>Nr declined</th>
<th>Nr pending</th>
<th>Nr reports<br/>obtained</th>
<th>Nr obtained<br/>(invited)</th>
<th>Nr obtained<br/>(contributed)</th>
</tr>
<tr>
<td>{{ nr_ref_inv }}</td>
<td>{{ nr_acc }} ({% widthratio nr_acc nr_ref_inv 100 %}&#37;)</td>
<td>{{ nr_dec }} ({% widthratio nr_dec nr_ref_inv 100 %}&#37;)</td>
<td>{{ nr_pen }} ({% widthratio nr_pen nr_ref_inv 100 %}&#37;)</td>
<td>{{ nr_rep_obt }}</td>
<td>{{ nr_rep_obt_inv }} ({% widthratio nr_rep_obt_inv nr_rep_obt 100 %}&#37;)</td>
<td>{{ nr_rep_obt_con }} ({% widthratio nr_rep_obt_con nr_rep_obt 100 %}&#37;)</td>
</tr>
</table>
{% endif %}
{% endblock content %}
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):
return getattr(obj, 'avg_processing_duration')(*args, **kwargs)
@register.simple_tag
def nr_publications(obj, *args, **kwargs):
return getattr(obj, 'nr_publications')(*args, **kwargs)
@register.simple_tag
def citation_rate(obj, *args, **kwargs):
return getattr(obj, 'citation_rate')(*args, **kwargs)
@register.filter(name='submissions_count_distinct')
def submissions_count_distinct(submissions):
......@@ -25,54 +34,3 @@ def journal_publication_years(journal):
if volume.until_date.year not in years:
years.append(volume.until_date.year)
return sorted(years)
@register.filter(name='journal_nr_publications')
def journal_nr_publications(journal):
return Publication.objects.filter(in_issue__in_volume__in_journal=journal).count()
@register.filter(name='journal_avg_processing_duration')
def journal_avg_processing_duration(journal):
duration = Publication.objects.filter(
in_issue__in_volume__in_journal=journal).aggregate(
avg=Avg(F('publication_date') - F('submission_date')))['avg']
if not duration: return 0
return duration.days + duration.seconds/86400
@register.filter(name='journal_citation_rate')
def journal_citation_rate(journal):
return journal.citation_rate()
@register.filter(name='volume_nr_publications')
def volume_nr_publications(volume):
return Publication.objects.filter(in_issue__in_volume=volume).count()
@register.filter(name='volume_avg_processing_duration')
def volume_avg_processing_duration(volume):
duration = Publication.objects.filter(
in_issue__in_volume=volume).aggregate(
avg=Avg(F('publication_date') - F('submission_date')))['avg']
if not duration: return 0
return duration.days + duration.seconds/86400
@register.filter(name='volume_citation_rate')
def volume_citation_rate(volume):
return volume.citation_rate()
@register.filter(name='issue_nr_publications')
def issue_nr_publications(issue):
return Publication.objects.filter(in_issue=issue).count()
@register.filter(name='issue_avg_processing_duration')
def issue_avg_processing_duration(issue):
duration = Publication.objects.filter(
in_issue=issue).aggregate(
avg=Avg(F('publication_date') - F('submission_date')))['avg']
if not duration: return 0
return duration.days + duration.seconds/86400
@register.filter(name='issue_citation_rate')
def issue_citation_rate(issue):
return issue.citation_rate()
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()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment