示例#1
0
    def get_entity(self):
        """returns one Structure instance data as JSON
        """
        response = super(StructureViews, self).get_entity()

        from stalker import Structure
        from stalker.db.session import DBSession
        r = DBSession.query(Structure.custom_template)\
            .filter(Structure.id == self.entity_id)\
            .first()

        # get template counts
        from stalker.models.structure import Structure_FilenameTemplates
        template_count = \
            DBSession.query(
                Structure_FilenameTemplates.c.filenametemplate_id
            ).filter(
                Structure_FilenameTemplates.c.structure_id == self.entity_id
            ).count()

        from stalker_pyramid import entity_type_to_url
        data = {
            'custom_template': r[0],
            'templates': {
                '$ref': '%s/%s/templates' %
                        (entity_type_to_url['Structure'], self.entity_id),
                'length': template_count
            }
        }
        return self.update_response_data(response, data)
示例#2
0
    def get_entity(self):
        """return one StatusList instance as json
        """
        sql = """select
            "StatusLists".target_entity_type
        from "StatusLists"
        where "StatusLists".id = :id
        """
        from sqlalchemy import text
        from stalker.db.session import DBSession
        conn = DBSession.connection()
        result = conn.execute(text(sql), id=self.entity_id)
        r = result.fetchone()

        # get statuses count
        from stalker.models.status import StatusList_Statuses
        statuses_count = DBSession.query(StatusList_Statuses.c.status_id)\
            .filter(StatusList_Statuses.c.status_list_id == self.entity_id)\
            .count()

        from stalker_pyramid import entity_type_to_url
        data = {
            'statuses': {
                '$ref':
                '%s/%s/statuses' %
                (entity_type_to_url['StatusList'], self.entity_id),
                'length':
                statuses_count
            },
            'target_entity_type': r[0]
        }

        # update with super data
        response = super(StatusListViews, self).get_entity()
        return self.update_response_data(response, data)
示例#3
0
    def get_filtered_entities(self):
        """returns the filtered entities according to the filter selection
        """
        project_id = self.get_project_id()
        entity_type = self.filter_by_entity_type_combo_box.currentText()
        sequence_id = self.get_sequence_id()
        task_type_id = self.get_task_type_id()
        resource_id = self.get_resource_id()

        from stalker import db, Task
        from stalker.db.session import DBSession
        query = DBSession.query(Task.id, Task.name)

        if project_id != -1:
            query = query.filter(Task.project_id == project_id)

        if task_type_id != -1:
            query = query.filter(Task.type_id == task_type_id)

        if entity_type != self.generic_selection_text:
            query = query.filter(Task.entity_type == entity_type)

            # if entity_type == 'Shot':
            #     from stalker.models.shot import Shot_Sequences
            #     query = query.filter(Shot_Sequences)

        # query the child tasks
        query = query.order_by(Task.name)

        return query.all()
示例#4
0
    def get_filtered_entities(self):
        """returns the filtered entities according to the filter selection
        """
        project_id = self.get_project_id()
        entity_type = self.filter_by_entity_type_combo_box.currentText()
        sequence_id = self.get_sequence_id()
        task_type_id = self.get_task_type_id()
        resource_id = self.get_resource_id()

        from stalker import db, Task
        from stalker.db.session import DBSession
        query = DBSession.query(Task.id, Task.name)

        if project_id != -1:
            query = query.filter(Task.project_id == project_id)

        if task_type_id != -1:
            query = query.filter(Task.type_id == task_type_id)

        if entity_type != self.generic_selection_text:
            query = query.filter(Task.entity_type == entity_type)

            # if entity_type == 'Shot':
            #     from stalker.models.shot import Shot_Sequences
            #     query = query.filter(Shot_Sequences)

        # query the child tasks
        query = query.order_by(Task.name)

        return query.all()
示例#5
0
    def _fill_task_type_widget(self):
        """fills the task type widget
        """
        if self.task is None:
            return

        # get the types
        from stalker import Type
        from stalker.db.session import DBSession
        all_types = \
            DBSession.query(Type.id, Type.name)\
                .filter(Type.target_entity_type == self.task.entity_type)\
                .all()

        self.type_field_is_updating = True
        self.type_field.clear()
        self.type_field.addItem('-- No Type --', -1)
        for type_data in all_types:
            self.type_field.addItem(type_data.name, type_data.id)

        # and select the corresponding type
        if self.task.type:
            index = self.type_field.findData(self.task.type.id)
            if index != -1:
                self.type_field.setCurrentIndex(index)
        self.type_field_is_updating = False
示例#6
0
    def list_all(self):
        """lists other representations
        """
        base_take_name = self.get_base_take_name(self.version)

        # find any version that starts with the base_repr_name
        # under the same task
        from stalker import Version
        from stalker.db.session import DBSession
        from sqlalchemy import distinct
        take_names = map(
            lambda x: x[0],
            DBSession.query(distinct(Version.take_name))
            .filter(Version.task == self.version.task)
            .all()
        )
        take_names.sort()

        repr_names = []
        for take_name in take_names:
            if take_name.startswith(base_take_name):
                if take_name != base_take_name:
                    repr_names.append(
                        take_name[len(base_take_name) +
                                  len(self.repr_separator):]
                    )
                else:
                    repr_names.append(self.base_repr_name)
        return repr_names
示例#7
0
    def project_changed(self, project_name):
        """runs when the project in the combo box changed
        """
        try:
            project_id = self.projects_combo_box.currentData()
        except AttributeError:
            index = self.projects_combo_box.currentIndex()
            project_id = self.projects_combo_box.itemData(index)

        # refresh the items on the double list widget
        self.users_double_list_widget.clear()

        # get users not in the project
        from stalker.db.session import DBSession
        from stalker import User
        from stalker.models.project import ProjectUser

        project_users = DBSession.query(User.id, User.name).join(ProjectUser)\
            .filter(ProjectUser.project_id == project_id)\
            .filter(User.id == ProjectUser.user_id)\
            .all()

        project_user_ids = [u.id for u in project_users]

        if project_user_ids:
            users_not_in_project = [
                u.name
                for u in DBSession.query(User.name)
                    .filter(~User.id.in_(project_user_ids)).all()
            ]
        else:
            users_not_in_project = [
                u.name
                for u in DBSession.query(User.name).all()
            ]

        self.users_double_list_widget.add_primary_items(
            users_not_in_project
        )

        users_in_project = \
            [u.name for u in project_users]

        self.users_double_list_widget.add_secondary_items(
            users_in_project
        )
示例#8
0
    def _set_defaults(self):
        """setup the default values
        """
        # set size policies
        # self.name_lineEdit

        self.type_comboBox.setSizePolicy(QtWidgets.QSizePolicy.Expanding,
                                         QtWidgets.QSizePolicy.Fixed)

        self.status_comboBox.setSizePolicy(QtWidgets.QSizePolicy.Expanding,
                                           QtWidgets.QSizePolicy.Fixed)

        self.client_comboBox.setSizePolicy(QtWidgets.QSizePolicy.Expanding,
                                           QtWidgets.QSizePolicy.Fixed)

        self.agency_comboBox.setSizePolicy(QtWidgets.QSizePolicy.Expanding,
                                           QtWidgets.QSizePolicy.Fixed)

        self.production_company_comboBox.setSizePolicy(
            QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)

        # invalidate the name and code fields by default
        self.name_lineEdit.set_invalid('Enter a name')
        self.code_lineEdit.set_invalid('Enter a code')

        # update type field
        from stalker import Type
        from stalker.db.session import DBSession
        project_types = \
            DBSession.query(Type.id, Type.name)\
                .filter(Type.target_entity_type == 'Project')\
                .order_by(Type.name)\
                .all()

        self.type_comboBox.clear()
        self.type_comboBox.addItem('', -1)
        for type_id, type_name in project_types:
            self.type_comboBox.addItem(type_name, type_id)

        self.image_format.fill_combo_box()
        self.fill_repository_combo_box()
        self.fill_structure_combo_box()

        # fill status field
        sql = """select
        "SimpleEntities".id,
        "SimpleEntities".name
    from "Statuses"
    join "SimpleEntities" on "Statuses".id = "SimpleEntities".id
    join "StatusList_Statuses" on "Statuses".id = "StatusList_Statuses".status_id
    join "StatusLists" on "StatusLists".id = "StatusList_Statuses".status_list_id
    where "StatusLists".target_entity_type = 'Project'"""

        all_project_statuses = \
            DBSession.connection().execute(sql).fetchall()

        for st_id, st_name in all_project_statuses:
            self.status_comboBox.addItem(st_name, st_id)
示例#9
0
 def get_current_resource_id(self):
     """returns the current resource
     """
     resource_name = self.resource_combo_box.currentText()
     from stalker import User
     from stalker.db.session import DBSession
     return DBSession.query(User.id)\
         .filter(User.name == resource_name)\
         .first()
示例#10
0
    def get_entity(self):
        """returns one Entity instance
        """
        sql = """
        select
          "Entities".id
        from "Entities"
        where "Entities".id = :id
        """
        from stalker.db.session import DBSession
        conn = DBSession.connection()
        from sqlalchemy import text
        result = conn.execute(text(sql), id=self.entity_id)
        r = result.fetchone()

        # get notes count
        from stalker.models.entity import Entity_Notes
        notes_count = DBSession.query(Entity_Notes.c.entity_id)\
            .filter(Entity_Notes.c.entity_id == self.entity_id)\
            .count()

        # get tags count
        from stalker.models.entity import Entity_Tags
        tags_count = DBSession.query(Entity_Tags.c.entity_id)\
            .filter(Entity_Tags.c.entity_id == self.entity_id)\
            .count()

        from stalker_pyramid import entity_type_to_url
        data = {
            'id': r[0],
            'notes': {
                '$ref': '%s/%s/notes' % (entity_type_to_url['Entity'], r[0]),
                'length': notes_count
            },
            'tags': {
                '$ref': '%s/%s/tags' % (entity_type_to_url['Entity'], r[0]),
                'length': tags_count
            },
        }

        # update with super data
        response = super(EntityViews, self).get_entity()
        return self.update_response_data(response, data)
示例#11
0
 def user_names_lut(self):
     """fills the _user_names_lut
     """
     if not self._user_names_lut:
         from anima.utils import do_db_setup
         do_db_setup()
         from stalker import User
         from stalker.db.session import DBSession
         map(lambda x: self._user_names_lut.__setitem__(x[0], x[1]),
             DBSession.query(User.id, User.name).all())
     return self._user_names_lut
示例#12
0
    def get_entity(self):
        """returns the DAGMixin portion of this mixed in class
        """
        from stalker.db.session import DBSession

        parent_id = DBSession.query(self.som_class.parent_id,)\
            .filter(self.som_class.id == self.entity_id).first()

        parent_data = []
        if parent_id:
            from stalker import SimpleEntity
            parent_data = DBSession.query(
                SimpleEntity.id, SimpleEntity.name,
                SimpleEntity.entity_type).filter(
                    SimpleEntity.id == parent_id[0]).first()

        children_count = DBSession.query(
            self.som_class.children
        ).filter(self.som_class.id == self.entity_id)\
        .count()

        from stalker_pyramid import entity_type_to_url

        data = {
            'parent': {
                'id':
                parent_data[0],
                'name':
                parent_data[1],
                'entity_type':
                parent_data[2],
                '$ref':
                '%s/%s' % (entity_type_to_url[parent_data[2]], parent_data[0])
            } if parent_data else None,
            'children': {
                '%ref': '%s/%s/children',
                'length': children_count
            }
        }

        return data
示例#13
0
    def user_names_lut(self):
        """fills the _user_names_lut
        """
        if not self._user_names_lut:
            from anima.utils import do_db_setup
            do_db_setup()
            from stalker import User
            from stalker.db.session import DBSession

            for result in DBSession.query(User.id, User.name).all():
                self._user_names_lut.__setitem__(result.id, result.name)
        return self._user_names_lut
示例#14
0
    def project_changed(self, project_name):
        """runs when the project in the combo box changed
        """
        try:
            project_id = self.projects_combo_box.currentData()
        except AttributeError:
            index = self.projects_combo_box.currentIndex()
            project_id = self.projects_combo_box.itemData(index)

        # refresh the items on the double list widget
        self.users_double_list_widget.clear()

        # get users not in the project
        from stalker.db.session import DBSession
        from stalker import User
        from stalker.models.project import ProjectUser

        project_users = DBSession.query(User.id, User.name).join(ProjectUser)\
            .filter(ProjectUser.project_id == project_id)\
            .filter(User.id == ProjectUser.user_id)\
            .all()

        project_user_ids = [u.id for u in project_users]

        if project_user_ids:
            users_not_in_project = [
                u.name for u in DBSession.query(User.name).filter(
                    ~User.id.in_(project_user_ids)).all()
            ]
        else:
            users_not_in_project = [
                u.name for u in DBSession.query(User.name).all()
            ]

        self.users_double_list_widget.add_primary_items(users_not_in_project)

        users_in_project = \
            [u.name for u in project_users]

        self.users_double_list_widget.add_secondary_items(users_in_project)
示例#15
0
def update_defaults_with_studio():
    """updates the default values from Studio instance if a database and a
    Studio instance is present
    """
    from stalker.db.session import DBSession
    if DBSession:
        with DBSession.no_autoflush:
            from stalker.models.studio import Studio
            # studio = Studio.query.first()
            studio = DBSession.query(Studio).first()
            if studio:
                logger.debug('found a studio, updating defaults')
                studio.update_defaults()
示例#16
0
文件: config.py 项目: eoyilmaz/anima
 def user_names_lut(self):
     """fills the _user_names_lut
     """
     if not self._user_names_lut:
         from anima.utils import do_db_setup
         do_db_setup()
         from stalker import User
         from stalker.db.session import DBSession
         map(
             lambda x: self._user_names_lut.__setitem__(x[0], x[1]),
             DBSession.query(User.id, User.name).all()
         )
     return self._user_names_lut
示例#17
0
    def get_entity(self):
        """returns one Task instance data
        """

        response = super(TaskViews, self).get_entity()
        # add the others

        # StatusMixinViews, DateRangeMixinViews,
        # ReferenceMixinViews, ScheduleMixinViews, DAGMixinViews
        response = self.update_response_data(response,
                                             StatusMixinViews.get_entity(self))
        response = self.update_response_data(
            response, DateRangeMixinViews.get_entity(self))
        response = self.update_response_data(
            response, ReferenceMixinViews.get_entity(self))
        response = self.update_response_data(
            response, ScheduleMixinViews.get_entity(self))
        response = self.update_response_data(response,
                                             DAGMixinViews.get_entity(self))

        from stalker import Task
        from stalker.db.session import DBSession

        r = DBSession.query(
            Task.allocation_strategy,
            Task.bid_timing,
            Task.bid_unit,
            Task.is_milestone,
            Task.persistent_allocation,
            Task.priority,
            Task.schedule_constraint,
            Task.schedule_model,
            Task.schedule_timing,
            Task.schedule_unit,
        ).filter(Task.id == self.entity_id).first()

        data = {
            'allocation_strategy': r[0],
            'bid_timing': r[1],
            'bid_unit': r[2],
            'is_milestone': r[3],
            'persistent_allocation': r[4],
            'priority': r[5],
            'schedule_constraint': r[6],
            'schedule_model': r[7],
            'schedule_timing': r[8],
            'schedule_unit': r[9]
        }

        return self.update_response_data(response, data)
示例#18
0
文件: task.py 项目: eoyilmaz/anima
    def fill(self):
        """fills the tree view with data
        """
        logger.debug('start filling tasks_treeView')
        logger.debug('creating a new model')
        if not self.project:
            from sqlalchemy import alias
            from stalker import Task, Project
            from stalker.db.session import DBSession
            # projects = Project.query.order_by(Project.name).all()
            inner_tasks = alias(Task.__table__)
            subquery = DBSession.query(inner_tasks.c.id).filter(
                inner_tasks.c.project_id == Project.id)
            query = DBSession\
                .query(
                    Project.id, Project.name, Project.entity_type,
                    Project.status_id,
                    subquery.exists().label('has_children')
                )
            if not self.show_completed_projects:
                from stalker import Status
                status_cmpl = \
                    Status.query.filter(Status.code == 'CMPL').first()
                query = query.filter(Project.status != status_cmpl)

            query = query.order_by(Project.name)
            projects = query.all()
        else:
            self.project.has_children = bool(self.project.tasks)
            projects = [self.project]

        logger.debug('projects: %s' % projects)

        # delete the old model if any
        if self.model() is not None:
            self.model().deleteLater()

        task_tree_model = TaskTreeModel()
        task_tree_model.populateTree(projects)
        self.setModel(task_tree_model)
        self.is_updating = False

        self.auto_fit_column()

        logger.debug('finished filling tasks_treeView')
