Ejemplo n.º 1
0
class Role(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64))
    color = db.Column(db.String(64), default="#7F9CF5")
    team = db.relationship("Team", uselist=False)
    team_id = db.Column(db.Integer, db.ForeignKey("team.id"))
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    all_users = db.relationship("User",
                                lazy="dynamic",
                                order_by="asc(User.username)")

    @hybrid_property
    def users(self):
        return self.all_users.filter(User.deleted == False)

    @users.setter
    def users(self, users):
        self.all_users = users

    def __repr__(self):
        return f"<Role {self.name} >"
Ejemplo n.º 2
0
class FeedbackTagGroup(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64))
    user = db.relationship("User", uselist=False)
    user_id = db.Column(db.Integer, db.ForeignKey("user.id"))
    tags = db.relationship(
        "FeedbackTag",
        order_by="asc(FeedbackTag.name)",
        lazy="dynamic",
    )

    def __repr__(self):
        return f"<FeedbackTagGroup {self.name}>"
Ejemplo n.º 3
0
class Feedback(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    author_id = db.Column(db.Integer, db.ForeignKey("user.id"))
    author_name = db.Column(db.String(64))
    recipient_id = db.Column(db.Integer, db.ForeignKey("user.id"))
    message = db.Column(db.Text())
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    tags = db.relationship("FeedbackTag",
                           secondary="tagged_feedback",
                           passive_deletes=True,
                           order_by="FeedbackTag.name")

    def __repr__(self):
        return f"<Feedback {self.id}>"
Ejemplo n.º 4
0
class FeedbackTag(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), default='')
    description = db.Column(db.Text(), default='')
    group = db.relationship("FeedbackTagGroup", uselist=False)
    group_id = db.Column(db.Integer, db.ForeignKey("feedback_tag_group.id"))
    feedbacks = db.relationship(
        "Feedback",
        secondary="tagged_feedback",
        order_by="asc(Feedback.created_at)",
        lazy="dynamic",
    )

    def __repr__(self):
        return f"<FeedbackTag {self.name}>"
Ejemplo n.º 5
0
class Team(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    uuid = db.Column(UUID(as_uuid=True), default=uuid4, index=True)
    name = db.Column(db.String(64))
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    all_users = db.relationship("User",
                                backref="user",
                                lazy="dynamic",
                                order_by="asc(User.username)")
    all_reminders = db.relationship("Reminder",
                                    backref="reminder",
                                    lazy="dynamic")
    all_pairing_sessions = db.relationship("PairingSession",
                                           backref="pairing_session",
                                           lazy="dynamic")
    roles = db.relationship("Role", backref="role", lazy="dynamic")

    @hybrid_property
    def users(self):
        return self.all_users.filter(User.deleted == False)

    @users.setter
    def users(self, users):
        self.all_users = users

    @hybrid_property
    def pairing_sessions(self):
        return self.all_pairing_sessions.filter(
            PairingSession.deleted == False)

    @pairing_sessions.setter
    def pairing_sessions(self, pairing_sessions):
        self.all_pairing_sessions = pairing_sessions

    @hybrid_property
    def reminders(self):
        return self.all_reminders.filter(Reminder.deleted == False)

    @reminders.setter
    def reminders(self, reminders):
        self.all_reminders = reminders

    def __repr__(self):
        return f"<Team {self.name} {self.uuid} >"
Ejemplo n.º 6
0
class User(SoftDeleteMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True)
    uuid = db.Column(UUID(as_uuid=True), default=uuid4, index=True)
    username = db.Column(db.String(64))
    role = db.relationship("Role", uselist=False)
    role_id = db.Column(db.Integer, db.ForeignKey("role.id"))
    team = db.relationship("Team", uselist=False)
    team_id = db.Column(db.Integer, db.ForeignKey("team.id"))
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    reminders = db.relationship("Reminder", lazy="dynamic")
    feedback_tag_groups = db.relationship("FeedbackTagGroup", lazy="dynamic")
    feedback_authored = db.relationship('Feedback',
                                        foreign_keys='Feedback.author_id',
                                        backref='author',
                                        order_by="desc(Feedback.created_at)",
                                        lazy='dynamic')
    feedback_received = db.relationship('Feedback',
                                        foreign_keys='Feedback.recipient_id',
                                        backref='recipient',
                                        order_by="desc(Feedback.created_at)",
                                        lazy='dynamic')
    pairing_sessions = db.relationship(
        "PairingSession",
        secondary="participants",
        order_by="desc(PairingSession.created_at)",
        lazy="dynamic",
    )

    email = db.Column(db.String(64), index=True, unique=True)
    password = db.Column(db.Text)
    full_name = db.Column(db.String(64))
    ### start flask praetorian ###
    @classmethod
    def lookup(cls, email):
        return cls.query.filter_by(email=email).one_or_none()

    @classmethod
    def identify(cls, id):
        return cls.query.get(id)

    @property
    def identity(self):
        return self.id

    @property  # not currently used but required by flask-praetorian
    def rolenames(self):
        return []

    ### end flask praetorian ###

    def __lt__(self, obj):
        return self.username < obj.username

    def __repr__(self):
        return f"<User {self.username} {self.role and self.role.name or 'No Role'} >"

    @property
    def active_pairing_sessions(self):
        return self.pairing_sessions.filter(
            ~PairingSession.info.in_(PairingSession.FILTERED)).all()

    def csv_row(self):
        row = []
        for pair in self.pairing_sessions.filter(
                ~PairingSession.info.in_(PairingSession.FILTERED)):
            members = ','.join(
                [user.username for user in pair.users if user is not self])
            row.append(
                f"{self.username},{pair.created_at.strftime('%m/%d/%y')},{pair.info.replace(',', ' ')},{members}"
            )
        return '\n'.join(row)

    def hard_delete(self):
        for pair in self.pairing_sessions:
            pair.users.remove(self)
        db.session.commit()
        self.role = None
        db.session.delete(self)
        db.session.commit()

    def soft_delete(self):
        for pair in self.pairing_sessions:
            if arrow.get(pair.created_at).to("US/Central") >= arrow.now(
                    "US/Central").floor("days"):
                pair.users.remove(self)
            else:
                Participants.query.filter(
                    Participants.pairing_session == pair).update(
                        {Participants.deleted: True})
                pair.soft_delete()

        self.reminders.update({Reminder.deleted: True})
        super().soft_delete()

    def revive(self):
        for pair in self.pairing_sessions:
            Participants.query.with_deleted().filter(
                Participants.pairing_session == pair).update(
                    {Participants.deleted: False})
            pair.revive()

        todays_unpaired = (self.team.pairing_sessions.filter(
            PairingSession.created_at >= start_of_day(datetime.now())).filter(
                PairingSession.created_at < end_of_day(datetime.now())).filter(
                    PairingSession.info == 'UNPAIRED').first())

        todays_unpaired.users.append(self)
        self.reminders.update({Reminder.deleted: False})
        super().revive()