| from pymongo import MongoClient |
| from datetime import datetime |
| from bson import ObjectId |
| from dotenv import load_dotenv |
| import os |
|
|
| load_dotenv() |
| MONGO_URI = os.getenv('MONGO_URI') |
| class PollDatabase: |
| def __init__(self): |
| self.client = MongoClient(MONGO_URI) |
| self.db = self.client["novascholar_db"] |
| |
| def create_poll(self, course_id, course_name, session_id, question, options, faculty_id): |
| """Create a new poll""" |
| poll = { |
| "course_id": course_id, |
| "course_name": course_name, |
| "session_id": session_id, |
| "faculty_id": faculty_id, |
| "question": question, |
| "options": options, |
| "status": "active", |
| "created_at": datetime.now(), |
| "responses": {option: 0 for option in options} |
| } |
| return self.db.polls.insert_one(poll) |
| |
| def get_active_polls(self, session_id, course_id): |
| """Get all active polls for a session""" |
| return list(self.db.polls.find({ |
| "session_id": session_id, |
| "course_id": course_id, |
| "status": "active" |
| })) |
| |
| def submit_response(self, poll_id, student_id, selected_option): |
| """Submit a student's response to a poll""" |
| try: |
| |
| response = { |
| "poll_id": poll_id, |
| "student_id": student_id, |
| "selected_option": selected_option, |
| "submitted_at": datetime.now() |
| } |
| self.db.poll_responses.insert_one(response) |
| |
| |
| self.db.polls.update_one( |
| {"_id": ObjectId(poll_id)}, |
| {"$inc": {f"responses.{selected_option}": 1}} |
| ) |
| return True, "Vote recorded successfully" |
| |
| except Exception as e: |
| if "duplicate key error" in str(e): |
| return False, "You have already voted in this poll" |
| return False, f"Error recording vote: {str(e)}" |
| |
| def close_poll(self, poll_id): |
| """Close a poll""" |
| return self.db.polls.update_one( |
| {"_id": ObjectId(poll_id)}, |
| {"$set": {"status": "closed"}} |
| ) |
| |
| def get_poll_analytics(self, poll_id): |
| """Get detailed analytics for a poll""" |
| poll = self.db.polls.find_one({"_id": ObjectId(poll_id)}) |
| responses = self.db.poll_responses.find({"poll_id": ObjectId(poll_id)}) |
| return poll, list(responses) |