Skip to content
Snippets Groups Projects
Commit 7dc2ba09 authored by Jan Mach's avatar Jan Mach
Browse files

Moved as much code from all views based on HawatSearchView to base class and common Jinja template.

(Redmine issue: #3443)
parent 21851685
No related branches found
No related tags found
No related merge requests found
......@@ -342,20 +342,31 @@ class HawatBaseView(flask.views.View):
@classmethod
def get_menu_title(cls):
"""
Return menu title/label for the view.
Return menu item title for the view.
:return: Menu title for the view.
:return: Menu item title for the view.
:rtype: str
"""
raise NotImplementedError()
@classmethod
def get_menu_legend(cls, item = None):
"""
Return menu item legend for the view (hover tooltip).
:param item: Optional item.
:return: Menu item legend for the view.
:rtype: str
"""
return cls.get_menu_title()
@classmethod
def get_menu_icon(cls):
"""
Return menu icon name for the view. Given name will be used as index to
Return menu item icon name for the view. Given name will be used as index to
built-in icon registry.
:return: Menu icon for the view.
:return: Menu item icon for the view.
:rtype: str
"""
raise NotImplementedError()
......@@ -486,6 +497,13 @@ class HawatRenderableView(HawatBaseView): # pylint: disable=locally-disabled,ab
Base class for all views, that are rendering content based on Jinja2 templates.
"""
@classmethod
def get_menu_icon(cls):
"""
*Interface implementation* of :py:func:`hawat.base.HawatBaseView.get_menu_icon`.
"""
return 'module-{}'.format(cls.module_name)
@classmethod
def get_view_title(cls):
"""
......@@ -593,8 +611,31 @@ class HawatSearchView(HawatDbmodelView):
"""
Base class for search views.
"""
@classmethod
def get_view_name(cls):
"""
*Interface implementation* of :py:func:`hawat.base.HawatBaseView.get_view_name`.
"""
return 'search'
@classmethod
def get_menu_icon(cls):
"""
*Interface implementation* of :py:func:`hawat.base.HawatBaseView.get_menu_icon`.
"""
return 'module-{}'.format(cls.module_name)
@classmethod
def get_view_template(cls):
"""
*Interface implementation* of :py:func:`hawat.base.HawatRenderableView.get_view_template`.
"""
return '{}/search.html'.format(cls.module_name)
#---------------------------------------------------------------------------
@staticmethod
def get_search_form(args):
def get_search_form(request_args):
"""
*Hook method*. Must return instance of :py:mod:`flask_wtf.FlaskForm`
appropriate for given search type.
......@@ -615,11 +656,47 @@ class HawatSearchView(HawatDbmodelView):
params[arg] = request_args[arg]
return params
def search(self, query, model, args, context):
@staticmethod
def build_query(query, model, args, context): # pylint: disable=locally-disabled,unused-argument
"""
*Hook method*. Modify given query according to the given arguments.
"""
return query
def search(self, form_args, context):
"""
*Hook method*. Perform actual search with given query.
Perform actual search with given query.
"""
raise NotImplementedError()
query = self.build_query(self.dbquery, self.dbmodel, form_args, context)
# Adjust the query according to the paging parameters.
if 'limit' in form_args and form_args['limit']:
query = query.limit(int(form_args['limit']))
if 'page' in form_args and form_args['page'] and int(form_args['page']) > 1:
query = query.offset((int(form_args['page']) - 1) * int(form_args['limit']))
return query.all()
#---------------------------------------------------------------------------
@classmethod
def get_breadcrumbs_menu(cls):
"""
Get breadcrumbs menu.
"""
breadcrumbs_menu = hawat.menu.HawatMenu()
breadcrumbs_menu.add_entry(
'link',
'index',
endpoint = 'index',
title = gettext('Home')
)
breadcrumbs_menu.add_entry(
'endpoint',
'search',
endpoint = '{}.search'.format(cls.module_name)
)
return breadcrumbs_menu
@classmethod
def get_action_menu(cls):
......@@ -631,9 +708,18 @@ class HawatSearchView(HawatDbmodelView):
@classmethod
def get_context_action_menu(cls):
"""
Get context action menu for particular item.
*Interface implementation* of :py:func:`hawat.base.HawatItemListView.get_context_action_menu`.
"""
return None
context_action_menu = hawat.menu.HawatMenu()
context_action_menu.add_entry(
'endpoint',
'show',
endpoint = '{}.show'.format(cls.module_name),
hidetitle = True
)
return context_action_menu
#---------------------------------------------------------------------------
def dispatch_request(self): # pylint: disable=locally-disabled,arguments-differ
"""
......@@ -647,7 +733,7 @@ class HawatSearchView(HawatDbmodelView):
if hawat.const.HAWAT_FORM_ACTION_SUBMIT in flask.request.args:
if form.validate():
form_data = form.data
items = self.search(self.dbquery, self.dbmodel, form_data, context)
items = self.search(form_data, context)
context.update(
searched = True,
......@@ -669,7 +755,8 @@ class HawatSearchView(HawatDbmodelView):
context.update(
search_form = form,
request_args = flask.request.args,
query_params = self.get_query_parameters(form, flask.request.args)
query_params = self.get_query_parameters(form, flask.request.args),
breadcrumbs_menu = self.get_breadcrumbs_menu()
)
return flask.render_template(self.get_view_template(), **context)
......
......@@ -51,20 +51,6 @@ class SearchView(hawat.base.HawatSearchView):
authorization = [hawat.acl.PERMISSION_POWER]
@classmethod
def get_view_name(cls):
"""
*Interface implementation* of :py:func:`hawat.base.HawatBaseView.get_view_name`.
"""
return 'search'
@classmethod
def get_menu_icon(cls):
"""
*Interface implementation* of :py:func:`hawat.base.HawatBaseView.get_menu_icon`.
"""
return 'module-{}'.format(BLUEPRINT_NAME)
@classmethod
def get_menu_title(cls):
"""
......@@ -79,13 +65,6 @@ class SearchView(hawat.base.HawatSearchView):
"""
return lazy_gettext('Search item changelogs')
@classmethod
def get_view_template(cls):
"""
*Interface implementation* of :py:func:`hawat.base.HawatRenderableView.get_view_template`.
"""
return '{}/search.html'.format(BLUEPRINT_NAME)
#---------------------------------------------------------------------------
@property
......@@ -96,15 +75,16 @@ class SearchView(hawat.base.HawatSearchView):
return ItemChangeLogModel
@staticmethod
def get_search_form(args):
def get_search_form(request_args):
"""
*Interface implementation* of :py:func:`hawat.base.HawatSearchView.get_search_form`.
"""
return ItemChangeLogSearchForm(args, meta = {'csrf': False})
return ItemChangeLogSearchForm(request_args, meta = {'csrf': False})
def search(self, query, model, args, context):
@staticmethod
def build_query(query, model, args, context):
"""
*Interface implementation* of :py:func:`hawat.base.HawatSearchView.search`.
*Interface implementation* of :py:func:`hawat.base.HawatSearchView.build_query`.
"""
# Adjust query based on lower time boudary selection.
if 'dt_from' in args and args['dt_from']:
......@@ -123,32 +103,7 @@ class SearchView(hawat.base.HawatSearchView):
query = query.filter(model.model.in_(args['models']))
# Return the result sorted by creation time in descending order.
query = query.order_by(model.createtime.desc())
# Adjust the query according to the pagind parameters.
if 'limit' in args and args['limit']:
query = query.limit(int(args['limit']))
if 'page' in args and args['page'] and int(args['page']) > 1:
query = query.offset((int(args['page']) - 1) * int(args['limit']))
return query.all()
@classmethod
def get_context_action_menu(cls):
"""
*Interface implementation* of :py:func:`hawat.base.HawatItemListView.get_context_action_menu`.
"""
action_menu = hawat.menu.HawatMenu()
action_menu.add_entry(
'endpoint',
'show',
endpoint = 'changelogs.show',
hidetitle = True,
legend = lambda x: lazy_gettext('View details of item changelog record "%(item)s"', item = str(x))
)
return action_menu
return query.order_by(model.createtime.desc())
class ShowView(hawat.base.HawatItemShowView):
......@@ -168,6 +123,13 @@ class ShowView(hawat.base.HawatItemShowView):
"""
return lazy_gettext('Show item changelog record')
@classmethod
def get_menu_legend(cls, item = None):
"""
*Interface implementation* of :py:func:`hawat.base.HawatBaseView.get_menu_legend`.
"""
return lazy_gettext('View details of item changelog record "%(item)s"', item = str(item))
@classmethod
def get_view_title(cls):
"""
......
{%- extends "_layout.html" %}
{%- extends "_layout_search.html" %}
{%- block content %}
{%- block contentsearchform %}
<div class="row">
<div class="col-lg-12">
<ol class="breadcrumb">
<li><a href="{{ url_for('index') }}">{{ gettext('Home') }}</a></li>
<li class="active">{{ gettext('Changelogs') }}</li>
</ol>
<div class="jumbotron" style="margin-top: 1em;">
<h2>{{ hawat_this_view_title }}</h2>
<hr>
<form method="GET" class="form" action="{{ url_for('changelogs.search') }}">
<div class="row">
<div class="col-sm-6">
{{ macros_site.render_form_item_datetime(search_form.dt_from, 'datetimepicker-hm-from') }}
......@@ -32,27 +22,9 @@
</div>
</div>
<hr>
{%- endblock contentsearchform %}
<div class="btn-toolbar" role="toolbar" aria-label="{{ gettext('Form submission buttons') }}">
<div class="btn-group" role="group">
{{ search_form.submit(class_='btn btn-primary') }}
<a role="button" class="btn btn-default" href="{{ url_for('changelogs.search') }}">{{ gettext('Clear') }}</a>
</div>
</div>
</form>
</div> <!-- /.jumbotron -->
</div> <!-- /.col-lg-12 -->
</div> <!-- /.row -->
{%- if searched %}
{%- if items %}
{{ macros_site.render_pager(hawat_this_view_endpoint, query_params, pager_index_low, pager_index_high, pager_index_limit) }}
<div class="row">
<div class="col-lg-12">
{%- block contentsearchresult %}
<ul class="list-group list-group-hover">
{%- for item in items %}
......@@ -90,32 +62,4 @@
{%- endfor %}
</ul>
</div> <!-- /.col-lg-12 -->
</div> <!-- /.row -->
{{ macros_site.render_pager(hawat_this_view_endpoint, query_params, pager_index_low, pager_index_high, pager_index_limit) }}
{%- if permission_can('developer') %}
<hr>
{{ macros_site.render_raw_var('form_data', form_data) }}
{{ macros_site.render_raw_var('items', items) }}
{{ macros_site.render_raw_var('statistics', statistics) }}
{%- endif %}
{%- else %}
{%- call macros_site.render_alert('warning', False) %}
{{ gettext('No data matches your search criteria.') }}
{%- endcall %}
{%- endif %}
{%- if permission_can('developer') %}
<hr>
{{ macros_site.render_raw_var('request_args', request_args) }}
{{ macros_site.render_raw_var('query_params', query_params) }}
{%- endif %}
{%- endif %}
{%- endblock content %}
{%- endblock contentsearchresult %}
{%- extends "_layout.html" %}
{%- block content %}
<div class="row">
<div class="col-lg-12">
{%- if breadcrumbs_menu %}
{{ macros_site.render_menu_breadcrumbs(breadcrumbs_menu) }}
{%- endif %}
<!-- Search form - BEGIN ---------------------------------->
<div class="jumbotron" style="margin-top: 1em;">
<h2>{{ hawat_this_view_title }}</h2>
<hr>
<form method="GET" class="form" action="{{ url_for(hawat_this_view_endpoint) }}">
{% block contentsearchform %}{% endblock contentsearchform %}
<hr>
<div class="btn-toolbar" role="toolbar" aria-label="{{ gettext('Form submission buttons') }}">
<div class="btn-group" role="group">
{{ search_form.submit(class_='btn btn-primary') }}
<a role="button" class="btn btn-default" href="{{ url_for(hawat_this_view_endpoint) }}">{{ gettext('Clear') }}</a>
</div>
</div>
</form>
</div>
<!-- Search form - END ------------------------------------>
</div> <!-- /.col-lg-12 -->
</div> <!-- /.row -->
{%- if searched %}
{%- if items %}
{{ macros_site.render_pager(hawat_this_view_endpoint, query_params, pager_index_low, pager_index_high, pager_index_limit) }}
<div class="row">
<div class="col-lg-12">
{% block contentsearchresult %}{% endblock contentsearchresult %}
</div> <!-- /.col-lg-12 -->
</div> <!-- /.row -->
{{ macros_site.render_pager(hawat_this_view_endpoint, query_params, pager_index_low, pager_index_high, pager_index_limit) }}
{%- if permission_can('developer') %}
<hr>
{{ macros_site.render_raw_var('form_data', form_data) }}
{{ macros_site.render_raw_var('items', items) }}
{{ macros_site.render_raw_var('statistics', statistics) }}
{%- endif %}
{%- else %}
{%- call macros_site.render_alert('warning', False) %}
{{ gettext('No data matches your search criteria.') }}
{%- endcall %}
{%- endif %}
{%- if permission_can('developer') %}
<hr>
{{ macros_site.render_raw_var('request_args', request_args) }}
{{ macros_site.render_raw_var('query_params', query_params) }}
{%- endif %}
{%- endif %}
{%- endblock content %}
......@@ -75,13 +75,6 @@ class SearchView(hawat.base.HawatRenderableView):
"""
return 'search'
@classmethod
def get_menu_icon(cls):
"""
*Interface implementation* of :py:func:`hawat.base.HawatBaseView.get_menu_icon`.
"""
return 'module-{}'.format(BLUEPRINT_NAME)
@classmethod
def get_menu_title(cls):
"""
......@@ -96,6 +89,8 @@ class SearchView(hawat.base.HawatRenderableView):
"""
return lazy_gettext('Search internal geoip database')
#---------------------------------------------------------------------------
def dispatch_request(self):
"""
Mandatory interface required by the :py:func:`flask.views.View.dispatch_request`.
......
......@@ -65,6 +65,7 @@ def adjust_query_for_groups(query, groups):
return query
class SearchView(hawat.base.HawatSearchView):
"""
View responsible for searching IDEA event report database and presenting result.
......@@ -75,20 +76,6 @@ class SearchView(hawat.base.HawatSearchView):
authorization = [hawat.acl.PERMISSION_ANY]
@classmethod
def get_view_name(cls):
"""
*Interface implementation* of :py:func:`hawat.base.HawatBaseView.get_view_name`.
"""
return 'search'
@classmethod
def get_menu_icon(cls):
"""
*Interface implementation* of :py:func:`hawat.base.HawatBaseView.get_menu_icon`.
"""
return 'module-{}'.format(BLUEPRINT_NAME)
@classmethod
def get_menu_title(cls):
"""
......@@ -103,12 +90,7 @@ class SearchView(hawat.base.HawatSearchView):
"""
return lazy_gettext('Search event reports')
@classmethod
def get_view_template(cls):
"""
*Interface implementation* of :py:func:`hawat.base.HawatRenderableView.get_view_template`.
"""
return '{}/search.html'.format(BLUEPRINT_NAME)
#---------------------------------------------------------------------------
@property
def dbmodel(self):
......@@ -118,15 +100,16 @@ class SearchView(hawat.base.HawatSearchView):
return EventReportModel
@staticmethod
def get_search_form(args):
def get_search_form(request_args):
"""
*Interface implementation* of :py:func:`hawat.base.HawatSearchView.get_search_form`.
"""
return EventReportSearchForm(args, meta = {'csrf': False})
return EventReportSearchForm(request_args, meta = {'csrf': False})
def search(self, query, model, args, context):
@staticmethod
def build_query(query, model, args, context):
"""
*Interface implementation* of :py:func:`hawat.base.HawatSearchView.search`.
*Interface implementation* of :py:func:`hawat.base.HawatSearchView.build_query`.
"""
# Adjust query based on group selection.
query = adjust_query_for_groups(query, args.get('groups', None))
......@@ -146,15 +129,8 @@ class SearchView(hawat.base.HawatSearchView):
if 'severities' in args and args['types']:
query = query.filter(model.type.in_(args['types']))
#query = query.order_by(model.dt_to.desc()).order_by(model.label.desc())
query = query.order_by(model.createtime.desc()).order_by(model.label.desc())
if 'limit' in args and args['limit']:
query = query.limit(int(args['limit']))
if 'page' in args and args['page'] and int(args['page']) > 1:
query = query.offset((int(args['page']) - 1) * int(args['limit']))
return query.all()
# Return the result sorted by creation time in descending order and by label.
return query.order_by(model.createtime.desc()).order_by(model.label.desc())
def do_before_render(self, item, context):
"""
......@@ -178,18 +154,18 @@ class ShowView(hawat.base.HawatItemShowView):
authentication = True
@classmethod
def get_menu_icon(cls):
def get_menu_title(cls):
"""
*Interface implementation* of :py:func:`hawat.base.HawatBaseView.get_menu_icon`.
*Interface implementation* of :py:func:`hawat.base.HawatBaseView.get_menu_title`.
"""
return 'module-{}'.format(BLUEPRINT_NAME)
return lazy_gettext('Show report')
@classmethod
def get_menu_title(cls):
def get_menu_legend(cls, item = None):
"""
*Interface implementation* of :py:func:`hawat.base.HawatBaseView.get_menu_title`.
*Interface implementation* of :py:func:`hawat.base.HawatBaseView.get_menu_legend`.
"""
return lazy_gettext('Show report')
return lazy_gettext('View details of event report &quot;%(item)s&quot;', item = str(item))
@classmethod
def get_view_title(cls):
......@@ -207,7 +183,8 @@ class ShowView(hawat.base.HawatItemShowView):
"""
return EventReportModel
def authorize_item_action(self, item):
@classmethod
def authorize_item_action(cls, item):
"""
Perform access authorization for current user to particular item.
"""
......@@ -429,13 +406,6 @@ class DashboardView(hawat.base.HawatSearchView):
"""
return 'dashboard'
@classmethod
def get_menu_icon(cls):
"""
*Interface implementation* of :py:func:`hawat.base.HawatBaseView.get_menu_icon`.
"""
return 'module-{}'.format(BLUEPRINT_NAME)
@classmethod
def get_menu_title(cls):
"""
......@@ -450,6 +420,15 @@ class DashboardView(hawat.base.HawatSearchView):
"""
return lazy_gettext('Event reporting dashboards')
@classmethod
def get_view_template(cls):
"""
*Interface implementation* of :py:func:`hawat.base.HawatRenderableView.get_view_template`.
"""
return '{}/dashboard.html'.format(cls.module_name)
#---------------------------------------------------------------------------
@property
def dbmodel(self):
"""
......@@ -458,15 +437,16 @@ class DashboardView(hawat.base.HawatSearchView):
return EventReportModel
@staticmethod
def get_search_form(args):
def get_search_form(request_args):
"""
*Interface implementation* of :py:func:`hawat.base.HawatSearchView.get_search_form`.
"""
return ReportingDashboardForm(args, meta = {'csrf': False})
return ReportingDashboardForm(request_args, meta = {'csrf': False})
def search(self, query, model, args, context):
@staticmethod
def build_query(query, model, args, context):
"""
*Interface implementation* of :py:func:`hawat.base.HawatSearchView.search`.
*Interface implementation* of :py:func:`hawat.base.HawatSearchView.build_query`.
"""
# Adjust query based on group selection.
query = adjust_query_for_groups(query, args.get('groups', None))
......@@ -476,7 +456,9 @@ class DashboardView(hawat.base.HawatSearchView):
# Adjust query based on upper time boudary selection.
if 'dt_to' in args and args['dt_to']:
query = query.filter(model.dt_to <= args['dt_to'])
return query.order_by(model.label).all()
# Return the result sorted by label.
return query.order_by(model.label)
def do_before_render(self, item, context):
"""
......
{% extends "_layout.html" %}
{%- extends "_layout_search.html" %}
{% block content %}
{%- block contentsearchform %}
<div class="row">
<div class="col-lg-12">
<ol class="breadcrumb">
<li><a href="{{ url_for('index') }}">{{ gettext('Home') }}</a></li>
<li class="active">{{ gettext('Reports') }}</li>
</ol>
<div class="jumbotron" style="margin-top: 1em;">
<h2>{{ hawat_this_view_title }}</h2>
<hr>
<form method="GET" class="form" action="{{ url_for('reports.search') }}">
<div class="row">
<div class="col-sm-4">
{{ macros_site.render_form_item_default(search_form.label) }}
......@@ -36,95 +25,52 @@
</div>
</div>
<hr>
<div class="btn-toolbar" role="toolbar" aria-label="{{ gettext('Form submission buttons') }}">
<div class="btn-group" role="group">
{{ search_form.submit(class_='btn btn-primary') }}
<a role="button" class="btn btn-default" href="{{ url_for('reports.search') }}">{{ gettext('Clear') }}</a>
</div>
</div>
</form>
</div> <!-- /.jumbotron -->
</div> <!-- /.col-lg-12 -->
</div> <!-- /.row -->
{%- if searched %}
{%- if items %}
{{ macros_site.render_pager('reports.search', query_params, pager_index_low, pager_index_high, pager_index_limit) }}
{%- endblock contentsearchform %}
<div class="row">
<div class="col-lg-12">
{%- block contentsearchresult %}
<div class="list-group">
{%- for item in items %}
<a href="{{ url_for('reports.show', item_id = item.id ) }}" class="list-group-item">
<h4 class="list-group-item-heading">
{{ item.label }}
<ul class="list-group list-group-hover">
{%- for item in items %}
<li class="list-group-item">
<h4 class="list-group-item-heading">
<div class="pull-right">
{{ macros_site.render_menu_context_actions(context_action_menu, item) }}
</div>
{{ item.label }}
<hr>
{{ macros_site.render_report_label_type(item) }}
{{ macros_site.render_report_label_severity(item) }}
{{ macros_site.render_report_label_weight(item) }}
{%- if item.evcount_flt_blk %}
<span class="label label-default" data-toggle="tooltip" title="{{ gettext('Some of the data for this report were filtered out by reporting filters') }}" >{{ get_fa_icon('report-data-filtered') }}</span>
{%- endif %}
{%- if item.evcount_rlp %}
<span class="label label-danger" data-toggle="tooltip" title="{{ gettext('Report contains relapsed events') }}" >{{ get_fa_icon('report-data-relapsed') }}</span>
{%- endif %}
{%- if item.flag_testdata %}
<span class="label label-default" title="{{ gettext('Report was generated from test data') }}" data-toggle="tooltip">{{ get_fa_icon('report-data-test') }}</span>
{%- endif %}
{%- if item.flag_mailed %}
<span class="label label-default" title="{{ gettext('Report was mailed at') }} {{ babel_format_datetime(item.mail_dt) }} ({{ gettext('before') }} {{ babel_format_timedelta(current_datetime_utc - item.mail_dt) }}){% if item.mail_to %} {{ gettext('to') }} {{ item.mail_to | join(', ') }}{% endif %}" data-toggle="tooltip">{{ get_fa_icon('report-data-mailed') }}</span>
{%- endif %}
</h4>
<hr>
<p class="list-group-item-text">
<strong>{{ gettext('Abuse group:') }}</strong> {{ item.group.name }}
&nbsp;|&nbsp;
<strong>{{ gettext('Report window:') }}</strong> {{ babel_format_datetime(item.dt_from) }} - {{ babel_format_datetime(item.dt_to) }} ({{ babel_format_timedelta(item.delta) }})
&nbsp;|&nbsp;
<strong>{{ gettext('Created:') }}</strong> {{ babel_format_datetime(item.createtime) }} ({{ gettext('before') }} {{ babel_format_timedelta(current_datetime_utc - item.createtime) }})
&nbsp;|&nbsp;
<strong>{{ gettext('Event counts:') }}</strong> {{ item.evcount_rep }} {{ gettext('reported') }}{% if item.type == 'summary' %} ({{ item.evcount_all }} {{ gettext('matched') }}, {{ item.evcount_new }} {{ gettext('new events') }}, {{ item.evcount_flt_blk }} {{ gettext('filtered out') }}, {{ item.evcount_thr_blk }} {{ gettext('thresholded') }}, {{ item.evcount_rlp }} {{ gettext('relapsed') }}){% else %}, {{ item.evcount_all }} {{ gettext('total in parent summary report') }}{% endif %}
</p>
<hr>
{{ macros_site.render_report_label_type(item) }}
{{ macros_site.render_report_label_severity(item) }}
{{ macros_site.render_report_label_weight(item) }}
{%- if item.evcount_flt_blk %}
<span class="label label-default" data-toggle="tooltip" title="{{ gettext('Some of the data for this report were filtered out by reporting filters') }}" >{{ get_fa_icon('report-data-filtered') }}</span>
{%- endif %}
{%- if item.evcount_rlp %}
<span class="label label-danger" data-toggle="tooltip" title="{{ gettext('Report contains relapsed events') }}" >{{ get_fa_icon('report-data-relapsed') }}</span>
{%- endif %}
{%- if item.flag_testdata %}
<span class="label label-default" title="{{ gettext('Report was generated from test data') }}" data-toggle="tooltip">{{ get_fa_icon('report-data-test') }}</span>
{%- endif %}
{%- if item.flag_mailed %}
<span class="label label-default" title="{{ gettext('Report was mailed at') }} {{ babel_format_datetime(item.mail_dt) }} ({{ gettext('before') }} {{ babel_format_timedelta(current_datetime_utc - item.mail_dt) }}){% if item.mail_to %} {{ gettext('to') }} {{ item.mail_to | join(', ') }}{% endif %}" data-toggle="tooltip">{{ get_fa_icon('report-data-mailed') }}</span>
{%- endif %}
</h4>
<hr>
<p class="list-group-item-text">
<strong>{{ gettext('Abuse group:') }}</strong> {{ item.group.name }}
&nbsp;|&nbsp;
<strong>{{ gettext('Report window:') }}</strong> {{ babel_format_datetime(item.dt_from) }} - {{ babel_format_datetime(item.dt_to) }} ({{ babel_format_timedelta(item.delta) }})
&nbsp;|&nbsp;
<strong>{{ gettext('Created:') }}</strong> {{ babel_format_datetime(item.createtime) }} ({{ gettext('before') }} {{ babel_format_timedelta(current_datetime_utc - item.createtime) }})
&nbsp;|&nbsp;
<strong>{{ gettext('Event counts:') }}</strong> {{ item.evcount_rep }} {{ gettext('reported') }}{% if item.type == 'summary' %} ({{ item.evcount_all }} {{ gettext('matched') }}, {{ item.evcount_new }} {{ gettext('new events') }}, {{ item.evcount_flt_blk }} {{ gettext('filtered out') }}, {{ item.evcount_thr_blk }} {{ gettext('thresholded') }}, {{ item.evcount_rlp }} {{ gettext('relapsed') }}){% else %}, {{ item.evcount_all }} {{ gettext('total in parent summary report') }}{% endif %}
</p>
<hr>
<div class="progress" data-toggle="tooltip" title="{{ gettext('Number of events in this report in comparison with other reports in the result.') }}">
<div class="progress-bar progress-bar-warning" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: {{ '{:3.0f}'.format(item.evcount_rep/max_evcount_rep*100) }}%">
<div class="progress" data-toggle="tooltip" title="{{ gettext('Number of events in this report in comparison with other reports in the result.') }}">
<div class="progress-bar progress-bar-warning" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: {{ '{:3.0f}'.format(item.evcount_rep/max_evcount_rep*100) }}%">
</div>
</div>
</div>
</a>
</li>
{%- endfor %}
</div>
</div> <!-- /.col-lg-12 -->
</div> <!-- /.row -->
{{ macros_site.render_pager('reports.search', query_params, pager_index_low, pager_index_high, pager_index_limit) }}
{%- if permission_can('developer') %}
<hr>
{{ macros_site.render_raw_var('form_data', form_data) }}
{{ macros_site.render_raw_var('items', items) }}
{{ macros_site.render_raw_var('statistics', statistics) }}
{%- endif %}
{%- else %}
{%- call macros_site.render_alert('warning', False) %}
{{ gettext('No data matches your search criteria.') }}
{%- endcall %}
{%- endif %}
{%- if permission_can('developer') %}
<hr>
{{ macros_site.render_raw_var('request_args', request_args) }}
{{ macros_site.render_raw_var('query_params', query_params) }}
{%- endif %}
{%- endif %}
</ul>
{%- endblock content %}
{%- endblock contentsearchresult %}
......@@ -81,13 +81,6 @@ class SearchView(hawat.base.HawatRenderableView):
"""
return 'search'
@classmethod
def get_menu_icon(cls):
"""
*Interface implementation* of :py:func:`hawat.base.HawatBaseView.get_menu_icon`.
"""
return 'module-{}'.format(BLUEPRINT_NAME)
@classmethod
def get_menu_title(cls):
"""
......@@ -102,6 +95,8 @@ class SearchView(hawat.base.HawatRenderableView):
"""
return lazy_gettext('Search internal whois database')
#---------------------------------------------------------------------------
def dispatch_request(self):
"""
Mandatory interface required by the :py:func:`flask.views.View.dispatch_request`.
......
......@@ -340,7 +340,7 @@ class HawatViewMenuEntry(HawatMenuEntry):
:rtype: str
"""
if not self.hidelegend:
value = self._legend or self.view.get_view_title()
value = self._legend or self.view.get_menu_legend(item = item)
if value:
if callable(value):
return value(item)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment