Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/djproject/urls.py
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/djproject/urls.py	(revision 2829)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/djproject/urls.py	(working copy)
@@ -74,6 +74,7 @@
     re_path(r'^device_metrics(?:/(?P<path>.*))?$', handle_device_metrics_req),
     re_path(r'^ssl_vpn_stats(?:/(?P<path>.*))?$', handle_ssl_vpn_stats_req),
     re_path(r'^llb_stats(?:/(?P<path>.*))?$', handle_llb_stats_req),
+    re_path(r"^report/(?P<path>log)/(?P<log_id>\d+)/?$", handle_report_generation),
     re_path(r"^report/?$", handle_report_generation),
     re_path(r"^report/(?P<report_id>\d+)(?:/(?P<path>.*))?$", handle_report_generation),
     re_path(r"^report/(?P<path>.*)$", handle_report_generation),
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/report/generate_report.py
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/report/generate_report.py	(revision 2834)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/report/generate_report.py	(working copy)
@@ -5,7 +5,7 @@
 from hive.report.report_utils import get_dynamic_interval, to_epoch_ms, convert_relative_time, resolve_time_ranges
 from hive.report.report_data_service import get_llb_detailed_data, get_link_summary_data, \
     get_virtual_service_detailed_data, get_virtual_service_summary_data, get_real_service_summary_data, \
-    get_real_service_detailed_data, get_device_detailed_data, get_device_summary_data
+    get_real_service_detailed_data, get_device_detailed_data, get_device_summary_data, update_report_service
 from cm.lib.libbasic_operation import oper_log
 from hive.custom_exceptions import generic_exception as ge
 from hive.report.report_queries import ReportDB
@@ -15,7 +15,7 @@
 REPORT_FILE_PATH = "/ca/webui/htdocs/new/src/hive/media/docs/"
 
 
-def handle_report_generation(request, path=None, report_id=None):
+def handle_report_generation(request, path=None, report_id=None, log_id=None):
     try:
         if request.method == 'POST':
             if path == 'save':
@@ -30,14 +30,20 @@
             if path == 'download':
                 return download_report(request.GET.get('filename'))
             elif path == 'log':
-                return get_all_report_log(request)
+                if log_id:
+                    return get_report_log_by_id(log_id)
+                else:
+                    return get_all_report_log(request)
             elif report_id:
                 return get_report(report_id)
             else:
                 return get_all_reports(request)
 
-        elif request.method == 'DELETE' and report_id:
-            return delete_report(report_id)
+        elif request.method == 'DELETE':
+            if path == 'log' and log_id:
+                return delete_report_log_by_id(log_id)
+            elif report_id:
+                return delete_report(report_id)
         else:
             return JsonResponse({"error": "Invalid path or parameters"}, status=400)
     except ge.GenericError as e:
@@ -93,8 +99,56 @@
     except Exception as e:
         oper_log("error", "system", f"Unexpected error in get_all_report_log: {str(e)}")
         return JsonResponse({"error": f"Fetching the report logs failed"}, status=500)
+
+
+def get_report_log_by_id(log_id):
+    """
+    Fetch a single report_log entry by log_id.
+    """
+    try:
+        log_id = int(log_id)
+    except (TypeError, ValueError):
+        return JsonResponse({"error": "Invalid log_id"}, status=400)
+
+    try:
+        log_list = ReportDB.get_report_log(log_id)
+        if not log_list:
+            return JsonResponse({"error": "Report log not found"}, status=404)
+
+        return JsonResponse({"report_log": log_list[0]}, status=200)
+
+    except Exception as e:
+        oper_log("error", "system", f"Fetch report log failed: {str(e)}")
+        return JsonResponse({"error": "Failed to fetch report log"}, status=500)
+
+
+def delete_report_log_by_id(log_id):
+    """
+    Delete a report_log entry by log_id.
+    """
+    try:
+        log_id = int(log_id)
+    except (TypeError, ValueError):
+        return JsonResponse({"error": "Invalid log_id"}, status=400)
+
+    try:
+        deleted = ReportDB.delete_report_log(log_id)
+        if not deleted:
+            return JsonResponse(
+                {"error": "Report log not found or already deleted"},
+                status=404
+            )
 
+        oper_log("info", "system", f"Report log {log_id} deleted successfully")
+        return JsonResponse(
+            {"message": f"Report log {log_id} deleted successfully"},
+            status=200
+        )
+    except Exception as e:
+        oper_log("error", "system", f"Delete report log failed: {str(e)}")
+        return JsonResponse({"error": "Failed to delete report log"}, status=500)
 
+
 def save_report(request):
     """ Save New Report """
     try:
@@ -138,26 +192,24 @@
         return JsonResponse({"error": "Missing report_id"}, status=400)
 
     try:
-        updated = ReportDB.update_report(
-            report_id,
-            data.get("name"),
-            data.get("subject_type"),
-            data.get("subject_name"),
-            data.get("device_ip"),
-            data.get("device_type", None),
-            data.get("from_time"),
-            data.get("to_time"),
-            data.get("send_to"),
+        update_report_service(report_id, data)
+
+        oper_log("info", "system", f"Report {report_id} updated successfully")
+        return JsonResponse(
+            {"message": f"Report {report_id} updated successfully"},
+            status=200
         )
 
-        if not updated:
-            return JsonResponse({"error": "Report update failed or no changes detected"}, status=400)
+    except ge.GenericError as e:
+        oper_log("error", "system", str(e))
+        return ge.handle_exception(e)
 
-        oper_log("info", "system", f"Report {report_id} updated successfully")
-        return JsonResponse({"message": f"Report {report_id} updated successfully"}, status=200)
     except Exception as e:
         oper_log("error", "system", f"Report update failed: {str(e)}")
-        return JsonResponse({"error": f"Failed to update report: {str(e)}"}, status=500)
+        return JsonResponse(
+            {"error": f"Failed to update report: {str(e)}"},
+            status=500
+        )
 
 
 def delete_report(report_id):
@@ -167,11 +219,11 @@
 
     try:
         # Delete logs first, then report
-        ReportDB.delete_report_log(report_id)
+        ReportDB.delete_log_by_report_id(report_id)
         deleted = ReportDB.delete_report(report_id)
 
         if not deleted:
-            return JsonResponse({"error": f"Failed to delete report data with report id: {report_id}"}, status=400)
+            return JsonResponse({"error": f"Failed to delete report data with report id: {report_id}"}, status=404)
 
         oper_log("info", "system", f"Report {report_id} data deleted successfully")
         return JsonResponse({"message": f"Report {report_id} data deleted successfully"}, status=200)
@@ -373,4 +425,4 @@
         device_type
     )
 
-    return report_name
\ No newline at end of file
+    return report_name
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/report/report_data_service.py
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/report/report_data_service.py	(revision 2834)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/report/report_data_service.py	(working copy)
@@ -4,6 +4,8 @@
 from hive.db.device_metric_queries import DeviceMetrics
 from django.http import JsonResponse
 from hive.utils import andebug
+from hive.report.report_queries import ReportDB
+from hive.custom_exceptions import generic_exception as ge
 
 
 def get_link_summary_data(time_from, time_to):
@@ -311,4 +313,43 @@
         return device_dict
 
     except Exception as e:
