Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
Commit
·
9203d52
1
Parent(s):
6c4809a
wip
Browse files
README.md
CHANGED
@@ -5,12 +5,11 @@ colorFrom: green
|
|
5 |
colorTo: indigo
|
6 |
sdk: gradio
|
7 |
hf_oauth: true
|
8 |
-
hf_oauth_expiration_minutes: 2
|
9 |
app_file: app.py
|
10 |
pinned: true
|
11 |
license: apache-2.0
|
12 |
short_description: FormulaOne Leaderboard
|
13 |
-
sdk_version: 5.
|
14 |
---
|
15 |
|
16 |
# Start the configuration
|
|
|
5 |
colorTo: indigo
|
6 |
sdk: gradio
|
7 |
hf_oauth: true
|
|
|
8 |
app_file: app.py
|
9 |
pinned: true
|
10 |
license: apache-2.0
|
11 |
short_description: FormulaOne Leaderboard
|
12 |
+
sdk_version: 5.42.0
|
13 |
---
|
14 |
|
15 |
# Start the configuration
|
app.py
CHANGED
@@ -1,12 +1,9 @@
|
|
1 |
-
from http.cookies import SimpleCookie
|
2 |
-
import os
|
3 |
import gradio as gr
|
4 |
import pandas as pd
|
5 |
from apscheduler.schedulers.background import BackgroundScheduler
|
6 |
from gradio.themes import Base, colors, sizes
|
7 |
from gradio_leaderboard import Leaderboard, SelectColumns
|
8 |
from huggingface_hub import whoami
|
9 |
-
from fastapi import Response
|
10 |
|
11 |
from src.about import CITATION_BUTTON_LABEL, CITATION_BUTTON_TEXT, EVALUATION_QUEUE_TEXT, INTRODUCTION_TEXT, TITLE
|
12 |
from src.datamodel.data import F1Data
|
@@ -87,13 +84,13 @@ def add_solution_cbk(
|
|
87 |
sys_type: str,
|
88 |
submission_path: str,
|
89 |
profile: gr.OAuthProfile | None,
|
90 |
-
|
91 |
):
|
92 |
logger.info("Fetching user details for submission")
|
93 |
logger.info("PROFILE %s", profile)
|
94 |
-
logger.info("TOKEN %s",
|
95 |
|
96 |
-
if profile is None or
|
97 |
return styled_error("Please sign in with Hugging Face before submitting.")
|
98 |
|
99 |
# Display handle and display name (may change over time)
|
@@ -102,7 +99,7 @@ def add_solution_cbk(
|
|
102 |
logger.info(f"Display name: {display_name}")
|
103 |
|
104 |
# Stable account id
|
105 |
-
user_info = fetch_user_info(
|
106 |
logger.info("Logged in user info: %s", user_info)
|
107 |
stable_id = user_info.get("id") if user_info else None
|
108 |
logger.info(f"User stable ID: {stable_id}")
|
@@ -160,66 +157,21 @@ def add_solution_cbk(
|
|
160 |
)
|
161 |
|
162 |
|
163 |
-
|
164 |
-
# logger.info("CHECK TOKEN %s", oauth_token)
|
165 |
-
# if oauth_token is None:
|
166 |
-
# logger.info("CHECK: NO TOKEN")
|
167 |
-
# return gr.update(value="")
|
168 |
-
# try:
|
169 |
-
# whoami(oauth_token.token)
|
170 |
-
# logger.info("CHECK: VALID TOKEN")
|
171 |
-
# return gr.update(value="")
|
172 |
-
# except Exception:
|
173 |
-
# logger.info("CHECK: TOKEN HAS EXPIRED")
|
174 |
-
# return gr.update(value='<script>window.location.href = "/logout";</script>')
|
175 |
-
|
176 |
-
|
177 |
-
# def gate_submission_by_prof(profile: gr.OAuthProfile | None):
|
178 |
-
# if not profile:
|
179 |
-
# return gr.update(visible=True), gr.update(visible=False)
|
180 |
-
# return gr.update(visible=False), gr.update(visible=True)
|
181 |
-
|
182 |
-
|
183 |
-
def gate_submission(oauth_token: gr.OAuthToken | None, request: gr.Request):
|
184 |
"""
|
185 |
@brief Toggles the visibility of the login box and submission panel based on the user's login status.
|
186 |
"""
|
187 |
-
# Log cookie sizes
|
188 |
-
cookies = request.headers.get("cookie", "")
|
189 |
-
cookie_obj = SimpleCookie()
|
190 |
-
try:
|
191 |
-
cookie_obj.load(cookies)
|
192 |
-
for key in ["spaces-jwt", "session"]:
|
193 |
-
if key in cookie_obj:
|
194 |
-
cookie_size = len(cookie_obj[key].OutputString().encode('utf-8'))
|
195 |
-
logger.info(f"Cookie {key} size: {cookie_size} bytes")
|
196 |
-
except Exception as e:
|
197 |
-
logger.error(f"Error parsing cookies: {str(e)}")
|
198 |
-
|
199 |
logger.info("GATE TOKEN %s", oauth_token)
|
200 |
if oauth_token is None:
|
201 |
logger.info("GATE: NO TOKEN")
|
202 |
-
return gr.update(visible=True), gr.update(visible=False)
|
203 |
try:
|
204 |
-
token_size = len(oauth_token.token.encode('utf-8'))
|
205 |
-
logger.info(f"Token size: {token_size} bytes")
|
206 |
whoami(oauth_token.token)
|
207 |
logger.info("GATE: TOKEN IS VALID")
|
208 |
-
return gr.update(visible=False), gr.update(visible=
|
209 |
except Exception:
|
210 |
logger.info("GATE: TOKEN HAS EXPIRED")
|
211 |
-
return gr.update(visible=
|
212 |
-
|
213 |
-
# Custom route to force clear HttpOnly cookies
|
214 |
-
def clear_cookies():
|
215 |
-
response = Response()
|
216 |
-
response.headers["Set-Cookie"] = [
|
217 |
-
"spaces-jwt=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Domain=" + os.environ.get("SPACE_HOST", ""),
|
218 |
-
"session=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Domain=" + os.environ.get("SPACE_HOST", "")
|
219 |
-
]
|
220 |
-
response.headers["Location"] = "/?t=" + str(int(os.times().elapsed * 1000))
|
221 |
-
response.status_code = 302
|
222 |
-
return response
|
223 |
|
224 |
|
225 |
def get_theme():
|
@@ -242,17 +194,6 @@ def get_theme():
|
|
242 |
)
|
243 |
return cyber_theme
|
244 |
|
245 |
-
# JavaScript to clear cookies and reload
|
246 |
-
JS_LOGOUT = """
|
247 |
-
<a href="#" onclick="
|
248 |
-
var domain = window.location.hostname;
|
249 |
-
document.cookie = 'spaces-jwt=; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Domain=' + domain;
|
250 |
-
document.cookie = 'session=; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Domain=' + domain;
|
251 |
-
console.log('Cookies cleared: spaces-jwt, session on domain: ' + domain);
|
252 |
-
window.location.href='/?t='+new Date().getTime();
|
253 |
-
return false;
|
254 |
-
" style="display: inline-block; padding: 10px; background: #ff4d4f; color: white; text-decoration: none; border-radius: 5px;">Manual Logout</a>
|
255 |
-
"""
|
256 |
|
257 |
blocks = gr.Blocks(css=custom_css, theme=get_theme())
|
258 |
with blocks:
|
@@ -311,20 +252,6 @@ with blocks:
|
|
311 |
gr.Markdown("Please sign in to continue:")
|
312 |
gr.LoginButton()
|
313 |
|
314 |
-
# Shown when login token is EXPIRED
|
315 |
-
logout_box = gr.Group(visible=False)
|
316 |
-
with logout_box:
|
317 |
-
gr.Markdown("Your session has already EXPIRED. Please sign in again")
|
318 |
-
gr.LoginButton()
|
319 |
-
# gr.Button("Manual Logout", link="/logout")
|
320 |
-
# gr.HTML(JS_LOGOUT)
|
321 |
-
# Manual logout link to server-side /logout
|
322 |
-
# gr.HTML('<a href="/logout?redirect=/" style="display: inline-block; padding: 10px; background: #ff4d4f; color: white; text-decoration: none; border-radius: 5px;">Logout (via /logout)</a>')
|
323 |
-
|
324 |
-
# Custom clear cookies link
|
325 |
-
# gr.HTML('<a href="/clear-cookies" style="display: inline-block; padding: 10px; background: #ff6666; color: white; text-decoration: none; border-radius: 5px; margin-left: 10px;">Clear Cookies</a>')
|
326 |
-
|
327 |
-
|
328 |
# Shown when logged IN
|
329 |
submit_panel = gr.Group(visible=False)
|
330 |
with submit_panel:
|
@@ -366,18 +293,12 @@ with blocks:
|
|
366 |
elem_id="citation-block",
|
367 |
)
|
368 |
|
369 |
-
# Trigger reload if token is expired
|
370 |
-
# blocks.load(check_valid_token, outputs=reload_html)
|
371 |
-
|
372 |
# UI refresh triggers latest data swap.
|
373 |
# The work already happened in the background - refresh_leaderboard_data().
|
374 |
blocks.load(lambda: leaderboard_df, inputs=[], outputs=[leaderboard_component])
|
375 |
|
376 |
# On initial load (and after OAuth redirect), toggle the UI based on login status.
|
377 |
-
|
378 |
-
blocks.load(gate_submission, inputs=None, outputs=[login_box, logout_box, submit_panel])
|
379 |
-
|
380 |
-
# blocks.app.add_api_route("/clear-cookies", clear_cookies, methods=["GET"])
|
381 |
|
382 |
|
383 |
logger.info("Scheduler")
|
|
|
|
|
|
|
1 |
import gradio as gr
|
2 |
import pandas as pd
|
3 |
from apscheduler.schedulers.background import BackgroundScheduler
|
4 |
from gradio.themes import Base, colors, sizes
|
5 |
from gradio_leaderboard import Leaderboard, SelectColumns
|
6 |
from huggingface_hub import whoami
|
|
|
7 |
|
8 |
from src.about import CITATION_BUTTON_LABEL, CITATION_BUTTON_TEXT, EVALUATION_QUEUE_TEXT, INTRODUCTION_TEXT, TITLE
|
9 |
from src.datamodel.data import F1Data
|
|
|
84 |
sys_type: str,
|
85 |
submission_path: str,
|
86 |
profile: gr.OAuthProfile | None,
|
87 |
+
oauth_token: gr.OAuthToken | None,
|
88 |
):
|
89 |
logger.info("Fetching user details for submission")
|
90 |
logger.info("PROFILE %s", profile)
|
91 |
+
logger.info("TOKEN %s", oauth_token)
|
92 |
|
93 |
+
if profile is None or oauth_token is None:
|
94 |
return styled_error("Please sign in with Hugging Face before submitting.")
|
95 |
|
96 |
# Display handle and display name (may change over time)
|
|
|
99 |
logger.info(f"Display name: {display_name}")
|
100 |
|
101 |
# Stable account id
|
102 |
+
user_info = fetch_user_info(oauth_token)
|
103 |
logger.info("Logged in user info: %s", user_info)
|
104 |
stable_id = user_info.get("id") if user_info else None
|
105 |
logger.info(f"User stable ID: {stable_id}")
|
|
|
157 |
)
|
158 |
|
159 |
|
160 |
+
def gate_submission(oauth_token: gr.OAuthToken | None):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
161 |
"""
|
162 |
@brief Toggles the visibility of the login box and submission panel based on the user's login status.
|
163 |
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
164 |
logger.info("GATE TOKEN %s", oauth_token)
|
165 |
if oauth_token is None:
|
166 |
logger.info("GATE: NO TOKEN")
|
167 |
+
return gr.update(visible=True), gr.update(visible=False)
|
168 |
try:
|
|
|
|
|
169 |
whoami(oauth_token.token)
|
170 |
logger.info("GATE: TOKEN IS VALID")
|
171 |
+
return gr.update(visible=False), gr.update(visible=True)
|
172 |
except Exception:
|
173 |
logger.info("GATE: TOKEN HAS EXPIRED")
|
174 |
+
return gr.update(visible=True), gr.update(visible=False)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
175 |
|
176 |
|
177 |
def get_theme():
|
|
|
194 |
)
|
195 |
return cyber_theme
|
196 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
197 |
|
198 |
blocks = gr.Blocks(css=custom_css, theme=get_theme())
|
199 |
with blocks:
|
|
|
252 |
gr.Markdown("Please sign in to continue:")
|
253 |
gr.LoginButton()
|
254 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
255 |
# Shown when logged IN
|
256 |
submit_panel = gr.Group(visible=False)
|
257 |
with submit_panel:
|
|
|
293 |
elem_id="citation-block",
|
294 |
)
|
295 |
|
|
|
|
|
|
|
296 |
# UI refresh triggers latest data swap.
|
297 |
# The work already happened in the background - refresh_leaderboard_data().
|
298 |
blocks.load(lambda: leaderboard_df, inputs=[], outputs=[leaderboard_component])
|
299 |
|
300 |
# On initial load (and after OAuth redirect), toggle the UI based on login status.
|
301 |
+
blocks.load(gate_submission, inputs=None, outputs=[login_box, submit_panel])
|
|
|
|
|
|
|
302 |
|
303 |
|
304 |
logger.info("Scheduler")
|