示例#19
0
    def fill(self):
        """fills the tree view with data
        """
        logger.debug('start filling tasks_treeView')
        logger.debug('creating a new model')
        if not self.project:
            from sqlalchemy import alias
            from stalker import Task, Project
            from stalker.db.session import DBSession
            # projects = Project.query.order_by(Project.name).all()
            inner_tasks = alias(Task.__table__)
            subquery = DBSession.query(inner_tasks.c.id).filter(
                inner_tasks.c.project_id == Project.id)
            query = DBSession\
                .query(
                    Project.id, Project.name, Project.entity_type,
                    Project.status_id,
                    subquery.exists().label('has_children')
                )
            if not self.show_completed_projects:
                from stalker import Status
                status_cmpl = \
                    Status.query.filter(Status.code == 'CMPL').first()
                query = query.filter(Project.status != status_cmpl)

            query = query.order_by(Project.name)
            projects = query.all()
        else:
            self.project.has_children = bool(self.project.tasks)
            projects = [self.project]

        logger.debug('projects: %s' % projects)

        # delete the old model if any
        if self.model() is not None:
            self.model().deleteLater()

        task_tree_model = TaskTreeModel()
        task_tree_model.populateTree(projects)
        self.setModel(task_tree_model)
        self.is_updating = False

        self.auto_fit_column()

        logger.debug('finished filling tasks_treeView')
示例#20
0
    def logged_in_user(self):
        """Returns the logged in user as JSON data
        """
        from pyramid.security import authenticated_userid
        login_name = authenticated_userid(self.request)
        from stalker import User
        from stalker.db.session import DBSession
        from sqlalchemy import or_
        user_id = DBSession.query(User.id) \
            .filter(or_(User.login == login_name, User.email == login_name)) \
            .first()

        if not user_id:
            from pyramid.exceptions import HTTPForbidden
            raise HTTPForbidden(self.request)
        else:
            self.entity_id = user_id
            return self.get_entity()
示例#21
0
 def hasChildren(self, index):
     """returns True or False depending on to the index and the item on the
     index
     """
     logger.debug('TaskTreeModel.hasChildren() is started for index: %s' %
                  index)
     if not index.isValid():
         from stalker import Project
         from stalker.db.session import DBSession
         projects_count = DBSession.query(Project.id).count()
         return_value = projects_count > 0
     else:
         item = self.itemFromIndex(index)
         return_value = False
         if item:
             return_value = item.hasChildren()
     logger.debug('TaskTreeModel.hasChildren() is finished for index: %s' %
                  index)
     return return_value
示例#22
0
    def get_entity(self):
        """returns StatusMixin part of the entity
        """
        from stalker_pyramid import entity_type_to_url
        from stalker.db.session import DBSession
        from stalker import Status, StatusList
        status_id, status_list_id = DBSession.query(
            self.som_class.status_id, self.som_class.status_list_id).filter(
                self.som_class.id == self.entity_id).first()

        status_data = DBSession\
            .query(Status.id, Status.name, Status.entity_type)\
            .filter(Status.id == status_id)\
            .first()

        status_list_data = DBSession\
            .query(StatusList.id, StatusList.name, StatusList.entity_type)\
            .filter(StatusList.id == status_list_id)\
            .first()
        data = {
            'status': {
                'id':
                status_data[0],
                'name':
                status_data[1],
                'entity_type':
                status_data[2],
                '$ref':
                '%s/%s' % (entity_type_to_url[status_data[2]], status_data[0])
            },
            'status_list': {
                'id':
                status_list_data[0],
                'name':
                status_list_data[1],
                'entity_type':
                status_list_data[2],
                '$ref':
                '%s/%s' %
                (entity_type_to_url[status_list_data[2]], status_list_data[0])
            }
        }
        return data
示例#23
0
文件: task.py 项目: eoyilmaz/anima
 def hasChildren(self, index):
     """returns True or False depending on to the index and the item on the
     index
     """
     logger.debug(
         'TaskTreeModel.hasChildren() is started for index: %s' % index
     )
     if not index.isValid():
         from stalker import Project
         from stalker.db.session import DBSession
         projects_count = DBSession.query(Project.id).count()
         return_value = projects_count > 0
     else:
         item = self.itemFromIndex(index)
         return_value = False
         if item:
             return_value = item.hasChildren()
     logger.debug(
         'TaskTreeModel.hasChildren() is finished for index: %s' % index
     )
     return return_value
示例#24
0
    def get_entity(self):
        """return one Group instance data as JSON
        """
        # get supers response
        response = super(GroupViews, self).get_entity()

        # get entity type
        entity_type = response.json_body['entity_type']

        # get user count
        from stalker.db.session import DBSession
        from stalker.models.auth import Group_Users
        user_count = DBSession.query(Group_Users.c.uid)\
            .filter(Group_Users.c.gid == self.entity_id)\
            .count()

        # get permission count
        sql = """select
            "Permissions".access || '_' || "Permissions".action || '_' || "Permissions".class_name
        from "Group_Permissions"
        join "Permissions" on "Group_Permissions".permission_id = "Permissions".id
        where "Group_Permissions".group_id = :id
        """
        from sqlalchemy import text
        conn = DBSession.connection()
        permissions = conn.execute(text(sql), id=self.entity_id).fetchall()

        # prepare data
        from stalker_pyramid import entity_type_to_url
        data = {
            'permissions': [r[0] for r in permissions],
            'users': {
                '$ref': '%s/%s/users' %
                        (entity_type_to_url[entity_type], self.entity_id),
                'length': user_count
            }
        }

        # update supers response with our data and return
        return self.update_response_data(response, data)
示例#25
0
    def get_entity(self):
        """returns one Department instance data as JSON
        """
        response = super(DepartmentViews, self).get_entity()

        # get entity type
        from stalker import SimpleEntity
        from stalker.db.session import DBSession
        entity_type = DBSession.query(SimpleEntity.entity_type)\
            .filter(SimpleEntity.id == self.entity_id)\
            .first()[0]

        # get user count
        from stalker import DepartmentUser
        user_count = DBSession\
            .query(DepartmentUser.user_id)\
            .filter(DepartmentUser.department_id == self.entity_id)\
            .count()

        from stalker_pyramid import entity_type_to_url
        data = {
            'user_roles': {
                '$ref':
                '%s/%s/user_roles' %
                (entity_type_to_url[entity_type], self.entity_id),
                'length':
                user_count
            },
            'users': {
                '$ref':
                '%s/%s/users' %
                (entity_type_to_url[entity_type], self.entity_id),
                'length':
                user_count
            }
        }

        return self.update_response_data(response, data)
示例#26
0
    def get_entity(self):
        """returns one User instance
        """
        sql_query = """select
            "Users".id,
            "Users".login,
            "Users".email,
            "Users".rate
        from "Users"
        where "Users".id = :id
        """

        from sqlalchemy import text
        from stalker.db.session import DBSession
        conn = DBSession.connection()
        result = conn.execute(text(sql_query), id=self.entity_id)
        r = result.fetchone()

        # get department count
        from stalker import DepartmentUser
        department_count = DBSession.query(DepartmentUser.user_id)\
            .filter(DepartmentUser.user_id == self.entity_id)\
            .count()

        # get group count
        from stalker.models.auth import Group_Users
        group_count = DBSession.query(Group_Users.c.gid)\
            .filter(Group_Users.c.uid == self.entity_id)\
            .count()

        # get project count
        from stalker import ProjectUser
        projects_count = DBSession.query(ProjectUser.project_id)\
            .filter(ProjectUser.user_id == self.entity_id)\
            .count()

        # get reviews count
        from stalker import Review
        reviews_count = DBSession.query(Review.id)\
            .filter(Review.reviewer_id == self.entity_id)\
            .count()

        # get pending reviews count
        from stalker import Status
        new_status_id = DBSession.query(Status.id)\
            .filter(Status.code == 'NEW')\
            .first()
        pending_reviews_count = DBSession.query(Review.id)\
            .filter(Review.reviewer_id == self.entity_id)\
            .filter(Review.status_id == new_status_id)\
            .count()

        # get tasks count
        from stalker.models.task import Task_Resources
        tasks_count = DBSession.query(Task_Resources.c.task_id)\
            .filter(Task_Resources.c.resource_id == self.entity_id)\
            .count()

        # get tickets count
        from stalker import Ticket
        tickets_count = DBSession.query(Ticket.id)\
            .filter(Ticket.owner_id == self.entity_id)\
            .count()

        # get open tickets count
        closed_status_id = DBSession.query(Status.id)\
            .filter(Status.code=='CLS')\
            .first()

        open_ticket_count = DBSession.query(Ticket.id)\
            .filter(Ticket.owner_id == self.entity_id)\
            .filter(Ticket.status_id != closed_status_id)\
            .count()

        # get vacations count
        from stalker import Vacation
        vacations_count = DBSession.query(Vacation.id)\
            .filter(Vacation.user_id == self.entity_id)\
            .count()

        if r:
            from stalker_pyramid import entity_type_to_url
            users_url = entity_type_to_url['User']
            data = {
                'id': r[0],
                'login': r[1],
                'email': r[2],
                'rate': r[3],
                'departments': {
                    '$ref': '%s/%s/departments' % (users_url, r[0]),
                    'length': department_count
                },
                'groups': {
                    '$ref': '%s/%s/groups' % (users_url, r[0]),
                    'length': group_count
                },
                'projects': {
                    '$ref': '%s/%s/projects' % (users_url, r[0]),
                    'length': projects_count
                },
                'reviews': {
                    '$ref': '%s/%s/reviews' % (users_url, r[0]),
                    'length': reviews_count
                },
                'pending_reviews': {
                    '$ref': '%s/%s/reviews?status=new' % (users_url, r[0]),
                    'length': pending_reviews_count
                },
                'tasks': {
                    '$ref': '%s/%s/tasks' % (users_url, r[0]),
                    'length': tasks_count
                },
                'tickets': {
                    '$ref': '%s/%s/tickets' % (users_url, r[0]),
                    'length': tickets_count
                },
                'open_tickets': {
                    '$ref': '%s/%s/tickets?status=open' % (users_url, r[0]),
                    'length': open_ticket_count
                },
                'vacations': {
                    '$ref': '%s/%s/vacations' % (users_url, r[0]),
                    'length': vacations_count
                },
            }
            response = super(UserViews, self).get_entity()
            return self.update_response_data(response, data)
        else:
            from pyramid.response import Response
            return Response(body='Not Found', status=404)
