Example #1
0
class WorkFlowInstanceDetail(db.Model):
    # Fields
    id = db.Column(db.Integer, primary_key=True)

    work_flow_instance_id = db.Column(db.Integer,
                                      db.ForeignKey('work_flow_instance.id'))
    work_flow_instance = db.relationship('WorkFlowInstance', backref='details')

    work_flow_state_id = db.Column(db.Integer,
                                   db.ForeignKey('work_flow_state.id'))
    work_flow_state = db.relationship('WorkFlowState', backref='instances')

    # Build generic relationship to target model object
    ref_model = db.Column(db.String(255))
    ref_id = db.Column(db.Integer)
    ref_object = generic_relationship(ref_model, ref_id)

    is_current_state = db.Column(db.Boolean, default=False)

    active = db.Column(db.Integer, default=True)
    created_at = db.Column(db.DateTime, default=datetime.datetime.now)
    updated_at = db.Column(db.DateTime,
                           default=datetime.datetime.now,
                           onupdate=datetime.datetime.now)

    def __repr__(self):
        return '<WorkFlowInstance id = %s, ref_model = %s, ref_id = %s>' % (
            self.id, self.ref_model, self.ref_id)
Example #2
0
class Favorite(TimestampMixin, db.Model):
    id = primary_key("Favorite")
    org_id = Column(key_type("Organization"), db.ForeignKey("organizations.id"))

    object_type = Column(db.Unicode(255))
    object_id = Column(key_type("Favorite"))
    object = generic_relationship(object_type, object_id)

    user_id = Column(key_type("User"), db.ForeignKey("users.id"))
    user = db.relationship(User, backref="favorites")

    __tablename__ = "favorites"
    __table_args__ = (
        UniqueConstraint("object_type", "object_id", "user_id", name="unique_favorite"),
    )

    @classmethod
    def is_favorite(cls, user, object):
        return cls.query.filter(cls.object == object, cls.user_id == user).count() > 0

    @classmethod
    def are_favorites(cls, user, objects):
        objects = list(objects)
        if not objects:
            return []

        object_type = str(objects[0].__class__.__name__)
        return [
            fav.object_id
            for fav in cls.query.filter(
                cls.object_id.in_([o.id for o in objects]),
                cls.object_type == object_type,
                cls.user_id == user,
            )
        ]
Example #3
0
class Favorite(TimestampMixin, db.Model):
    id = Column(db.Integer, primary_key=True)
    org_id = Column(db.Integer, db.ForeignKey("organizations.id"))

    object_type = Column(db.Unicode(255))
    object_id = Column(db.Integer)
    object = generic_relationship(object_type, object_id)

    user_id = Column(db.Integer, db.ForeignKey("users.id"))
    user = db.relationship(User, backref='favorites')

    __tablename__ = "favorites"
    __table_args__ = (UniqueConstraint("object_type",
                                       "object_id",
                                       "user_id",
                                       name="unique_favorite"), )

    @classmethod
    def is_favorite(cls, user, object):
        return cls.query.filter(cls.object == object, cls.user_id
                                == user).count() > 0

    @classmethod
    def are_favorites(cls, user, objects):
        objects = list(objects)
        if not objects:
            return []

        object_type = text_type(objects[0].__class__.__name__)
        return map(
            lambda fav: fav.object_id,
            cls.query.filter(cls.object_id.in_(map(lambda o: o.id, objects)),
                             cls.object_type == object_type,
                             cls.user_id == user))
