Exemple #1
0
    def get_rows(self, request, context, parent_id, offset, limit, filter):
        # если справочник состоит только из дерева и у него просят запись,
        # то надо брать из модели дерева
        # TODO: возможно это не надо было делать - раз не туда обратились,
        # значит сами виноваты
        if self.list_model:
            query = None
            if parent_id == BaseTreeDictionaryModelActions.ALL_ROWS:
                # отображаются все данные
                query = self.list_model.objects
            else:
                # отображаются данные с фильтрацией по значению parent_id
                query = self.list_model.objects.filter(
                    **{self.list_parent_field: parent_id})

            # Подтягиваем группу, т.к. при сериализации она требуется
            query = query.select_related(self.list_parent_field)
            query = utils.apply_sort_order(query, self.list_columns,
                                           self.list_sort_order)
            query = utils.apply_search_filter(query, filter,
                                              self.filter_fields)
            query = utils.detect_related_fields(query, self.list_columns)
            # Для работы пейджинга нужно передавать общее количество записей
            query = self.modify_get_rows(query, request, context)
            total = query.count()
            # Срез данных для страницы
            if limit > 0:
                query = query[offset:offset + limit]

            result = {'rows': list(query.all()), 'total': total}
            return result
        else:
            return self.get_nodes(request, context, parent_id, filter)
Exemple #2
0
    def get_rows(self, request, context, parent_id, offset, limit, filter):
        # если справочник состоит только из дерева и у него просят запись,
        # то надо брать из модели дерева
        # TODO: возможно это не надо было делать - раз не туда обратились,
        # значит сами виноваты
        if self.list_model:
            query = None
            if parent_id == BaseTreeDictionaryModelActions.ALL_ROWS:
                # отображаются все данные
                query = self.list_model.objects
            else:
                # отображаются данные с фильтрацией по значению parent_id
                query = self.list_model.objects.filter(
                    **{self.list_parent_field: parent_id})

            # Подтягиваем группу, т.к. при сериализации она требуется
            query = query.select_related(self.list_parent_field)
            query = utils.apply_sort_order(
                query, self.list_columns, self.list_sort_order)
            query = utils.apply_search_filter(
                query, filter, self.filter_fields)
            query = utils.detect_related_fields(query, self.list_columns)
            # Для работы пейджинга нужно передавать общее количество записей
            query = self.modify_get_rows(query, request, context)
            total = query.count()
            # Срез данных для страницы
            if limit > 0:
                query = query[offset: offset + limit]

            result = {'rows': list(query.all()), 'total': total}
            return result
        else:
            return self.get_nodes(request, context, parent_id, filter)
Exemple #3
0
    def get_rows(self, request, context, offset, limit, filter, user_sort=''):
        if user_sort:
            sort_order = [user_sort] if not isinstance(user_sort, (list, tuple,)) else user_sort
        else:
            sort_order = self.list_sort_order
        filter_fields = self._default_filter()

        query = utils.apply_sort_order(self.model.objects, self.list_columns, sort_order)
        query = utils.apply_search_filter(query, filter, filter_fields)
        query = utils.detect_related_fields(query, self.list_columns)

        query = self.modify_get_rows(query, request, context)
        total = query.count()

        if limit > 0:
            query = query[offset: offset + limit]

        result = {'rows': list(query.all()), 'total': total}
        return result
Exemple #4
0
    def get_nodes(self, request, context, parent_id, filter, branch_id=None):
        """
        Метод получения списка узлов дерева, которые
        """
        # parent_id - это элемент, который раскрывается,
        # поэтому для него фильтр ставить не надо, иначе фильтруем
        # branch_id - это элемент ограничивающий дерево,
        # т.е. должны возвращаться только дочерние ему элементы
        if filter and not parent_id:
            filter_dict = utils.create_search_filter(filter,
                                                     self.tree_filter_fields)
            nodes = utils.fetch_search_tree(self.tree_model, filter_dict,
                                            branch_id)
        else:
            if branch_id and hasattr(self.tree_model, 'get_descendants'):
                branch_node = self.tree_model.objects.get(id=branch_id)
                if parent_id:
                    query = branch_node.get_descendants().filter(
                        parent=parent_id)
                else:
                    query = branch_node.get_children()
            else:
                query = self.tree_model.objects.filter(parent=parent_id)
            query = utils.apply_sort_order(query, self.tree_columns,
                                           self.tree_sort_order)
            query = utils.detect_related_fields(query, self.list_columns)

            # кастомная функция модификации запроса
            # при реализации контестных справочников в большинстве случаев
            # достаточно будет просто переопределить данную функцию
            query = self.modify_get_nodes(query, request, context)

            nodes = list(query)
            # Если имеем дело с листом, нужно передавать параметр leaf = true
            for node in nodes:
                if not self.tree_model.objects.filter(parent=node.id).exists():
                    node.leaf = 'true'

        # генерируем сигнал о том, что узлы дерева подготовлены
        nodes_prepared.send(sender=self.__class__, nodes=nodes)
        return nodes
Exemple #5
0
    def get_nodes(self, request, context, parent_id, filter, branch_id=None):
        """
        Метод получения списка узлов дерева, которые
        """
        # parent_id - это элемент, который раскрывается,
        # поэтому для него фильтр ставить не надо, иначе фильтруем
        # branch_id - это элемент ограничивающий дерево,
        # т.е. должны возвращаться только дочерние ему элементы
        if filter and not parent_id:
            filter_dict = utils.create_search_filter(
                filter, self.tree_filter_fields)
            nodes = utils.fetch_search_tree(
                self.tree_model, filter_dict, branch_id)
        else:
            if branch_id and hasattr(self.tree_model, 'get_descendants'):
                branch_node = self.tree_model.objects.get(id=branch_id)
                if parent_id:
                    query = branch_node.get_descendants().filter(
                        parent=parent_id)
                else:
                    query = branch_node.get_children()
            else:
                query = self.tree_model.objects.filter(parent=parent_id)
            query = utils.apply_sort_order(
                query, self.tree_columns, self.tree_sort_order)
            query = utils.detect_related_fields(query, self.list_columns)

            # кастомная функция модификации запроса
            # при реализации контестных справочников в большинстве случаев
            # достаточно будет просто переопределить данную функцию
            query = self.modify_get_nodes(query, request, context)

            nodes = list(query)
            # Если имеем дело с листом, нужно передавать параметр leaf = true
            for node in nodes:
                if not self.tree_model.objects.filter(parent=node.id).exists():
                    node.leaf = 'true'

        # генерируем сигнал о том, что узлы дерева подготовлены
        nodes_prepared.send(sender=self.__class__, nodes=nodes)
        return nodes