示例#27
0
    def fetchMore(self):
        logger.debug('TaskItem.fetchMore() is started for item: %s' %
                     self.text())

        if self.canFetchMore():
            from sqlalchemy.orm import aliased
            from sqlalchemy.dialects.postgresql import array_agg
            from stalker import Task, User
            from stalker.models.task import Task_Resources
            from stalker.db.session import DBSession

            inner_tasks = aliased(Task)
            subquery = DBSession.query(Task.id) \
                .filter(Task.id == inner_tasks.parent_id)

            query = DBSession.query(
                Task.id,
                Task.name,
                Task.entity_type,
                Task.status_id,
                subquery.exists().label('has_children'),
                array_agg(User.name).label('resources')
            ) \
                .outerjoin(Task_Resources, Task.__table__.c.id == Task_Resources.c.task_id) \
                .outerjoin(User, Task_Resources.c.resource_id == User.id) \
                .group_by(
                    Task.id,
                    Task.name,
                    Task.entity_type,
                    Task.status_id,
                    subquery.exists().label('has_children')
                )

            if self.task.entity_type != 'Project':
                # query child tasks
                query = query.filter(Task.parent_id == self.task.id)
            else:
                # query only root tasks
                query = query.filter(Task.project_id == self.task.id)\
                    .filter(Task.parent_id==None)

            tasks = query.order_by(Task.name).all()

            # # model = self.model() # This will cause a SEGFAULT
            # # TODO: update it later on

            # start = time.time()
            from anima import defaults
            task_items = []
            for task in tasks:
                task_item = TaskItem(0, 4, task=task)
                task_item.parent = self

                # color with task status
                task_item.setData(
                    QtGui.QColor(
                        *defaults.status_colors_by_id[task.status_id]),
                    QtCore.Qt.BackgroundRole)

                # use black text
                task_item.setForeground(QtGui.QBrush(QtGui.QColor(0, 0, 0)))

                task_items.append(task_item)

            if task_items:
                # self.appendRows(task_items)
                for task_item in task_items:
                    # TODO: Create a custom QStandardItem for each data type in different columns
                    entity_type_item = QtGui.QStandardItem()
                    entity_type_item.setData(task_item.task.entity_type,
                                             QtCore.Qt.DisplayRole)

                    resources_item = QtGui.QStandardItem()
                    if task_item.task.resources != [None]:
                        resources_item.setData(
                            ', '.join(map(str, task_item.task.resources)),
                            QtCore.Qt.DisplayRole)

                    self.appendRow(
                        [task_item, entity_type_item, resources_item])

            self.fetched_all = True

        logger.debug('TaskItem.fetchMore() is finished for item: %s' %
                     self.text())
示例#28
0
    def get_entity(self):
        """returns one simple entity instance data
        """
        sql = """
        select
          "SimpleEntities".id,
          "SimpleEntities".name,
          "SimpleEntities".description,
          "SimpleEntities".created_by_id,
          "SimpleEntities".updated_by_id,
          (extract(epoch from "SimpleEntities".date_created::timestamp at time zone 'UTC') * 1000)::bigint as date_created,
          (extract(epoch from "SimpleEntities".date_updated::timestamp at time zone 'UTC') * 1000)::bigint as date_updated,
          "SimpleEntities".thumbnail_id,
          "SimpleEntities".stalker_version,
          "SimpleEntities".generic_text,
          "SimpleEntities".entity_type,
          "SimpleEntities".type_id
        from "SimpleEntities"
        where "SimpleEntities".id = :id
        """

        from sqlalchemy import text
        from stalker.db.session import DBSession
        conn = DBSession.connection()
        result = conn.execute(text(sql), id=self.entity_id)
        r = result.fetchone()

        # get generic_data_count
        from stalker.models.entity import SimpleEntity_GenericData
        generic_data_count = \
            DBSession.query(SimpleEntity_GenericData.c.simple_entity_id)\
            .filter(
                SimpleEntity_GenericData.c.simple_entity_id == self.entity_id
            )\
            .count()

        # get created_by name
        created_by_name = created_by_entity_type = None
        if r[3]:
            sub_query_result = DBSession\
                .query(SimpleEntity.name, SimpleEntity.entity_type)\
                .filter(SimpleEntity.id == r[3])\
                .first()
            created_by_name = sub_query_result[0]
            created_by_entity_type = sub_query_result[1]

        # get updated_by name
        updated_by_name = updated_by_entity_type = None
        if r[4]:
            if r[3] == r[4]:
                updated_by_name = created_by_name
                updated_by_entity_type = created_by_entity_type
            else:
                sub_query_result = DBSession \
                    .query(SimpleEntity.name, SimpleEntity.entity_type)\
                    .filter(SimpleEntity.id == r[4]) \
                    .first()
                updated_by_name = sub_query_result[0]
                updated_by_entity_type = sub_query_result[1]

        # get thumbnail name - we need to do that to be consistent
        thumbnail_name = thumbnail_entity_type = None
        if r[7]:
            sub_query_result = DBSession\
                .query(SimpleEntity.name, SimpleEntity.entity_type)\
                .filter(SimpleEntity.id == r[7])\
                .first()
            thumbnail_name = sub_query_result[0]
            thumbnail_entity_type = sub_query_result[1]

        # get type name
        type_name = type_entity_type = None
        if r[11]:
            sub_query_result = DBSession\
                .query(SimpleEntity.name, SimpleEntity.entity_type)\
                .filter(SimpleEntity.id == r[11])\
                .first()
            type_name = sub_query_result[0]
            type_entity_type = sub_query_result[1]

        from stalker_pyramid import entity_type_to_url
        data = {
            'id': r[0],
            'name': r[1],
            'description': r[2],
            'created_by': {
                'id':
                r[3],
                '$ref':
                '%s/%s' % (entity_type_to_url[created_by_entity_type], r[3]),
                'name':
                created_by_name,
                'entity_type':
                created_by_entity_type
            } if r[3] else None,
            'updated_by': {
                'id':
                r[4],
                '$ref':
                '%s/%s' % (entity_type_to_url[updated_by_entity_type], r[4]),
                'name':
                updated_by_name,
                'entity_type':
                updated_by_entity_type
            } if r[4] else None,
            'date_created': r[5],
            'date_updated': r[6],
            'thumbnail': {
                'id': r[7],
                '$ref': '%s/%s' %
                (entity_type_to_url[thumbnail_entity_type], r[7]),
                'name': thumbnail_name,
                'entity_type': thumbnail_entity_type
            } if r[7] else None,
            'stalker_version': r[8],
            'generic_text': r[9],
            'generic_data': {
                '$ref':
                '%s/%s/generic_data' %
                (entity_type_to_url['SimpleEntity'], r[0]),
                'length':
                generic_data_count
            },
            'entity_type': r[10],
            'type': {
                'id': r[11],
                '$ref': '%s/%s' %
                (entity_type_to_url[type_entity_type], r[11]),
                'name': type_name,
                'entity_type': type_entity_type
            } if r[11] else None
        }

        from pyramid.response import Response
        return Response(json_body=data)
