Skip to content

Double fetching of a group when searching for groups #2437

@MathieuLegault1

Description

@MathieuLegault1

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

target_portal_groups = gis.groups.search("*", sort_field="title", max_groups=1000)

error:

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.

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.

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.

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.

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

Thanks,
Mathieu

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions