From 90a518cc071cc68e7fa89fbdc9829a5d27adbb0c Mon Sep 17 00:00:00 2001 From: Sami Mokaddem Date: Wed, 8 Nov 2017 11:29:07 +0100 Subject: [PATCH] Added support of honorBadge + Added text related to global ranking requirements --- contributor_helper.py | 31 +++- server.py | 13 +- static/css/ranking.css | 13 +- static/js/contrib.js | 43 ++++-- static/pics/MISPHonorableIcons/1.svg | 178 ++++++++++++++++++++++ static/pics/MISPHonorableIcons/2.svg | 185 +++++++++++++++++++++++ static/pics/rankingMISPOrg/14.svg | 86 +++++------ static/pics/rankingMISPOrg/15.svg | 218 +++++++++------------------ static/pics/rankingMISPOrg/16.svg | 91 +++++++---- templates/contrib.html | 63 ++++++-- zmq_subscriber.py | 50 +++++- 11 files changed, 713 insertions(+), 258 deletions(-) create mode 100644 static/pics/MISPHonorableIcons/1.svg create mode 100644 static/pics/MISPHonorableIcons/2.svg diff --git a/contributor_helper.py b/contributor_helper.py index 530c4a7..6252302 100644 --- a/contributor_helper.py +++ b/contributor_helper.py @@ -10,16 +10,32 @@ class Contributor_helper: self.serv_redis_db = serv_redis_db self.cfg = cfg self.cfg_org_rank = configparser.ConfigParser() - self.cfg_org_rank.read(os.path.join(os.environ['DASH_CONFIG'], 'rankTitle.cfg')) + self.cfg_org_rank.read(os.path.join(os.environ['DASH_CONFIG'], 'ranking.cfg')) + #honorBadge + self.org_honor_badge_title = {} + for badgeNum in range(1, len(self.cfg_org_rank.options('HonorBadge'))+1): #get Num of honorBadge + self.org_honor_badge_title[badgeNum] = self.cfg_org_rank.get('HonorBadge', str(badgeNum)) + + #GLOBAL RANKING self.org_rank_maxLevel = self.cfg_org_rank.getint('rankTitle', 'maxLevel') self.org_rank = {} for rank in range(1, self.org_rank_maxLevel+1): self.org_rank[rank] = self.cfg_org_rank.get('rankTitle', str(rank)) + self.org_rank_requirement_pnts = {} + for rank in range(1, self.org_rank_maxLevel+1): + self.org_rank_requirement_pnts[rank] = self.cfg_org_rank.getint('rankRequirementsPnts', str(rank)) + self.org_rank_requirement_text = {} + for rank in range(1, self.org_rank_maxLevel+1): + self.org_rank_requirement_text[rank] = self.cfg_org_rank.get('rankRequirementsText', str(rank)) + self.org_rank_additional_info = json.loads(self.cfg_org_rank.get('additionalInfo', 'textsArray')) + #WEB STUFF self.misp_web_url = cfg.get('RedisGlobal', 'misp_web_url') self.MAX_NUMBER_OF_LAST_CONTRIBUTOR = cfg.getint('CONTRIB', 'max_number_of_last_contributor') self.categories_in_datatable = json.loads(cfg.get('CONTRIB', 'categories_in_datatable')) + + #MONTHLY RANKING self.default_pnts_per_contribution = json.loads(cfg.get('CONTRIB', 'default_pnts_per_contribution')) temp = json.loads(cfg.get('CONTRIB', 'pnts_per_contribution')) self.DICO_PNTS_REWARD = {} @@ -196,6 +212,7 @@ class Contributor_helper: dic = {} dic['rank'] = random.randint(1,self.levelMax) dic['orgRank'] = random.randint(1,self.levelMax), + dic['honorBadge'] = [random.randint(1,2)], dic['logo_path'] = 'logo' dic['org'] = 'Org'+str(d) dic['pnts'] = random.randint(1,2**self.levelMax) @@ -216,6 +233,7 @@ class Contributor_helper: { 'rank': random.randint(1,self.levelMax), 'orgRank': random.randint(1,self.levelMax), + 'honorBadge': [1,2], 'logo_path': self.getOrgLogoFromRedis('MISP'), 'org': 'MISP', 'pnts': random.randint(1,2**self.levelMax) @@ -223,6 +241,7 @@ class Contributor_helper: { 'rank': random.randint(1,self.levelMax), 'orgRank': random.randint(1,self.levelMax), + 'honorBadge': [1], 'logo_path': 'logo1', 'org': 'CIRCL', 'pnts': random.randint(1,2**self.levelMax) @@ -230,6 +249,7 @@ class Contributor_helper: { 'rank': random.randint(1,self.levelMax), 'orgRank': random.randint(1,self.levelMax), + 'honorBadge': [2], 'logo_path': 'logo2', 'org': 'CASES', 'pnts': random.randint(1,2**self.levelMax) @@ -237,6 +257,7 @@ class Contributor_helper: { 'rank': random.randint(1,self.levelMax), 'orgRank': random.randint(1,self.levelMax), + 'honorBadge': [], 'logo_path': 'logo3', 'org': 'SMILE', 'pnts': random.randint(1,2**self.levelMax) @@ -244,6 +265,7 @@ class Contributor_helper: { 'rank': random.randint(1,self.levelMax), 'orgRank': random.randint(1,self.levelMax), + 'honorBadge': [], 'logo_path': 'logo4', 'org': 'ORG4', 'pnts': random.randint(1,2**self.levelMax) @@ -251,6 +273,7 @@ class Contributor_helper: { 'rank': random.randint(1,self.levelMax), 'orgRank': random.randint(1,self.levelMax), + 'honorBadge': [], 'logo_path': 'logo5', 'org': 'ORG5', 'pnts': random.randint(1,2**self.levelMax) @@ -264,6 +287,7 @@ class Contributor_helper: { 'rank': random.randint(1,self.levelMax), 'orgRank': random.randint(1,self.levelMax), + 'honorBadge': [1,2], 'logo_path': self.getOrgLogoFromRedis('MISP'), 'org': 'MISP', 'pnts': random.randint(1,2**self.levelMax), @@ -272,6 +296,7 @@ class Contributor_helper: { 'rank': random.randint(1,self.levelMax), 'orgRank': random.randint(1,self.levelMax), + 'honorBadge': [1], 'logo_path': 'logo1', 'org': 'CIRCL', 'pnts': random.randint(1,2**self.levelMax), @@ -280,6 +305,7 @@ class Contributor_helper: { 'rank': random.randint(1,self.levelMax), 'orgRank': random.randint(1,self.levelMax), + 'honorBadge': [2], 'logo_path': 'logo2', 'org': 'CASES', 'pnts': random.randint(1,2**self.levelMax), @@ -288,6 +314,7 @@ class Contributor_helper: { 'rank': random.randint(1,self.levelMax), 'orgRank': random.randint(1,self.levelMax), + 'honorBadge': [], 'logo_path': 'logo3', 'org': 'SMILE', 'pnts': random.randint(1,2**self.levelMax), @@ -296,6 +323,7 @@ class Contributor_helper: { 'rank': random.randint(1,self.levelMax), 'orgRank': random.randint(1,self.levelMax), + 'honorBadge': [], 'logo_path': 'logo4', 'org': 'ORG4', 'pnts': random.randint(1,2**self.levelMax), @@ -304,6 +332,7 @@ class Contributor_helper: { 'rank': random.randint(1,self.levelMax), 'orgRank': random.randint(1,self.levelMax), + 'honorBadge': [], 'logo_path': 'logo5', 'org': 'ORG5', 'pnts': random.randint(1,2**self.levelMax), diff --git a/server.py b/server.py index 00a867d..0cc30ab 100755 --- a/server.py +++ b/server.py @@ -151,9 +151,17 @@ def contrib(): categ_list = contributor_helper.categories_in_datatable categ_list_str = [ s[0].upper() + s[1:].replace('_', ' ') for s in contributor_helper.categories_in_datatable] categ_list_points = [contributor_helper.DICO_PNTS_REWARD[categ] for categ in categ_list] + org_rank = contributor_helper.org_rank - org_rank_list = [[rank, title] for rank, title in org_rank.items()] + org_rank_requirement_pnts = contributor_helper.org_rank_requirement_pnts + org_rank_requirement_text = contributor_helper.org_rank_requirement_text + org_rank_list = [[rank, title, org_rank_requirement_pnts[rank], org_rank_requirement_text[rank]] for rank, title in org_rank.items()] org_rank_list.sort(key=lambda x: x[0]) + org_rank_additional_text = contributor_helper.org_rank_additional_info + + org_honor_badge_title = contributor_helper.org_honor_badge_title + org_honor_badge_title_list = [ [num, text] for num, text in contributor_helper.org_honor_badge_title.items()] + org_honor_badge_title_list.sort(key=lambda x: x[0]) currOrg = request.args.get('org') if currOrg is None: @@ -168,6 +176,9 @@ def contrib(): categ_list_points=categ_list_points, org_rank_json=json.dumps(org_rank), org_rank_list=org_rank_list, + org_rank_additional_text=org_rank_additional_text, + org_honor_badge_title=json.dumps(org_honor_badge_title), + org_honor_badge_title_list=org_honor_badge_title_list, min_between_reload=cfg.getint('CONTRIB', 'min_between_reload') ) diff --git a/static/css/ranking.css b/static/css/ranking.css index f29aac4..24f5d8d 100644 --- a/static/css/ranking.css +++ b/static/css/ranking.css @@ -3,6 +3,15 @@ height: auto; } +.circleBadge { + width: 80px; + height: 80px; + text-align: center; + border-radius: 65px; + background-color: #e1e1e1; + border: 1px solid #caccce; +} + .questionBadgeText { left: -15%; position: relative; @@ -27,8 +36,8 @@ left: 1%; } -.infoBlue { - background-color: #d1d1d1 !important; +.selectedOrgInTable { + background-color: #fff6c2 !important; color: black; } diff --git a/static/js/contrib.js b/static/js/contrib.js index c8dd1c5..e29cdae 100644 --- a/static/js/contrib.js +++ b/static/js/contrib.js @@ -51,7 +51,8 @@ var optionDatatable_light = { "info": false, "columnDefs": [ { className: "centerCellPicOrgRank", "targets": [ 2 ] }, - { className: "centerCellPicOrgLogo", "targets": [ 3 ] } + { className: "centerCellPicOrgLogo", "targets": [ 3 ] }, + { className: "centerCellPicOrgLogo", "targets": [ 4 ] } ] }; var optionDatatable_top = jQuery.extend({}, optionDatatable_light) @@ -59,9 +60,10 @@ var optionDatatable_last = jQuery.extend({}, optionDatatable_light) optionDatatable_last.columnDefs = [ { className: "centerCellPicOrgRank", "targets": [ 2 ] }, { className: "centerCellPicOrgLogo", "targets": [ 3 ] }, - { 'orderData':[5], 'targets': [0] }, + { className: "centerCellPicOrgLogo", "targets": [ 4 ] }, + { 'orderData':[6], 'targets': [0] }, { - 'targets': [5], + 'targets': [6], 'visible': false, 'searchable': false }, @@ -79,7 +81,8 @@ var optionDatatable_Categ = { "info": false, "columnDefs": [ { className: "centerCellPicOrgRank", "targets": [ 2 ] }, - { className: "centerCellPicOrgLogo", "targets": [ 3 ], 'searchable': false, 'sortable': false } + { className: "centerCellPicOrgLogo", "targets": [ 3 ], 'searchable': false, 'sortable': false }, + { className: "centerCellPicOrgLogo", "targets": [ 4 ]} ] }; @@ -144,16 +147,30 @@ function getOrgRankIcon(rank, size) { return obj.outerHTML; } -function createImg(source, size, return_obj) { +function createImg(source, size) { var obj = document.createElement('object'); obj.height = size; obj.width = size; obj.style.margin = 'auto'; obj.data = source; - obj.type = "image/png" return obj.outerHTML; } +function createHonorImg(array, size) { + size = 32; + var div = document.createElement('div'); + for (badgeNum of array) { + var obj = document.createElement('img'); + obj.height = size; + obj.width = size; + obj.style.margin = 'auto'; + obj.title = org_honor_badge_title[badgeNum]; + obj.src = url_baseHonorLogo+badgeNum+'.svg'; + div.appendChild(obj); + } + return div.outerHTML; +} + function generateRankingSheet(rank, rankDec, stepPnt, pnt, Rpnt) { var Cpnt = pnt - stepPnt; var Tpnt = Cpnt + Rpnt; @@ -241,7 +258,6 @@ function generateRankingSheet(rank, rankDec, stepPnt, pnt, Rpnt) { function addToTableFromJson(datatable, url) { $.getJSON( url, function( data ) { - console.log(data); for (i in data) { var row = data[i]; i = parseInt(i); @@ -249,6 +265,7 @@ function addToTableFromJson(datatable, url) { row.pnts, getMonthlyRankIcon(row.rank), getOrgRankIcon(row.orgRank, 60), + createHonorImg(row.honorBadge, 20), createImg(row.logo_path, 32), row.org ]; @@ -274,6 +291,7 @@ function addLastContributor(datatable, data, update) { data.pnts, getMonthlyRankIcon(data.rank), getOrgRankIcon(data.orgRank, 60), + createHonorImg(data.honorBadge, 20), createImg(data.logo_path, 32), data.org, data.epoch @@ -309,19 +327,19 @@ function updateProgressHeader(org) { // update color in other dataTables datatableTop.rows().every( function() { var row = this.node(); - if(this.data()[3] == data.org) { row.classList.add('infoBlue'); } else { row.classList.remove('infoBlue'); } + if(this.data()[5] == data.org) { row.classList.add('selectedOrgInTable'); } else { row.classList.remove('selectedOrgInTable'); } }); datatableFame.rows().every( function() { var row = this.node(); - if(this.data()[3] == data.org) { row.classList.add('infoBlue'); } else { row.classList.remove('infoBlue'); } + if(this.data()[5] == data.org) { row.classList.add('selectedOrgInTable'); } else { row.classList.remove('selectedOrgInTable'); } }); datatableCateg.rows().every( function() { var row = this.node(); - if(this.data()[3] == data.org) { row.classList.add('infoBlue'); } else { row.classList.remove('infoBlue'); } + if(this.data()[5] == data.org) { row.classList.add('selectedOrgInTable'); } else { row.classList.remove('selectedOrgInTable'); } }); datatableLast.rows().every( function() { var row = this.node(); - if(this.data()[3] == data.org) { row.classList.add('infoBlue'); } else { row.classList.remove('infoBlue'); } + if(this.data()[5] == data.org) { row.classList.add('selectedOrgInTable'); } else { row.classList.remove('selectedOrgInTable'); } }); }); } @@ -381,7 +399,8 @@ $(document).ready(function() { row.pnts, getMonthlyRankIcon(row.rank), getOrgRankIcon(row.orgRank, 44), - row.logo_path, + createHonorImg(row.honorBadge, 20), + createImg(row.logo_path, 32), row.org, ]; for (categ of categ_list) { diff --git a/static/pics/MISPHonorableIcons/1.svg b/static/pics/MISPHonorableIcons/1.svg new file mode 100644 index 0000000..16de876 --- /dev/null +++ b/static/pics/MISPHonorableIcons/1.svg @@ -0,0 +1,178 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/static/pics/MISPHonorableIcons/2.svg b/static/pics/MISPHonorableIcons/2.svg new file mode 100644 index 0000000..65bcf30 --- /dev/null +++ b/static/pics/MISPHonorableIcons/2.svg @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + diff --git a/static/pics/rankingMISPOrg/14.svg b/static/pics/rankingMISPOrg/14.svg index 3051dc1..abcfb78 100644 --- a/static/pics/rankingMISPOrg/14.svg +++ b/static/pics/rankingMISPOrg/14.svg @@ -15,7 +15,7 @@ version="1.1" id="svg8" inkscape:version="0.92.1 r15371" - sodipodi:docname="14-General.svg"> + sodipodi:docname="14.svg"> - - - - - - - - - - - + + + + + + + diff --git a/static/pics/rankingMISPOrg/15.svg b/static/pics/rankingMISPOrg/15.svg index f2782eb..ff4f422 100644 --- a/static/pics/rankingMISPOrg/15.svg +++ b/static/pics/rankingMISPOrg/15.svg @@ -15,7 +15,7 @@ version="1.1" id="svg8" inkscape:version="0.92.1 r15371" - sodipodi:docname="15-Marshal.svg"> + sodipodi:docname="15.svg"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/static/pics/rankingMISPOrg/16.svg b/static/pics/rankingMISPOrg/16.svg index 4ace1cb..670e901 100644 --- a/static/pics/rankingMISPOrg/16.svg +++ b/static/pics/rankingMISPOrg/16.svg @@ -15,7 +15,7 @@ version="1.1" id="svg8" inkscape:version="0.92.1 r15371" - sodipodi:docname="16-Grand General.svg"> + sodipodi:docname="16.svg"> - - - - - - + id="g3760" + transform="matrix(0.26458333,0,0,0.26458333,0.25014905,248.81803)"> + + + + + + + + + + + + + diff --git a/templates/contrib.html b/templates/contrib.html index dbc3c5a..7e56ca2 100644 --- a/templates/contrib.html +++ b/templates/contrib.html @@ -46,23 +46,24 @@