Esri / Esri/arcgis-python-api

Double fetching of a group when searching for groups

Đang mở
#2,437 2 bình luận 0 reaction 0 người được giao Xem trên GitHub
bug
Ngôn ngữ chính
Python
Star
2.2k
Fork
1.1k
Merge trung bình
2 giờ 40 phút
Pull request đã merge (30 ngày)
2

Mô tả

When searching for groups the created class is not set properly which cause the group to be fetched a second time when accessing a property.

**To Reproduce**
Search the groups of an organization
```python
target_portal_groups = gis.groups.search("*", sort_field="title", max_groups=1000)
```
error:
```python
target_portal_groups[0].title # This will query the portal
```

**Expected behavior**
The dictionnary from the initial fetch you be used instead of fetching the object again.

**Platform (please complete the following information):**
- OS: WIndows 11
- Python API Version: 2.4.2

**Additional context**
The reason why this happens is the Group object `hydrate` property is not set correctly when the group dict was provided on initialization.

```python
def __init__(self, gis, groupid, groupdict=None):
dict.__init__(self)
self._gis = gis
self._migrate = None
self._portal = gis._portal
self.groupid = groupid
self.thumbnail = None
self._workdir = tempfile.gettempdir()
# groupdict = self._portal.get_group(self.groupid)
self._hydrated = False
if groupdict:
groupdict.update(self.__dict__)
super(Group, self).update(groupdict)
```

When the groupdict is provided it updates the group dict with it's properties. But since it doesn't set hydrated to true it will fetch its properties later on.

```python
def __getattr__(self, name):
if not self._hydrated and not name.startswith("_"):
self._hydrate()
if name.startswith("_ipython_"):
return None # Skip IPython-specific attributes
try:
return dict.__getitem__(self, name)
except AttributeError:
raise AttributeError("'%s' object has no attribute '%s'" % (type(self).__name__, name))
```

If we look at the hydrate function it actually does pretty much the same thing as the initial group creation but it correctly sets the hydrate property.

```python
def _hydrate(self):
try:
groupdict = self._portal.get_group(self.groupid)
self._hydrated = True
super(Group, self).update(groupdict)
self.__dict__.update(groupdict)
except Exception as e:
raise e
```

I've checked on my side and the initial call to search the groups returns all the properties of the group (which can be seen when reading the rest api documentation).

https://developers.arcgis.com/rest/users-groups-and-items/group-search/
Returns: A JSON array of group objects. See the response properties for [Group](https://developers.arcgis.com/rest/users-groups-and-items/group/).

This is kinda a big bug on our side this will causes a lot of fetches to our organization.

Thanks,
Mathieu

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Hướng nghiên cứu

Bắt đầu từ Group.__init__ và đường dẫn groups.search, sau đó so sánh cách groupdict được áp dụng ở đó với _hydrate. Xác minh ví dụ tìm kiếm được tái hiện và quyền truy cập vào target_portal_groups[0].title; hoàn thành khi dữ liệu nhóm ban đầu được sử dụng mà không có truy vấn portal thứ hai.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
python
Lĩnh vực
api, backend
Loại issue
Lỗi
Độ khó
2/5
Thời gian dự kiến
1-3 giờ
Mức độ hoạt động
Đình trệ
Độ rõ ràng
Đặc tả rõ ràng
Mức phù hợp với người mới
45/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.