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)
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)
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
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
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