Skip to content

Commit

Permalink
Allow filtering event log by related entries
Browse files Browse the repository at this point in the history
  • Loading branch information
OmeGak committed Jul 1, 2020
1 parent 0a098a5 commit 29eb4d0
Show file tree
Hide file tree
Showing 9 changed files with 65 additions and 7 deletions.
2 changes: 2 additions & 0 deletions CHANGES.rst
Expand Up @@ -78,6 +78,8 @@ Improvements
- Preserve non-ascii characters in file names (:issue:`4465`)
- Allow resetting moderation state from registration management view
(:issue:`4498`, thanks :user:`omegak`)
- Allow filtering event log by related entries (:issue:`4503`, thanks
:user:`omegak`)

Bugfixes
^^^^^^^^
Expand Down
9 changes: 7 additions & 2 deletions indico/modules/events/logs/client/js/actions.js
Expand Up @@ -16,6 +16,7 @@ export const FETCH_FAILED = 'FETCH_FAILED';
export const SET_DETAILED_VIEW = 'SET_DETAILED_VIEW';
export const VIEW_PREV_ENTRY = 'VIEW_PREV_ENTRY';
export const VIEW_NEXT_ENTRY = 'VIEW_NEXT_ENTRY';
export const SET_METADATA_QUERY = 'SET_METADATA_QUERY';

