Back to home page

EIC code displayed by LXR

 
 

    


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     # Get filter parameters
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     # Get filter options for dropdown links
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     # Get unique status values (no choices defined, so get from DB)
0039     statuses = TFSlice.objects.values_list('status', flat=True).distinct()
0040 
0041     # Column definitions for DataTables
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     # Initialize DataTables processor
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     # Build base queryset
0081     queryset = TFSlice.objects.all()
0082 
0083     # Apply filters
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     # Get counts and apply search/pagination
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     # Apply ordering and pagination
0102     queryset = queryset.order_by(dt.get_order_by())
0103     slices = dt.apply_pagination(queryset)
0104 
0105     # Format data for DataTables
0106     data = []
0107     for slice_obj in slices:
0108         # TF range display
0109         tf_range = f"{slice_obj.tf_first}-{slice_obj.tf_last}"
0110 
0111         # Worker display
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     # Return DataTables-formatted response
0127     return JsonResponse({
0128         'draw': dt.draw,
0129         'recordsTotal': records_total,
0130         'recordsFiltered': records_filtered,
0131         'data': data
0132     })