fix another lazy import phase 1 introduced which confused PyInstaller

This commit is contained in:
Jay Lee
2026-07-03 15:48:45 -04:00
parent e6ba984c13
commit d992288d67
22 changed files with 1286 additions and 1149 deletions

View File

@@ -0,0 +1,71 @@
"""Domain/query filter utilities shared between aliases, groups, and users.
Moved here to break circular dependencies between cmd/ modules.
"""
from gamlib import glcfg as GC
from gamlib import glclargs
from gam.util.entity import getEntityList, getQueries
Cmd = glclargs.GamCLArgs()
def initUserGroupDomainQueryFilters():
if not GC.Values[GC.PRINT_AGU_DOMAINS]:
return {'list': [{'customer': GC.Values[GC.CUSTOMER_ID]}], 'queries': [None]}
return {'list': [{'domain': domain.lower()} for domain in GC.Values[GC.PRINT_AGU_DOMAINS].replace(',', ' ').split()], 'queries': [None]}
def getUserGroupDomainQueryFilters(myarg, kwargsDict):
if myarg in {'domain', 'domains'}:
kwargsDict['list'] = [{'domain': domain.lower()} for domain in getEntityList(Cmd.OB_DOMAIN_NAME_ENTITY)]
elif myarg in {'query', 'queries'}:
kwargsDict['queries'] = getQueries(myarg)
else:
return False
return True
def makeUserGroupDomainQueryFilters(kwargsDict, isSuspended, isArchived, isDisabled):
def addToQuery(query, keyword, value):
pquery = query
if not pquery:
pquery = ''
else:
pquery += ' '
pquery += f'{keyword}={value}'
kwargsQueries.append((kwargs, pquery))
kwargsQueries = []
for kwargs in kwargsDict['list']:
for query in kwargsDict['queries']:
if isDisabled is not None:
addToQuery(query, 'isArchived', isDisabled)
addToQuery(query, 'isSuspended', isDisabled)
elif isSuspended is not None or isArchived is not None:
if isArchived is not None:
addToQuery(query, 'isArchived', isArchived)
if isSuspended is not None:
addToQuery(query, 'isSuspended', isSuspended)
else:
kwargsQueries.append((kwargs, query))
return kwargsQueries
def groupFilters(kwargs, query):
queryTitle = ''
if kwargs.get('domain'):
queryTitle += f'domain={kwargs["domain"]}, '
if query is not None:
queryTitle += f'query="{query}", '
if queryTitle:
return query, queryTitle[:-2]
return query, queryTitle
def _setUserGroupArgs(user, kwargs):
if 'customer' in kwargs:
if "'" not in user:
kwargs['query'] = f'memberKey={user}'
else:
quser = user.replace("'", "\\\\'")
kwargs['query'] = f'memberKey={quser}'
else:
kwargs['userKey'] = user

View File

