Genesys Cloud - Developer Community!

 View Only

Sign Up

  • 1.  Python Scripts

    Posted 22 days ago
    Edited by George Park 22 days ago

    Hello, I'm currently trying to swap 200 + users from the DID being the primary voice to their ext being the primary voice and for some reason the code I have made does not change the primary voice, It should I feel like as it matches exactly what it would be when I manually set the primary voice on my profile to see what it returns but it won't change the primary voice.

    def process_user(self,user,group_names):
            try:
                # derive this user's group names using the cached id->name mapping
                user_group_names = {group_names.get(getattr(group, 'id', None)) for group in getattr(user, 'groups', []) or []}
                # remove any None values
                user_group_names.discard(None)

                # exact names to match
                target_names = {"GC NSS CL SUPERVISOR", "GC NSS CL USER", "GC NSS PL SUPERVISOR", "GC NSS PL USER"}
                matched = user_group_names.intersection(target_names)

                if matched:
                    body = PureCloudPlatformClientV2.UpdateUser()
                    body.version = user.version
                    updated_primary_contact_info = []
                    #print(f"User {user.id}, name: {user.name}, matched groups: {matched}")
                    for address in user.addresses:
                        print(f"Address: {address}")
                        ext = getattr(address, 'extension', None)
                        if ext == None or ext == "":
                            # if "primary" in address and address.primary == True:
                            #     address.primary = False
                            continue
                        else:
                            users_ext = ext
                            #print(f"Extension: {users_ext}")
                            #address.primary = True
                    for address in user.primary_contact_info:
                        if address.media_type == "PHONE" and address.type == "PRIMARY":
                            print (f"Before Update - {address}")
                            address.address = None
                            address.display = users_ext
                            address.extension = users_ext
                            #print(f"After Update - {address}")
                            updated_primary_contact_info.append(address)
                        else:
                            updated_primary_contact_info.append(address)

                    body.primary_contact_info = updated_primary_contact_info
                    body.addresses = user.addresses
                    #print(f"body:\n {body}")
                   
                    try:
                        resp = self.users_api.patch_user(user.id, body)
                        print("patched: \n", resp)
                    except Exception as e: print("API error:", e)
                   
                    # return {
                    #     'id': getattr(user, 'id', None),
                    #     'name': getattr(user, 'name', None),
                    #     'matched_groups': list(matched),
                    #     'primary_contact_info': getattr(user, 'primary_contact_info', None)
                    # }
                return None


    #PlatformAPI

    ------------------------------
    George Park
    NA
    ------------------------------



  • 2.  RE: Python Scripts

    Posted 18 days ago

    Hi George Park,  

    The address.address can't be none if you are planning to set a primary contact. Try mapping the address.address with the extension number that you are trying to update instead of keep them as none.



    ------------------------------
    Parthiban Thangarajan
    Principal Full Stack Developer
    ------------------------------



  • 3.  RE: Python Scripts

    Posted 15 days ago

    Olá George,

    O comportamento que você viu faz sentido: para o Primary contact (PHONE), o Genesys Cloud não aceita address nulo. Se você pretende tornar o ramal o contato primário, precisa preencher os três campos em primary_contact_info para o item media_type=PHONE e type=PRIMARY:

    • address → não pode ser None

    • extension → o número do ramal

    • display → rótulo que aparece na UI

    Além disso, é importante manter consistência com a lista addresses do usuário, para que o registro não fique contraditório.

    Passo a passo recomendado

    1. Descobrir o ramal do usuário
      Varra user.addresses e pegue o primeiro endereço de telefone com extension preenchido.

    2. Garantir que o primário exista e seja do tipo PHONE
      Em user.primary_contact_info, localize o item media_type=="PHONE" && type=="PRIMARY".
      Se não existir, crie um novo objeto PrimaryContactInfo.

    3. Preencher os três campos do primário

      • address: use o mesmo valor do ramal se sua política permitir ramal como endereço.
        Se sua política exigir um número completo (E.164), então o "primário por ramal" deve ficar via extension/display, mantendo um DID válido em address.

      • extension: o ramal (ex.: "1234").

      • display: algo como "Ramal 1234".

    4. Atualizar addresses para refletir a mudança
      Defina primary=true no endereço que representa o ramal (ou garanta que o endereço que tem o ramal seja o principal).
      Evite deixar dois endereços conflitantes com primary=true.

    5. PATCH mínimo
      Envie apenas os campos necessários no UpdateUser para reduzir chances de 400 (campos read-only).
      Use body.version = user.version atual.

    Exemplo de ajuste no seu código

    def process_user(self, user, group_names):
        try:
            user_group_names = {group_names.get(getattr(g, 'id', None)) for g in getattr(user, 'groups', []) or []}
            user_group_names.discard(None)
     
            target_names = {"GC NSS CL SUPERVISOR", "GC NSS CL USER", "GC NSS PL SUPERVISOR", "GC NSS PL USER"}
            matched = user_group_names.intersection(target_names)
     
            if not matched:
                return None
     
            # 1) Descobrir o ramal do usuário
            users_ext = None
            for addr in getattr(user, 'addresses', []) or []:
                if getattr(addr, 'extension', None):
                    users_ext = addr.extension
                    break
     
            if not users_ext:
                # sem ramal, nada a fazer
                return None
     
            # 2) Montar primary_contact_info atualizado (apenas o necessário)
            updated_pci = []
            found_primary_phone = False
     
            for pci in getattr(user, 'primary_contact_info', []) or []:
                if pci.media_type == "PHONE" and pci.type == "PRIMARY":
                    # 3) Preencher address, extension e display (address não pode ser None)
                    pci.address = users_ext               # se sua política exigir E.164, troque aqui
                    pci.extension = users_ext
                    pci.display = f"Ext {users_ext}"
                    found_primary_phone = True
                updated_pci.append(pci)
     
            if not found_primary_phone:
                # criar um primário PHONE se não existir
                from PureCloudPlatformClientV2.models import PrimaryContactInfo
                pci_new = PrimaryContactInfo()
                pci_new.media_type = "PHONE"
                pci_new.type = "PRIMARY"
                pci_new.address = users_ext
                pci_new.extension = users_ext
                pci_new.display = f"Ext {users_ext}"
                updated_pci.append(pci_new)
     
            # 4) Alinhar addresses (opcional mas recomendado)
            #    marque como primary o endereço que contém o ramal
            for addr in getattr(user, 'addresses', []) or []:
                if getattr(addr, 'extension', None) == users_ext:
                    setattr(addr, 'primary', True)
                else:
                    # evite múltiplos primários
                    if getattr(addr, 'primary', False):
                        setattr(addr, 'primary', False)
     
            # 5) PATCH mínimo
            from PureCloudPlatformClientV2 import UpdateUser
            body = UpdateUser()
            body.version = user.version
            body.primary_contact_info = updated_pci
            body.addresses = user.addresses
     
            resp = self.users_api.patch_user(user.id, body)
            print("patched:\n", resp)
     
        except Exception as e:
            print("API error:", e)
     
        return None

    Observações importantes

    • Se a sua política exigir número E.164 real em address, mantenha o DID em address e coloque o ramal em extension/display. Nesse caso, o "primário de voz por ramal" ficará refletido pelo extension, mas o address continuará sendo o DID real.

    • Sempre use o version mais recente do usuário. Se houver conflito de versão (409), faça um GET e tente novamente.

    • Evite enviar o objeto inteiro retornado pelo GET no PATCH. Monte um payload mínimo com apenas primary_contact_info e addresses.

    • Permissões: garanta que o token tenha directory:user:edit.

    Em resumo é: o ajuste principal é nunca deixar address vazio quando for media_type=PHONE e type=PRIMARY, e manter addresses coerente. Com isso, o PATCH passa e o primário fica como você deseja.



    ------------------------------
    Fernando Sotto dos Santos
    Consultor Grupo Casas Bahia
    ------------------------------