def suppliers_on_framework(data_api_url, data_api_token, questions): """ Generate the CSV - takes the data api details - iterates through all suppliers - foreach supplier hits the declaration API to recover the answers - builds CSV row for each supplier :param data_api_url: :param data_api_token: :param questions: :return: """ client = DataAPIClient(data_api_url, data_api_token) writer = csv.writer(sys.stdout, delimiter=',', quotechar='"') writer.writerow(headers(questions)) for supplier in client.find_suppliers_iter(): try: declaration = client.get_supplier_declaration( supplier['id'], 'g-cloud-7')['declaration'] if not declaration: continue status = declaration['status'] processed_supplier_declaration = \ process_supplier_declaration( declaration, questions ) supplier_declaration = list() supplier_declaration.append(supplier['id']) supplier_declaration.append(supplier['name']) supplier_declaration.append(supplier.get('dunsNumber', "")) supplier_declaration.append(status) for declaration in processed_supplier_declaration: supplier_declaration.append(declaration) try: writer.writerow(supplier_declaration) except UnicodeEncodeError: writer.writerow([ field.encode('utf-8') if hasattr(field, 'encode') else field for field in supplier_declaration ]) except HTTPError as e: if e.status_code == 404: # not all suppliers make a declaration so this is fine # status = 'unstarted' pass else: # status = 'error-{}'.format(e.status_code) raise e except KeyError: # status = 'error-key-error' pass
supplier_id = arguments['<supplier_id>'] framework = arguments['<framework>'] s3_file_name = arguments['<s3_file_name>'] stage = arguments['<stage>'] or 'production' bucket_name = f"digitalmarketplace-documents-{stage}-{stage}" s3_key_name = f"{framework}/documents/{supplier_id}/{s3_file_name}" asset_url = f"https://assets.digitalmarketplace.service.gov.uk/{s3_key_name}" user = get_user() print(f"Setting user to '{user}'...") data_api_client = DataAPIClient(get_api_endpoint_from_stage(stage), get_auth_token('api', stage), user=user) supplier_declaration = data_api_client.get_supplier_declaration( supplier_id, framework) bucket = S3(bucket_name) with open(file_path, 'br') as source_file: bucket.save(s3_key_name, source_file, acl='public-read') print(f"Uploaded {file_path} to {bucket.bucket_name}::{s3_key_name}") data_api_client.update_supplier_declaration( supplier_id=supplier_id, framework_slug=framework, declaration_update={ get_slavery_statement_declaration_key(supplier_declaration): asset_url }) print(