File indexing completed on 2026-04-25 08:29:10
0001 """
0002 TF Slices views for fast processing workflow monitoring.
0003 """
0004
0005 from django.contrib.auth.decorators import login_required
0006 from django.shortcuts import render
0007 from django.http import JsonResponse
0008 from django.urls import reverse
0009 from .models import TFSlice
0010 from .utils import DataTablesProcessor, get_filter_params, format_datetime
0011
0012
0013 @login_required
0014 def tf_slices_list(request):
0015 """
0016 TF slices list view using server-side DataTables.
0017 Provides high-performance access to all TF slice records with filtering.
0018 """
0019
0020 tf_filename = request.GET.get('tf_filename')
0021 stf_filename = request.GET.get('stf_filename')
0022 status_filter = request.GET.get('status')
0023 run_number = request.GET.get('run_number')
0024
0025
0026 tf_filenames = TFSlice.objects.values_list(
0027 'tf_filename', flat=True
0028 ).distinct()
0029
0030 stf_filenames = TFSlice.objects.values_list(
0031 'stf_filename', flat=True
0032 ).distinct()
0033
0034 run_numbers = TFSlice.objects.values_list(
0035 'run_number', flat=True
0036 ).distinct()
0037
0038
0039 statuses = TFSlice.objects.values_list('status', flat=True).distinct()
0040
0041
0042 columns = [
0043 {'name': 'slice_id', 'title': 'Slice ID', 'orderable': True},
0044 {'name': 'tf_filename', 'title': 'TF Sample', 'orderable': True},
0045 {'name': 'stf_filename', 'title': 'STF File', 'orderable': True},
0046 {'name': 'run_number', 'title': 'Run', 'orderable': True},
0047 {'name': 'tf_first', 'title': 'TF Range', 'orderable': True},
0048 {'name': 'tf_count', 'title': 'TF Count', 'orderable': True},
0049 {'name': 'status', 'title': 'Status', 'orderable': True},
0050 {'name': 'assigned_worker', 'title': 'Worker', 'orderable': True},
0051 {'name': 'created_at', 'title': 'Created', 'orderable': True},
0052 ]
0053
0054 context = {
0055 'table_title': 'TF Slices (Fast Processing)',
0056 'table_description': 'Track Time Frame slices for parallel worker processing in fast processing workflow.',
0057 'ajax_url': reverse('monitor_app:tf_slices_datatable_ajax'),
0058 'columns': columns,
0059 'tf_filenames': sorted([f for f in tf_filenames if f]),
0060 'stf_filenames': sorted([f for f in stf_filenames if f]),
0061 'run_numbers': sorted(run_numbers, reverse=True),
0062 'statuses': sorted([s for s in statuses if s]),
0063 'selected_tf_filename': tf_filename,
0064 'selected_stf_filename': stf_filename,
0065 'selected_status': status_filter,
0066 'selected_run_number': run_number,
0067 }
0068 return render(request, 'monitor_app/tf_slices_list.html', context)
0069
0070
0071 def tf_slices_datatable_ajax(request):
0072 """
0073 AJAX endpoint for server-side DataTables processing of TF slices.
0074 """
0075
0076 columns = ['slice_id', 'tf_filename', 'stf_filename', 'run_number',
0077 'tf_first', 'tf_count', 'status', 'assigned_worker', 'created_at']
0078 dt = DataTablesProcessor(request, columns, default_order_column=8, default_order_direction='desc')
0079
0080
0081 queryset = TFSlice.objects.all()
0082
0083
0084 filter_mapping = {
0085 'tf_filename': 'tf_filename',
0086 'stf_filename': 'stf_filename',
0087 'status': 'status',
0088 'run_number': 'run_number'
0089 }
0090 filters = get_filter_params(request, filter_mapping.keys())
0091 for param_name, field_name in filter_mapping.items():
0092 if filters[param_name]:
0093 queryset = queryset.filter(**{field_name: filters[param_name]})
0094
0095
0096 records_total = TFSlice.objects.count()
0097 search_fields = ['slice_id', 'tf_filename', 'stf_filename', 'run_number', 'status', 'assigned_worker']
0098 queryset = dt.apply_search(queryset, search_fields)
0099 records_filtered = queryset.count()
0100
0101
0102 queryset = queryset.order_by(dt.get_order_by())
0103 slices = dt.apply_pagination(queryset)
0104
0105
0106 data = []
0107 for slice_obj in slices:
0108
0109 tf_range = f"{slice_obj.tf_first}-{slice_obj.tf_last}"
0110
0111
0112 worker_display = slice_obj.assigned_worker if slice_obj.assigned_worker else "-"
0113
0114 data.append([
0115 slice_obj.slice_id,
0116 slice_obj.tf_filename,
0117 slice_obj.stf_filename,
0118 slice_obj.run_number,
0119 tf_range,
0120 slice_obj.tf_count,
0121 slice_obj.status,
0122 worker_display,
0123 format_datetime(slice_obj.created_at)
0124 ])
0125
0126
0127 return JsonResponse({
0128 'draw': dt.draw,
0129 'recordsTotal': records_total,
0130 'recordsFiltered': records_filtered,
0131 'data': data
0132 })