datatracker/ietf/stats/management/commands/fetch_meeting_attendance.py
Jennifer Richards 6a96a69234
feat: improve / clean up logging (#7591)
* refactor: always use console log handler

* refactor: json for k8s, plain otherwise

* chore: remove syslog from wsgi.py

* chore: remove debug.log()

* chore: drop syslog from settings.py

* refactor: use log.log() in person.utils

* refactor: fetch_meeting_attendance->log.log()

* chore: gunicorn logs as JSON (wip)

* feat: better json log formatting

* refactor: improve log config

* feat: gunicorn access log fields

* fix: remove type hints

The gunicorn logger plays tricks with the
LogRecord args parameter to let it have string
keys instead of being a simple tuple.
The mypy tests rightly flag this. Rather
than fighting the typing, just remove the
hints and leave a comment warning not to
use the gunicorn-specific formatter with
other loggers.
2024-06-26 14:53:05 -05:00

43 lines
1.8 KiB
Python

# Copyright The IETF Trust 2017-2019, All Rights Reserved
# Copyright 2016 IETF Trust
from django.core.management.base import BaseCommand, CommandError
from django.utils import timezone
import debug # pyflakes:ignore
from ietf.meeting.models import Meeting
from ietf.stats.utils import fetch_attendance_from_meetings
from ietf.utils import log
class Command(BaseCommand):
help = "Fetch meeting attendee figures from ietf.org/registration/attendees."
def add_arguments(self, parser):
parser.add_argument("--meeting", help="meeting to fetch data for")
parser.add_argument("--all", action="store_true", help="fetch data for all meetings")
parser.add_argument("--latest", type=int, help="fetch data for latest N meetings")
def handle(self, *args, **options):
self.verbosity = options['verbosity']
meetings = Meeting.objects.none()
if options['meeting']:
meetings = Meeting.objects.filter(number=options['meeting'], type="ietf")
elif options['all']:
meetings = Meeting.objects.filter(type="ietf").order_by("date")
elif options['latest']:
meetings = Meeting.objects.filter(type="ietf", date__lte=timezone.now()).order_by("-date")[:options['latest']]
else:
raise CommandError("Please use one of --meeting, --all or --latest")
for meeting, stats in zip(meetings, fetch_attendance_from_meetings(meetings)):
msg = "Fetched data for meeting {:>3}: {:4d} processed, {:4d} added, {:4d} in table".format(
meeting.number, stats.processed, stats.added, stats.total
)
if self.stdout.isatty():
self.stdout.write(msg+'\n') # make debugging a bit easier
else:
log.log(msg)