class Voter(db.Model): ''' Contains details of a voter ''' __tablename__ = 'Voter' voterId = db.Column(db.Integer, db.ForeignKey('ElectoralRoll.voterId'), nullable=False, primary_key=True) electionId = db.Column(db.Integer, db.ForeignKey('Elections.electionId'), nullable=False, primary_key=True) otp = db.Column(db.Integer, nullable=True) def __repr__(self): return 'Voter: < ' + self.voterId + ':' + self.electionId + ':' + self.otp + '>' def __init__(self, id, electionId, otp): self.voterId = id self.electionId = electionId self.otp = otp def as_dict(self): return { c.name: getattr(self, c.name) for c in self.__tablename__.columns }
class Coordinator(db.Model): __tablename__ = 'Coordinator' userId = db.Column(db.String(10), db.ForeignKey('User.pecfestId'), primary_key=True) password = db.Column(db.String(10), nullable=False) level = db.Column(db.String(10), nullable=False) def __str__(self): return "[" + self.userId + "] " + self.level
class User(db.Model): ''' Contain details of a user. ''' __tablename__ = 'User' pecfestId = db.Column(db.String(10), primary_key=True) name = db.Column(db.String(256), nullable=False) college = db.Column(db.String(256), nullable=False) email = db.Column(db.String(100), nullable=False) mobile = db.Column(db.String(10), nullable=False) gender = db.Column(db.String(10), nullable=False) accomodation = db.Column(db.String(255), nullable=False) verified = db.Column(db.Integer, nullable=False) smsCounter = db.Column(db.Integer, default=0) def __repr__(self): return 'User: <' + self.pecfestId + ':' + self.name + '>' def as_dict(self): return { c.name: getattr(self, c.name) for c in self.__tablename__.columns }
class SentSMS(db.Model): __tablename__ = 'sent_sms' id = db.Column(db.Integer, primary_key=True) smsId = db.Column(db.String(255), nullable=False) mobile = db.Column(db.String(10), nullable=False) smsType = db.Column(db.Integer, nullable=False) # 1 for pending, 2 for delivered, 3 for rejected status = db.Column(db.Integer, nullable=False)
class Notifications(db.Model): __tablename__ = 'Notifications' notificationId = db.Column(db.String(10), primary_key=True) notificationTitle = db.Column(db.String(100), nullable=False) notificationDetails = db.Column(db.String(4096), nullable=True) eventId = db.Column(db.Integer, db.ForeignKey('Event.eventId'), nullable=False) notificationType = db.Column(db.String(10), nullable=False) notif_rel = relationship('Event')
class OTPs(db.Model): __tablename__ = 'OTPs' mobile = db.Column(db.String(10), primary_key=True) otp = db.Column(db.String(6), nullable=False) def __repr__(self): return 'ID: <' + self.mobile + ':' + self.otp + '>' def as_dict(self): return { c.name: getattr(self, c.name) for c in self.__tablename__.columns }
class QuestionAttempt(db.Model): """Maps quiz attempt to quiz questions, mark if correct""" __tablename__ = 'question_attempts' id = db.Column(db.Integer, primary_key=True) question_id = db.Column(db.Integer, db.ForeignKey('questions.id', ondelete='cascade')) quiz_attempt_id = db.Column( db.Integer, db.ForeignKey('quiz_attempts.id', ondelete='cascade')) answer_given = db.Column(db.Text) correct = db.Column(db.Boolean)
class QuizAttempt(db.Model): """Quiz attempts by a user""" __tablename__ = 'quiz_attempts' id = db.Column(db.Integer, primary_key=True) user_id = db.Column(db.Integer, db.ForeignKey('users.id', ondelete='cascade')) quiz_id = db.Column(db.Integer, db.ForeignKey('quizzes.id', ondelete='cascade')) timestamp = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) num_correct = db.Column(db.Integer) questions = db.relationship("QuestionAttempt", backref='quiz_attempt')
class Candidate(db.Model): ''' Info about candidates ''' __tablename__ = "Candidate" voterId = db.Column(db.Integer, db.ForeignKey('ElectoralRoll.voterId'), nullable=False) electionId = db.Column(db.Integer, db.ForeignKey('Elections.electionId'), nullable=False) name = db.Column(db.String(100), nullable=False) manifesto = db.Column(db.Text, nullable=True) uId = db.Column(db.Integer, primary_key=True, autoincrement=True) def __repr__(self): return 'Candidate: < ' + str(self.electionId) + ':' + str( self.uId) + ':' + str( self.voterId) + ':' + self.name + ':' + self.manifesto + '>' def __init__(self, electionId, voterId, name, manifesto): self.voterId = voterId self.name = name self.manifesto = manifesto self.electionId = electionId def as_dict(self): return { c.name: getattr(self, c.name) for c in self.__tablename__.columns } def get_uId(self): return self.uId def get_voterId(self): return self.voterId def get_name(self): return self.name def get_manifesto(self): return self.manifesto
class QuizQuestion(db.Model): """Map quiz questions to a quiz""" __tablename__ = 'quiz_questions' id = db.Column( db.Integer, primary_key=True ) question_id = db.Column( db.Integer, db.ForeignKey('questions.id', ondelete='cascade') ) quiz_id = db.Column( db.Integer, db.ForeignKey('quizzes.id', ondelete='cascade') )
class EventRegistration(db.Model): __tablename__ = 'Registration' id = db.Column(db.Integer, primary_key=True) eventId = db.Column(db.Integer, db.ForeignKey('Event.eventId'), nullable=False) memberId = db.Column(db.String(10), db.ForeignKey('User.pecfestId'), nullable=False) leaderId = db.Column(db.String(10), db.ForeignKey('User.pecfestId'), nullable=False) def as_dict(self): return { c.name: getattr(self, c.name) for c in self.__tablename__.columns }
class Elections(db.Model): ''' Contains Details of all elections ''' __tablename__ = "Elections" electionId = db.Column(db.Integer, nullable=False, primary_key=True, autoincrement=True) electionName = db.Column(db.String(1000), nullable=False) description = db.Column(db.Text, nullable=True) startTime = db.Column(db.DateTime, nullable=False) endTime = db.Column(db.DateTime, nullable=False) hostId = db.Column(db.Integer, nullable=False) def __repr__(self): return 'Electons: < ' + self.hostId + ':' + self.electionId + ':' + self.electionName + ':' + self.description + ':' + self.startTime + ':' + self.endTime + '>' def __init__(self, hostId, electionId, electionName, description, startTime, endTime): self.electionId = electionId self.electionName = electionName self.description = description self.startTime = startTime self.endTime = endTime self.hostId = hostId def as_dict(self): return { c.name: getattr(self, c.name) for c in self.__tablename__.columns }
class ElectoralRoll(db.Model): ''' Contains Master Details ''' __tablename__ = 'ElectoralRoll' voterId = db.Column(db.Integer, nullable=False, primary_key=True) name = db.Column(db.String(100), nullable=False) branch = db.Column(db.String(100), nullable=False) year = db.Column(db.Integer, nullable=False) email = db.Column(db.String(256), nullable=False, unique=True) contact = db.Column(db.String(10), nullable=False, unique=True) def __repr__(self): return 'ElectoralRoll: < ' + self.voterId + ':' + self.name + ':' + self.branch + ':' + self.year + ':' + self.email + ':' + self.contact + '>' def __init__(self, voterId, name, branch, year, email, contact): self.voterId = voterId self.name = name self.branch = branch self.year = year self.email = email self.contact = contact def as_dict(self): return { c.name: getattr(self, c.name) for c in self.__tablename__.columns }
class Vote(db.Model): ''' Contains info about the Vote count ''' __tablename__ = "Vote" electionId = db.Column ( db.Integer, db.ForeignKey('Elections.electionId'),nullable=False, primary_key=True) uId = db.Column ( db.Integer,db.ForeignKey('Candidate.uId'), nullable=False , primary_key=True) count = db.Column (db.Integer, nullable=False) def __repr__(self): return 'Vote: < ' + self.electionId + ':' + self.uId + ':' + self.count + '>' def __init__(self, uId, electionId, count): self.uId = uId self.electionId = electionId self.count = 0 def as_dict(self): return { c.name : getattr(self, c.name) for c in self.__tablename__.columns}
class Question(db.Model): """Quiz question""" __tablename__ = 'questions' id = db.Column( db.Integer, primary_key=True ) url = db.Column( db.Text ) correct_answer = db.Column( db.Text ) wrong_answer_1 = db.Column( db.Text ) wrong_answer_2 = db.Column( db.Text ) wrong_answer_3 = db.Column( db.Text ) slug = db.Column( db.Text ) search_slug = db.Column( db.Text, default=search_slug ) attempts = db.relationship( 'QuestionAttempt', backref='question' )
class User(db.Model): """User in the system.""" __tablename__ = 'users' id = db.Column( db.Integer, primary_key=True, ) username = db.Column( db.Text, nullable=False, unique=True, ) password = db.Column( db.Text, nullable=False, ) num_quizzes_created = db.Column(db.Integer, default=0) quizzes = db.relationship('Quiz', secondary="quiz_attempts", backref='taken_by') attempts = db.relationship('QuizAttempt', backref='taken_by') def __repr__(self): return f"<User #{self.id}: {self.username}>" def is_new_quiz_eligible(self): """User may request creation of one new quiz for every 10 different quizzes taken.""" return self.num_quizzes_created * 10 + 10 <= len(self.quizzes) @classmethod def signup(cls, username, password): """Sign up user. Hashes password and adds user to system.""" hashed_pwd = bcrypt.generate_password_hash(password).decode('UTF-8') user = User(username=username, password=hashed_pwd) db.session.add(user) db.session.commit() return user @classmethod def authenticate(cls, username, password): """Find user with `username` and `password`. If can't find matching user (or if password is wrong), returns False. """ user = cls.query.filter_by(username=username).first() if user: is_auth = bcrypt.check_password_hash(user.password, password) if is_auth: return user return False
class Notifications(db.Model): __tablename__ = 'Notifications' token = db.Column(db.String(50), primary_key=True)
class Participant(db.Model): __tablename__ = 'Participant' pecfestId = db.Column(db.String(10), primary_key=True) firstName = db.Column(db.String(256), nullable=False) lastName = db.Column(db.String(256), nullable=False) collegeName = db.Column(db.String(256), nullable=False) emailId = db.Column(db.String(100), nullable=False) mobileNumber = db.Column(db.String(10), nullable=False) gender = db.Column(db.String(10), nullable=False) accomodation = db.Column(db.String(10), nullable=False) verified = db.Column(db.Integer, nullable=False) smsCounter = db.Column(db.Integer, default=0) password = db.Column(db.String(300), nullable=False) def __repr__(self): return 'User: <' + self.pecfestId + ':' + self.password + '>' def set_password(self, password): self.password = generate_password_hash(password) def check_password(self, password): return check_password_hash(self.password, password) def as_dict(self): return { c.name: getattr(self, c.name) for c in self.__tablename__.columns }
class Event(db.Model): __tablename__ = 'Event' eventId = db.Column(db.Integer, primary_key=True, nullable=False) name = db.Column(db.String(100), unique=True, nullable=False) coordinators = db.Column(db.String(4096)) location = db.Column(db.String(200)) day = db.Column(db.Integer) time = db.Column(db.String(50)) prize = db.Column(db.String(256)) minSize = db.Column(db.Integer, default=0) maxSize = db.Column(db.Integer, default=0) eventType = db.Column(db.Integer, nullable=False) category = db.Column(db.Integer, default=0) clubId = db.Column(db.String(10), default=0) details = db.Column(db.String(4096)) shortDescription = db.Column(db.String(300)) imageUrl = db.Column(db.String(255), default='') rulesList = db.Column(db.String(4096)) pdfUrl = db.Column(db.String(255), nullable=False) def __repr__(self): return 'Event: <' + self.eventName + '>' def as_dict(self): return { c.name: getattr(self, c.name) for c in self.__tablename__.columns }
class Session(db.Model): __tablename__ = 'Session' sessionKey = db.Column(db.String(10), primary_key=True) userId = db.Column(db.String(10), nullable=False)
class Quiz(db.Model): """Quiz""" __tablename__ = 'quizzes' id = db.Column( db.Integer, primary_key=True ) num_questions = db.Column(db.Integer) family = db.Column( db.Text, nullable=False ) num_by_family = db.Column( db.Integer, default=num_by_family ) created_on = db.Column( db.DateTime, default = datetime.utcnow ) created_by = db.Column( db.Text, default = 'system' ) questions = db.relationship( 'Question', secondary="quiz_questions", backref='part_of' ) attempts = db.relationship( 'QuizAttempt', backref='quiz' ) @classmethod def create(cls, family): """Create new quiz from identified family. If error in quiz creation, return False""" questions = create_quiz(family) if not questions: return False quiz = Quiz(num_questions=10, family=family) db.session.add(quiz) db.session.commit() for question in questions: new_question = Question(**question) new_question.family = family db.session.add(new_question) db.session.commit() quiz.questions.append(new_question) db.session.commit() return quiz