« first day (1794 days earlier)      last day (27 days later) » 

12:09 AM
@PatricioMoracho Estas ?
 
@JuanPerez: Y que es lo que se debe hacer con las claves que no tengas?
 
@PatricioMoracho No mostrarlas
if any(True for k in keys if k in json_data):
@PatricioMoracho Esto es solo cuando todas se cumplan ?
 
Crea un diccionario temporal y haces algo así:
if 'Pet Name 1' in json_data:
  d['Pet Name 1'] =  json_data['Pet Name 1']
if 'Pet Type 1' in json_data:
  d['Pet Type 1'] = json_data['Pet Type 1']

dataPerson.append(d)
 
Como asi crear un diccionario temporal
 
d = dict()
 
12:25 AM
dataPerson = []
limit      = 5

for item in dataMemberships[:limit]:
    id_ = item['id']
    response = requests.get(f'{base_url}/api/v1/person/{id_}', params=params)
    if response.status_code == 200:
        json_data = json.loads(response.text)
        if 'Pet Name 1' in json_data or 'Pet Type 1' in json_data or 'Pet Breed 1' in json_data or 'Pet Birthday 1' in json_data:
            dataPerson.append(json_data)
Asi tengo el codigo
@PatricioMoracho No encuentro como hacer el diccionario temporal que me comentas
 
Una solución genérica:
keys_to_search = ['Pet Name 1', 'Pet Type 1']
d = dict()
for k in keys_to_search:
  if k in json_data:
    d[k] =  json_data[k]

dataPerson.append(d)
 
@PatricioMoracho ¿ Cual sería la respuesta de dataPerson para ese ejemplo que me enviaste ?
Me gustaría que fuese algo asi;
{
"object": "person",
"id": "dqQnNW",
"$email": "name @gmail.com",
"Pet Name 1": "George",
"Pet Type 1": "Dog",
"Pet Breed 1" "Labrador Retriever"
}
 
1:05 AM
@PatricioMoracho Te puedo hacer otra consulta ?
 
 
8 hours later…
9:14 AM
Guten morning
XD
 
9:53 AM
Hi, buenos días!
 
@Manuel hello
 
 
5 hours later…
2:57 PM
@JuanPerez Hola Juan, puedes adaptar el código que te pasé para extraer las claves que te interesen
 
3:15 PM
@PatricioMoracho Hola Patricio
{'Pet Name 1': 'Hayley'}
{'Pet Name 1': 'Hayley', 'Pet Type 1': 'Dog'}
{'Pet Name 1': 'Olive'}
{'Pet Name 1': 'Olive', 'Pet Type 1': 'Dog'}
{'Pet Name 1': 'Olive', 'Pet Type 1': 'Dog', 'Pet Breed 1': 'Russell Terrier'}
{'Pet Name 1': 'Olive', 'Pet Type 1': 'Dog', 'Pet Breed 1': 'Russell Terrier', 'Pet Birthday 1': '10/1/19'}
{'Pet Name 1': 'Micky'}
{'Pet Name 1': 'Micky', 'Pet Type 1': 'Dog'}
{'Pet Name 1': 'Micky', 'Pet Type 1': 'Dog', 'Pet Breed 1': 'Yorkshire Terrier'}
{'Pet Name 1': 'Micky', 'Pet Type 1': 'Dog', 'Pet Breed 1': 'Yorkshire Terrier', 'Pet Birthday 1': '5/1/19'}
@PatricioMoracho Al ejecutar el código que me pasaste al imprimir me sale así
@PatricioMoracho Pasa una cosa que pueden venir N veces:
Pet Name 1
Pet Type 1
Pet Breed 1
Pet Birthday 1

Pet Name 2
Pet Type 2
Pet Breed 2
Pet Birthday 2


Pet Name 3
Pet Type 3
Pet Breed 3
Pet Birthday 3
Y necesito capturarlos todos
 
 
5 hours later…
8:30 PM
Buenas.... Quien anda por acá ?
 
8:50 PM
@JuanPerez es domingo.. hoy se duerme... ssshhhh
:p
@JuanPerez que necesitas?
 
Estoy en un problema en Python estoy conectandome a la api de bigcommerce
 
@JuanPerez No entiendo
 
@PatricioMoracho Asi quedo el código que estaba implementando:
dataPerson = []

for item in dataMemberships:
    id_ = item['id']
    response = requests.get(f'{base_urlKlaviyo}/api/v1/person/{id_}', params=params)
    if response.status_code == 200:
        json_data = json.loads(response.text)
        pets= ['Pet Name 1', 'Pet Name 2', 'Pet Type 1', 'Pet Type 2', 'Pet Breed 1', 'Pet Breed 2', 'Pet Birthday 1', 'Pet Birthday 2']
        keys_resp = json_data.keys()
        for pet in pets:
            if pet in keys_resp:
                dataPerson.append(
Ahora esa respuesta que esta en dataPerson necesito actualizarla en la api de bigcommerce el metodo PUT
 
Ahora estoy más confundido que antes
 
9:05 PM
En que estas confundido ?
 
Este código que muestras no parecer ser el requerimiento que planteaste al principio
 
Si, es que se cambio un poco la logica de lo que se quería por eso te lo envíe
Solo se va a tomar en cuenta este filtro:
pets= ['Pet Name 1', 'Pet Name 2', 'Pet Type 1', 'Pet Type 2', 'Pet Breed 1', 'Pet Breed 2', 'Pet Birthday 1', 'Pet Birthday 2']
Y no las N veces como te había comentado antes
 
Bueno. y entonces cual sería el problema?
 
Ahora una vez hecha la conexión a la api de bigcommerce tengo el siguiente código
for data in dataPerson:
    dataSend = json.dumps(data)
    conn.request("PUT", "/stores/v3/customers/form-field-values", dataSend, headers)
    res = conn.getresponse()
    data = res.read()
    print(data.decode("utf-8"))
Donde necesito enviarle a ese método este formato como lo explica la pagina:
[
  {
    "customer_id": 1,
    "name": "color",
    "value": "blue"
  },
  {
    "customer_id": 1,
    "name": "weight",
    "value": 12.345
  }
]
Del código la variable dataSend tiene este formato:
{"customer_id": 12345, "name": "Pet Name 1", "value": "Hayley"}
{"customer_id": 43333, "name": "Pet Name 2", "value": "Chance"}
 
dataPerson es una lista?
 
9:12 PM
Al ejecutar me dice esto:
{"status":422,"title":"The request payload has to be a JSON array for the endpoint","type":"https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes","errors":{}}
<class 'list'>
 
A ver.. no tengo mucha idea, pero lo que entiendo es que del otro lado estaƄ esperando un JSON array, que es un JSON array?
 
@JuanPerez eso no es un json valido
 
Si correcto
 
Estas pasando de a un dataPerson por vez, ¿no deberías pasar la lista completa?
 
Es que cuando paso mas de 10 registros la api me dice esto:
{"status":413,"title":"The request payload is too large. The maximum items allowed in the array is 10","type":"https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes","errors":{}}
 
9:17 PM
Que haces Gonzalo? como te trata este domingo gris?
@JuanPerez, divide la lista DataPerson en sublistas de no más de 10 elementos
 
DataPerson contiene ID se puede hacer que al recorrerlo lo hago con sus ID
Por ejemplo:
 
@PatricioMoracho tranquilo aca escuchando musica infantil con la niña...
 
{'customer_id': 123456, 'name': 'Pet Name 1', 'value': 'Hayley'}
{'customer_id': 123456, 'name': 'Pet Name 2', 'value': 'Chance'}
{'customer_id': 123456, 'name': 'Pet Type 1', 'value': 'Dog'}
{'customer_id': 123456, 'name': 'Pet Type 2', 'value': 'Dog'}
Ya que cada cliente(ID) no puede tener mas de 10 registros por eso fue que limite acá:
pets= ['Pet Name 1', 'Pet Name 2', 'Pet Type 1', 'Pet Type 2', 'Pet Breed 1', 'Pet Breed 2', 'Pet Birthday 1', 'Pet Birthday 2']
 
Que bueno, nosotros salimos a caminar un rato, pero ya se puso fulero
 
@PatricioMoracho si aca estuvo frio todo el dia.. ni salimos...
ayer nos dedicamos a arreglar el parque... hasta sacamos un arbol.. asi que estamos todos muy cansados...
 
9:24 PM
Y sí, el laburo de jardinería es pesado, y eso que solo tengo 5 macetas..
@JuanPerez, la verdad, tendría que leer la documentación del método para entender un poco más el tema, tienes algún link?
 
Bien, sin duda se espera un array y no le estás pasando eso, pero francamente no sé nada de la lógica de negocios que hay atrás.
A ver, a lo que tienes hecho hasta ahora, lo único que le faltaría es que el objeto sea una lista, por lo que podrías probar con :
 
@PatricioMoracho El problema que tengo es como le estoy pasando la respuesta a la api
 
 dataSend = json.dumps(list(data))
 
{"status":404,"title":"Not found","type":"https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes","errors":{}}
@PatricioMoracho No se puede arreglar la data de la variable dataPerson ?
Para que ya venga con el formato adecuado de una vez ?
 
9:40 PM
El 404 es que no se encontró el endpoint? parece otro tema
Dataperson según entiendo ya es una lista, pero no se la puedes pasar por qe no se aceptan más de 10 elementos
 
for data in dataPerson:
    dataSend = json.dumps(list(data))
    print(dataSend)
["customer_id", "name", "value"]
["customer_id", "name", "value"]
["customer_id", "name", "value"]
["customer_id", "name", "value"]
["customer_id", "name", "value"]
["customer_id", "name", "value"]
["customer_id", "name", "value"]
Me trae solo esto
 
Y que imprime solo data?
 
dataPerson es <class 'list'>
{'customer_id': 12345, 'name': 'Pet Name 1', 'value': 'Hayley'}
{'customer_id': 12345, 'name': 'Pet Name 2', 'value': 'Chance'}
{'customer_id': 12345, 'name': 'Pet Type 1', 'value': 'Dog'}
{'customer_id': 12345, 'name': 'Pet Type 2', 'value': 'Dog'}
Eso es lo que me imprime solo data
 
Esa estructura no la entiendo, de hecho no puede existir.
si data es una lista sería algo así [{..}, {..}]
 
for data in dataPerson:
        conn.request("PUT", "/stores/v3/customers/form-field-values", data, headers)
        res = conn.getresponse()
        data = res.read()
        print(data.decode("utf-8"))
Asi la tengo
 
9:45 PM
pero no deberías pasar un JSON? dónde mapeas data a un payload JSON
 
Eso no lo estoy haciendo
 
¿Puedes copiar por acá lo que tiene dataPerson?
 
Perdon es este:
dataPerson = []
limit      = 10

for item in dataMemberships[:limit]:
    id_ = item['id']
    response = requests.get(f'{base_urlKlaviyo}/api/v1/person/{id_}', params=params)
    if response.status_code == 200:
        json_data = json.loads(response.text)
        pets= ['Pet Name 1', 'Pet Name 2', 'Pet Type 1', 'Pet Type 2', 'Pet Breed 1', 'Pet Breed 2', 'Pet Birthday 1', 'Pet Birthday 2']
        keys_resp = json_data.keys()
        for pet in pets:
            if pet in keys_resp:
                dataPerson.append(
@PatricioMoracho Ahi le puse un limit para que recorrer todos los registros ya que son varios
 
Bien, lo que muestras es que dataPerson es una lista, dónde cada elemento es un diccionario.
 
Correcto
 
9:52 PM
Bueno, si esa lista no tuviera más de 10 elementos, entiendo que podrías transformar todo en un JSON con algo así dataSend = json.dumps(dataPerson)
 
[{'customer_id': 123456, 'name': 'Pet Name 1', 'value': 'Hayley'}, {'customer_id': 123456, 'name': 'Pet Name 2', 'value': 'Chance'}, {'customer_id': 123456, 'name': 'Pet Type 1', 'value': 'Dog'}, {'customer_id': 123456, 'name': 'Pet Type 2', 'value': 'Dog'}]
Eso es lo que contiene dataPerson
Son mas registros pero no deja copiarlos todos
[{"customer_id": 123456, "name": "Pet Name 1", "value": "Hayley"}, {"customer_id": 123456, "name": "Pet Name 2", "value": "Chance"}, {"customer_id": 123456, "name": "Pet Type 1", "value": "Dog"}, {"customer_id": 123456, "name": "Pet Type 2", "value": "Dog"}]
Al hacer un print de dataSend = json.dumps(dataPerson)
@PatricioMoracho Ese formato esta bie
 
La limitación de los 10 registros es a nivel de POST o de lógica de negocios, es decir, si tienes 15 registros podrías hacer dos POST uno con 10 y otro con 5?
 
La limitación de los 10 registros lo hace la api atreves del metodo PUT solo se pueden enviar 10 registros
Ahora ya con el código que tenemos solo por cada cliente debe existir como máximo 8 registros
Pienso, que se tendría que hacer un for para recorrer cada cliente o cada registro que se actualice de uno en uno
 
10:14 PM
@PatricioMoracho Como lo ves ?
 
@JuanPerez Suena razonable, pero recuerda que no conozco nada de la lógica de negocios que hay detrás. Si la API te impone un límite de hasta 10 registros, tienes dos alternativas, la fácil: enviar de a un registro, la más eficiente, dividir en bloques de hasta 10 y enviar estos.
 
@PatricioMoracho Podemos probar con pocos registros enviando de un registro ?
 
Si, no debería haber problema.
 
dataSendP = json.dumps(dataPerson)
for dataUpdate in dataSendP:
   print(dataUpdate)
Estaba tratando de hacer algo asi y me muestra esto:
[
{
"
c
u
s
t
o
m
e
r
_
i
d
"
:
 
Claro, a ver.. json.dumps(dataPerson) devuelve una cadena que es el código JSON que supongo será el que debes enviar. Cuando haces for dataUpdate in dataSendP:, estas iterando sobre una simple cadena, es decir sobre cada carcter de la misma. No entiendo para que el for
 
10:25 PM
Ah vale y como seria para enviar registro por registro ?
No es necesario utilizar el for ?
Ya te entendi lo que me quieres decir
 
10:40 PM
Eventualmente si, pero sobre dataPerson
 
Ahh ok
Solo me hace falta eso y listo
@PatricioMoracho Estoy tratando de hacerlo pero no encuentro
 
11:05 PM
@PatricioMoracho Habría que crear una especie como bandera o no es necesario ?
 
Itera sobre dataPerson, cada elemento conviertelo en una lista y eso es lo que debes serializar en un json
 
for dataUpdate in dataPerson:
print(dataUpdate)
Tengo esto
Pero que hay que convertir en una lista dataUpdate ?
for dataUpdate in dataPerson:
        dataList = list(dataUpdate)
        print(dataList)
['customer_id', 'name', 'value']
['customer_id', 'name', 'value']
['customer_id', 'name', 'value']
['customer_id', 'name', 'value']
['customer_id', 'name', 'value']
['customer_id', 'name', 'value']
['customer_id', 'name', 'value']
['customer_id', 'name', 'value']
['customer_id', 'name', 'value']
['customer_id', 'name', 'value']
['customer_id', 'name', 'value']
['customer_id', 'name', 'value']
['customer_id', 'name', 'value']
['customer_id', 'name', 'value']
['customer_id', 'name', 'value']
['customer_id', 'name', 'value']
@PatricioMoracho Me muestra así
 
11:31 PM
que te muestra print(type(dataUpdate))
?
 
<class 'dict'>
 
Prueba así dataList = [dataUpdate]
 
[{'customer_id': 35593, 'name': 'Pet Name 1', 'value': 'Hayley'}]
[{'customer_id': 35593, 'name': 'Pet Name 2', 'value': 'Chance'}]
[{'customer_id': 35593, 'name': 'Pet Type 1', 'value': 'Dog'}]
[{'customer_id': 35593, 'name': 'Pet Type 2', 'value': 'Dog'}]
[{'customer_id': 33582, 'name': 'Pet Name 1', 'value': 'Olive'}]
[{'customer_id': 33582, 'name': 'Pet Type 1', 'value': 'Dog'}]
[{'customer_id': 33582, 'name': 'Pet Breed 1', 'value': 'Russell Terrier'}]
[{'customer_id': 33582, 'name': 'Pet Birthday 1', 'value': '10/1/19'}]
 
Cada una de estas lineas sería lo que enviarías en el PUT
 
Y con eso se resolvería el problema sin hacer mas nada ?
Se va a registrar de registro en uno
?
 
11:46 PM
Lo que te puedo decir es que con esto enviarías un PUT solo de a un diccionario o registro por vez, si eso te sirve o funciona ya es otro tema que a mi se me escapa.
 
Lo voy a probar
dataSend=json.dumps(dataPerson [0:8])
Por ejemplo si yo hago esto ahi se guardar perfecto
try:
    for dataUpdate in dataPerson:
        dataList = [dataUpdate]
        conn.request("PUT", "/stores/bgjc1kd1rm/v3/customers/form-field-values", dataList, headers)
        res = conn.getresponse()
        data = res.read()
        print(data.decode("utf-8"))
except Exception as e:
        exc_type, exc_obj, exc_tb = sys.exc_info()
        message = {
            'Error': str(exc_type),
            'Line Number': str(exc_tb.tb_lineno),
            'Details': str(e)
        }
        print(message)
Asi quedaría el codigo lo voy a probar
@PatricioMoracho Me dio este error:
{'Error': "<class 'TypeError'>", 'Line Number': '4', 'Details': "can't concat dict to bytes"}
Pero no estamos enviando el dataSend ?
 
Te olvidás de serializar el objeto
 
O solo basta con dataList
json.dumps(dataList)
Te refieres a esto ?
 
dataList = json.dumps([dataUpdate]), en todo caso, aunque dataList ya no es una lista sino una cadena
 
{"data":[{"name":"Pet Name 1","value":"Hayley","customer_id":35593}],"meta":{}}
{"data":[{"name":"Pet Name 2","value":"Chance","customer_id":35593}],"meta":{}}
{"data":[{"name":"Pet Type 1","value":"Dog","customer_id":35593}],"meta":{}}
{"data":[{"name":"Pet Type 2","value":"Dog","customer_id":35593}],"meta":{}}
{"data":[{"name":"Pet Name 1","value":"Olive","customer_id":33582}],"meta":{}}
{"data":[{"name":"Pet Type 1","value":"Dog","customer_id":33582}],"meta":{}}
{"data":[{"name":"Pet Breed 1","value":"Russell Terrier","customer_id":33582}],"meta":{}}
Listo ya lo pude resolver era problema con la fecha el formato
 

« first day (1794 days earlier)      last day (27 days later) »