Example #1
0
class Book(db.Model):
    __table_args__ = (db.UniqueConstraint('name', 'lang', 'version'), {
        "mysql_charset": "utf8mb4"
    })
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
    lang = db.Column(db.String(20))
    version = db.Column(db.Integer)
    cover = db.Column(db.Integer)
    desc = db.Column(db.Text)

    def __init__(self, name, lang, version, cover, desc):
        self.name = name
        self.lang = lang
        self.version = version
        self.cover = cover
        self.desc = desc

    def __repr__(self):
        return '<Book %r>' % self.id

    def to_dict(self):
        return {
            "id": self.id,
            "name": self.name,
            "language": self.lang,
            "version": self.version,
            "desc": self.desc,
            "cover": ""
        }
Example #2
0
class User(db.Model):
    __tablename__ = 'user__user'
    id = col(db.Integer, primary_key=True)
    email = col(db.String(100), unique=True)
    password = col(db.Text)
    roles = col(db.Text)
    is_active = col(db.Boolean, default=True)
    db.UniqueConstraint(email)

    @property
    def rolenames(self):
        try:
            return self.roles.split(',')
        except Exception:
            return []

    @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

    def is_valid(self):
        return self.is_active
Example #3
0
class ColorScheme(db.Model):
    __tablename__ = 'colorscheme'

    id = db.Column(db.Integer, primary_key=True)
    hex = db.Column(db.String(255), nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    shift_category_id = db.Column(db.Integer,
                                  db.ForeignKey('shiftcategory.id'),
                                  nullable=False)
    created_at = db.Column(db.DateTime, nullable=False, default=datetime.now)
    updated_at = db.Column(db.DateTime,
                           nullable=False,
                           default=datetime.now,
                           onupdate=datetime.now)

    __table_args__ = (db.UniqueConstraint('user_id',
                                          'shift_category_id',
                                          name='_user_color_scheme_uc'), )

    def __repr__(self):
        user = session.query(User).filter(
            User.id == self.user_id).one_or_none()
        shiftcategory = session.query(ShiftCategory).filter(
            ShiftCategory.id == self.shift_category_id).one_or_none()
        return '{}({})({})'.format(self.hex, user.name, shiftcategory.name)
Example #4
0
class LockedHour(db.Model):
    _tablename_ = 'LockedHour'
    __table_args__ = (db.UniqueConstraint('dayId',
                                          'hour',
                                          name='unique_day_hour'), )
    id = db.Column(db.String, unique=True, primary_key=True)
    dayId = db.Column(db.String)
    ownerId = db.Column(db.String)
    hour = db.Column(db.String)
    shortDescription = db.Column(db.String)
    scheduleType = db.Column(db.Integer)

    def __repr__(self):
        return "id: {}, dayId: {}, ownerId: {}, hour: {}, shortDescription: {}, scheduleType" \
            .format(self.id, self.dayId, self.ownerId, self.hour, self.shortDescription, self.scheduleType)

    def toDict(self):
        return dict(
            zip([
                "id", "dayId", "ownerId", "hour", "shortDescription",
                "scheduleType"
            ], self.toList()))

    def toList(self):
        return [
            self.id, self.dayId, self.ownerId, self.hour,
            self.shortDescription, self.scheduleType
        ]
class THCMeasurement(db.Model):
    """
    THCMeasurement stores the number of answers for red, yellow and green for
    one question asked to one team in one session of Team Health Check.
    A whole session of Team Health Check done with one team would therefore
    produce several of these measurements - one for each question.
    """

    __tablename__ = "m_thc"

    # Primary key
    pk = db.Column(db.Integer, primary_key=True)
    # UUID for measurement
    measurement_id = db.Column(UUID(as_uuid=True),
                               unique=True,
                               nullable=False,
                               default=uuid4)
    # Date of measurement
    measurement_date = db.Column(db.DateTime, nullable=False)
    # Name of the session (to group with other team's results)
    session_name = db.Column(db.String, nullable=False)
    # Team and question ID
    team_id = db.Column(db.Integer, db.ForeignKey("teams.team_id"))
    question_id = db.Column(db.Integer,
                            db.ForeignKey("res_thc_questions.question_id"))
    # Result
    result_red = db.Column(db.Integer)
    result_yellow = db.Column(db.Integer)
    result_green = db.Column(db.Integer)

    # Relationship to team
    team = db.relationship("Team")

    # Relationship to question
    question = db.relationship("THCQuestion")

    # The triple (session, team, question) makes the measurement unique:
    __table_args__ = (db.UniqueConstraint(session_name, team_id,
                                          question_id), )

    def __repr__(self):
        return (
            "<THCMeasurement: measurement_id={}, measurement_date={}, session_name={}, team_id={}, "
            "question_id={}, result_red={}, result_yellow={}, result_green={}>"
            .format(
                self.measurement_id,
                self.measurement_date,
                self.session_name,
                self.team_id,
                self.question_id,
                self.result_red,
                self.result_yellow,
                self.result_green,
            ))
Example #6
0
class Follow(db.Model):
    __tablename__ = 'follow'

    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer,
                        db.ForeignKey('user.id'),
                        nullable=True,
                        default=None,
                        unique=True)
    follow_id = db.Column(db.Integer,
                          db.ForeignKey('user.id'),
                          nullable=True,
                          default=None)
    user = db.relationship("User", foreign_keys=[user_id])
    follow = db.relationship("User", foreign_keys=[follow_id])

    __table_args__ = (db.UniqueConstraint('user_id',
                                          'follow_id',
                                          name='_user_follow_uc'), )
