diff --git a/server.py b/server.py index f8c5692..d88622c 100755 --- a/server.py +++ b/server.py @@ -487,6 +487,16 @@ def getLoginVSCOntribution(): data = users_helper.getLoginVSCOntribution(date) return jsonify(data) +@app.route("/_getUserLoginsAndContribOvertime") +def getUserLoginsAndContribOvertime(): + try: + date = datetime.datetime.fromtimestamp(float(request.args.get('date'))) + except: + date = datetime.datetime.now() + + data = users_helper.getUserLoginsAndContribOvertime(date) + return jsonify(data) + ''' TRENDINGS ''' @app.route("/_getTrendingEvents") def getTrendingEvents(): diff --git a/static/js/contrib.js b/static/js/contrib.js index 158e745..baf85d8 100644 --- a/static/js/contrib.js +++ b/static/js/contrib.js @@ -527,17 +527,24 @@ function updateProgressHeader(org) { categ = trophy_categ_list[i]; $('#trophy_'+categ).attr('src', source); $('#trophy_'+categ).attr('title', ""); - $('#trophy_'+categ).popover("destroy") - } - for(var i=0; i
- Login overtime + Login and contribution overtime Dates: @@ -195,7 +195,7 @@ small { var url_getUserLogins = "{{ url_for('getUserLogins') }}"; var url_getTopOrglogin = "{{ url_for('getTopOrglogin') }}"; var url_getLoginVSCOntribution = "{{ url_for('getLoginVSCOntribution') }}"; - var url_getUserLoginsOvertime = "{{ url_for('getUserLoginsOvertime') }}"; + var url_getUserLoginsAndContribOvertime = "{{ url_for('getUserLoginsAndContribOvertime') }}"; /* DATA FROM CONF */ diff --git a/users_helper.py b/users_helper.py index badf901..e70cd5e 100644 --- a/users_helper.py +++ b/users_helper.py @@ -136,13 +136,22 @@ class Users_helper: data = [data[6]]+data[:6] return data - def getUserLoginsOvertime(self, date, prev_days=6): + def getUserLoginsAndContribOvertime(self, date, prev_days=6): + dico_hours_contrib = {} dico_hours = {} for curDate in util.getXPrevHoursSpan(date, prev_days*24): dico_hours[util.getTimestamp(curDate)] = 0 # populate with empty data + dico_hours_contrib[util.getTimestamp(curDate)] = 0 # populate with empty data for curDate in util.getXPrevDaysSpan(date, prev_days): timestamps = self.getUserLogins(curDate) + keyname = "CONTRIB_DAY:{}".format(util.getDateStrFormat(curDate)) + + orgs_contri = self.serv_redis_db.zrange(keyname, 0, -1, desc=True, withscores=False) + orgs_contri_num = len(orgs_contri) + for curDate in util.getHoursSpanOfDate(curDate, adaptToFitCurrentTime=True): #fill hole day + dico_hours_contrib[util.getTimestamp(curDate)] = orgs_contri_num + for timestamp in timestamps: # sum occurence during the current hour dateTimestamp = datetime.datetime.fromtimestamp(float(timestamp)) dateTimestamp = dateTimestamp.replace(minute=0, second=0, microsecond=0) @@ -152,9 +161,18 @@ class Users_helper: pass # Format data + # login + to_ret = {} data = [] for curDate, occ in dico_hours.items(): data.append([curDate, occ]) - data.sort(key=lambda x: x[0]) - return data + to_ret['login'] = data + # contrib + data = [] + for curDate, occ in dico_hours_contrib.items(): + data.append([curDate, occ]) + data.sort(key=lambda x: x[0]) + to_ret['contrib'] = data + + return to_ret diff --git a/util.py b/util.py index 1b79a40..c22e539 100644 --- a/util.py +++ b/util.py @@ -35,6 +35,18 @@ def getXPrevHoursSpan(date, hours): to_return.append(de - datetime.timedelta(hours=i)) return to_return +def getHoursSpanOfDate(date, adaptToFitCurrentTime=True, daySpanned=6): + ds = date + ds = ds.replace(hour=0, minute=0, second=0, microsecond=0) + to_return = [] + now = datetime.datetime.now() + for i in range(0, 24): + the_date = ds + datetime.timedelta(hours=i) + if the_date > now or the_date < now - datetime.timedelta(days=daySpanned): # avoid going outside + continue + to_return.append(the_date) + return to_return + def getDateStrFormat(date): return str(date.year)+str(date.month).zfill(2)+str(date.day).zfill(2)