@@ -22,7 +22,7 @@ from argparse import (
2222from datetime import datetime
2323from typing import Any , Callable , TypedDict
2424from urllib .error import HTTPError , URLError
25- from urllib .parse import parse_qsl , urlencode , urlparse , urlunparse
25+ from urllib .parse import parse_qsl , urlencode , urlparse , urlunparse , quote
2626from urllib .request import Request , urlopen
2727from urllib .response import addinfourl
2828
@@ -41,6 +41,7 @@ Features:
4141 - Store and retrieve configuration (e.g., base URL)
4242 - Retrieve a list of instruments in the database
4343 - Update and delete instrument records
44+ - Find and delete subjects
4445 - Get the current status of an ODC instance
4546
4647Requires:
@@ -382,6 +383,39 @@ class InstrumentRecordsCommands:
382383 print (response )
383384
384385
386+ class SubjectCommands :
387+ @require_url
388+ @require_token
389+ @staticmethod
390+ def delete (id : str ) -> None :
391+ entry = input ("Are you sure you want to delete this subject? Type DELETE to Confirm: " )
392+ if entry == "DELETE" :
393+ url = build_url_with_params (
394+ f'{ config .base_url } /v1/subjects/{ quote (id , safe = "" )} ' ,
395+ {
396+ 'force' : True
397+ }
398+ )
399+ response = HttpClient .delete (url )
400+ print (response )
401+ else :
402+ print ("Cancelling delete command" )
403+
404+ @require_url
405+ @require_token
406+ @staticmethod
407+ def find (min_date : datetime | None , subject_id : str | None ) -> None :
408+ url = build_url_with_params (
409+ f'{ config .base_url } /v1/subjects' ,
410+ {
411+ 'minDate' : min_date ,
412+ 'subjectId' : subject_id ,
413+ },
414+ )
415+ response = HttpClient .get (url )
416+ print (response )
417+
418+
385419class InstrumentsCommands :
386420 @require_url
387421 @require_token
@@ -453,6 +487,7 @@ class CLI:
453487 self ._create_config_parser ()
454488 self ._create_instrument_records_parser ()
455489 self ._create_instruments_parser ()
490+ self ._create_subjects_parser ()
456491 self ._create_setup_parser ()
457492
458493 def run (self ) -> None :
@@ -517,6 +552,22 @@ class CLI:
517552 )
518553 update_parser .set_defaults (fn = InstrumentRecordsCommands .update )
519554
555+ def _create_subjects_parser (self ):
556+ subparsers = self ._create_subcommand_subparsers ('subjects' )
557+
558+ delete_parser = subparsers .add_parser ('delete' , help = 'delete an subject record by id' )
559+ delete_parser .add_argument ('--id' , required = True , help = 'id of the subject record to delete' )
560+ delete_parser .set_defaults (fn = SubjectCommands .delete )
561+
562+ find_parser = subparsers .add_parser ('find' , help = 'search subject records by optional filters' )
563+ find_parser .add_argument (
564+ '--min-date' ,
565+ type = ArgumentTypes .valid_datetime ,
566+ help = 'filter records created after this date (format: yyyy-mm-dd or yyyy-mm-dd hh:mm:ss)' ,
567+ )
568+ find_parser .add_argument ('--subject-id' , help = 'filter by subject id' )
569+ find_parser .set_defaults (fn = SubjectCommands .find )
570+
520571 def _create_instruments_parser (self ):
521572 subparsers = self ._create_subcommand_subparsers ('instruments' )
522573 get_parser = subparsers .add_parser ('list' , help = 'list all instruments, optionally filtered by kind' )
0 commit comments