mirror of https://github.com/MISP/misp-dashboard
Added typeahead
parent
29df40e474
commit
39d83ebc9b
12
server.py
12
server.py
|
@ -551,5 +551,17 @@ def getTrendingDisc():
|
|||
data = trendings_helper.getTrendingDisc(dateS, dateE)
|
||||
return jsonify(data)
|
||||
|
||||
@app.route("/_getTypeaheadData")
|
||||
def getTypeaheadData():
|
||||
try:
|
||||
dateS = datetime.datetime.fromtimestamp(float(request.args.get('dateS')))
|
||||
dateE = datetime.datetime.fromtimestamp(float(request.args.get('dateE')))
|
||||
except:
|
||||
dateS = datetime.datetime.now() - datetime.timedelta(days=7)
|
||||
dateE = datetime.datetime.now()
|
||||
|
||||
data = trendings_helper.getTypeaheadData(dateS, dateE)
|
||||
return jsonify(data)
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run(host='localhost', port=8001, threaded=True)
|
||||
|
|
|
@ -9,6 +9,7 @@ var tagPie = ["#tagPie"];
|
|||
var tagLine = ["#tagLine"];
|
||||
var sightingLineWidget;
|
||||
var discLine = ["#discussionLine"];
|
||||
var allData;
|
||||
|
||||
/* OPTIONS */
|
||||
var datePickerOptions = {
|
||||
|
@ -57,6 +58,51 @@ var pieChartOption = {
|
|||
clickable: true
|
||||
}
|
||||
};
|
||||
var typeaheadOption_event = {
|
||||
source: function (query, process) {
|
||||
if (allData === undefined) { // caching
|
||||
return $.getJSON(url_getTypeaheadData, function (data) {
|
||||
allData = data;
|
||||
return process(data.TRENDINGS_EVENTS);
|
||||
});
|
||||
} else {
|
||||
return process(allData.TRENDINGS_EVENTS);
|
||||
}
|
||||
},
|
||||
updater: function(theevent) {
|
||||
console.log(theevent);
|
||||
}
|
||||
}
|
||||
var typeaheadOption_categ = {
|
||||
source: function (query, process) {
|
||||
if (allData === undefined) { // caching
|
||||
return $.getJSON(url_getTypeaheadData, function (data) {
|
||||
allData = data;
|
||||
return process(data.TRENDINGS_CATEGS);
|
||||
});
|
||||
} else {
|
||||
return process(allData.TRENDINGS_CATEGS);
|
||||
}
|
||||
},
|
||||
updater: function(categ) {
|
||||
console.log(categ);
|
||||
}
|
||||
}
|
||||
var typeaheadOption_tag = {
|
||||
source: function (query, process) {
|
||||
if (allData === undefined) { // caching
|
||||
return $.getJSON(url_getTypeaheadData, function (data) {
|
||||
allData = data;
|
||||
return process(data.TRENDINGS_TAGS);
|
||||
});
|
||||
} else {
|
||||
return process(allData.TRENDINGS_TAGS);
|
||||
}
|
||||
},
|
||||
updater: function(tag) {
|
||||
console.log(tag);
|
||||
}
|
||||
}
|
||||
|
||||
/* FUNCTIONS */
|
||||
function innerPieLabelFormatter(label, series) {
|
||||
|
@ -306,7 +352,6 @@ function updateLineForLabel(line, specificLabel, colorMapping, url) {
|
|||
function updatePieLine(pie, line, url) {
|
||||
$.getJSON( url+"?dateS="+parseInt(dateStart.getTime()/1000)+"&dateE="+parseInt(dateEnd.getTime()/1000), function( data ) {
|
||||
var colorMapping = updatePie(pie, line, data, url);
|
||||
console.log(colorMapping);
|
||||
updateLine(line, data, undefined, undefined, colorMapping);
|
||||
});
|
||||
}
|
||||
|
@ -341,6 +386,10 @@ $(document).ready(function () {
|
|||
datePickerWidgetEnd.datepicker("setDate", new Date());
|
||||
dateEnd = datePickerWidgetEnd.datepicker( "getDate" );
|
||||
|
||||
$('#typeaheadEvent').typeahead(typeaheadOption_event);
|
||||
$('#typeaheadCateg').typeahead(typeaheadOption_categ);
|
||||
$('#typeaheadTag').typeahead(typeaheadOption_tag);
|
||||
|
||||
updatePieLine(eventPie, eventLine, url_getTrendingEvent)
|
||||
updatePieLine(categPie, categLine, url_getTrendingCateg)
|
||||
updatePieLine(tagPie, tagLine, url_getTrendingTag)
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
<script src="{{ url_for('static', filename='js/jquery.flot.time.js') }}"></script>
|
||||
<!-- Bootstrap Core JavaScript -->
|
||||
<script src="{{ url_for('static', filename='js/bootstrap.js') }}"></script>
|
||||
<script src="{{ url_for('static', filename='js/bootstrap3-typeahead.min.js') }}"></script>
|
||||
<link href="{{ url_for('static', filename='css/font-awesome.min.css') }}" rel="text/css">
|
||||
|
||||
<link rel="stylesheet" href="{{ url_for('static', filename='css/jquery-jvectormap-2.0.3.css') }}" type="text/css" media="screen"/>
|
||||
|
@ -138,6 +139,7 @@ small {
|
|||
<div class="panel panel-default" style="">
|
||||
<div class="panel-heading bg-info" style="font-weight: bold;">
|
||||
<b>Most active events</b>
|
||||
<input type="text" id="typeaheadEvent" data-provide="typeahead" size="20" style="margin-bottom: 5px; float:right;" placeholder="Enter an event">
|
||||
</div>
|
||||
<div id="panelbody" class="panel-body" style="">
|
||||
<div id="eventPie" style="width:100%; height: 34vh;"></div>
|
||||
|
@ -150,6 +152,7 @@ small {
|
|||
<div class="panel panel-default" style="">
|
||||
<div class="panel-heading bg-info" style="font-weight: bold;">
|
||||
<b>Most active categories</b>
|
||||
<input type="text" id="typeaheadCateg" data-provide="typeahead" size="20" style="margin-bottom: 5px; float:right;" placeholder="Enter a category">
|
||||
</div>
|
||||
<div id="panelbody" class="panel-body" style="">
|
||||
<div id="categPie" style="width:100%; height: 34vh;"></div>
|
||||
|
@ -162,6 +165,7 @@ small {
|
|||
<div class="panel panel-default" style="">
|
||||
<div class="panel-heading bg-info" style="font-weight: bold;">
|
||||
<b>Most popular tags</b>
|
||||
<input type="text" id="typeaheadTag" data-provide="typeahead" size="20" style="margin-bottom: 5px; float:right;" placeholder="Enter a tag">
|
||||
</div>
|
||||
<div id="panelbody" class="panel-body" style="">
|
||||
<div id="tagPie" style="width:100%; height: 34vh;"></div>
|
||||
|
@ -214,6 +218,8 @@ small {
|
|||
var url_getTrendingSightings = "{{ url_for('getTrendingSightings') }}";
|
||||
var url_getTrendingDisc = "{{ url_for('getTrendingDisc') }}";
|
||||
|
||||
var url_getTypeaheadData = "{{ url_for('getTypeaheadData') }}";
|
||||
|
||||
/* DATA FROM CONF */
|
||||
|
||||
</script>
|
||||
|
|
|
@ -71,6 +71,7 @@ class Trendings_helper:
|
|||
def getTrendingCategs(self, dateS, dateE):
|
||||
return self.getGenericTrending('TRENDINGS_CATEGS', dateS, dateE)
|
||||
|
||||
# FIXME: Construct this when getting data
|
||||
def getTrendingTags(self, dateS, dateE, topNum=12):
|
||||
to_ret = []
|
||||
prev_days = (dateE - dateS).days
|
||||
|
@ -101,3 +102,24 @@ class Trendings_helper:
|
|||
|
||||
def getTrendingDisc(self, dateS, dateE):
|
||||
return self.getGenericTrending('TRENDINGS_DISC', dateS, dateE)
|
||||
|
||||
def getTypeaheadData(self, dateS, dateE):
|
||||
to_ret = {}
|
||||
for trendingType in ['TRENDINGS_EVENTS', 'TRENDINGS_CATEGS']:
|
||||
allSet = set()
|
||||
prev_days = (dateE - dateS).days
|
||||
for curDate in util.getXPrevDaysSpan(dateE, prev_days):
|
||||
keyname = "{}:{}".format(trendingType, util.getDateStrFormat(curDate))
|
||||
data = self.serv_redis_db.zrange(keyname, 0, -1, desc=True)
|
||||
for elem in data:
|
||||
allSet.add(elem.decode('utf8'))
|
||||
to_ret[trendingType] = list(allSet)
|
||||
tags = self.getTrendingTags(dateS, dateE)
|
||||
tagSet = set()
|
||||
for item in tags:
|
||||
theDate, tagList = item
|
||||
for tag in tagList:
|
||||
tag = tag[0]
|
||||
tagSet.add(tag['name'])
|
||||
to_ret['TRENDINGS_TAGS'] = list(tagSet)
|
||||
return to_ret
|
||||
|
|
Loading…
Reference in New Issue