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 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)
Exemple #6
0
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)