class User(Base):
    __tablename__ = 'auth_user'

    print_filter = ('password', 'object_type', 'object_id')
    to_json_filter = ('password', 'object_type', 'object_id')

    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(30), unique=True)
    firstname = db.Column(db.String(30))
    lastname = db.Column(db.String(30))
    password = db.Column(db.String(120))
    phone_number = db.Column(db.String(10), nullable=True)

    # This is used to discriminate between the linked tables.
    object_type = db.Column(db.Unicode(255))
    # This is used to point to the primary key of the linked row.
    object_id = db.Column(db.Integer)
    organization = generic_relationship(object_type, object_id)

    def __init__(self, email=None, password=None, **kwargs):
        super(User, self).__init__(email=email, password=password, **kwargs)
        if email:
            self.email = email.lower()
        if password:
            self.set_password(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 get_id(self):
        """Return the email address to satisfy Flask-Login's requirements."""
        return self.email
Example #5
0
class Organization(Base):
    __tablename__ = "orga_organization"

    to_json_filter = (
        "object_type",
        "object_id",
        "availabilities",
        "address_id",
    )

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(30), nullable=False)
    type = db.Column(ChoiceType(OrganizationType, impl=db.Integer()),
                     nullable=False,
                     default=OrganizationType.finess_et)
    reg_code = db.Column(db.String, db.ForeignKey("orga_region.code"))

    address_id = db.Column(db.Integer, db.ForeignKey("orga_address.id"))
    address = db.relationship(Address, back_populates="organization")

    # This is used to discriminate between the linked tables.
    object_type = db.Column(db.Unicode(255))
    # This is used to point to the primary key of the linked row.
    object_id = db.Column(db.Integer)
    data = generic_relationship(object_type, object_id)
        class Event(self.Base):
            __tablename__ = 'event'
            id = sa.Column(sa.Integer, primary_key=True)

            object_type = sa.Column(sa.Unicode(255))
            object_id = sa.Column(sa.Integer, nullable=False)

            object = generic_relationship(object_type, object_id)
Example #7
0
class Log(TorModel):
    __tablename__ = 'logs'

    ### others ###
    ### END_OTHERS ###

    # acl[*] # default
    object_id = Column(UUIDType(binary=False))
    # acl[*] # default
    object_type = Column(String(50))

    # acl[*] # default
    object = generic_relationship(object_type, object_id)

    # acl[*] # default
    message_type = Column(MESSAGE_TYPE_ENUM, default=Constants.MESSAGE_TYPE_INFO, nullable=False)
    # acl[*] # default
    message = Column(String)

    def delete_related_obj(self):
        pass

    # auto generate
    @classmethod
    def acl(cls):
        return {
            'object': ['admin', 'client'],
            'created_at': ['admin', 'client'],
            'object_type': ['admin', 'client'],
            'updated_at': ['admin', 'client'],
            'object_id': ['admin', 'client'],
            'message': ['admin', 'client'],
            'message_type': ['admin', 'client'],
            'id': ['admin', 'client'],
        }

    @classmethod
    def user_acl(cls):
        return {
            'admin': ['object_id', 'object_type', 'object', 'message_type', 'message', 'id', 'created_at', 'updated_at'],
            'client': ['object_id', 'object_type', 'object', 'message_type', 'message', 'id', 'created_at', 'updated_at'],
        }

    @classmethod
    def dft_view(cls):
        return {
            'object': 'object',
            'created_at': 'created_at',
            'object_type': 'object_type',
            'updated_at': 'updated_at',
            'object_id': 'object_id',
            'message': 'message',
            'message_type': 'message_type',
            'id': 'id',
        }
    class Event(Base):
        __tablename__ = 'event'
        id = sa.Column(sa.Integer, primary_key=True)

        transaction_id = sa.Column(sa.Integer)

        object_type = sa.Column(sa.Unicode(255))
        object_id = sa.Column(sa.Integer, nullable=False)

        object = generic_relationship(object_type, object_id)

        @hybrid_property
        def object_version_type(self):
            return self.object_type + 'History'

        @object_version_type.expression
        def object_version_type(cls):
            return sa.func.concat(cls.object_type, 'History')

        object_version = generic_relationship(object_version_type,
                                              (object_id, transaction_id))
Example #9
0
class Documents(db.Model):
    __tablename__ = 'documents'
    __table_args__ = {'extend_existing': True}

    doc_id = db.Column(db.Integer, primary_key=True)
    marksheet_10th = db.Column(db.String)
    marksheet_12th = db.Column(db.String)
    marksheet_bsc = db.Column(db.String)
    marksheet_msc = db.Column(db.String)
    object_type = db.Column(db.Unicode(255))
    object_id = db.Column(db.Integer)
    object = generic_relationship(object_type, object_id)
Example #10
0
class AuditEvent(BaseModel):
    who_id = db.Column(UUID(), db.ForeignKey('user.id', ondelete='CASCADE'))
    who = relationship("User")

    section = db.Column(db.String(255))
    action = db.Column(db.String(255))

    object_type = db.Column(db.Unicode(255))
    # This is used to point to the primary key of the linked row.
    object_id = db.Column(UUID)

    # A pointer to a row in the database somewhere.
    object = generic_relationship(object_type, object_id)
Example #11
0
class Notebook(BaseModel):
    __tablename__ = 'notebooks'
    __repr_attrs__ = ['title']
    __repr_max_length__ = 45

    # Custom relationships that Automap can't handle
    creator_id = sa.Column(sa.Integer, sa.ForeignKey('users.id'))
    creator = sa.orm.relationship('User', foreign_keys=[creator_id])
    updater_id = sa.Column(sa.Integer, sa.ForeignKey('users.id'))
    updater = sa.orm.relationship('User', foreign_keys=[updater_id])
    owner_id = sa.Column(sa.Integer)
    owner_type = sa.Column(sa.String)
    owner = sa_utils.generic_relationship(owner_type, owner_id)
Example #12
0
class NotificationContent(db.Model, Timestamp):

    __tablename__ = 'notification_content'

    id = db.Column(db.Integer, primary_key=True)

    type = db.Column(db.String, nullable=False)

    target_type = db.Column(db.Unicode(255))
    target_id = db.Column(db.Integer)
    target = generic_relationship(target_type, target_id)

    # For storing state of the action
    target_action = db.Column(db.String)
Example #13
0
class UserMapping(db.Model):

    __tablename__ = 'user_mappings'
    id = db.Column(db.Integer, primary_key=True)
    password = db.Column(db.String)
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
    user = db.relationship('User', foreign_keys=[user_id])
    entity_type = db.Column(db.String(255))
    entity_id = db.Column(db.Integer)
    entity = generic_relationship(entity_type, entity_id)
    __table_args__ = (db.UniqueConstraint(user_id, entity_type),)

    def __str__(self):
        return 'UserID: {}, UserType: {}'.format(
            self.parent_id, self.object_type)
Example #14
0
class Vote(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    author_id = db.Column(db.Integer, db.ForeignKey("user.id"))
    vote = db.Column(db.Boolean)

    # This is used to discriminate between the linked tables.
    target_type = db.Column(db.Unicode(255))

    # This is used to point to the primary key of the linked row.
    target_id = db.Column(db.Integer, nullable=False)

    target = generic_relationship(target_type, target_id)

    author = db.relationship("User")

    def __init__(self, author="", vote="", target=""):
        self.author = author
        self.vote = vote
        self.target = target
Example #15
0
class Organisation(db.Model, BaseModel):
    __tablename__ = 'orga_organization'

    id = db.Column(db.Integer, primary_key=True)
    vid = db.Column(db.Integer, unique=True)
    name = db.Column(db.String(30))
    role = db.Column(db.Integer, db.ForeignKey("orga_reference.id"))
    role_obj = db.relationship(Reference, foreign_keys=[role])
    status = db.Column(db.Integer, db.ForeignKey("orga_reference.id"))
    status_obj = db.relationship(Reference, foreign_keys=[status])
    availability = db.Column(db.Integer, db.ForeignKey("orga_reference.id"))
    availability_obj = db.relationship(Reference, foreign_keys=[availability])

    address_id = db.Column(db.Integer, db.ForeignKey('orga_address.id'))
    address = db.relationship(Address, back_populates="organization")

   # This is used to discriminate between the linked tables.
    object_type = db.Column(db.Unicode(255))
    # This is used to point to the primary key of the linked row.
    object_id = db.Column(db.Integer)

    data = generic_relationship(object_type, object_id)

    users = db.relationship("User", back_populates="organization")

    @property
    def json(self):
        return {
            "id": self.id,
            "vid": self.vid,
            "role":  self.role_obj.code,
            'status': self.status_obj.code,
            'availability': self.availability_obj.code,
            "address": self.address.json,
            "data": self.data.json
        }
Example #16
0
        class Activity(manager.declarative_base, ActivityBase):
            __tablename__ = 'activity'
            manager = self

            transaction_id = sa.Column(sa.BigInteger,
                                       index=True,
                                       nullable=False)

            data = sa.Column(JSONType)

            object_type = sa.Column(sa.String(255))

            object_id = sa.Column(postgresql.UUID(as_uuid=True))

            object_tx_id = sa.Column(sa.BigInteger)

            target_type = sa.Column(sa.String(255))

            target_id = sa.Column(postgresql.UUID(as_uuid=True))

            target_tx_id = sa.Column(sa.BigInteger)

            def _calculate_tx_id(self, obj):
                session = sa.orm.object_session(self)
                if obj:
                    object_version = version_obj(session, obj)
                    if object_version:
                        return object_version.transaction_id

                    version_cls = version_class(obj.__class__)
                    return session.query(
                        sa.func.max(version_cls.transaction_id)).filter(
                            version_cls.id == obj.id).scalar()

            def calculate_object_tx_id(self):
                self.object_tx_id = self._calculate_tx_id(self.object)

            def calculate_target_tx_id(self):
                self.target_tx_id = self._calculate_tx_id(self.target)

            object = generic_relationship(object_type, object_id)

            @hybrid_property
            def object_version_type(self):
                return self.object_type + 'Version'

            @object_version_type.expression
            def object_version_type(cls):
                return sa.func.concat(cls.object_type, 'Version')

            object_version = generic_relationship(object_version_type,
                                                  (object_id, object_tx_id))

            target = generic_relationship(target_type, target_id)

            @hybrid_property
            def target_version_type(self):
                return self.target_type + 'Version'

            @target_version_type.expression
            def target_version_type(cls):
                return sa.func.concat(cls.target_type, 'Version')

            target_version = generic_relationship(target_version_type,
                                                  (target_id, target_tx_id))
Example #17
0
class AuditEvent(db.Model):
    __tablename__ = 'audit_events'

    id = db.Column(db.Integer, primary_key=True)
    type = db.Column(db.String, index=True, nullable=False)
    created_at = db.Column(db.DateTime, index=True, nullable=False, default=datetime.utcnow)
    user = db.Column(db.String)
    data = db.Column(JSON)

    object_type = db.Column(db.String)
    object_id = db.Column(db.BigInteger)

    object = generic_relationship(
        object_type, object_id
    )

    acknowledged = db.Column(
        db.Boolean,
        index=True,
        unique=False,
        nullable=False)

    acknowledged_by = db.Column(db.String)
    acknowledged_at = db.Column(
        db.DateTime,
        nullable=True)

    def __init__(self, audit_type, user, data, db_object):
        self.type = audit_type.value
        self.data = data
        self.object = db_object
        self.user = user
        self.acknowledged = False

    class query_class(BaseQuery):
        def last_for_object(self, object, types=None):
            events = self.filter(AuditEvent.object == object)
            if types is not None:
                events = events.filter(AuditEvent.type.in_(types))

            return events.order_by(desc(AuditEvent.created_at)).first()

    def serialize(self, include_user=False):
        """
        :return: dictionary representation of an audit event
        """

        data = {
            'id': self.id,
            'type': self.type,
            'acknowledged': self.acknowledged,
            'user': self.user,
            'data': self.data,
            'createdAt': self.created_at.strftime(DATETIME_FORMAT),
            'links': filter_null_value_fields({
                "self": url_for(".list_audits"),
                "oldArchivedService": ArchivedService.link_object(
                    self.data.get('oldArchivedServiceId')
                ),
                "newArchivedService": ArchivedService.link_object(
                    self.data.get('newArchivedServiceId')
                )
            })
        }

        if self.acknowledged:
            data.update({
                'acknowledgedAt':
                    self.acknowledged_at.strftime(DATETIME_FORMAT),
                'acknowledgedBy':
                    self.acknowledged_by,
            })

        if include_user:
            user = User.query.filter(
                User.email_address == self.user
            ).first()

            if user:
                data['userName'] = user.name

        return data
Example #18
0
class FilterSet(Model, AuditMixinNullable):
    __tablename__ = "filter_sets"
    id = Column(Integer, primary_key=True)
    name = Column(String(500), nullable=False, unique=True)
    description = Column(Text, nullable=True)
    json_metadata = Column(Text, nullable=False)
    dashboard_id = Column(Integer, ForeignKey("dashboards.id"))
    dashboard = relationship("Dashboard", back_populates="_filter_sets")
    owner_id = Column(Integer, nullable=False)
    owner_type = Column(String(255), nullable=False)
    owner_object = generic_relationship(owner_type, owner_id)

    def __repr__(self) -> str:
        return f"FilterSet<{self.name or self.id}>"

    @property
    def url(self) -> str:
        return f"/api/filtersets/{self.id}/"

    @property
    def sqla_metadata(self) -> None:
        # pylint: disable=no-member
        meta = MetaData(bind=self.get_sqla_engine())
        meta.reflect()

    @property
    def changed_by_name(self) -> str:
        if not self.changed_by:
            return ""
        return str(self.changed_by)

    @property
    def changed_by_url(self) -> str:
        if not self.changed_by:
            return ""
        return f"/superset/profile/{self.changed_by.username}"

    def to_dict(self) -> Dict[str, Any]:
        return {
            "id": self.id,
            "name": self.name,
            "description": self.description,
            "params": self.params,
            "dashboard_id": self.dashboard_id,
            "owner_type": self.owner_type,
            "owner_id": self.owner_id,
        }

    @classmethod
    def get(cls, _id: int) -> FilterSet:
        session = db.session()
        qry = session.query(FilterSet).filter(_id)
        return qry.one_or_none()

    @classmethod
    def get_by_name(cls, name: str) -> FilterSet:
        session = db.session()
        qry = session.query(FilterSet).filter(FilterSet.name == name)
        return qry.one_or_none()

    @classmethod
    def get_by_dashboard_id(cls, dashboard_id: int) -> FilterSet:
        session = db.session()
        qry = session.query(FilterSet).filter(
            FilterSet.dashboard_id == dashboard_id)
        return qry.all()

    @property
    def params(self) -> Dict[str, Any]:
        if self.json_metadata:
            return json.loads(self.json_metadata)
        return {}
Example #19
0
class GroupAdmin(db.Model):
    """Represent an administrator of a group."""

    __tablename__ = 'groupADMIN'

    __table_args__ = (db.UniqueConstraint('group_id', 'admin_type',
                                          'admin_id'), db.Model.__table_args__)

    id = db.Column(db.Integer(15, unsigned=True),
                   nullable=False,
                   primary_key=True,
                   autoincrement=True)
    """GroupAdmin identifier."""

    group_id = db.Column(db.Integer(15, unsigned=True),
                         db.ForeignKey(Group.id),
                         nullable=False,
                         primary_key=True)
    """Group for membership."""

    admin_type = db.Column(db.Unicode(255))
    """Generic relationship to an object."""

    admin_id = db.Column(db.Integer)
    """Generic relationship to an object."""

    #
    # Relations
    #

    group = db.relationship(Group,
                            backref=db.backref('admins',
                                               cascade="all, delete-orphan"))
    """Group relationship."""

    admin = generic_relationship(admin_type, admin_id)
    """Generic relationship to administrator of group."""
    @classmethod
    def create(cls, group, admin):
        """Create a new group admin.

        :param group: Group object.
        :param admin: Admin object.
        :returns: Newly created GroupAdmin object.
        :raises: IntegrityError
        """
        try:
            obj = cls(
                group=group,
                admin=admin,
            )
            db.session.add(obj)

            db.session.commit()
            return obj
        except IntegrityError:
            db.session.rollback()
            raise

    @classmethod
    def get(cls, group, admin):
        """Get specific GroupAdmin object."""
        try:
            ga = cls.query.filter_by(
                group=group,
                admin_id=admin.get_id(),
                admin_type=resolve_admin_type(admin)).one()
            return ga
        except Exception:
            return None

    @classmethod
    def delete(cls, group, admin):
        """Delete admin from group.

        :param group: Group object.
        :param admin: Admin object.
        """
        try:
            obj = cls.query.filter(cls.admin == admin,
                                   cls.group == group).one()
            db.session.delete(obj)
            db.session.commit()
        except Exception:
            db.session.rollback()
            raise

    @classmethod
    def query_by_group(cls, group):
        """Get all admins for a specific group."""
        return cls.query.filter_by(group=group)

    @classmethod
    def query_by_admin(cls, admin):
        """Get all groups for for a specific admin."""
        return cls.query.filter_by(admin_type=resolve_admin_type(admin),
                                   admin_id=admin.get_id())

    @classmethod
    def query_admins_by_group_ids(cls, groups_ids=None):
        """Get count of admins per group."""
        assert groups_ids is None or isinstance(groups_ids, list)

        query = db.session.query(Group.id, func.count(
            GroupAdmin.id)).join(GroupAdmin).group_by(Group.id)

        if groups_ids:
            query = query.filter(Group.id.in_(groups_ids))

        return query
Example #20
0
 def object(cls):
     return generic_relationship('object_type', 'object_id')
 def object(cls):
     return generic_relationship('object_type', 'object_id')
Example #22
0
class Message(db.Model, BaseModel):

    __tablename__ = "messages"

    title = db.Column(
        db.String(255),
        nullable=False,
        index=True
    )

    content = db.Column(
        db.Text(),
        nullable=False,
        index=True
    )

    channel = db.Column(
        db.String(255)
    )

    time_sent = db.Column(
        db.TIMESTAMP
    )

    message_author_id = db.Column(
        db.String,
        db.ForeignKey("users.id")
    )
    author = db.relationship(
        "User",
        backref="createdMessages",
        uselist=False,
        foreign_keys=[message_author_id]
    )

    company_id = db.Column(
        db.String,
        db.ForeignKey("companies.id")
    )

    contact_id = db.Column(
        db.String,
        db.ForeignKey("contacts.id")
    )

    user_id = db.Column(
        db.String,
        db.ForeignKey("users.id")
    )

    deal_id = db.Column(
        db.String,
        db.ForeignKey("deals.id")
    )

    task_id = db.Column(
        db.String,
        db.ForeignKey("tasks.id")
    )

    organization_id = db.Column(
        db.String,
        db.ForeignKey("organizations.id")
    )

    project_id = db.Column(
        db.String,
        db.ForeignKey("projects.id")
    )

    sprint_id = db.Column(
        db.String,
        db.ForeignKey("sprints.id")
    )

    event_id = db.Column(
        db.String,
        db.ForeignKey("events.id")
    )

    links = db.relationship(
        "Link",
        backref="message"
    )

    state = db.Column(
        db.Enum(MessageState),
        default=MessageState.TOSEND,
        index=True
    )

    parent_id = db.Column(
        db.String(5),
        db.ForeignKey('messages.id')
    )

    author_original_type = db.Column(
        db.Unicode(255)
    )

    author_original_id = db.Column(
        db.Integer,
    )

    author_original = generic_relationship(
        author_original_type,
        author_original_id
    )

    author_last_id = db.Column(
        db.Integer,
    )

    author_last = generic_relationship(
        author_original_type,
        author_original_id
    )

    @property
    def parent(self):
        if self.parent_id:
            return self.__class__.query.filter_by(id=self.parent_id).first()

    replies = db.relationship(
        "Message",
        uselist=True,

    )

    # ',' separated string of emails
    # Is used to force sending emails to certain destination
    # If not set, `notification_emails` is used instead to calculate
    # ALl email addresses
    forced_destinations = db.Column(
        db.String,
    )

    @property
    def notification_emails(self):
        """
        :return: list of all emails to send notifications to
        :rtype: list
        """
        if self.forced_destinations:
            return [d.strip() for d in self.forced_destinations.split(',') if d]

        obj = None

        if self.user:
            obj = self.user
        elif self.contact:
            obj = self.contact
        elif self.company:
            obj = self.company
        elif self.organization:
            obj = self.organization
        elif self.deal: # contact emails or company emails
            obj = self.deal
        elif self.task: # assignee + one of these if found (contact, users, deal, company, organization, event, sprint)
            obj = self.task
        elif self.project: # promoter + guardian + contacts + one of (tasks, sprints)
            obj = self.project
        elif self.event: # All contacts emails + All tasks emails
            obj = self.event
        elif self.sprint: # contacts + owner + tasks
            obj = self.sprint

        if not obj:
            return []

        return list(set(obj.notification_emails))

    def __str__(self):
        return self.title
Example #23
0
 def transaction_object(self):
     return generic_relationship(
         "content_object_type", "content_object_id")