"""Synchronize derived viewer payloads after verified group publications.""" import copy,json,os,sys,tempfile,time from pathlib import Path sys.path.insert(0,str(Path(__file__).resolve().parents[1])) import server from box_member_schema import member_model server.require_modeling_rules() for identity in sys.argv[1:]: if len(identity)!=24 or any(c not in '0123456789abcdef' for c in identity):raise ValueError('invalid job') path=Path('/tmp/drawing-model-studio-8097-jobs')/(identity+'.json');raw=path.read_bytes();job=json.loads(raw) if job.get('status')=='running':raise ValueError('active job') result=job['result'];geometry=copy.deepcopy([result['concrete_components'],result['rebar_groups']]) result.pop('innerWallStationReviews',None) for binding in result.get('drawingEvidence',{}).get('cad_cycle_assembly_bindings',{}).get('groups',[]): binding.pop('inner_wall_station_exclusions',None) result['memberModel']=member_model(result) job.update(partialResult=copy.deepcopy(result),geometryRevision=time.time_ns()) assert geometry==[result['concrete_components'],result['rebar_groups']] if path.read_bytes()!=raw:raise ValueError('job changed') backup=path.with_name(identity+f'.before-view-payload-{time.time_ns()}.json') with backup.open('xb')as out:out.write(raw) with tempfile.NamedTemporaryFile(mode='w',dir=path.parent,delete=False)as out: json.dump(job,out,ensure_ascii=False,allow_nan=False);temp=out.name if path.read_bytes()!=raw:raise ValueError('job changed before replacement') os.replace(temp,path) print(json.dumps(dict(job=identity,geometry_preserved=True,legacy_exclusions_removed=True)),flush=True)