import json import os from datetime import datetime import glob from huggingface_hub import HfApi REPO_ID = "snap-stanford/stark-leaderboard" class ForumPost: def __init__(self, message: str, timestamp: str, post_type: str): self.message = message self.timestamp = timestamp self.post_type = post_type def load_forum_posts(forum_file="submissions/forum_posts.json"): """Load forum posts from local file""" try: if os.path.exists(forum_file): with open(forum_file, 'r') as f: posts_data = json.load(f) return [ForumPost(**post) for post in posts_data] return [] except Exception as e: print(f"Error loading forum posts: {e}") return [] def save_forum_posts(posts, forum_file="submissions/forum_posts.json"): """Save forum posts to local file""" try: posts_data = [ { "message": post.message, "timestamp": post.timestamp, "post_type": post.post_type } for post in posts ] os.makedirs(os.path.dirname(forum_file), exist_ok=True) with open(forum_file, 'w') as f: json.dump(posts_data, f, indent=4) except Exception as e: print(f"Error saving forum posts: {e}") def add_status_update(posts, method_name: str, new_status: str): """Add a status update post""" timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") emoji = "✅" if new_status == "approved" else "❌" message = f"{emoji} Status update: {method_name} has been {new_status}" posts.append(ForumPost(message, timestamp, "status_update")) save_forum_posts(posts) def review_pending_submissions(submissions_dir: str = "submissions"): """Review all pending submissions and allow admin to approve/reject them.""" try: # Load forum posts forum_posts = load_forum_posts() # Find all latest.json files latest_files = glob.glob(os.path.join(submissions_dir, "**", "latest.json"), recursive=True) if not latest_files: print("No submissions found.") return changes_made = [] # Process each submission for latest_file in latest_files: try: with open(latest_file, 'r') as f: latest_info = json.load(f) if latest_info.get('status') != 'pending_review': continue folder_path = os.path.dirname(latest_file) timestamp = latest_info.get('latest_submission') if not timestamp: print(f"No timestamp found in {latest_file}, skipping...") continue metadata_file = os.path.join(folder_path, f"metadata_{timestamp}.json") try: with open(metadata_file, 'r') as f: metadata = json.load(f) except Exception as e: print(f"Could not read metadata for {latest_file}, skipping...") continue # Display submission details print("\n" + "="*80) print(f"Submission Details:") print(f"Method Name: {metadata.get('Method Name')}") print(f"Team Name: {metadata.get('Team Name')}") print(f"Dataset: {metadata.get('Dataset')}") print(f"Split: {metadata.get('Split')}") print(f"Contact Email(s): {metadata.get('Contact Email(s)')}") print(f"Code Repository: {metadata.get('Code Repository')}") print("\nModel Description:") print(metadata.get('Model Description', 'No description provided')) print("\nResults:") if 'results' in metadata: for metric, value in metadata['results'].items(): print(f"{metric}: {value}") print("\nSubmission Date:", metadata.get('submission_date', 'Unknown')) print("="*80) # Get admin decision while True: decision = input("\nApprove this submission? (y/n/skip/quit): ").lower() if decision in ['y', 'n', 'skip', 'quit']: break print("Invalid input. Please enter 'y', 'n', 'skip', or 'quit'") if decision == 'quit': print("Exiting review process...") break if decision == 'skip': continue # Update status new_status = 'approved' if decision == 'y' else 'rejected' review_timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") # Update latest.json latest_info['status'] = new_status latest_info['reviewed_at'] = review_timestamp with open(latest_file, 'w') as f: json.dump(latest_info, f, indent=4) changes_made.append(latest_file) # Update metadata metadata['status'] = new_status metadata['reviewed_at'] = review_timestamp with open(metadata_file, 'w') as f: json.dump(metadata, f, indent=4) changes_made.append(metadata_file) # Add forum post add_status_update(forum_posts, metadata.get('Method Name'), new_status) changes_made.append("submissions/forum_posts.json") print(f"Submission {new_status}") except Exception as e: print(f"Error processing {latest_file}: {e}") continue if changes_made: print("\nThe following files have been modified:") for file in sorted(set(changes_made)): print(f"- {file}") print("\nPlease push these changes to HuggingFace manually.") except Exception as e: print(f"Error during review process: {str(e)}") if __name__ == "__main__": print("Starting submission review process...") review_pending_submissions() print("\nReview process completed.")