Loading capif_backend/backoffice_service/controllers/apis_controller.py +18 −17 Original line number Diff line number Diff line Loading @@ -23,6 +23,24 @@ def get_apis_pages_order(): order = request.args.get('order', default="ascending", type=str) return operations.get_apis_pages_order(page, page_size, order) # DELETE multiple apis @apis_routes.route("/", methods=["DELETE"]) @jwt_required() def delete_apis_route(): try: apis = request.json.get('api', []) if not apis: return jsonify(message="No apis provided for delete."), 400 responses = operations.delete_providers_services(apis) return jsonify(responses), 200 except Exception as e: return jsonify(message="Error deleting apis", error=str(e)), 500 # # GET a JSON with all apis @cross_origin() @apis_routes.route("/apisTotal", methods=["GET"]) Loading Loading @@ -61,20 +79,3 @@ def get_num_apis(): # return jsonify(response), status_code # except Exception as e: # return jsonify({"error": str(e)}), 500 # # DELETE multiple apis # @apis_routes.route("/", methods=["DELETE"]) # @jwt_required() # def delete_apis_route(): # try: # apis = request.json.get('api', []) # if not apis: # return jsonify(message="No apis provided for delete."), 400 # responses = operations.delete_providers_services(apis) # return jsonify(responses), 200 # except Exception as e: # return jsonify(message="Error deleting apis", error=str(e)), 500 No newline at end of file capif_backend/backoffice_service/controllers/invokers_controller.py +24 −23 Original line number Diff line number Diff line Loading @@ -23,6 +23,23 @@ def get_invokers_pages_order(): order = request.args.get('order', default="ascending", type=str) return operations.get_invokers_pages_order(page, page_size, order) # DELETE multiple invokers @invokers_routes.route("/", methods=["DELETE"]) @jwt_required() def delete_invokers_route(): try: invoker_ids = request.json.get('invoker_ids', []) if not invoker_ids: return jsonify(message="No invoker IDs provided"), 400 responses = operations.delete_invokers(invoker_ids) return jsonify(responses), 200 except Exception as e: return jsonify(message="Error deleting invokers", error=str(e)), 500 # GET a JSON with all invokers @cross_origin() @invokers_routes.route("/invokersTotal", methods=["GET"]) Loading Loading @@ -81,27 +98,11 @@ def get_invoker_security_context(invoker_id): return operations.get_invoker_security_context(invoker_id) # DELETE a single invoker @cross_origin() @invokers_routes.route("/<id>", methods=["DELETE"]) @jwt_required() def delete_invoker(id): if id == "null": return jsonify(message="Invalid id", object=None), 400 return operations.delete_invoker(id) # @cross_origin() # @invokers_routes.route("/<id>", methods=["DELETE"]) # @jwt_required() # def delete_invoker(id): # if id == "null": # return jsonify(message="Invalid id", object=None), 400 # return operations.delete_invoker(id) # DELETE multiple invokers @invokers_routes.route("/", methods=["DELETE"]) @jwt_required() def delete_invokers_route(): try: invoker_ids = request.json.get('invoker_ids', []) if not invoker_ids: return jsonify(message="No invoker IDs provided"), 400 responses = operations.delete_invokers(invoker_ids) return jsonify(responses), 200 except Exception as e: return jsonify(message="Error deleting invokers", error=str(e)), 500 No newline at end of file capif_backend/backoffice_service/controllers/providers_controller.py +17 −17 Original line number Diff line number Diff line Loading @@ -23,6 +23,23 @@ def get_providers_pages_order(): order = request.args.get('order', default="ascending", type=str) return operations.get_providers_pages_order(page, page_size, order) # DELETE multiple providers @providers_routes.route("/", methods=["DELETE"]) @jwt_required() def delete_providers_route(): try: provider_ids = request.json.get('provider_ids', []) if not provider_ids: return jsonify(message="No provider IDs provided"), 400 responses = operations.delete_providers(provider_ids) return jsonify(responses), 200 except Exception as e: return jsonify(message="Error deleting providers", error=str(e)), 500 # # GET a JSON with all providers @cross_origin() @providers_routes.route("/providersTotal", methods=["GET"]) Loading Loading @@ -79,23 +96,6 @@ def get_num_providers(): # return jsonify(message="Invalid id", object=None), 400 # return operations.delete_provider(id) # # DELETE multiple providers # @providers_routes.route("/", methods=["DELETE"]) # @jwt_required() # def delete_providers_route(): # try: # provider_ids = request.json.get('provider_ids', []) # if not provider_ids: # return jsonify(message="No provider IDs provided"), 400 # responses = operations.delete_providers(provider_ids) # return jsonify(responses), 200 # except Exception as e: # return jsonify(message="Error deleting providers", error=str(e)), 500 # # DELETE a service from a provider # @cross_origin() # @providers_routes.route("/services/<apf_id>/<api_id>", methods=["DELETE"]) Loading capif_backend/backoffice_service/core/operations.py +101 −61 Original line number Diff line number Diff line Loading @@ -204,9 +204,11 @@ class Operations: except requests.exceptions.RequestException as e: return jsonify({"error": str(e)}), 500 def delete_invokers(self, invoker_ids): try: responses = [] response = None # Inicializar la variable response for invoker_id in invoker_ids: if not invoker_id: Loading @@ -215,7 +217,7 @@ class Operations: url = 'https://{}/api-invoker-management/v1/onboardedInvokers/{}'.format(os.getenv('CAPIF_HOSTNAME'), invoker_id) response = requests.delete(url, cert=( '/etc/ssl/certs/superadmin.cr', '/etc/ssl/certs/superadmin.crt', '/etc/ssl/private/superadmin.key'), verify='/etc/ssl/certs/ca_root.crt') Loading @@ -227,7 +229,37 @@ class Operations: return responses except Exception as e: raise Exception("Error deleting invokers: " + response) error_message = str(e) if response is not None and hasattr(response, 'text'): error_message += " | Response content: " + response.text raise Exception("Error deleting invokers: " + error_message) # def delete_invokers(self, invoker_ids): # try: # responses = [] # response = None # for invoker_id in invoker_ids: # if not invoker_id: # responses.append({'invoker_id': None, 'message': 'Invalid invoker ID'}) # continue # url = 'https://{}/api-invoker-management/v1/onboardedInvokers/{}'.format(os.getenv('CAPIF_HOSTNAME'), invoker_id) # response = requests.delete(url, cert=( # '/etc/ssl/certs/superadmin.cr', # '/etc/ssl/private/superadmin.key'), # verify='/etc/ssl/certs/ca_root.crt') # if response.status_code == 204: # responses.append({'invoker_id': invoker_id, 'message': 'Invoker removed successfully'}) # else: # responses.append({'invoker_id': invoker_id, 'message': 'Failed to remove invoker'}) # return responses # except Exception as e: # raise Exception("Error deleting invokers: " + response) def get_num_invokers(self): Loading Loading @@ -851,30 +883,30 @@ class Operations: # return "Error request deleting invoker: ", e def delete_invokers(self, invoker_ids): try: responses = [] # def delete_invokers(self, invoker_ids): # try: # responses = [] for invoker_id in invoker_ids: if not invoker_id: responses.append({'invoker_id': None, 'message': 'Invalid invoker ID'}) continue # for invoker_id in invoker_ids: # if not invoker_id: # responses.append({'invoker_id': None, 'message': 'Invalid invoker ID'}) # continue url = 'https://{}/api-invoker-management/v1/onboardedInvokers/{}'.format(os.getenv('CAPIF_HOSTNAME'), invoker_id) response = requests.delete(url, cert=( '/usr/src/app/backoffice_service/certs/backoffice_vault_cert.crt', '/usr/src/app/backoffice_service/certs/backoffice_vault_private_key.key'), verify='/usr/src/app/backoffice_service/certs/ca.crt') # url = 'https://{}/api-invoker-management/v1/onboardedInvokers/{}'.format(os.getenv('CAPIF_HOSTNAME'), invoker_id) # response = requests.delete(url, cert=( # '/usr/src/app/backoffice_service/certs/backoffice_vault_cert.crt', # '/usr/src/app/backoffice_service/certs/backoffice_vault_private_key.key'), # verify='/usr/src/app/backoffice_service/certs/ca.crt') if response.status_code == 204: responses.append({'invoker_id': invoker_id, 'message': 'Invoker removed successfully'}) else: responses.append({'invoker_id': invoker_id, 'message': 'Failed to remove invoker'}) # if response.status_code == 204: # responses.append({'invoker_id': invoker_id, 'message': 'Invoker removed successfully'}) # else: # responses.append({'invoker_id': invoker_id, 'message': 'Failed to remove invoker'}) return responses # return responses except Exception as e: raise Exception("Error deleting invokers: " + str(e)) # except Exception as e: # raise Exception("Error deleting invokers: " + str(e)) # def delete_provider(self, provider_id): # try: Loading @@ -891,30 +923,34 @@ class Operations: # except Exception as e: # return "Error request deleting provider: ", e # def delete_providers(self, provider_ids): # try: # responses = [] def delete_providers(self, provider_ids): try: responses = [] # for provider_id in provider_ids: # if not provider_id: # responses.append({'provider_id': None, 'message': 'Invalid provider ID'}) # continue for provider_id in provider_ids: if not provider_id: responses.append({'provider_id': None, 'message': 'Invalid provider ID'}) continue # url = 'https://{}/api-provider-management/v1/registrations/{}'.format(os.getenv('CAPIF_HOSTNAME'), provider_id) url = 'https://{}/api-provider-management/v1/registrations/{}'.format(os.getenv('CAPIF_HOSTNAME'), provider_id) # response = requests.delete(url, cert=( # '/usr/src/app/backoffice_service/certs/backoffice_vault_cert.crt', # '/usr/src/app/backoffice_service/certs/backoffice_vault_private_key.key'), # verify='/usr/src/app/backoffice_service/certs/ca.crt') response = requests.delete(url, cert=( '/etc/ssl/certs/superadmin.crt', '/etc/ssl/private/superadmin.key'), verify='/etc/ssl/certs/ca_root.crt') # if response.status_code == 204: # responses.append({'provider_id': provider_id, 'message': 'Provider removed successfully'}) # else: # responses.append({'provider_id': provider_id, 'message': 'Failed to remove provider'}) if response.status_code == 204: responses.append({'provider_id': provider_id, 'message': 'Provider removed successfully'}) else: responses.append({'provider_id': provider_id, 'message': 'Failed to remove provider'}) # return responses return responses # except Exception as e: # raise Exception("Error deleting provider: " + str(e)) except Exception as e: raise Exception("Error deleting provider: " + str(e)) # def delete_security_context(self, invoker_id, aef_id, api_id): # try: Loading Loading @@ -958,32 +994,36 @@ class Operations: # except Exception as e: # return "Error request deleting provider: ", e # # Delete API with Selector (more than one api at a time) # def delete_providers_services(self, apis): # try: # responses = [] # Delete API with Selector (more than one api at a time) def delete_providers_services(self, apis): try: responses = [] # for api in apis: # if not api: # responses.append({'api_id': api['api_id'], 'message': 'Invalid API.'}) # continue for api in apis: if not api: responses.append({'api_id': api['api_id'], 'message': 'Invalid API.'}) continue # url = 'https://{}/published-apis/v1/{}/service-apis/{}'.format(os.getenv('CAPIF_HOSTNAME'), api['apf_id'], api['api_id']) url = 'https://{}/published-apis/v1/{}/service-apis/{}'.format(os.getenv('CAPIF_HOSTNAME'), api['apf_id'], api['api_id']) # response = requests.delete(url, cert=( # '/usr/src/app/backoffice_service/certs/backoffice_vault_cert.crt', # '/usr/src/app/backoffice_service/certs/backoffice_vault_private_key.key'), # verify='/usr/src/app/backoffice_service/certs/ca.crt') response = requests.delete(url, cert=( '/etc/ssl/certs/superadmin.crt', '/etc/ssl/private/superadmin.key'), verify='/etc/ssl/certs/ca_root.crt') # if response.status_code == 204: # responses.append({'api_id': api['api_id'], 'message': 'Api removed successfully'}) # else: # responses.append({'api_id': api['api_id'], 'message': 'Failed to remove api'}) if response.status_code == 204: responses.append({'api_id': api['api_id'], 'message': 'Api removed successfully'}) else: responses.append({'api_id': api['api_id'], 'message': 'Failed to remove api'}) # return responses return responses # except Exception as e: # raise Exception("Error deleting apis: " + str(e)) except Exception as e: raise Exception("Error deleting apis: " + str(e)) # # Delete a single user # def delete_user(self, username, password): Loading Loading
capif_backend/backoffice_service/controllers/apis_controller.py +18 −17 Original line number Diff line number Diff line Loading @@ -23,6 +23,24 @@ def get_apis_pages_order(): order = request.args.get('order', default="ascending", type=str) return operations.get_apis_pages_order(page, page_size, order) # DELETE multiple apis @apis_routes.route("/", methods=["DELETE"]) @jwt_required() def delete_apis_route(): try: apis = request.json.get('api', []) if not apis: return jsonify(message="No apis provided for delete."), 400 responses = operations.delete_providers_services(apis) return jsonify(responses), 200 except Exception as e: return jsonify(message="Error deleting apis", error=str(e)), 500 # # GET a JSON with all apis @cross_origin() @apis_routes.route("/apisTotal", methods=["GET"]) Loading Loading @@ -61,20 +79,3 @@ def get_num_apis(): # return jsonify(response), status_code # except Exception as e: # return jsonify({"error": str(e)}), 500 # # DELETE multiple apis # @apis_routes.route("/", methods=["DELETE"]) # @jwt_required() # def delete_apis_route(): # try: # apis = request.json.get('api', []) # if not apis: # return jsonify(message="No apis provided for delete."), 400 # responses = operations.delete_providers_services(apis) # return jsonify(responses), 200 # except Exception as e: # return jsonify(message="Error deleting apis", error=str(e)), 500 No newline at end of file
capif_backend/backoffice_service/controllers/invokers_controller.py +24 −23 Original line number Diff line number Diff line Loading @@ -23,6 +23,23 @@ def get_invokers_pages_order(): order = request.args.get('order', default="ascending", type=str) return operations.get_invokers_pages_order(page, page_size, order) # DELETE multiple invokers @invokers_routes.route("/", methods=["DELETE"]) @jwt_required() def delete_invokers_route(): try: invoker_ids = request.json.get('invoker_ids', []) if not invoker_ids: return jsonify(message="No invoker IDs provided"), 400 responses = operations.delete_invokers(invoker_ids) return jsonify(responses), 200 except Exception as e: return jsonify(message="Error deleting invokers", error=str(e)), 500 # GET a JSON with all invokers @cross_origin() @invokers_routes.route("/invokersTotal", methods=["GET"]) Loading Loading @@ -81,27 +98,11 @@ def get_invoker_security_context(invoker_id): return operations.get_invoker_security_context(invoker_id) # DELETE a single invoker @cross_origin() @invokers_routes.route("/<id>", methods=["DELETE"]) @jwt_required() def delete_invoker(id): if id == "null": return jsonify(message="Invalid id", object=None), 400 return operations.delete_invoker(id) # @cross_origin() # @invokers_routes.route("/<id>", methods=["DELETE"]) # @jwt_required() # def delete_invoker(id): # if id == "null": # return jsonify(message="Invalid id", object=None), 400 # return operations.delete_invoker(id) # DELETE multiple invokers @invokers_routes.route("/", methods=["DELETE"]) @jwt_required() def delete_invokers_route(): try: invoker_ids = request.json.get('invoker_ids', []) if not invoker_ids: return jsonify(message="No invoker IDs provided"), 400 responses = operations.delete_invokers(invoker_ids) return jsonify(responses), 200 except Exception as e: return jsonify(message="Error deleting invokers", error=str(e)), 500 No newline at end of file
capif_backend/backoffice_service/controllers/providers_controller.py +17 −17 Original line number Diff line number Diff line Loading @@ -23,6 +23,23 @@ def get_providers_pages_order(): order = request.args.get('order', default="ascending", type=str) return operations.get_providers_pages_order(page, page_size, order) # DELETE multiple providers @providers_routes.route("/", methods=["DELETE"]) @jwt_required() def delete_providers_route(): try: provider_ids = request.json.get('provider_ids', []) if not provider_ids: return jsonify(message="No provider IDs provided"), 400 responses = operations.delete_providers(provider_ids) return jsonify(responses), 200 except Exception as e: return jsonify(message="Error deleting providers", error=str(e)), 500 # # GET a JSON with all providers @cross_origin() @providers_routes.route("/providersTotal", methods=["GET"]) Loading Loading @@ -79,23 +96,6 @@ def get_num_providers(): # return jsonify(message="Invalid id", object=None), 400 # return operations.delete_provider(id) # # DELETE multiple providers # @providers_routes.route("/", methods=["DELETE"]) # @jwt_required() # def delete_providers_route(): # try: # provider_ids = request.json.get('provider_ids', []) # if not provider_ids: # return jsonify(message="No provider IDs provided"), 400 # responses = operations.delete_providers(provider_ids) # return jsonify(responses), 200 # except Exception as e: # return jsonify(message="Error deleting providers", error=str(e)), 500 # # DELETE a service from a provider # @cross_origin() # @providers_routes.route("/services/<apf_id>/<api_id>", methods=["DELETE"]) Loading
capif_backend/backoffice_service/core/operations.py +101 −61 Original line number Diff line number Diff line Loading @@ -204,9 +204,11 @@ class Operations: except requests.exceptions.RequestException as e: return jsonify({"error": str(e)}), 500 def delete_invokers(self, invoker_ids): try: responses = [] response = None # Inicializar la variable response for invoker_id in invoker_ids: if not invoker_id: Loading @@ -215,7 +217,7 @@ class Operations: url = 'https://{}/api-invoker-management/v1/onboardedInvokers/{}'.format(os.getenv('CAPIF_HOSTNAME'), invoker_id) response = requests.delete(url, cert=( '/etc/ssl/certs/superadmin.cr', '/etc/ssl/certs/superadmin.crt', '/etc/ssl/private/superadmin.key'), verify='/etc/ssl/certs/ca_root.crt') Loading @@ -227,7 +229,37 @@ class Operations: return responses except Exception as e: raise Exception("Error deleting invokers: " + response) error_message = str(e) if response is not None and hasattr(response, 'text'): error_message += " | Response content: " + response.text raise Exception("Error deleting invokers: " + error_message) # def delete_invokers(self, invoker_ids): # try: # responses = [] # response = None # for invoker_id in invoker_ids: # if not invoker_id: # responses.append({'invoker_id': None, 'message': 'Invalid invoker ID'}) # continue # url = 'https://{}/api-invoker-management/v1/onboardedInvokers/{}'.format(os.getenv('CAPIF_HOSTNAME'), invoker_id) # response = requests.delete(url, cert=( # '/etc/ssl/certs/superadmin.cr', # '/etc/ssl/private/superadmin.key'), # verify='/etc/ssl/certs/ca_root.crt') # if response.status_code == 204: # responses.append({'invoker_id': invoker_id, 'message': 'Invoker removed successfully'}) # else: # responses.append({'invoker_id': invoker_id, 'message': 'Failed to remove invoker'}) # return responses # except Exception as e: # raise Exception("Error deleting invokers: " + response) def get_num_invokers(self): Loading Loading @@ -851,30 +883,30 @@ class Operations: # return "Error request deleting invoker: ", e def delete_invokers(self, invoker_ids): try: responses = [] # def delete_invokers(self, invoker_ids): # try: # responses = [] for invoker_id in invoker_ids: if not invoker_id: responses.append({'invoker_id': None, 'message': 'Invalid invoker ID'}) continue # for invoker_id in invoker_ids: # if not invoker_id: # responses.append({'invoker_id': None, 'message': 'Invalid invoker ID'}) # continue url = 'https://{}/api-invoker-management/v1/onboardedInvokers/{}'.format(os.getenv('CAPIF_HOSTNAME'), invoker_id) response = requests.delete(url, cert=( '/usr/src/app/backoffice_service/certs/backoffice_vault_cert.crt', '/usr/src/app/backoffice_service/certs/backoffice_vault_private_key.key'), verify='/usr/src/app/backoffice_service/certs/ca.crt') # url = 'https://{}/api-invoker-management/v1/onboardedInvokers/{}'.format(os.getenv('CAPIF_HOSTNAME'), invoker_id) # response = requests.delete(url, cert=( # '/usr/src/app/backoffice_service/certs/backoffice_vault_cert.crt', # '/usr/src/app/backoffice_service/certs/backoffice_vault_private_key.key'), # verify='/usr/src/app/backoffice_service/certs/ca.crt') if response.status_code == 204: responses.append({'invoker_id': invoker_id, 'message': 'Invoker removed successfully'}) else: responses.append({'invoker_id': invoker_id, 'message': 'Failed to remove invoker'}) # if response.status_code == 204: # responses.append({'invoker_id': invoker_id, 'message': 'Invoker removed successfully'}) # else: # responses.append({'invoker_id': invoker_id, 'message': 'Failed to remove invoker'}) return responses # return responses except Exception as e: raise Exception("Error deleting invokers: " + str(e)) # except Exception as e: # raise Exception("Error deleting invokers: " + str(e)) # def delete_provider(self, provider_id): # try: Loading @@ -891,30 +923,34 @@ class Operations: # except Exception as e: # return "Error request deleting provider: ", e # def delete_providers(self, provider_ids): # try: # responses = [] def delete_providers(self, provider_ids): try: responses = [] # for provider_id in provider_ids: # if not provider_id: # responses.append({'provider_id': None, 'message': 'Invalid provider ID'}) # continue for provider_id in provider_ids: if not provider_id: responses.append({'provider_id': None, 'message': 'Invalid provider ID'}) continue # url = 'https://{}/api-provider-management/v1/registrations/{}'.format(os.getenv('CAPIF_HOSTNAME'), provider_id) url = 'https://{}/api-provider-management/v1/registrations/{}'.format(os.getenv('CAPIF_HOSTNAME'), provider_id) # response = requests.delete(url, cert=( # '/usr/src/app/backoffice_service/certs/backoffice_vault_cert.crt', # '/usr/src/app/backoffice_service/certs/backoffice_vault_private_key.key'), # verify='/usr/src/app/backoffice_service/certs/ca.crt') response = requests.delete(url, cert=( '/etc/ssl/certs/superadmin.crt', '/etc/ssl/private/superadmin.key'), verify='/etc/ssl/certs/ca_root.crt') # if response.status_code == 204: # responses.append({'provider_id': provider_id, 'message': 'Provider removed successfully'}) # else: # responses.append({'provider_id': provider_id, 'message': 'Failed to remove provider'}) if response.status_code == 204: responses.append({'provider_id': provider_id, 'message': 'Provider removed successfully'}) else: responses.append({'provider_id': provider_id, 'message': 'Failed to remove provider'}) # return responses return responses # except Exception as e: # raise Exception("Error deleting provider: " + str(e)) except Exception as e: raise Exception("Error deleting provider: " + str(e)) # def delete_security_context(self, invoker_id, aef_id, api_id): # try: Loading Loading @@ -958,32 +994,36 @@ class Operations: # except Exception as e: # return "Error request deleting provider: ", e # # Delete API with Selector (more than one api at a time) # def delete_providers_services(self, apis): # try: # responses = [] # Delete API with Selector (more than one api at a time) def delete_providers_services(self, apis): try: responses = [] # for api in apis: # if not api: # responses.append({'api_id': api['api_id'], 'message': 'Invalid API.'}) # continue for api in apis: if not api: responses.append({'api_id': api['api_id'], 'message': 'Invalid API.'}) continue # url = 'https://{}/published-apis/v1/{}/service-apis/{}'.format(os.getenv('CAPIF_HOSTNAME'), api['apf_id'], api['api_id']) url = 'https://{}/published-apis/v1/{}/service-apis/{}'.format(os.getenv('CAPIF_HOSTNAME'), api['apf_id'], api['api_id']) # response = requests.delete(url, cert=( # '/usr/src/app/backoffice_service/certs/backoffice_vault_cert.crt', # '/usr/src/app/backoffice_service/certs/backoffice_vault_private_key.key'), # verify='/usr/src/app/backoffice_service/certs/ca.crt') response = requests.delete(url, cert=( '/etc/ssl/certs/superadmin.crt', '/etc/ssl/private/superadmin.key'), verify='/etc/ssl/certs/ca_root.crt') # if response.status_code == 204: # responses.append({'api_id': api['api_id'], 'message': 'Api removed successfully'}) # else: # responses.append({'api_id': api['api_id'], 'message': 'Failed to remove api'}) if response.status_code == 204: responses.append({'api_id': api['api_id'], 'message': 'Api removed successfully'}) else: responses.append({'api_id': api['api_id'], 'message': 'Failed to remove api'}) # return responses return responses # except Exception as e: # raise Exception("Error deleting apis: " + str(e)) except Exception as e: raise Exception("Error deleting apis: " + str(e)) # # Delete a single user # def delete_user(self, username, password): Loading