From e0d155564f84030d8d48d8b27705c144566c7645 Mon Sep 17 00:00:00 2001 From: Sami Mokaddem Date: Wed, 15 Nov 2017 15:40:28 +0100 Subject: [PATCH] Replaced loginOccurence by contribution/login --- server.py | 2 +- templates/users.html | 7 +++---- users_helper.py | 46 ++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 48 insertions(+), 7 deletions(-) diff --git a/server.py b/server.py index 7745ae9..e17302b 100755 --- a/server.py +++ b/server.py @@ -467,7 +467,7 @@ def getTopOrglogin(): except: date = datetime.datetime.now() - data = users_helper.getTopOrglogin(date) + data = users_helper.getTopOrglogin(date, maxNum=12) return jsonify(data) @app.route("/_getLoginVSCOntribution") diff --git a/templates/users.html b/templates/users.html index 39a469e..152a044 100644 --- a/templates/users.html +++ b/templates/users.html @@ -128,7 +128,7 @@ small {
- Top organisation login + Top organisation contribution/login (last 31 days) Dates: @@ -251,8 +251,8 @@ small { var date = datePickerWidgetApi.datepicker( "getDate" ); $.getJSON( "{{ url_for('getLoginVSCOntribution') }}"+"?date="+date.getTime()/1000, function( data ) { toPlot = [ - {label: 'Has contributed during the day', data: data[0], color: '#4da74d' }, - {label: 'Has not contributed during the day', data:data[1], color: '#cb4b4b' } + {label: 'Login with contribution during the day', data: data[0], color: '#4da74d' }, + {label: 'Login without contribution during the day', data:data[1], color: '#cb4b4b' } ]; if (data[0] == 0 && data[1] == 0) { toPlot = [{ label: 'No data', data: 100 }]; @@ -314,7 +314,6 @@ small { var datePickerOptions = { showOn: "button", - // minDate: -31, maxDate: 0, buttonImage: urlIconCalendar, buttonImageOnly: true, diff --git a/users_helper.py b/users_helper.py index b646e4c..939a51b 100644 --- a/users_helper.py +++ b/users_helper.py @@ -26,17 +26,59 @@ class Users_helper: timestamps = [int(timestamp.decode('utf8')) for timestamp in timestamps] return timestamps - def getTopOrglogin(self, date, topNum=12): + def getOrgslogin(self, date, topNum=12): keyname = "LOGIN_ORG:{}".format(util.getDateStrFormat(date)) data = self.serv_redis_db.zrange(keyname, 0, topNum-1, desc=True, withscores=True) data = [ [record[0].decode('utf8'), record[1]] for record in data ] return data + def getAllLoggedInOrgs(self, date, prev_days=31): + orgs = set() + for curDate in util.getXPrevDaysSpan(date, prev_days): + keyname = "LOGIN_ORG:{}".format(util.getDateStrFormat(curDate)) + data = self.serv_redis_db.zrange(keyname, 0, -1, desc=True, withscores=True) + for org in data: + orgs.add(org[0].decode('utf8')) + return list(orgs) + + def getOrgContribAndLogin(self, date, org, prev_days=31): + keyname_log = "LOGIN_ORG:{}" + keyname_contrib = "CONTRIB_DAY:{}" + data = [] + for curDate in util.getXPrevDaysSpan(date, prev_days): + log = self.serv_redis_db.zscore(keyname_log.format(util.getDateStrFormat(curDate)), org) + log = 0 if log is None else 1 + contrib = self.serv_redis_db.zscore(keyname_contrib.format(util.getDateStrFormat(curDate)), org) + contrib = 0 if contrib is None else 1 + data.append([log, contrib]) + return data + + def getContribOverLoginScore(self, array): + totLog = 0 + totContrib = 0 + for log, contrib in array: + totLog += log + totContrib += contrib + if totLog == 0: # avoid div by 0 + totLog = 1 + return totContrib/totLog + + def getTopOrglogin(self, date, maxNum=12, prev_days=31): + all_logged_in_orgs = self.getAllLoggedInOrgs(date, prev_days) + data = [] + for org in all_logged_in_orgs: + orgStatus = self.getOrgContribAndLogin(date, org, prev_days) + orgScore = self.getContribOverLoginScore(orgStatus) + data.append([org, orgScore]) + data.sort(key=lambda x: x[1], reverse=True) + return data[:maxNum] + + def getLoginVSCOntribution(self, date): keyname = "CONTRIB_DAY:{}".format(util.getDateStrFormat(date)) orgs_contri = self.serv_redis_db.zrange(keyname, 0, -1, desc=True, withscores=False) orgs_contri = [ org.decode('utf8') for org in orgs_contri ] - orgs_login = [ org[0] for org in self.getTopOrglogin(date, topNum=0) ] + orgs_login = [ org[0] for org in self.getOrgslogin(date, topNum=0) ] contributed_num = 0 non_contributed_num = 0 for org in orgs_login: