def get_dates(): """ Return a dictionary containing count of submissions on each date """ if request.vars.user_id and request.vars.custom: user_id = int(request.vars.user_id) custom = (request.vars.custom == "True") else: raise HTTP(400, "Bad request") return if custom: attribute = "submission.custom_user_id" else: attribute = "submission.user_id" sql_query = """ SELECT status, time_stamp, COUNT(*) FROM submission WHERE %s=%d GROUP BY DATE(submission.time_stamp), submission.status; """ % (attribute, user_id) row = db.executesql(sql_query) total_submissions = {} # For day streak streak = max_streak = 0 prev = curr = None # For accepted solutions streak curr_accepted_streak = utilities.get_accepted_streak(user_id, custom) max_accepted_streak = utilities.get_max_accepted_streak(user_id, custom) for i in row: if prev is None and streak == 0: prev = time.strptime(str(i[1]), "%Y-%m-%d %H:%M:%S") prev = datetime.date(prev.tm_year, prev.tm_mon, prev.tm_mday) streak = 1 else: curr = time.strptime(str(i[1]), "%Y-%m-%d %H:%M:%S") curr = datetime.date(curr.tm_year, curr.tm_mon, curr.tm_mday) if (curr - prev).days == 1: streak += 1 elif curr != prev: streak = 1 prev = curr if streak > max_streak: max_streak = streak sub_date = str(i[1]).split()[0] if total_submissions.has_key(sub_date): total_submissions[sub_date][i[0]] = i[2] total_submissions[sub_date]["count"] += i[2] else: total_submissions[sub_date] = {} total_submissions[sub_date][i[0]] = i[2] total_submissions[sub_date]["count"] = i[2] today = datetime.datetime.today().date() # Check if the last streak is continued till today if prev is None or (today - prev).days > 1: streak = 0 return dict(total=total_submissions, max_streak=max_streak, curr_streak=streak, curr_accepted_streak=curr_accepted_streak, max_accepted_streak=max_accepted_streak)
def get_dates(): """ Return a dictionary containing count of submissions on each date """ if len(request.args) != 1: if auth.is_logged_in(): handle = str(session.handle) else: redirect(URL("default", "index")) else: handle = str(request.args[0]) sql_query = """ SELECT status, time_stamp, COUNT(*) FROM submission WHERE submission.stopstalk_handle='%s' GROUP BY DATE(submission.time_stamp), submission.status; """ % (handle) row = db.executesql(sql_query) total_submissions = {} # For day streak streak = max_streak = 0 prev = curr = None # For accepted solutions streak curr_accepted_streak = utilities.get_accepted_streak(handle) max_accepted_streak = utilities.get_max_accepted_streak(handle) for i in row: if prev is None and streak == 0: prev = time.strptime(str(i[1]), "%Y-%m-%d %H:%M:%S") prev = datetime.date(prev.tm_year, prev.tm_mon, prev.tm_mday) streak = 1 else: curr = time.strptime(str(i[1]), "%Y-%m-%d %H:%M:%S") curr = datetime.date(curr.tm_year, curr.tm_mon, curr.tm_mday) if (curr - prev).days == 1: streak += 1 elif curr != prev: streak = 1 prev = curr if streak > max_streak: max_streak = streak sub_date = str(i[1]).split()[0] if total_submissions.has_key(sub_date): total_submissions[sub_date][i[0]] = i[2] total_submissions[sub_date]["count"] += i[2] else: total_submissions[sub_date] = {} total_submissions[sub_date][i[0]] = i[2] total_submissions[sub_date]["count"] = i[2] today = datetime.datetime.today().date() # Check if the last streak is continued till today if prev is None or (today - prev).days > 1: streak = 0 return dict(total=total_submissions, max_streak=max_streak, curr_streak=streak, curr_accepted_streak=curr_accepted_streak, max_accepted_streak=max_accepted_streak)
def get_dates(): """ Return a dictionary containing count of submissions on each date """ if request.extension != "json" or \ request.vars.user_id is None or \ request.vars.custom is None: raise HTTP(400, "Bad request") return user_id = int(request.vars.user_id) custom = (request.vars.custom == "True") stopstalk_handle = utilities.get_stopstalk_handle(user_id, custom) redis_cache_key = "get_dates_" + stopstalk_handle # Check if data is present in REDIS data = current.REDIS_CLIENT.get(redis_cache_key) if data: return json.loads(data) if custom: attribute = "submission.custom_user_id" else: attribute = "submission.user_id" sql_query = """ SELECT status, time_stamp, COUNT(*) FROM submission WHERE %s=%d GROUP BY DATE(submission.time_stamp), submission.status; """ % (attribute, user_id) row = db.executesql(sql_query) total_submissions = {} # For day streak streak = max_streak = 0 prev = curr = None # For accepted solutions streak curr_accepted_streak = utilities.get_accepted_streak(user_id, custom) max_accepted_streak = utilities.get_max_accepted_streak(user_id, custom) for i in row: if prev is None and streak == 0: prev = time.strptime(str(i[1]), "%Y-%m-%d %H:%M:%S") prev = datetime.date(prev.tm_year, prev.tm_mon, prev.tm_mday) streak = 1 else: curr = time.strptime(str(i[1]), "%Y-%m-%d %H:%M:%S") curr = datetime.date(curr.tm_year, curr.tm_mon, curr.tm_mday) if (curr - prev).days == 1: streak += 1 elif curr != prev: streak = 1 prev = curr if streak > max_streak: max_streak = streak sub_date = str(i[1]).split()[0] if total_submissions.has_key(sub_date): total_submissions[sub_date][i[0]] = i[2] total_submissions[sub_date]["count"] += i[2] else: total_submissions[sub_date] = {} total_submissions[sub_date][i[0]] = i[2] total_submissions[sub_date]["count"] = i[2] today = datetime.datetime.today().date() # Check if the last streak is continued till today if prev is None or (today - prev).days > 1: streak = 0 if custom is False: uetable = db.user_editorials query = (uetable.user_id == user_id) & \ (uetable.verification == "accepted") user_editorials = db(query).select() for editorial in user_editorials: this_date = str(editorial.added_on).split()[0] if total_submissions.has_key(this_date): if total_submissions[this_date].has_key("EAC"): total_submissions[this_date]["EAC"] += 1 else: total_submissions[this_date]["EAC"] = 1 total_submissions[this_date]["count"] += 1 else: total_submissions[this_date] = {"count": 1} total_submissions[this_date]["EAC"] = 1 data = dict(total=total_submissions, max_streak=max_streak, curr_streak=streak, curr_accepted_streak=curr_accepted_streak, max_accepted_streak=max_accepted_streak) current.REDIS_CLIENT.set(redis_cache_key, json.dumps(data, separators=(",", ":")), ex=5 * 60 * 60) return data
def notifications(): """ Check if any of the friends(includes CUSTOM) of the logged-in user is on a streak """ if session["user_id"] is None: redirect(URL("default", "index")) ftable = db.friends atable = db.auth_user cftable = db.custom_friend # Check for streak of friends on stopstalk query = (ftable.user_id == session["user_id"]) rows = db(query).select(atable.first_name, atable.last_name, atable.stopstalk_handle, join=ftable.on(ftable.friend_id == atable.id)) # Will contain list of handles of all the friends along # with the Custom Users added by the logged-in user handles = [] complete_dict = {} friends_stopstalk_handles = [] for user in rows: complete_dict[user.stopstalk_handle] = [] friends_stopstalk_handles.append("'" + user.stopstalk_handle + "'") handles.append((user.stopstalk_handle, user.first_name + " " + user.last_name, user.stopstalk_handle)) # Check for streak of custom friends query = (cftable.user_id == session["user_id"]) rows = db(query).select(cftable.first_name, cftable.last_name, cftable.duplicate_cu, cftable.stopstalk_handle) for user in rows: name = user.first_name + " " + user.last_name actual_handle = user.stopstalk_handle if user.duplicate_cu: stopstalk_handle = user.duplicate_cu.stopstalk_handle else: stopstalk_handle = user.stopstalk_handle handles.append((stopstalk_handle, name, actual_handle)) complete_dict[stopstalk_handle] = [] friends_stopstalk_handles.append("'" + stopstalk_handle + "'") if friends_stopstalk_handles == []: friends_stopstalk_handles = ["-1"] # Build the complex SQL query sql_query = """ SELECT stopstalk_handle, DATE(time_stamp), COUNT(*) as cnt FROM submission WHERE stopstalk_handle in (%s) GROUP BY stopstalk_handle, DATE(submission.time_stamp) ORDER BY time_stamp; """ % (", ".join(friends_stopstalk_handles)) user_rows = db.executesql(sql_query) for user in user_rows: if complete_dict[user[0]] != []: complete_dict[user[0]].append((user[1], user[2])) else: complete_dict[user[0]] = [(user[1], user[2])] # List of users with non-zero streak users_on_day_streak = [] users_on_submission_streak = [] for handle in handles: curr_streak = utilities.get_max_streak(complete_dict[handle[0]])[2] curr_accepted_streak = utilities.get_accepted_streak(handle[0]) # If streak is non-zero append to users_on_streak list if curr_streak: users_on_day_streak.append((handle, curr_streak)) if curr_accepted_streak: users_on_submission_streak.append((handle, curr_accepted_streak)) # Sort the users on streak by their streak users_on_day_streak.sort(key=lambda k: k[1], reverse=True) users_on_submission_streak.sort(key=lambda k: k[1], reverse=True) # The table containing users on streak(days) table1 = TABLE(THEAD(TR(TH(STRONG("User")), TH(STRONG("Days")))), _class="col offset-s3 s6 striped centered") # The table containing users on streak(submissions) table2 = TABLE(THEAD(TR(TH(STRONG("User")), TH(STRONG("Submissions")))), _class="col offset-s3 s6 striped centered") tbody1 = TBODY() tbody2 = TBODY() # Append all the users to the final table for users in users_on_day_streak: handle = users[0] curr_streak = users[1] tr = TR(TD((A(handle[1], _href=URL("user", "profile", args=[handle[2]]), _target="_blank"))), TD(str(curr_streak) + " ", I(_class="fa fa-bolt", _style="color:red"), _class="center")) tbody1.append(tr) table1.append(tbody1) if len(users_on_day_streak) == 0: table1 = H6("No friends on day streak", _class="center") # Append all the users to the final table for users in users_on_submission_streak: handle = users[0] curr_accepted_streak = users[1] tr = TR(TD((A(handle[1], _href=URL("user", "profile", args=[handle[2]]), _target="_blank"))), TD(str(curr_accepted_streak) + " ", I(_class="fa fa-bolt", _style="color:red"), _class="center")) tbody2.append(tr) table2.append(tbody2) if len(users_on_submission_streak) == 0: table2 = H6("No friends on submission streak", _class="center") return dict(table1=table1, table2=table2)
def notifications(): """ Check if any of the friends(includes CUSTOM) of the logged-in user is on a streak """ if session["user_id"] is None: redirect(URL("default", "index")) ftable = db.friends atable = db.auth_user cftable = db.custom_friend # Check for streak of friends on stopstalk query = (ftable.user_id == session["user_id"]) rows = db(query).select(atable.first_name, atable.last_name, atable.stopstalk_handle, join=ftable.on(ftable.friend_id == atable.id)) # Will contain list of handles of all the friends along # with the Custom Users added by the logged-in user handles = [] complete_dict = {} friends_stopstalk_handles = [] for user in rows: complete_dict[user.stopstalk_handle] = [] friends_stopstalk_handles.append("'" + user.stopstalk_handle + "'") handles.append( (user.stopstalk_handle, user.first_name + " " + user.last_name, user.stopstalk_handle)) # Check for streak of custom friends query = (cftable.user_id == session["user_id"]) rows = db(query).select(cftable.first_name, cftable.last_name, cftable.duplicate_cu, cftable.stopstalk_handle) for user in rows: name = user.first_name + " " + user.last_name actual_handle = user.stopstalk_handle if user.duplicate_cu: stopstalk_handle = user.duplicate_cu.stopstalk_handle else: stopstalk_handle = user.stopstalk_handle handles.append((stopstalk_handle, name, actual_handle)) complete_dict[stopstalk_handle] = [] friends_stopstalk_handles.append("'" + stopstalk_handle + "'") if friends_stopstalk_handles == []: friends_stopstalk_handles = ["-1"] # Build the complex SQL query sql_query = """ SELECT stopstalk_handle, DATE(time_stamp), COUNT(*) as cnt FROM submission WHERE stopstalk_handle in (%s) GROUP BY stopstalk_handle, DATE(submission.time_stamp) ORDER BY time_stamp; """ % (", ".join(friends_stopstalk_handles)) user_rows = db.executesql(sql_query) for user in user_rows: if complete_dict[user[0]] != []: complete_dict[user[0]].append((user[1], user[2])) else: complete_dict[user[0]] = [(user[1], user[2])] # List of users with non-zero streak users_on_day_streak = [] users_on_submission_streak = [] for handle in handles: curr_streak = utilities.get_max_streak(complete_dict[handle[0]])[2] curr_accepted_streak = utilities.get_accepted_streak(handle[0]) # If streak is non-zero append to users_on_streak list if curr_streak: users_on_day_streak.append((handle, curr_streak)) if curr_accepted_streak: users_on_submission_streak.append((handle, curr_accepted_streak)) # Sort the users on streak by their streak users_on_day_streak.sort(key=lambda k: k[1], reverse=True) users_on_submission_streak.sort(key=lambda k: k[1], reverse=True) # The table containing users on streak(days) table1 = TABLE(THEAD(TR(TH(STRONG("User")), TH(STRONG("Days")))), _class="col offset-s3 s6 striped centered") # The table containing users on streak(submissions) table2 = TABLE(THEAD(TR(TH(STRONG("User")), TH(STRONG("Submissions")))), _class="col offset-s3 s6 striped centered") tbody1 = TBODY() tbody2 = TBODY() # Append all the users to the final table for users in users_on_day_streak: handle = users[0] curr_streak = users[1] tr = TR( TD((A(handle[1], _href=URL("user", "profile", args=[handle[2]]), _target="_blank"))), TD(str(curr_streak) + " ", I(_class="fa fa-bolt", _style="color:red"), _class="center")) tbody1.append(tr) table1.append(tbody1) if len(users_on_day_streak) == 0: table1 = H6("No friends on day streak", _class="center") # Append all the users to the final table for users in users_on_submission_streak: handle = users[0] curr_accepted_streak = users[1] tr = TR( TD((A(handle[1], _href=URL("user", "profile", args=[handle[2]]), _target="_blank"))), TD(str(curr_accepted_streak) + " ", I(_class="fa fa-bolt", _style="color:red"), _class="center")) tbody2.append(tr) table2.append(tbody2) if len(users_on_submission_streak) == 0: table2 = H6("No friends on submission streak", _class="center") return dict(table1=table1, table2=table2)