47 lines
2.1 KiB
Python
47 lines
2.1 KiB
Python
"""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 <project id> neuropolitik a project gets a Radar from a preset
|
|
... radar --import <project id> <file.json> 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)
|