@@ -0,0 +1,70 @@
"""Group parent hierarchy utilities shared between groups/members and userop/usergroups.
Moved here to break circular dependencies between cmd/ modules.
"""
from gamlib import glentity
from gamlib import glgapi as GAPI
from gamlib import glindent
from gam.util.access import accessErrorExit
from gam.util.api import callGAPIpages
from gam.util.csv_pf import flattenJSON
from gam.util.display import badRequestWarning, printKeyValueListWithCount
from gam.util.domain_filters import _setUserGroupArgs
Ent = glentity.GamEntity()
Ind = glindent.GamIndent()
def getGroupParents(cd, groupParents, groupEmail, groupName, kwargs):
groupParents[groupEmail] = {'name': groupName, 'parents': []}
_setUserGroupArgs(groupEmail, kwargs)
try:
entityList = callGAPIpages(cd.groups(), 'list', 'groups',
throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS,
retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
orderBy='email', fields='nextPageToken,groups(email,name)', **kwargs)
for parentGroup in entityList:
groupParents[groupEmail]['parents'].append(parentGroup['email'])
if parentGroup['email'] not in groupParents:
getGroupParents(cd, groupParents, parentGroup['email'], parentGroup['name'], kwargs)
except (GAPI.invalidMember, GAPI.invalidInput):
badRequestWarning(Ent.GROUP, Ent.MEMBER, groupEmail)
except (GAPI.resourceNotFound, GAPI.domainNotFound, GAPI.forbidden, GAPI.badRequest):
accessErrorExit(cd)
def showGroupParents(groupParents, groupEmail, role, i, count):
kvList = [groupEmail, f'{groupParents[groupEmail]["name"]}']
if role:
kvList.extend([Ent.Singular(Ent.ROLE), role])
printKeyValueListWithCount(kvList, i, count)
Ind.Increment()
for parentEmail in groupParents[groupEmail]['parents']:
showGroupParents(groupParents, parentEmail, None, 0, 0)
Ind.Decrement()
def addJsonGroupParents(groupParents, userGroup, groupEmail):
userGroup.setdefault('parents', [])
for parentEmail in groupParents[groupEmail]['parents']:
userGroup['parents'].append({'email': parentEmail, 'name': groupParents[parentEmail]['name'], 'parents': []})
addJsonGroupParents(groupParents, userGroup['parents'][-1], parentEmail)
def printGroupParents(groupParents, groupEmail, row, csvPF, delimiter, showParentsAsList):
if groupParents[groupEmail]['parents']:
for parentEmail in groupParents[groupEmail]['parents']:
row['parents'].append({'email': parentEmail, 'name': groupParents[parentEmail]['name']})
printGroupParents(groupParents, parentEmail, row, csvPF, delimiter, showParentsAsList)
del row['parents'][-1]
else:
if not showParentsAsList:
csvPF.WriteRowTitles(flattenJSON(row))
else:
crow = row.copy()
if 'Role' in row:
crow['Role'] = row['Role']
parents = crow.pop('parents')
crow['ParentsCount'] = len(parents)
crow['Parents'] = delimiter.join([parent['email'] for parent in parents])
crow['ParentsName'] = delimiter.join([parent['name'] for parent in parents])
csvPF.WriteRow(flattenJSON(crow))

View File

@@ -130,3 +130,9 @@ def getAllParentOrgUnitsForUser(cd, user):
except (GAPI.badRequest, GAPI.invalidCustomerId, GAPI.loginRequired):
_getMain().accessErrorExit(cd)
return orgUnits
def _getOrgunitsOrgUnitIdPath(cd, orgUnit):
if orgUnit.startswith('orgunits/'):
orgUnit = f'id:{orgUnit[9:]}'
orgUnitPath, orgUnitId = getOrgUnitId(cd, orgUnit)
return (orgUnitPath, f'orgunits/{orgUnitId[3:]}')

View File

@@ -0,0 +1,32 @@
"""Schema parameter utilities shared between user management and groups.
Moved here to break circular dependencies between cmd/ modules.
"""
from gamlib import glclargs
from gam.util.args import getString
Cmd = glclargs.GamCLArgs()
def _initSchemaParms(projection):
return {'projection': projection, 'customFieldMask': None, 'selectedSchemaFields': {}}
def _getSchemaNameList(schemaParms):
customFieldMask = getString(Cmd.OB_SCHEMA_NAME_LIST).replace(' ', ',')
if customFieldMask.lower() == 'all':
schemaParms['projection'] = 'full'
schemaParms['customFieldMask'] = None
schemaParms['selectedSchemaFields'] = {}
else:
schemaParms['projection'] = 'custom'
customFieldMaskList = []
for schemaField in customFieldMask.split(','):
if schemaField.find('.') == -1:
customFieldMaskList.append(schemaField)
else:
schemaName, fieldName = schemaField.split('.', 1)
customFieldMaskList.append(schemaName)
schemaParms['selectedSchemaFields'] .setdefault(schemaName, set())
schemaParms['selectedSchemaFields'][schemaName].add(fieldName)
schemaParms['customFieldMask'] = ','.join(customFieldMaskList)