diora-web/projects/management/commands/radar.py
mrwnslz c8fd139b44
Some checks failed
Build and push Docker image / build (push) Successful in 1m11s
Test / test (push) Successful in 10m32s
Test / e2e (push) Failing after 1m31s
Projekte: Radar – wöchentlich neue Papers (PubMed, arXiv, bioRxiv, medRxiv), von Claude im Batch sortiert, Entscheidungen verschlüsselt, → Quellen; Preset Neuropolitik aus F:\neuropolitik\tools; sw v145
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 20:43:43 +02:00

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)