示例#29
0
    def fetchMore(self):
        logger.debug(
            'TaskItem.fetchMore() is started for item: %s' % self.text()
        )

        if self.canFetchMore():
            from sqlalchemy import alias
            from stalker import Task
            from stalker.db.session import DBSession

            inner_tasks = alias(Task.__table__)
            subquery = DBSession.query(Task.id)\
                .filter(Task.id == inner_tasks.c.parent_id)
            query = DBSession.query(
                Task.id,
                Task.name,
                Task.entity_type,
                Task.status_id,
                subquery.exists().label('has_children')
            )

            if self.task.entity_type != 'Project':
                # query child tasks
                query = query.filter(Task.parent_id == self.task.id)
            else:
                # query only root tasks
                query = query.filter(Task.project_id == self.task.id)\
                    .filter(Task.parent_id==None)

            tasks = query.order_by(Task.name).all()

            # # model = self.model() # This will cause a SEGFAULT
            # # TODO: update it later on

            # start = time.time()
            from anima import defaults
            task_items = []
            for task in tasks:
                task_item = TaskItem(0, 3, entity=task)
                task_item.parent = self

                # color with task status
                task_item.setData(
                    QtGui.QColor(
                        *defaults.status_colors_by_id[task.status_id]
                    ),
                    QtCore.Qt.BackgroundRole
                )

                # use black text
                task_item.setForeground(
                    QtGui.QBrush(QtGui.QColor(0, 0, 0))
                )

                task_items.append(task_item)

            if task_items:
                self.appendRows(task_items)

            self.fetched_all = True

        logger.debug(
            'TaskItem.fetchMore() is finished for item: %s' % self.text()
        )
示例#30
0
    def copy_versions(self):
        """copies versions from one task to another
        """
        # get from task
        from_task = self.get_task_from_tree_view(self.from_task_tree_view)

        # get logged in user
        logged_in_user = self.get_logged_in_user()

        if not from_task:
            QtWidgets.QMessageBox.critical(
                self, 'Error',
                'Please select a task from <b>From Task</b> list')
            return

        # get to task
        to_task = self.get_task_from_tree_view(self.to_task_tree_view)

        if not to_task:
            QtWidgets.QMessageBox.critical(
                self, 'Error', 'Please select a task from <b>To Task</b> list')
            return

        # check if tasks are the same
        if from_task == to_task:
            QtWidgets.QMessageBox.critical(
                self, 'Error', 'Please select two different tasks')
            return

        # get take names and related versions
        # get distinct take names
        from stalker.db.session import DBSession
        from_take_names = map(
            lambda x: x[0],
            DBSession.query(distinct(Version.take_name)).filter(
                Version.task == from_task).order_by(Version.take_name).all())

        # create versions for each take
        answer = QtWidgets.QMessageBox.question(
            self, 'Info', "Will copy %s versions from take names:<br><br>"
            "%s"
            "<br><br>"
            "Is that Ok?" %
            (len(from_take_names), '<br>'.join(from_take_names)),
            QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No)

        if answer == QtWidgets.QMessageBox.Yes:
            for take_name in from_take_names:
                latest_version = Version.query\
                    .filter_by(task=from_task)\
                    .filter_by(take_name=take_name)\
                    .order_by(Version.version_number.desc())\
                    .first()

                # create a new version
                new_version = Version(task=to_task, take_name=take_name)
                new_version.created_by = logged_in_user
                new_version.extension = latest_version.extension
                new_version.description = \
                    'Moved from another task (id=%s) with Version Mover' % \
                    latest_version.task.id
                new_version.created_with = latest_version.created_with
                DBSession.add(new_version)
                DBSession.commit()

                # update path
                new_version.update_paths()
                DBSession.add(new_version)
                DBSession.commit()

                # now copy the last_version file to the new_version path
                try:
                    os.makedirs(new_version.absolute_path)
                except OSError:  # path exists
                    pass

                # move the file there
                shutil.copyfile(latest_version.absolute_full_path,
                                new_version.absolute_full_path)

            # inform the user
            QtWidgets.QMessageBox.information(
                self, 'Success',
                'Successfully copied %s versions' % len(from_take_names))
