Пример #1
0
class PasswordReset(db.Model):
    """Model for password reset key"""
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    key = db.Column(db.String(64))
    expiration = db.Column(db.DateTime)

    def __init__(self, user, key=None):
        """Initialize a  model"""
        if not key:
            key = ''.join(
                random.choice(string.ascii_letters + string.digits)
                for _ in range(60))
        self.user = user
        self.email = user.email
        self.key = key
        # Add one additional day so the user can potentially reset their password at midnight
        self.expiration = datetime.datetime.now() + datetime.timedelta(days=8)

    def __repr__(self):
        """Return a descriptive representation of a password reset"""
        return '<Reset password for %r>' % self.user

    def send(self):
        """Send the PasswordReset"""
        title = 'Reset Your ACM-HSCC Password'
        url = '{site}/reset_pass/{key}'.format(
            site=os.environ['ACM_HSCC_SITE_URL'],
            key=self.key,
        )
        content = 'Please go to the link: {url}'.format(url=url)

        msg = Message(title, recipients=[self.email])
        msg.body = content
        mail.send(msg)
Пример #2
0
class Team(db.Model):
    """Model representing a team"""

    __tablename__ = 'team'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64))
    school_id = db.Column(db.Integer, db.ForeignKey('school.id'))
    users = db.relationship(User, backref='team')

    def __init__(self, name, school):
        """Initialize a team model"""
        self.name = name
        self.school = school
        self.users = []

    def __repr__(self):
        """Return a descriptive representation of a user"""
        return '<Team %s>' % self.name

    @classmethod
    def get_or_create(cls, name, school):
        """Retrieve a team or create a new one if the name isn't in use"""
        team = Team.query.filter(Team.name.ilike(name)).first()
        if not team:
            team = Team(name, school)
            db.session.add(team)
            db.session.commit()
        return team
Пример #3
0
class Language(db.Model):
    """Model representing a programming language"""

    __tablename__ = 'language'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(256))

    @classmethod
    def get_or_create(cls, name):
        """Retrieve a language or create a new one if the name isn't in use"""
        language = Language.query.filter(Language.name.ilike(name)).first()
        if not language:
            language = Language(name=name)
            db.session.add(language)
            db.session.commit()
        return language
Пример #4
0
class School(db.Model):
    """Model representing a high school"""

    __tablename__ = 'school'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64))
    state = db.Column(db.Integer)
    students = db.relationship(User, backref='school')
    teams = db.relationship(Team, backref='school')

    def __init__(self, name, state):
        """Initialize a school model"""
        self.name = name
        self.state = state
        self.students = []
        self.teams = []

    def __repr__(self):
        """Return a descriptive representation of a school"""
        return '<School %s>' % self.name

    @property
    def state_name(self):
        """Get the text representation of the school's state"""
        return State.get(self.state)

    @classmethod
    def get_or_create(cls, name, state):
        """Retrieve a school or create a new one if it hasn't been added yet"""
        school = School.query.filter(
            School.name.ilike(name)).filter(School.state == state).first()
        if not school:
            school = School(name, state)
            db.session.add(school)
            db.session.commit()
        return school
Пример #5
0
class User(db.Model, UserMixin):
    """Model representing a basic site user"""

    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key=True)

    school_id = db.Column(db.Integer, db.ForeignKey('school.id'))
    team_id = db.Column(db.Integer, db.ForeignKey('team.id'))
    allergies_id = db.Column(db.Integer, db.ForeignKey('allergies.id'))
    language_id = db.Column(db.Integer, db.ForeignKey('language.id'))

    name = db.Column(db.String(64))
    email = db.Column(db.String(64), index=True, unique=True)
    password = db.Column(db.String(128))
    grade = db.Column(db.Integer)
    shirt_size = db.Column(db.Integer)
    status = db.Column(db.Integer)
    is_admin = db.Column(db.Boolean)

    language = db.relationship(Language)
    allergies = db.relationship(Allergies, backref='user')
    pw_reset = db.relationship(PasswordReset, backref='user')

    def __init__(self,
                 name,
                 email,
                 password,
                 school,
                 team,
                 grade,
                 shirt_size,
                 language,
                 allergies,
                 is_admin=False):
        """Initialize a student model"""
        self.name = name
        self.email = email
        self.set_password(password)
        self.school = school
        self.team = team
        self.grade = grade
        self.shirt_size = shirt_size
        self.language = language
        self.allergies = allergies
        self.status = Status.Applied.value[0]
        self.is_admin = is_admin

    def __repr__(self):
        """Return a descriptive representation of a user"""
        return '<User %s>' % self.name

    def set_password(self, new_password):
        """Change the user's password to the new password"""
        self.password = generate_password_hash(new_password)

    def check_password(self, password):
        """Check the user's password against the given value"""
        return check_password_hash(self.password, password)

    @property
    def grade_name(self):
        """Get the text representation of the student's grade"""
        return Grade.get(self.grade)

    @property
    def shirt_size_name(self):
        """Get the text representation of the student's shirt size"""
        return ShirtSize.get(self.shirt_size)

    @property
    def status_name(self):
        """Get the text representation of the student's application status"""
        return Status.get(self.status)
Пример #6
0
class Allergies(db.Model):
    """Model representing a student's allergies"""

    __tablename__ = 'allergies'
    id = db.Column(db.Integer, primary_key=True)
    text = db.Column(db.String(256))