Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-04-25 08:29:10

0001 """
0002 FastMon-specific views for Time Frame file 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 FastMonFile
0010 from .utils import DataTablesProcessor, get_filter_params, format_datetime
0011 
0012 
0013 @login_required
0014 def fastmon_files_list(request):
0015     """
0016     Professional FastMon files list view using server-side DataTables.
0017     Provides high-performance access to all Time Frame (TF) file records with filtering.
0018     """
0019     # Get filter parameters (for initial state)
0020     stf_filename = request.GET.get('stf_filename')
0021     status_filter = request.GET.get('status')
0022     run_number = request.GET.get('run_number')
0023 
0024     # Get filter options for dropdown links
0025     # Get unique STF filenames that have TF files
0026     stf_filenames = FastMonFile.objects.select_related('stf_file').values_list(
0027         'stf_file__stf_filename', flat=True
0028     ).distinct()
0029 
0030     # Get run numbers from related STF files
0031     run_numbers = FastMonFile.objects.select_related('stf_file__run').values_list(
0032         'stf_file__run__run_number', flat=True
0033     ).distinct()
0034 
0035     # Get status choices from the model
0036     statuses = [choice[0] for choice in FastMonFile._meta.get_field('status').choices]
0037 
0038     # Column definitions for DataTables
0039     columns = [
0040         {'name': 'tf_filename', 'title': 'TF Filename', 'orderable': True},
0041         {'name': 'stf_file__stf_filename', 'title': 'Parent STF', 'orderable': True},
0042         {'name': 'stf_file__run__run_number', 'title': 'Run', 'orderable': True},
0043         {'name': 'file_size_bytes', 'title': 'Size (bytes)', 'orderable': True},
0044         {'name': 'status', 'title': 'Status', 'orderable': True},
0045         {'name': 'created_at', 'title': 'Created', 'orderable': True},
0046     ]
0047 
0048     context = {
0049         'table_title': 'FastMon Files (Time Frames)',
0050         'table_description': 'Track Time Frame (TF) files sampled from Super Time Frames for fast monitoring.',
0051         'ajax_url': reverse('monitor_app:fastmon_files_datatable_ajax'),
0052         'columns': columns,
0053         'stf_filenames': sorted([s for s in stf_filenames if s]),
0054         'run_numbers': sorted(run_numbers, reverse=True),
0055         'statuses': statuses,
0056         'selected_stf_filename': stf_filename,
0057         'selected_status': status_filter,
0058         'selected_run_number': run_number,
0059     }
0060     return render(request, 'monitor_app/fastmon_files_list.html', context)
0061 
0062 
0063 def fastmon_files_datatable_ajax(request):
0064     """
0065     AJAX endpoint for server-side DataTables processing of FastMon files.
0066     """
0067     # Initialize DataTables processor
0068     columns = ['tf_filename', 'stf_file__stf_filename', 'stf_file__run__run_number',
0069                'file_size_bytes', 'status', 'created_at']
0070     dt = DataTablesProcessor(request, columns, default_order_column=5, default_order_direction='desc')
0071 
0072     # Build base queryset with related data
0073     queryset = FastMonFile.objects.select_related('stf_file', 'stf_file__run')
0074 
0075     # Apply filters using utility
0076     filter_mapping = {
0077         'stf_filename': 'stf_file__stf_filename',
0078         'status': 'status',
0079         'run_number': 'stf_file__run__run_number'
0080     }
0081     filters = get_filter_params(request, filter_mapping.keys())
0082     # Apply filters with correct field names
0083     for param_name, field_name in filter_mapping.items():
0084         if filters[param_name]:
0085             queryset = queryset.filter(**{field_name: filters[param_name]})
0086 
0087     # Get counts and apply search/pagination
0088     records_total = FastMonFile.objects.count()
0089     search_fields = ['tf_filename', 'stf_file__stf_filename', 'stf_file__run__run_number']
0090     queryset = dt.apply_search(queryset, search_fields)
0091     records_filtered = queryset.count()
0092 
0093     # Apply ordering and pagination
0094     queryset = queryset.order_by(dt.get_order_by())
0095     fastmon_files = dt.apply_pagination(queryset)
0096 
0097     # Format data for DataTables
0098     data = []
0099     for file in fastmon_files:
0100         # Use plain text status (consistent with STF files view)
0101         status_text = file.get_status_display()
0102 
0103         # Format file size with commas for readability
0104         file_size = f"{file.file_size_bytes:,}" if file.file_size_bytes else "N/A"
0105 
0106         # Make STF filename clickable to go to STF detail page
0107         from django.urls import reverse
0108         stf_detail_url = reverse('monitor_app:stf_file_detail', args=[file.stf_file.file_id])
0109         stf_link = f'<a href="{stf_detail_url}">{file.stf_file.stf_filename}</a>'
0110 
0111         # Make run number clickable to go to run detail page
0112         run_detail_url = reverse('monitor_app:run_detail', args=[file.stf_file.run.run_number])
0113         run_link = f'<a href="{run_detail_url}">{file.stf_file.run.run_number}</a>'
0114 
0115         data.append([
0116             file.tf_filename,
0117             stf_link,
0118             run_link,
0119             file_size,
0120             status_text,
0121             format_datetime(file.created_at)
0122         ])
0123 
0124     # Return DataTables-formatted response
0125     return JsonResponse({
0126         'draw': dt.draw,
0127         'recordsTotal': records_total,
0128         'recordsFiltered': records_filtered,
0129         'data': data
0130     })