"""The Radars (projects/radar.py): collect finished batches, submit what is due. Run from the host's crontab every half hour: docker exec diora-prod python manage.py radar ... radar --setup neuropolitik a project gets a Radar from a preset ... radar --import a digest made elsewhere (also marks its papers seen) """ import json from django.core.management.base import BaseCommand, CommandError from projects import radar from projects.models import Project, Radar from projects.radar_presets import PRESETS class Command(BaseCommand): help = 'Radar: collect finished batches, submit what is due' def add_arguments(self, parser): parser.add_argument('--setup', nargs=2, metavar=('PROJECT', 'PRESET')) parser.add_argument('--import', dest='import_', nargs=2, metavar=('PROJECT', 'FILE')) parser.add_argument('--seen', nargs=2, metavar=('PROJECT', 'FILE'), help='ids reported before (JSON list)') def handle(self, *args, setup=None, import_=None, seen=None, **opts): if setup: p = Project.objects.filter(pk=setup[0]).first() if not p or setup[1] not in PRESETS: raise CommandError('project or preset unknown') r, made = Radar.objects.update_or_create(project=p, defaults={'config': PRESETS[setup[1]]}) self.stdout.write(f"radar {p.id}: {'set up' if made else 'config updated'}") return if import_: r = Radar.objects.get(project_id=import_[0]) with open(import_[1], encoding='utf-8') as f: d = radar.store(r, json.load(f)) self.stdout.write(f'radar {r.project_id}: digest {d.id} ({d.generated})') return if seen: r = Radar.objects.get(project_id=seen[0]) with open(seen[1], encoding='utf-8') as f: ids = json.load(f) r.seen = list(dict.fromkeys(list(r.seen) + list(ids)))[-radar.SEEN_MAX:] r.save(update_fields=['seen']) self.stdout.write(f'radar {r.project_id}: {len(r.seen)} seen') return for line in radar.tick(): self.stdout.write(line)