export function setKeyword(keyword) {
return {type: SET_KEYWORD, keyword};
Expand All @@ -33,6 +34,10 @@ export function setDetailedView(entryIndex) {
return {type: SET_DETAILED_VIEW, currentViewIndex: entryIndex};
}

export function setMetadataQuery(metadataQuery) {
return {type: SET_METADATA_QUERY, metadataQuery};
}

export function viewPrevEntry() {
return async (dispatch, getStore) => {
const {
Expand Down Expand Up @@ -90,15 +95,15 @@ export function fetchFailed() {
export function fetchLogEntries() {
return async (dispatch, getStore) => {
dispatch(fetchStarted());

const {
logs: {filters, keyword, currentPage},
logs: {filters, keyword, currentPage, metadataQuery},
staticData: {fetchLogsUrl},
} = getStore();

const params = {
page: currentPage,
filters: [],
data: JSON.stringify(metadataQuery),
};
if (keyword) {
params.q = keyword;
Expand Down
32 changes: 32 additions & 0 deletions indico/modules/events/logs/client/js/components/EventLog.jsx
Expand Up @@ -6,13 +6,45 @@
// LICENSE file for more details.

import React from 'react';
import {useDispatch, useSelector} from 'react-redux';

import {Param, Translate} from 'indico/react/i18n';

import LogEntryList from '../containers/LogEntryList';
import Toolbar from './Toolbar';
import {fetchLogEntries, setMetadataQuery, setPage} from '../actions';

function MetadataQueryMessage() {
const dispatch = useDispatch();
const resetURLFiltering = () => {
dispatch(setMetadataQuery({}));
dispatch(setPage(1));
dispatch(fetchLogEntries());
};

return (
<div className="highlight-message-box">
<span className="icon" />
<div className="message-text">
<Translate>
Log entries are currently filtered by URL.{' '}
<Param name="link" wrapper={<a onClick={resetURLFiltering} />}>
Click here
</Param>{' '}
to disable the filter.
</Translate>
</div>
</div>
);
}

MetadataQueryMessage.propTypes = {};

export default function EventLog() {
const metadataQuery = useSelector(state => state.logs.metadataQuery);
return (
<>
{Object.keys(metadataQuery).length !== 0 && <MetadataQueryMessage />}
<Toolbar />
<LogEntryList />
</>
Expand Down
3 changes: 2 additions & 1 deletion indico/modules/events/logs/client/js/index.jsx
Expand Up @@ -12,7 +12,7 @@ import {Provider} from 'react-redux';
import createReduxStore from 'indico/utils/redux';

import EventLog from './components/EventLog';
import {fetchLogEntries} from './actions';
import {fetchLogEntries, setMetadataQuery} from './actions';
import reducer from './reducers';

import '../style/logs.scss';
Expand All @@ -33,6 +33,7 @@ window.addEventListener('load', () => {
},
initialData
);
store.dispatch(setMetadataQuery(JSON.parse(rootElement.dataset.metadataQuery)));

ReactDOM.render(
<Provider store={store}>
Expand Down
3 changes: 3 additions & 0 deletions indico/modules/events/logs/client/js/reducers.js
Expand Up @@ -12,6 +12,7 @@ const initialState = {
keyword: null,
currentPage: 1,
isFetching: false,
metadataQuery: {},
filters: {
event: true,
management: true,
Expand Down Expand Up @@ -46,6 +47,8 @@ export default function logReducer(state = initialState, action) {
return {...state, isFetching: false};
case actions.SET_DETAILED_VIEW:
return {...state, currentViewIndex: action.currentViewIndex};
case actions.SET_METADATA_QUERY:
return {...state, metadataQuery: action.metadataQuery};
default:
return state;
}
Expand Down
6 changes: 4 additions & 2 deletions indico/modules/events/logs/controllers.py
Expand Up @@ -31,15 +31,17 @@ class RHEventLogs(RHManageEventBase):
"""Shows the modification/action log for the event"""

def _process(self):
metadata_query = {k.lstrip('meta.'): int(v) if v.isdigit() else v
for k, v in request.args.iteritems() if k.startswith('meta.')}
realms = {realm.name: realm.title for realm in EventLogRealm}
return WPEventLogs.render_template('logs.html', self.event, realms=realms)
return WPEventLogs.render_template('logs.html', self.event, realms=realms, metadata_query=metadata_query)


class RHEventLogsJSON(RHManageEventBase):
def _process(self):
page = int(request.args.get('page', 1))
filters = request.args.getlist('filters')
data = json.loads(request.args.get('data'))
data = json.loads(request.args.get('data', '{}'))
text = request.args.get('q')

if not filters and not data:
Expand Down
4 changes: 3 additions & 1 deletion indico/modules/events/logs/renderers.py
Expand Up @@ -31,7 +31,9 @@ def render_entry(cls, entry):
:param entry: A :class:`.EventLogEntry`
"""
template = '{}:{}'.format(cls.plugin.name, cls.template_name) if cls.plugin is not None else cls.template_name
return render_template(template, entry=entry, data=cls.get_data(entry), **cls.template_kwargs)
metadata_query = {'meta.{}'.format(k): v for k, v in entry.meta.iteritems()}
return render_template(template, entry=entry, data=cls.get_data(entry), metadata_query=metadata_query,
**cls.template_kwargs)

@classmethod
def get_data(cls, entry):
Expand Down
10 changes: 10 additions & 0 deletions indico/modules/events/logs/templates/entry_simple.html
Expand Up @@ -34,4 +34,14 @@
</td>
</tr>
{% endfor %}
{% if metadata_query %}
<tr class="i-table content">
<td class="i-table caption log-caption"></td>
<td class="i-table value">
<a href="{{ url_for('.index', entry.event, **metadata_query) }}">
{% trans %}Display related log entries only.{% endtrans %}
</a>
</td>
</tr>
{% endif %}
{% endblock %}
3 changes: 2 additions & 1 deletion indico/modules/events/logs/templates/logs.html
Expand Up @@ -7,6 +7,7 @@
{% block content %}
<div class="event-log"
data-fetch-logs-url="{{ url_for('.logs', event) }}"
data-realms="{{ realms|tojson|forceescape }}">
data-realms="{{ realms|tojson|forceescape }}"
data-metadata-query="{{ metadata_query|tojson|forceescape }}">
</div>
{% endblock %}

0 comments on commit 29eb4d0

Please sign in to comment.