示例#31
0
    def _set_defaults(self):
        """setup the default values
        """
        # set size policies
        # self.name_lineEdit

        self.type_comboBox.setSizePolicy(
            QtWidgets.QSizePolicy.Expanding,
            QtWidgets.QSizePolicy.Fixed
        )

        self.status_comboBox.setSizePolicy(
            QtWidgets.QSizePolicy.Expanding,
            QtWidgets.QSizePolicy.Fixed
        )

        self.client_comboBox.setSizePolicy(
            QtWidgets.QSizePolicy.Expanding,
            QtWidgets.QSizePolicy.Fixed
        )

        self.agency_comboBox.setSizePolicy(
            QtWidgets.QSizePolicy.Expanding,
            QtWidgets.QSizePolicy.Fixed
        )

        self.production_company_comboBox.setSizePolicy(
            QtWidgets.QSizePolicy.Expanding,
            QtWidgets.QSizePolicy.Fixed
        )

        # invalidate the name and code fields by default
        self.name_lineEdit.set_invalid('Enter a name')
        self.code_lineEdit.set_invalid('Enter a code')

        # update type field
        from stalker import Type
        from stalker.db.session import DBSession
        project_types = \
            DBSession.query(Type.id, Type.name)\
                .filter(Type.target_entity_type == 'Project')\
                .order_by(Type.name)\
                .all()

        self.type_comboBox.clear()
        self.type_comboBox.addItem('', -1)
        for type_id, type_name in project_types:
            self.type_comboBox.addItem(type_name, type_id)

        self.image_format.fill_combo_box()
        self.fill_repository_combo_box()
        self.fill_structure_combo_box()

        # fill status field
        sql = """select
        "SimpleEntities".id,
        "SimpleEntities".name
    from "Statuses"
    join "SimpleEntities" on "Statuses".id = "SimpleEntities".id
    join "StatusList_Statuses" on "Statuses".id = "StatusList_Statuses".status_id
    join "StatusLists" on "StatusLists".id = "StatusList_Statuses".status_list_id
    where "StatusLists".target_entity_type = 'Project'"""

        all_project_statuses = \
            DBSession.connection().execute(sql).fetchall()

        for st_id, st_name in all_project_statuses:
            self.status_comboBox.addItem(st_name, st_id)
示例#32
0
文件: task.py 项目: eoyilmaz/anima
    def fetchMore(self):
        logger.debug(
            'TaskItem.fetchMore() is started for item: %s' % self.text()
        )

        if self.canFetchMore():
            from sqlalchemy import alias
            from sqlalchemy.dialects.postgresql import array_agg
            from stalker import Task, User
            from stalker.models.task import Task_Resources
            from stalker.db.session import DBSession

            inner_tasks = alias(Task.__table__)
            subquery = DBSession.query(Task.id)\
                .filter(Task.id == inner_tasks.c.parent_id)
            query = DBSession.query(
                Task.id,
                Task.name,
                Task.entity_type,
                Task.status_id,
                subquery.exists().label('has_children'),
                array_agg(User.name).label('resources')
            )\
                .outerjoin(Task_Resources, Task.id == Task_Resources.c.task_id)\
                .outerjoin(User, Task_Resources.c.resource_id == User.id) \
                .group_by(
                    Task.id,
                    Task.name,
                    Task.entity_type,
                    Task.status_id,
                    subquery.exists().label('has_children')
                )

            if self.task.entity_type != 'Project':
                # query child tasks
                query = query.filter(Task.parent_id == self.task.id)
            else:
                # query only root tasks
                query = query.filter(Task.project_id == self.task.id)\
                    .filter(Task.parent_id==None)

            tasks = query.order_by(Task.name).all()

            # # model = self.model() # This will cause a SEGFAULT
            # # TODO: update it later on

            # start = time.time()
            from anima import defaults
            task_items = []
            for task in tasks:
                task_item = TaskItem(0, 4, entity=task)
                task_item.parent = self

                # color with task status
                task_item.setData(
                    QtGui.QColor(
                        *defaults.status_colors_by_id[task.status_id]
                    ),
                    QtCore.Qt.BackgroundRole
                )

                # use black text
                task_item.setForeground(
                    QtGui.QBrush(QtGui.QColor(0, 0, 0))
                )

                task_items.append(task_item)

            if task_items:
                # self.appendRows(task_items)
                for task_item in task_items:
                    # TODO: Create a custom QStandardItem for each data type in different columns
                    entity_type_item = QtGui.QStandardItem()
                    entity_type_item.setData(task_item.task.entity_type, QtCore.Qt.DisplayRole)

                    resources_item = QtGui.QStandardItem()
                    if task_item.task.resources != [None]:
                        resources_item.setData(', '.join(map(str, task_item.task.resources)), QtCore.Qt.DisplayRole)

                    self.appendRow([task_item, entity_type_item, resources_item])

            self.fetched_all = True

        logger.debug(
            'TaskItem.fetchMore() is finished for item: %s' % self.text()
        )