4141 db_find_account , db_update_account , db_update_publickey , db_filter_publickeys , db_get_reports ,
4242 db_get_keys , db_insert_report , db_get_recent_results2 , db_patch_approval2 , db_get_report ,
4343 db_ensure_schema , db_get_apikeys , db_update_apikey , db_filter_apikeys , db_clear_delegates ,
44- db_find_subjects , db_insert_result2 , db_get_relevant_results2 , db_add_delegate ,
44+ db_find_subjects , db_insert_result2 , db_get_relevant_results2 , db_add_delegate , db_get_group ,
4545)
4646
4747
@@ -79,6 +79,7 @@ def __init__(self):
7979 self .yaml_path = os .path .abspath ("../Tests" )
8080
8181
82+ GROUP_PREFIX = 'group-'
8283ROLES = {'read_any' : 1 , 'append_any' : 2 , 'admin' : 4 , 'approve' : 8 }
8384# number of days that expired results will be considered in lieu of more recent, but unapproved ones
8485GRACE_PERIOD_DAYS = 7
@@ -226,7 +227,8 @@ def import_bootstrap(bootstrap_path, conn):
226227 with conn .cursor () as cur :
227228 for account in accounts :
228229 roles = sum (ROLES [r ] for r in account .get ('roles' , ()))
229- accountid = db_update_account (cur , {'subject' : account ['subject' ], 'roles' : roles })
230+ acc_record = {'subject' : account ['subject' ], 'roles' : roles , 'group' : account .get ('group' )}
231+ accountid = db_update_account (cur , acc_record )
230232 db_clear_delegates (cur , accountid )
231233 for delegate in account .get ('delegates' , ()):
232234 db_add_delegate (cur , accountid , delegate )
@@ -637,6 +639,13 @@ async def get_report_view_full(
637639 )
638640
639641
642+ def _resolve_group (cur , subject , prefix = GROUP_PREFIX ):
643+ group = subject .removeprefix (prefix )
644+ if subject != group :
645+ return group , db_get_group (cur , group )
646+ return None , [subject ]
647+
648+
640649@app .get ("/{view_type}/detail/{subject}/{scopeuuid}" )
641650async def get_detail (
642651 request : Request ,
@@ -646,14 +655,18 @@ async def get_detail(
646655 scopeuuid : str ,
647656):
648657 with conn .cursor () as cur :
649- rows2 = db_get_relevant_results2 (cur , subject , scopeuuid , approved_only = True )
658+ group , subjects = _resolve_group (cur , subject )
659+ rows2 = []
660+ for subj in subjects :
661+ rows2 .extend (db_get_relevant_results2 (cur , subj , scopeuuid , approved_only = True ))
650662 results2 = convert_result_rows_to_dict2 (
651663 rows2 , get_scopes (), include_report = True , grace_period_days = GRACE_PERIOD_DAYS ,
652664 subjects = (subject , ), scopes = (scopeuuid , ),
653665 )
666+ title = f'Details for group { group } ' if group else f'Details for subject { subject } '
654667 return render_view (
655668 VIEW_DETAIL , view_type , results = results2 , base_url = settings .base_url ,
656- title = f' { subject } compliance' ,
669+ title = title ,
657670 )
658671
659672
@@ -666,13 +679,17 @@ async def get_detail_full(
666679 scopeuuid : str ,
667680):
668681 with conn .cursor () as cur :
669- rows2 = db_get_relevant_results2 (cur , subject , scopeuuid , approved_only = False )
682+ group , subjects = _resolve_group (cur , subject )
683+ rows2 = []
684+ for subject in subjects :
685+ rows2 .extend (db_get_relevant_results2 (cur , subject , scopeuuid , approved_only = False ))
670686 results2 = convert_result_rows_to_dict2 (
671687 rows2 , get_scopes (), include_report = True , subjects = (subject , ), scopes = (scopeuuid , ),
672688 )
689+ title = f'Details for group { group } ' if group else f'Details for subject { subject } '
673690 return render_view (
674691 VIEW_DETAIL , view_type , results = results2 , base_url = settings .base_url ,
675- title = f'{ subject } compliance (incl. unverified results)' ,
692+ title = f'{ title } (incl. unverified results)' ,
676693 )
677694
678695
0 commit comments