datatracker/ietf/doc/views_stats.py
Jennifer Richards 901fdd8d44
chore: remove newrevisiondocevent stats view (#8210)
* refactor: update node, eslint, neostandard + fix esm (#8083)

* chore: update dependencies

* fix: eslint + neostandard

* fix: add corepack prompt env var to init script

* docs: Update README.md

---------

Co-authored-by: Robert Sparks <rjsparks@nostrum.com>

* chore: remove newrevisiondocevent stats view

Not functional anyway

* chore: fix lint

* chore: remove unused template

* Revert "refactor: update node, eslint, neostandard + fix esm (#8083)"

This reverts commit 649879efd745470f6e0cc6768d889f45640e1505.

---------

Co-authored-by: Nicolas Giard <github@ngpixel.com>
Co-authored-by: Robert Sparks <rjsparks@nostrum.com>
2024-11-14 15:21:48 -06:00

132 lines
4.5 KiB
Python

# Copyright The IETF Trust 2016-2019, All Rights Reserved
import copy
import datetime
from django.conf import settings
from django.db.models.aggregates import Count
from django.db.models.functions import TruncDate
from django.http import JsonResponse
from django.views.decorators.cache import cache_page
import debug # pyflakes:ignore
from ietf.doc.models import DocEvent
from ietf.doc.templatetags.ietf_filters import comma_separated_list
from ietf.name.models import DocTypeName
from ietf.person.models import Person
from ietf.utils.timezone import date_today
epochday = datetime.datetime.utcfromtimestamp(0).date().toordinal()
def dt(s):
"Convert the date string returned by sqlite's date() to a datetime.date"
ys, ms, ds = s.split('-')
return datetime.date(int(ys), int(ms), int(ds))
def model_to_timeline_data(model, field='time', **kwargs):
"""Takes a Django model and a set of queryset filter arguments, and
returns a dictionary with highchart settings and data, suitable as
a JsonResponse() argument. The model must have a DateTimeField field.
If the time field is named something else than 'time', the name must
be supplied."""
assert field in [ f.name for f in model._meta.get_fields() ]
objects = ( model.objects.filter(**kwargs)
.annotate(date=TruncDate(field, tzinfo=datetime.timezone.utc))
.order_by('date')
.values('date')
.annotate(count=Count('id')))
if objects.exists():
obj_list = list(objects)
today = date_today(datetime.timezone.utc)
if not obj_list[-1]['date'] == today:
obj_list += [ {'date': today, 'count': 0} ]
data = [ ((e['date'].toordinal()-epochday)*1000*60*60*24, e['count']) for e in obj_list ]
else:
data = []
return data
def get_doctypes(queryargs, pluralize=False):
doctypes = []
if ( queryargs.get('rfcs') == 'on'
or queryargs.get('activedrafts') == 'on'
or queryargs.get('olddrafts') == 'on'):
if pluralize:
doctypes.append('Internet-Drafts')
else:
doctypes.append('Internet-Draft')
alltypes = DocTypeName.objects.exclude(slug__in='draft').order_by('name');
for doctype in alltypes:
if 'include-' + doctype.slug in queryargs:
name = doctype.name
if pluralize and not name.endswith('s'):
name += 's'
doctypes.append(name)
return comma_separated_list(doctypes)
def make_title(queryargs):
title = 'New '
title += get_doctypes(queryargs).lower()
title += ' revisions'
# radio choices
by = queryargs.get('by')
if by == 'author':
author = queryargs.get('author')
if author:
title += ' with author %s' % author.title()
elif by == "group":
group = queryargs.get('group')
if group:
title += ' for %s' % group.capitalize()
elif by == "area":
area = queryargs.get('area')
if area:
title += ' in %s Area' % area.upper()
elif by == "ad":
ad_id = queryargs.get('ad')
if ad_id:
title += ' with AD %s' % Person.objects.get(id=ad_id)
elif by == "state":
state = queryargs.get('state')
if state:
title += ' in state %s' % state
substate = queryargs.get('substate')
if substate:
title += '::%s' % substate
elif by == "stream":
stream = queryargs.get('stream')
if stream:
title += ' in stream %s' % stream
name = queryargs.get('name')
if name:
title += ' with name matching "%s"' % name
return title
@cache_page(60*15)
def chart_conf_person_drafts(request, id):
person = Person.objects.filter(id=id).first()
if not person:
conf = {}
else:
conf = copy.deepcopy(settings.CHART_TYPE_COLUMN_OPTIONS)
conf['title']['text'] = "New Internet-Draft revisions over time for %s" % person.name
conf['series'][0]['name'] = "Submitted Internet-Drafts"
return JsonResponse(conf)
@cache_page(60*15)
def chart_data_person_drafts(request, id):
person = Person.objects.filter(id=id).first()
if not person:
data = []
else:
data = model_to_timeline_data(DocEvent, doc__documentauthor__person=person, type='new_revision', doc__type_id='draft')
return JsonResponse(data, safe=False)