diff options
Diffstat (limited to 'lib/srtgui/reports.py')
-rw-r--r-- | lib/srtgui/reports.py | 227 |
1 files changed, 225 insertions, 2 deletions
diff --git a/lib/srtgui/reports.py b/lib/srtgui/reports.py index a1f0de00..715c5606 100644 --- a/lib/srtgui/reports.py +++ b/lib/srtgui/reports.py @@ -20,13 +20,14 @@ import os import logging -from datetime import datetime +from datetime import datetime, timedelta import csv from orm.models import Cve, CveSource, Vulnerability, Investigation, Defect, Product from orm.models import Package from orm.models import SRTool, SrtSetting from orm.models import PublishSet, DefectHistory +from orm.models import Notify, ErrorLog from srtgui.api import readCveDetails, summaryCveDetails from django.db.models import Q @@ -2273,7 +2274,7 @@ class HistoryDefectReport(Report): separator = ";" if csv_separator == 'comma': separator = "," if csv_separator == 'tab': separator = "\t" - writer = csv.writer(csvfile, delimiter=separator, + writer = csv.writer(report_name, delimiter=separator, quotechar='"', quoting=csv.QUOTE_MINIMAL) else: separator = "," @@ -2297,6 +2298,223 @@ class HistoryDefectReport(Report): ############################################################################### # +# Notifications reports +# + +class NotificationsReport(Report): + """Report for the Notifications Page""" + + def __init__(self, parent_page, *args, **kwargs): + _log_args("WR_NOTIFICATION_INIT(%s)" % parent_page, *args, **kwargs) + super(NotificationsReport, self).__init__(parent_page, *args, **kwargs) + + def get_context_data(self, *args, **kwargs): + _log_args("WR_NOTIFICATION_CONTEXT", *args, **kwargs) + context = super(NotificationsReport, self).get_context_data(*args, **kwargs) + + context['report_type_list'] = '\ + <option value="summary">Notification List</option> \ + ' + + context['report_columnrange_list'] = '' + context['report_format_list'] = '\ + <input type="radio" name="format" value="txt" checked> Text<br> \ + <input type="radio" name="format" value="csv"> CSV \ + (Separator: \ + <select name="csv_separator"> \ + <option value="semi">Semi-colon</option> \ + <option value="comma">Comma</option> \ + <option value="tab">Tab</option> \ + </select>) \ + <br> \ + ' + + context['report_recordrange_list'] = '\ + <input type="radio" name="records" value="all"> All<br> \ + ' + + # Add a date range + date_start = datetime.today() - timedelta(days=30) + date_stop = datetime.today() + context['report_date_list'] = '\ + Start: <input type="text" name="date_start" value="%s"><br> \ + Stop: <input type="text" name="date_stop" value="%s"> \ + ' % (date_start.strftime('%m/%d/%Y'),date_stop.strftime('%m/%d/%Y')) + + # Done! + return context + + def exec_report(self, *args, **kwargs): + _log_args("WR_NOTIFICATION_EXEC", *args, **kwargs) + + request_POST = self.request.POST + + records = request_POST.get('records', '') + format = request_POST.get('format', '') +# title = request_POST.get('title', '') + report_type = request_POST.get('report_type', '') + record_list = request_POST.get('record_list', '') + csv_separator = request_POST.get('csv_separator', 'semi') + + # Dates (make as no timezone) + msg = '' + try: + msg = 'Start:%s' % request_POST.get('date_start', '') + date_start = datetime.strptime(request_POST.get('date_start', ''), '%m/%d/%Y') + msg = 'Stop:%s' % request_POST.get('date_stop', '') + date_stop = datetime.strptime(request_POST.get('date_stop', ''), '%m/%d/%Y') + if date_stop < date_start: + return 'Error:stop date is before start date','' + except Exception as e: + return 'Error:bad format for dates (must be mm/dd/yyyy) (%s)(%s)' % (msg,e),'' + + date_start = date_start.strftime('%Y-%m-%d') + date_stop = date_stop.strftime('%Y-%m-%d') + + report_name = '%s/notifications_%s_%s.%s' % (SRT_REPORT_DIR,report_type,datetime.today().strftime('%Y%m%d_%H%M'),format) + with open(report_name, 'w') as file: + + if 'csv' == format: + separator = ";" + if csv_separator == 'comma': separator = "," + if csv_separator == 'tab': separator = "\t" + writer = csv.writer(file, delimiter=separator, + quotechar='"', quoting=csv.QUOTE_MINIMAL) + else: + separator = "," + + if ('summary' == report_type): + if 'csv' == format: + writer.writerow(['Date','Category','Priority','Decription','URL','Author']) + if 'txt' == format: + file.write("Report : Notifications\n") + file.write("\n") + text_format='%02d) %-10s %-25s %-10s "%s",%s,%s\n' + file.write(text_format % (0,'Date','Category','Priority','Decription','URL','Author')) + +# for i,notify in enumerate(Notify.objects.filter(srt_updated__gte=date_start,srt_updated__lte=date_stop).order_by('-srt_updated')): + for i,notify in enumerate(Notify.objects.all().order_by('-srt_updated')): + srt_updated = notify.srt_updated.strftime('%Y-%m-%d') + if (date_start > srt_updated) or (date_stop < srt_updated): + continue + + if 'csv' == format: + writer.writerow([i+1,srt_updated,notify.category,notify.get_priority_text,notify.description,notify.url,notify.author]) + if 'txt' == format: + file.write(text_format % (i+1,srt_updated,notify.category,notify.get_priority_text,notify.description,notify.url,notify.author)) + + return report_name,os.path.basename(report_name) + +############################################################################### +# +# ErrorLogs reports +# + +class ErrorLogsReport(Report): + """Report for the Error Logs Page""" + + def __init__(self, parent_page, *args, **kwargs): + _log_args("WR_ERRORLOGS_INIT(%s)" % parent_page, *args, **kwargs) + super(ErrorLogsReport, self).__init__(parent_page, *args, **kwargs) + + def get_context_data(self, *args, **kwargs): + _log_args("WR_ERRORLOGS_CONTEXT", *args, **kwargs) + context = super(ErrorLogsReport, self).get_context_data(*args, **kwargs) + + context['report_type_list'] = '\ + <option value="summary">Error Log List</option> \ + ' + + context['report_columnrange_list'] = '' + context['report_format_list'] = '\ + <input type="radio" name="format" value="txt" checked> Text<br> \ + <input type="radio" name="format" value="csv"> CSV \ + (Separator: \ + <select name="csv_separator"> \ + <option value="semi">Semi-colon</option> \ + <option value="comma">Comma</option> \ + <option value="tab">Tab</option> \ + </select>) \ + <br> \ + ' + + context['report_recordrange_list'] = '\ + <input type="radio" name="records" value="all"> All<br> \ + ' + + # Add a date range + date_start = datetime.today() - timedelta(days=30) + date_stop = datetime.today() + context['report_date_list'] = '\ + Start: <input type="text" name="date_start" value="%s"><br> \ + Stop: <input type="text" name="date_stop" value="%s"> \ + ' % (date_start.strftime('%m/%d/%Y'),date_stop.strftime('%m/%d/%Y')) + + # Done! + return context + + def exec_report(self, *args, **kwargs): + _log_args("WR_ERRORLOGS_EXEC", *args, **kwargs) + + request_POST = self.request.POST + + records = request_POST.get('records', '') + format = request_POST.get('format', '') +# title = request_POST.get('title', '') + report_type = request_POST.get('report_type', '') + record_list = request_POST.get('record_list', '') + csv_separator = request_POST.get('csv_separator', 'semi') + + # Dates (make as no timezone) + msg = '' + try: + msg = 'Start:%s' % request_POST.get('date_start', '') + date_start = datetime.strptime(request_POST.get('date_start', ''), '%m/%d/%Y') + msg = 'Stop:%s' % request_POST.get('date_stop', '') + date_stop = datetime.strptime(request_POST.get('date_stop', ''), '%m/%d/%Y') + if date_stop < date_start: + return 'Error:stop date is before start date','' + except Exception as e: + return 'Error:bad format for dates (must be mm/dd/yyyy) (%s)(%s)' % (msg,e),'' + + date_start = date_start.strftime('%Y-%m-%d') + date_stop = date_stop.strftime('%Y-%m-%d') + + report_name = '%s/errorlogs_%s_%s.%s' % (SRT_REPORT_DIR,report_type,datetime.today().strftime('%Y%m%d_%H%M'),format) + with open(report_name, 'w') as file: + + if 'csv' == format: + separator = ";" + if csv_separator == 'comma': separator = "," + if csv_separator == 'tab': separator = "\t" + writer = csv.writer(file, delimiter=separator, + quotechar='"', quoting=csv.QUOTE_MINIMAL) + else: + separator = "," + + if ('summary' == report_type): + if 'csv' == format: + writer.writerow(['Date','Severity','Decription']) + if 'txt' == format: + file.write("Report : Error Logs\n") + file.write("Start=%s,Stop=%s\n" % (date_start,date_stop)) + text_format='%02d) %-10s %-10s "%s"\n' + file.write(text_format % (0,'Date','Severity','Decription')) + +# for i,notify in enumerate(ErrorLog.objects.filter(srt_created__gte=date_start,srt_created__lte=date_stop).order_by('-srt_created')): + for i,notify in enumerate(ErrorLog.objects.all().order_by('-srt_created')): + srt_created = notify.srt_created.strftime('%Y-%m-%d') + if (date_start > srt_created) or (date_stop < srt_created): + continue + if 'csv' == format: + writer.writerow([i+1,srt_created,notify.severity,notify.description]) + if 'txt' == format: + file.write(text_format % (i+1,srt_created,notify.get_severity_text,notify.description)) + + return report_name,os.path.basename(report_name) + +############################################################################### +# class DefaultReport(Report): """Report for the Default Page""" @@ -2377,6 +2595,11 @@ class ReportManager(): elif 'cpes_srtool' == parent_page: return CpesSrtoolReport(parent_page, *args, **kwargs) + elif 'manage_notifications' == parent_page: + return NotificationsReport(parent_page, *args, **kwargs) + elif 'error_logs' == parent_page: + return ErrorLogsReport(parent_page, *args, **kwargs) + elif 'history_defect' == parent_page: return HistoryDefectReport(parent_page, *args, **kwargs) |