Example #7
0
class StatusCategoryStatusMapping(db.Model):
    __tablename__ = "status_category_status_mappings"

    id = db.Column(db.Integer, primary_key=True, nullable=False)
    activity_id = db.Column(db.Integer,
                            db.ForeignKey("activities.activity_id"),
                            nullable=True)
    status = db.Column(db.String, nullable=False)
    status_category = db.Column(db.Enum(StatusCategory), nullable=False)

    activity = db.relationship("Activity", backref="status_mappings")

    __table_args__ = (
        db.UniqueConstraint("activity_id", "status"),
        db.Index(
            "ix_status_activity_id_null",
            "status",
            unique=True,
            postgresql_where=(activity_id.is_(None)),
        ),
    )
class BurndownMeasurement(db.Model):
    __tablename__ = "m_burndown"

    pk = db.Column(db.Integer, primary_key=True)
    measurement_id = db.Column(UUID(as_uuid=True),
                               unique=True,
                               nullable=False,
                               default=uuid4)
    measurement_date = db.Column(db.DateTime, nullable=False)
    activity_id = db.Column(db.Integer,
                            db.ForeignKey("activities.activity_id"))
    sprint_id = db.Column(db.Integer, db.ForeignKey("sprints.sprint_id"))

    sp_not_done = db.Column(db.Integer)
    sp_added = db.Column(db.Integer, default=0)
    sp_swapped = db.Column(db.Integer, default=0)

    # Relationship to sprint
    sprint = db.relationship("Sprint")
    # Relationship to activity
    activity = db.relationship("Activity")

    # TODO: Relationship to team

    # A burndown-measurement is unique per sprint and measurement datetime
    __table_args__ = (db.UniqueConstraint(measurement_date, sprint_id), )

    def __repr__(self):
        return (
            "<BurndownMeasurement: measurement_id={}, measurement_date={}, sprint_id={}, "
            "sp_not_done={}, sp_added={}, sp_swapped={}".format(
                self.measurement_id,
                self.measurement_date,
                self.sprint_id,
                self.sp_not_done,
                self.sp_added,
                self.sp_swapped,
            ))
Example #9
0
class Office(db.Model):
    __tablename__ = 'office'
    id = db.Column(db.Integer, primary_key=True)
    cp_id = db.Column(db.String(10),
                      db.ForeignKey('congressperson.id'),
                      nullable=False)
    city = db.Column(db.String(100), nullable=False)
    phone = db.Column(db.String(10), nullable=True)
    info_json = db.Column(db.String(2048), nullable=True)
    __table_args__ = (db.UniqueConstraint("cp_id", "city"), )

    @property
    def info(self):
        try:
            self.__info
        except AttributeError:
            self.__info = json.loads(self.info_json)
        return self.__info

    @info.setter
    def info(self, info):
        self.__info = info
        self.info_json = json.dumps(self.__info)
Example #10
0
class Checkout(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    checkout_date = db.Column(db.DateTime, nullable=False, default=func.now())
    return_date = db.Column(db.DateTime)

    book_id = db.Column(db.Integer, db.ForeignKey('book.id'))
    book = db.relationship('Book',
                           backref=db.backref('checkout', lazy='dynamic'))

    room_id = db.Column(db.Integer, db.ForeignKey('room.id'))
    room = db.relationship('Room',
                           backref=db.backref('checkout', lazy='dynamic'))

    person_id = db.Column(db.Integer, db.ForeignKey('person.id'))
    person = db.relationship('Person',
                             backref=db.backref('chekout', lazy='dynamic'))

    __table_args__ = (db.UniqueConstraint('book_id',
                                          'checkout_date',
                                          name='_one_checkout_at_a_time'), )

    def __repr__(self):
        return '<Checkout Book ID=%r to room=%r from %s to %s>' % (
            self.book.id, self.room.id, self.checkout_date, self.return_date)
Example #11
0
class Book(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    isbn13 = db.Column(db.String(13))
    inside_cover_id = db.Column(db.String(30))

    title = db.Column(db.String)
    description = db.Column(db.String)
    thumbnail_url = db.Column(db.String)

    date_added = db.Column(db.DateTime, default=func.now())

    #TODO: status

    __table_args__ = (db.UniqueConstraint('isbn13',
                                          'inside_cover_id',
                                          name='_isbn_coverid_uc'), )

    def __repr__(self):
        return '<Book id=%s, isbn13=%r, inside_cover_id=%r, date_added=%s, title=%r>' % (
            self.id, self.isbn13, self.inside_cover_id, self.date_added,
            self.title)

    def append_google_book_data(self):
        if not self.isbn13:
            raise ValueError('No isbn13')
        google_data = google_books_info(self.isbn13)
        self.title = google_data['title']
        self.description = google_data['description']
        self.thumbnail_url = google_data['imageLinks']['thumbnail']

        # allow chaining
        return self

    @property
    def is_available(self):
        """True if available, ie true if not currently checked out. False otherwise."""
        return self.checkout.filter(Checkout.return_date == None).count() == 0

    def open_checkout(self):
        """Returns the open Checkout for this book, or None if there's no open checkouts."""
        return self.checkout.filter(Checkout.return_date == None).scalar()

    def last_checked_out(self):
        """Date last checked out, or None if never checked out.
        Doesn't tell you anything about whether it's available or not."""
        return db.session.query(func.max(
            Checkout.checkout_date)).filter_by(book_id=self.id).scalar()

    def teaser(self, chars=120):
        """Teaser text for description"""
        # TODO: this should probably be a macro or something, it's not specific to this text field only
        if self.description:
            return self.description[:chars]

    @validates('isbn13')
    def validate_isbn(self, key, isbn_raw):
        """Convert to stripped ISBN13, validating in the process"""
        # raises InvalidIsbn if bad
        return toI13(isbn_raw)

    @validates('thumbnail_url')
    def validate_optional_img_url(self, key, url):
        if url is None:
            return None
        return normalize_url(url)