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
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
0025
0026 stf_filenames = FastMonFile.objects.select_related('stf_file').values_list(
0027 'stf_file__stf_filename', flat=True
0028 ).distinct()
0029
0030
0031 run_numbers = FastMonFile.objects.select_related('stf_file__run').values_list(
0032 'stf_file__run__run_number', flat=True
0033 ).distinct()
0034
0035
0036 statuses = [choice[0] for choice in FastMonFile._meta.get_field('status').choices]
0037
0038
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
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
0073 queryset = FastMonFile.objects.select_related('stf_file', 'stf_file__run')
0074
0075
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
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
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
0094 queryset = queryset.order_by(dt.get_order_by())
0095 fastmon_files = dt.apply_pagination(queryset)
0096
0097
0098 data = []
0099 for file in fastmon_files:
0100
0101 status_text = file.get_status_display()
0102
0103
0104 file_size = f"{file.file_size_bytes:,}" if file.file_size_bytes else "N/A"
0105
0106
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
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
0125 return JsonResponse({
0126 'draw': dt.draw,
0127 'recordsTotal': records_total,
0128 'recordsFiltered': records_filtered,
0129 'data': data
0130 })