-        return JsonResponse({"error": f"Error while fetching Device Detailed data: {str(e)}"}, status=500)
\ No newline at end of file
+        return JsonResponse({"error": f"Error while fetching Device Detailed data: {str(e)}"}, status=500)
+
+def update_report_service(report_id, update_payload):
+    """
+    Fetch existing report and update only provided fields.
+    """
+    # 1. Fetch existing report
+    report_details = ReportDB.get_report_details(report_id)
+    if not report_details:
+        raise ge.GenericError(404, "Report not found")
+
+    existing = report_details[0]
+
+    # 2. Merge fields (partial update)
+    updated_name = update_payload.get("name", existing.get("name"))
+    updated_subject_type = update_payload.get("subject_type", existing.get("subject_type"))
+    updated_subject_name = update_payload.get("subject_name", existing.get("subject_name"))
+    updated_device_ip = update_payload.get("device_ip", existing.get("device_ip"))
+    updated_device_type = update_payload.get("device_type", existing.get("device_type"))
+    updated_from_time = update_payload.get("from_time", existing.get("from_time"))
+    updated_to_time = update_payload.get("to_time", existing.get("to_time"))
+    updated_send_to = update_payload.get("send_to", existing.get("send_to"))
+
+    # 3. Update DB
+    updated = ReportDB.update_report(
+        report_id,
+        updated_name,
+        updated_subject_type,
+        updated_subject_name,
+        updated_device_ip,
+        updated_device_type,
+        updated_from_time,
+        updated_to_time,
+        updated_send_to,
+    )
+
+    if not updated:
+        raise ge.GenericError(400, f'No changes detected or update failed for report id: {report_id}')
+
+    return True
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/report/report_queries.py
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/report/report_queries.py	(revision 2834)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/report/report_queries.py	(working copy)
@@ -98,7 +98,7 @@
                     send_to = %s
                 WHERE id = %s;
             """
-        params = (name, subject_type, subject_name, device_ip, from_time, to_time, send_to, report_id)
+        params = (name, subject_type, subject_name, device_ip, device_type, from_time, to_time, send_to, report_id)
         req = {"query": query, "params": params}
         response = DBClient.execute_modify_query(req, "postgres")
 
@@ -140,7 +140,8 @@
         req = {"query": query, "params": params}
         response = DBClient.execute_modify_query(req, "postgres")
 
-        if response.get("status") == 200 and response.get("rows_affected", 0) > 0:
+        affected_rows = response.get("data", {}).get("affected_rows", 0)
+        if response.get("status") == 200 and affected_rows > 0:
             return True
         else:
             oper_log('error', 'system', f"Report {report_id} not found or already deleted or DB error")
@@ -172,8 +173,54 @@
             return []
 
 
+
     @staticmethod
-    def get_report_log(report_id):
+    def delete_report_log(log_id):
+        """
+        Delete all report_log entries for a given log_id.
+        """
+        query = "DELETE FROM report_log WHERE id = %s;"
+        params = (log_id,)
+        req = {"query": query, "params": params}
+        response = DBClient.execute_modify_query(req, "postgres")
+
+        affected_rows = response.get("data", {}).get("affected_rows", 0)
+        if response.get("status") == 200 and affected_rows > 0:
+            return True
+        else:
+            oper_log('error', 'system',
+                     f"Report log for with id:{log_id} not found or already deleted or DB error")
+            return False
+
+    @staticmethod
+    def get_report_log(log_id):
+        """
+        Fetch report log entries by log_id.
+        """
+        query = f"""
+                SELECT
+                    id,
+                    subject_type,
+                    subject_name,
+                    start_time,
+                    status,
+                    result
+                FROM report_log
+                WHERE id = {log_id};
+            """
+        req = {"query": query}
+        response = DBClient.execute_query(req, "postgres")
+
+        if response.get("status") == 200:
+            return response.get("data", [])
+        else:
+            oper_log('error', 'system',
+                     f"Failed to fetch report_log: {response.get('message')} - {response.get('data')}")
+            return []
+
+
+    @staticmethod
+    def get_log_by_report_id(report_id):
         """
         Fetch report log entries by report_id.
         """
@@ -256,7 +303,7 @@
             return False
 
     @staticmethod
-    def delete_report_log(report_id):
+    def delete_log_by_report_id(report_id):
         """
         Delete all report_log entries for a given report_id.
         """
@@ -265,9 +312,10 @@
         req = {"query": query, "params": params}
         response = DBClient.execute_modify_query(req, "postgres")
 
-        if response.get("status") == 200:
+        affected_rows = response.get("data", {}).get("affected_rows", 0)
+        if response.get("status") == 200 and affected_rows > 0:
             return True
         else:
             oper_log('error', 'system',
-                     f"Failed to delete report_log: {response.get('message')} - {response.get('data')}")
+                     f"Report log for report id:{report_id} not found or already deleted or DB error")
             return False
