def test_class_nested_array(self): peeps = [] names = ['bob', 'jim', 'peabody', 'mumblesleves'] for name in names: a = Person() a.name = name a.birthdate = datetime.datetime(1979, 1, 1) a.age = 27 a.addresses = [] for i in range(0, 25): addr = Address() addr.street = '555 downtown' addr.city = 'funkytown' a.addresses.append(addr) peeps.append(a) arr = Array(Person) arr.resolve_namespace(arr, __name__) element = etree.Element('test') XmlDocument().to_parent(None, arr, peeps, element, ns_test) element = element[0] self.assertEquals(4, len(element.getchildren())) peeps2 = XmlDocument().from_element(None, arr, element) for peep in peeps2: self.assertEquals(27, peep.age) self.assertEquals(25, len(peep.addresses)) self.assertEquals('funkytown', peep.addresses[18].city)
def test_class_array(self): peeps = [] names = ['bob', 'jim', 'peabody', 'mumblesleeves'] dob = datetime.datetime(1979, 1, 1, tzinfo=pytz.utc) for name in names: a = Person() a.name = name a.birthdate = dob a.age = 27 peeps.append(a) type = Array(Person) type.resolve_namespace(type, __name__) element = etree.Element('test') XmlDocument().to_parent(None, type, peeps, element, ns_test) element = element[0] self.assertEquals(4, len(element.getchildren())) peeps2 = XmlDocument().from_element(None, type, element) for i in range(0, 4): self.assertEquals(peeps2[i].name, names[i]) self.assertEquals(peeps2[i].birthdate, dob)
def test_cust_array_again(self): A = Array(Unicode) A = A.customize(foo='bar') assert A.Attributes.foo == 'bar' assert A.__orig__ is Array assert A.__extends__ is None assert issubclass(A, Array)
def test_cust_array_serializer(self): A = Array(Unicode) A = A.customize(serializer_attrs=dict(max_len=10)) serializer, = A._type_info.values() assert serializer.Attributes.max_len == 10 assert serializer.__orig__ is Unicode assert issubclass(serializer, Unicode)
def test_array_empty(self): type = Array(String) type.resolve_namespace(type, "zbank") values = [] element = etree.Element('test') XmlDocument().to_parent(None, type, values, element, ns_test) element = element[0] self.assertEquals(len(values), len(element.getchildren())) values2 = XmlDocument().from_element(None, type, element) self.assertEquals(len(values2), 0)
class Category(ComplexModel): id = XmlData(Integer(min_occurs=1, max_occurs=1, nillable=False)) children = Array(Unicode)
def test_array_type_name(self): assert Array(String, type_name='punk').__type_name__ == 'punk'
class Level1(ComplexModel): level2 = Level2 level3 = Array(Level3) level4 = Array(Level4)
class A(ComplexModel): s = Array(Unicode)
class CardListScreen(ScreenBase): main = Array( Card.customize(child_attrs=dict( id=dict(prot=HrefWidget("/get_card?id={}")), ), ), prot=HtmlColumnTable(before_table=_write_new_card_link), )
class CCM(ComplexModel): c = Array(CM)
class InfractionManagementService(ServiceBase): @rpc(_returns=Array(InfractionComplex)) def infraction_list(self): list_infractions = Infraction.objects.values( 'id', 'date', 'road_type', 'road_name', 'municipality', 'location', 'plate', 'infraction_code', 'vehicle_type', 'vehicle_service', 'offender_type', 'offender_document_type', 'offender_document_id', 'offender_name', 'offender_license_id', 'offender_address', 'offender_age', 'offender_phone', 'offender_mail', 'owner_document_type', 'owner_document_id', 'owner_name', 'company_id', 'company_name', 'transit_agent_name', 'transit_agent_entity', 'transit_agent_id', 'transit_agent_observations', 'document_url', 'state', 'state_date') return list_infractions @rpc(InfractionComplex, _returns=InfractionComplex) def add_infraction(self, infraction): data = infraction.as_dict() try: inf = Infraction.objects.create(**data) sendmailnotification = SendMailNotifications() sendmailnotification.send_mail( list_emails=[data['offender_mail']], subject='Multa de Transito - Simit Services', content_xml='<h2>Multa de Transito N0: ' + str(inf.id) + '</h2></br><p>' + 'Estimado Infractor se ha creado una nueva Multa de Transito asociado al ciudadano ' + str(inf.offender_document_id) + ' - ' + str(inf.offender_name) + '</p></br><p>Realice el pago lo mas pronto posible para evitar sanciones</p>' + '<br><h3>SIMIT Services</h3>') return Infraction.objects.filter(id=inf.id).values( 'id', 'date', 'road_type', 'road_name', 'municipality', 'location', 'plate', 'infraction_code', 'vehicle_type', 'vehicle_service', 'offender_type', 'offender_document_type', 'offender_document_id', 'offender_name', 'offender_license_id', 'offender_address', 'offender_age', 'offender_phone', 'offender_mail', 'owner_document_type', 'owner_document_id', 'owner_name', 'company_id', 'company_name', 'transit_agent_name', 'transit_agent_entity', 'transit_agent_id', 'transit_agent_observations', 'document_url', 'state', 'state_date').first() except IntegrityError as e: raise Fault(faultcode=str(e.args[0]), faultstring=e.args[1]) @rpc(InfractionComplex, _returns=InfractionComplex) def edit_infraction(self, infraction): data = infraction.as_dict() try: Infraction.objects.filter(id=data['id']).update(**data) return Infraction.objects.filter(id=data['id']).values( 'id', 'date', 'road_type', 'road_name', 'municipality', 'location', 'plate', 'infraction_code', 'vehicle_type', 'vehicle_service', 'offender_type', 'offender_document_type', 'offender_document_id', 'offender_name', 'offender_license_id', 'offender_address', 'offender_age', 'offender_phone', 'offender_mail', 'owner_document_type', 'owner_document_id', 'owner_name', 'company_id', 'company_name', 'transit_agent_name', 'transit_agent_entity', 'transit_agent_id', 'transit_agent_observations', 'document_url', 'state', 'state_date').first() except IntegrityError as e: raise Fault(faultcode=str(e.args[0]), faultstring=e.args[1]) @rpc(Integer, _returns=String) def delete_infraction(self, id): try: Infraction.objects.filter(id=id).delete() return 'Infraction ' + str(id) + ' as deleted' except ProtectedError as e: raise Fault(faultcode='400', faultstring=e.args[0]) @rpc(Integer, _returns=InfractionComplex) def find_infraction(self, id): try: infraction = Infraction.objects.get(pk=id) return infraction except IntegrityError as e: raise Fault(faultcode=str(e.args[0]), faultstring=e.args[1]) except Infraction.DoesNotExist: raise Fault(faultcode='404', faultstring=str('Infraction not exist'))
class SoapService(ServiceBase): @rpc(Client, _returns=ResponseText) def createUsuario(ctx, cliente): res = ResponseText() sc = models.Cliente.objects.filter(nombreUsuario=cliente.nombreUsuario) if sc.count() == 0: try: usu = models.Cliente(nombreUsuario=cliente.nombreUsuario, nombre=cliente.nombre, edad=cliente.edad, contrasena=cliente.contrasena, descripcion=cliente.descripcion, telefono=cliente.telefono) if (len(cliente.tipo) > 2 and len(cliente.foto[0]) > 10): ty = cliente.tipo.split("/")[1] with open( CLIENT_IMAGES + cliente.nombreUsuario + "_profile." + ty, "wb") as f: for x in cliente.foto: f.write(x) f.close() usu.foto = cliente.nombreUsuario + "_profile." + ty usu.save() res.resultado = "usuario creado con exito" return res except: res.resultado = "error al crear usuario" return res res.resultado = "el nombre de usuario no esta disponible" return res @rpc(String(), _returns=[ResponseText, ClientRes]) def readUsuario(ctx, userName): sc = models.Cliente.objects.filter(nombreUsuario=userName) if (sc.count() > 0): usu = sc[0] res = ResponseText() cli = ClientRes() res.resultado = "usuario leido con exito" cli.nombreUsuario = usu.nombreUsuario cli.nombre = usu.nombre cli.edad = usu.edad if (len(usu.foto) > 3): in_file = open(CLIENT_IMAGES + usu.foto, "rb") d = in_file.read() fo = base64.b64encode(d) cli.foto = fo.decode('ascii') in_file.close() cli.tipo = usu.foto.split(".") cli.tipo = cli.tipo[len(cli.tipo) - 1] cli.descripcion = usu.descripcion cli.telefono = usu.telefono retval = [res, cli] return retval res = ResponseText() res.resultado = "usuario no existe" retval = [res, Client()] return retval @rpc(String, Client, _returns=ResponseText) def updateUsuario(ctx, nomUsuCli, cliente): sc = models.Cliente.objects.filter(nombreUsuario=nomUsuCli) res = ResponseText() if sc.count() > 0: try: cli = sc[0] cli.nombreUsuario = cliente.nombreUsuario cli.nombre = cliente.nombre cli.edad = cliente.edad cli.contrasena = cliente.contrasena if (len(cliente.tipo) > 2 and len(cliente.foto[0]) > 10): print(len(cli.foto)) if (len(cli.foto) > 1): os.remove(CLIENT_IMAGES + cli.foto) ty = cliente.tipo.split("/")[1] #os.mkdir(os.path.dirname(CLIENT_IMAGES+cliente.nombreUsuario+"_profile."+ty)) with open( CLIENT_IMAGES + cliente.nombreUsuario + "_profile." + ty, "wb+") as f: for x in cliente.foto: f.write(x) f.close() cli.foto = cliente.nombreUsuario + "_profile." + ty else: cli.foto = " " cli.descripcion = cliente.descripcion cli.telefono = cliente.telefono cli.save() res.resultado = "actualizacion realizada exitosamente" return res except: res.resultado = "error al actualizar cliente" return res res.resultado = "no hay un usuario registrado con ese nombre de usuario" return res @rpc(String(), _returns=ResponseText) def deleteUsuario(ctx, nombreUsuario): sc = models.Cliente.objects.filter(nombreUsuario=nombreUsuario) res = ResponseText() if (sc.count() > 0): try: usu = sc[0] if (len(usu.foto) > 2): os.remove(CLIENT_IMAGES + usu.foto) usu.delete() res.resultado = "usuario eliminado con exito" return res except: res.resultado = "error al borrar usuario" return res res.resultado = "usuario no existe en el sistema" return res @rpc(_returns=Array(ClientRes)) def getAllUsuarios(ctx): ret = [] list = models.Cliente.objects.all() for u in list: aux = ClientRes() aux.nombreUsuario = u.nombreUsuario aux.nombre = u.nombre aux.edad = u.edad if (len(u.foto) > 1): in_file = open(CLIENT_IMAGES + u.foto, "rb") d = in_file.read() fo = base64.b64encode(d) aux.foto = fo.decode('ascii') in_file.close() aux.tipo = u.foto.split(".") aux.tipo = aux.tipo[len(aux.tipo) - 1] aux.descripcion = u.descripcion aux.telefono = u.telefono ret.append(aux) return ret @rpc(Proveedor, _returns=ResponseText) def createProveedor(ctx, proveedor): res = ResponseText() sc = models.Proveedor.objects.filter( nombreUsuario=proveedor.nombreUsuario) if sc.count() == 0: try: prov = models.Proveedor(nombreUsuario=proveedor.nombreUsuario, nombre=proveedor.nombre, edad=proveedor.edad, contrasena=proveedor.contrasena, descripcion=proveedor.descripcion, telefono=proveedor.telefono, paginaWeb=proveedor.paginaWeb, contactoRS=proveedor.contactoRS) if (len(proveedor.tipo) > 2 and len(proveedor.foto[0]) > 10): ty = proveedor.tipo.split("/")[1] with open( PROVIDER_IMAGES + proveedor.nombreUsuario + "_profile." + ty, "wb+") as f: for x in proveedor.foto: f.write(x) f.close() prov.foto = proveedor.nombreUsuario + "_profile." + ty prov.save() res.resultado = "proveedor creado con exito" return res except: res.resultado = "error al crear proveedor" return res res.resultado = "el nombre del proveedor no esta disponible" return res @rpc(String(), _returns=[ResponseText, ProveedorRes]) def readProveedor(ctx, provName): sc = models.Proveedor.objects.filter(nombreUsuario=provName) if (sc.count() > 0): usu = sc[0] res = ResponseText() prov = ProveedorRes() res.resultado = "usuario leido con exito" prov.nombreUsuario = usu.nombreUsuario prov.nombre = usu.nombre prov.edad = usu.edad if (len(usu.foto) > 3): in_file = open(PROVIDER_IMAGES + usu.foto, "rb") d = in_file.read() fo = base64.b64encode(d) prov.foto = fo.decode('ascii') in_file.close() prov.tipo = usu.foto.split(".") prov.tipo = prov.tipo[len(prov.tipo) - 1] prov.descripcion = usu.descripcion prov.telefono = usu.telefono prov.paginaWeb = usu.paginaWeb prov.contactoRS = usu.contactoRS retval = [res, prov] return retval res = ResponseText() res.resultado = "usuario no existe" retval = [res, Proveedor()] return retval @rpc(String, Proveedor, _returns=ResponseText) def updateProveedor(ctx, nomUsuProv, proveedor): sc = models.Proveedor.objects.filter(nombreUsuario=nomUsuProv) res = ResponseText() if sc.count() > 0: try: cli = sc[0] cli.nombreUsuario = proveedor.nombreUsuario cli.nombre = proveedor.nombre cli.edad = proveedor.edad cli.contrasena = proveedor.contrasena if (len(proveedor.tipo) > 2 and len(proveedor.foto[0]) > 10): print(len(cli.foto)) if (len(cli.foto) > 1): os.remove(PROVIDER_IMAGES + cli.foto) ty = proveedor.tipo.split("/")[1] with open( PROVIDER_IMAGES + cli.nombreUsuario + "_profile." + ty, "wb+") as f: for x in proveedor.foto: f.write(x) f.close() cli.foto = proveedor.nombreUsuario + "_profile." + ty else: cli.foto = " " cli.descripcion = proveedor.descripcion cli.telefono = proveedor.telefono cli.paginaWeb = proveedor.paginaWeb cli.contactoRS = proveedor.contactoRS cli.save() res.resultado = "actualizacion realizada exitosamente" return res except: res.resultado = "error al actualizar proveedor" return res res.resultado = "no hay un proveedor registrado con ese nombre de usuario" return res @rpc(String(), _returns=ResponseText) def deleteProveedor(ctx, nombreUsuario): sc = models.Proveedor.objects.filter(nombreUsuario=nombreUsuario) res = ResponseText() if (sc.count() > 0): try: usu = sc[0] if (len(usu.foto) > 2): os.remove(PROVIDER_IMAGES + usu.foto) usu.delete() res.resultado = "proveedor eliminado con exito" return res except: res.resultado = "error al borrar proveedor" return res res.resultado = "proveedor no existe en el sistema" return res @rpc(_returns=Array(ProveedorRes)) def getAllProveedores(ctx): ret = [] list = models.Proveedor.objects.all() for u in list: aux = ProveedorRes() aux.nombreUsuario = u.nombreUsuario aux.nombre = u.nombre aux.edad = u.edad if (len(u.foto) > 1): in_file = open(PROVIDER_IMAGES + u.foto, "rb") d = in_file.read() fo = base64.b64encode(d) aux.foto = fo.decode('ascii') in_file.close() aux.tipo = u.foto.split(".") aux.tipo = aux.tipo[len(aux.tipo) - 1] aux.descripcion = u.descripcion aux.telefono = u.telefono aux.paginaWeb = u.paginaWeb aux.contactoRS = u.contactoRS ret.append(aux) return ret @rpc(Alimentacion, _returns=ResponseText) def createServicioAlimentacion(ctx, servicio): res = ResponseText() sc = models.Proveedor.objects.filter( nombreUsuario=servicio.nombreProveedor) if sc.count() > 0: serv = models.Alimentacion(nombre=servicio.nombre, pais=servicio.pais, ciudad=servicio.ciudad, idioma=servicio.idioma, costo=servicio.costo, descripcion=servicio.descripcion, numeroPersonas=servicio.numeroPersonas) serv.proveedor = sc[0] serv.tipoComida = servicio.tipoComida print(serv.id) serv.cantidadPlatos = servicio.cantidadPlatos if (len(servicio.tipo) > 2 and len(servicio.foto[0]) > 10): ty = servicio.tipo.split("/")[1] cons = models.Servicio.objects.filter(proveedor=sc[0]).count() n = SERVICE_IMAGES + servicio.nombre + str( cons) + "_" + servicio.nombreProveedor + "img." + ty with open(n, "wb") as f: for x in servicio.foto: f.write(x) f.close() serv.foto = servicio.nombre + str( cons) + "_" + servicio.nombreProveedor + "img." + ty serv.save() res.resultado = "Servicio creado con exito" return res res.resultado = "No existe un Proveedor identificado con ese nombre" return res @rpc(Integer(), Alimentacion, _returns=ResponseText) def updateServicioAlimentacion(ctx, idServicio, servAlimentacion): res = ResponseText() sc = models.Alimentacion.objects.filter(id=idServicio) if sc.count() > 0: ser = sc[0] ser.nombre = servAlimentacion.nombre ser.pais = servAlimentacion.pais ser.ciudad = servAlimentacion.ciudad ser.idioma = servAlimentacion.idioma ser.costo = servAlimentacion.costo ser.descripcion = servAlimentacion.descripcion if (len(servAlimentacion.tipo) > 2 and len(servAlimentacion.foto[0]) > 10): if (len(ser.foto) > 1): os.remove(SERVICE_IMAGES + ser.foto) ty = servAlimentacion.tipo.split("/")[1] n = servAlimentacion.nombre + str( ser.id - 1) + "_" + servAlimentacion.nombreProveedor + "img." + ty ser.foto = n with open(SERVICE_IMAGES + n, "wb") as f: for x in servAlimentacion.foto: f.write(x) f.close() else: if (len(ser.foto) > 1): os.remove(SERVICE_IMAGES + ser.foto) ser.foto = " " ser.numeroPersonas = servAlimentacion.numeroPersonas ser.cantidadPlatos = servAlimentacion.cantidadPlatos ser.tipoComida = servAlimentacion.tipoComida res.resultado = "encontrado" ser.save() return res @rpc(_returns=[Boolean, Array(AlimentacionRes)]) def getServiciosAlimentaicon(ctx): list = models.Alimentacion.objects.all() res = [] for ser in list: aux = AlimentacionRes() aux.id = ser.id aux.nombre = ser.nombre aux.pais = ser.pais aux.ciudad = ser.ciudad aux.idioma = ser.idioma aux.costo = ser.costo aux.descripcion = ser.descripcion if (len(ser.foto) > 3): in_file = open(SERVICE_IMAGES + ser.foto, "rb") d = in_file.read() fo = base64.b64encode(d) aux.foto = fo.decode('ascii') in_file.close() aux.tipo = ser.foto.split(".") aux.tipo = aux.tipo[len(aux.tipo) - 1] else: aux.foto = " " aux.numeroPersonas = ser.numeroPersonas aux.nombreProveedor = ser.proveedor.nombreUsuario aux.tipoComida = ser.tipoComida aux.cantidadPlatos = ser.cantidadPlatos res.append(aux) p = True if (len(res) == 0): p = False return [p, res] @rpc(Integer(), _returns=ResponseText) def deleteServicio(ctx, id_servicio): sc = models.Servicio.objects.filter(id=id_servicio) res = ResponseText() if (sc.count() > 0): try: usu = sc[0] if (len(usu.foto) > 2): os.remove(SERVICE_IMAGES + usu.foto) usu.delete() res.resultado = "servicio eliminado con exito" return res except: res.resultado = "error al borrar servicio" return res res.resultado = "servicio no existe en el sistema" return res @rpc(PaseoEcologico, _returns=ResponseText) def createServicioPaseoEcologico(ctx, servicio): res = ResponseText() sc = models.Proveedor.objects.filter( nombreUsuario=servicio.nombreProveedor) if sc.count() > 0: serv = models.PaseoEcologico( nombre=servicio.nombre, pais=servicio.pais, ciudad=servicio.ciudad, idioma=servicio.idioma, costo=servicio.costo, descripcion=servicio.descripcion, numeroPersonas=servicio.numeroPersonas) serv.proveedor = sc[0] serv.origen = servicio.origen serv.destino = servicio.destino serv.horaInicio = servicio.horaInicio serv.horaFin = servicio.horaFin if (len(servicio.tipo) > 2 and len(servicio.foto[0]) > 10): ty = servicio.tipo.split("/")[1] cons = models.Servicio.objects.filter(proveedor=sc[0]).count() n = SERVICE_IMAGES + servicio.nombre + str( cons) + "_" + servicio.nombreProveedor + "img." + ty with open(n, "wb") as f: for x in servicio.foto: f.write(x) f.close() serv.foto = servicio.nombre + str( cons) + "_" + servicio.nombreProveedor + "img." + ty serv.save() res.resultado = "Servicio creado con exito" return res res.resultado = "No existe un Proveedor identificado con ese nombre" return res @rpc(Integer(), PaseoEcologico, _returns=ResponseText) def updateServicioPaseoEcologico(ctx, idServicio, serv): res = ResponseText() sc = models.PaseoEcologico.objects.filter(id=idServicio) if sc.count() > 0: ser = sc[0] ser.nombre = serv.nombre ser.pais = serv.pais ser.ciudad = serv.ciudad ser.idioma = serv.idioma ser.costo = serv.costo ser.descripcion = serv.descripcion if (len(serv.tipo) > 2 and len(serv.foto[0]) > 10): if (len(ser.foto) > 1): os.remove(SERVICE_IMAGES + ser.foto) ty = serv.tipo.split("/")[1] n = serv.nombre + str( ser.id - 1) + "_" + serv.nombreProveedor + "img." + ty ser.foto = n with open(SERVICE_IMAGES + n, "wb") as f: for x in serv.foto: f.write(x) f.close() else: if (len(ser.foto) > 1): os.remove(SERVICE_IMAGES + ser.foto) ser.foto = " " ser.numeroPersonas = serv.numeroPersonas ser.origen = serv.origen ser.destino = serv.destino ser.horaInicio = serv.horaInicio ser.horaFin = serv.horaFin res.resultado = "encontrado" ser.save() return res @rpc(_returns=[Boolean, Array(PaseoEcologicoRes)]) def getServiciosPaseoEcologico(ctx): list = models.PaseoEcologico.objects.all() res = [] for ser in list: aux = PaseoEcologicoRes() aux.id = ser.id aux.nombre = ser.nombre aux.pais = ser.pais aux.ciudad = ser.ciudad aux.idioma = ser.idioma aux.costo = ser.costo aux.descripcion = ser.descripcion if (len(ser.foto) > 3): in_file = open(SERVICE_IMAGES + ser.foto, "rb") d = in_file.read() fo = base64.b64encode(d) aux.foto = fo.decode('ascii') in_file.close() aux.tipo = ser.foto.split(".") aux.tipo = aux.tipo[len(aux.tipo) - 1] else: aux.foto = " " aux.numeroPersonas = ser.numeroPersonas aux.nombreProveedor = ser.proveedor.nombreUsuario aux.origen = ser.origen aux.destino = ser.destino aux.horaInicio = ser.horaInicio aux.horaFin = ser.horaFin res.append(aux) p = True if (len(res) == 0): p = False return [p, res] @rpc(Alojamiento, _returns=ResponseText) def createServicioAlojamiento(ctx, servicio): res = ResponseText() sc = models.Proveedor.objects.filter( nombreUsuario=servicio.nombreProveedor) if sc.count() > 0: serv = models.Alojamiento(nombre=servicio.nombre, pais=servicio.pais, ciudad=servicio.ciudad, idioma=servicio.idioma, costo=servicio.costo, descripcion=servicio.descripcion, numeroPersonas=servicio.numeroPersonas) serv.proveedor = sc[0] serv.tipoAlojamiento = servicio.tipoAlojamiento serv.numeroHabitaciones = servicio.numeroHabitaciones serv.numeroBanos = servicio.numeroBanos serv.servicioLimpieza = servicio.servicioLimpieza serv.servicioWifi = servicio.servicioWifi if (len(servicio.tipo) > 2 and len(servicio.foto[0]) > 10): ty = servicio.tipo.split("/")[1] cons = models.Servicio.objects.filter(proveedor=sc[0]).count() n = SERVICE_IMAGES + servicio.nombre + str( cons) + "_" + servicio.nombreProveedor + "img." + ty with open(n, "wb") as f: for x in servicio.foto: f.write(x) f.close() serv.foto = servicio.nombre + str( cons) + "_" + servicio.nombreProveedor + "img." + ty serv.save() res.resultado = "Servicio creado con exito" return res res.resultado = "No existe un Proveedor identificado con ese nombre" return res @rpc(Integer(), Alojamiento, _returns=ResponseText) def updateServicioAlojamiento(ctx, idServicio, serv): res = ResponseText() sc = models.Alojamiento.objects.filter(id=idServicio) if sc.count() > 0: ser = sc[0] ser.nombre = serv.nombre ser.pais = serv.pais ser.ciudad = serv.ciudad ser.idioma = serv.idioma ser.costo = serv.costo ser.descripcion = serv.descripcion if (len(serv.tipo) > 2 and len(serv.foto[0]) > 10): if (len(ser.foto) > 1): os.remove(SERVICE_IMAGES + ser.foto) ty = serv.tipo.split("/")[1] n = serv.nombre + str( ser.id - 1) + "_" + serv.nombreProveedor + "img." + ty ser.foto = n with open(SERVICE_IMAGES + n, "wb") as f: for x in serv.foto: f.write(x) f.close() else: if (len(ser.foto) > 1): os.remove(SERVICE_IMAGES + ser.foto) ser.foto = " " ser.numeroPersonas = serv.numeroPersonas ser.tipoAlojamiento = serv.tipoAlojamiento ser.numeroHabitaciones = serv.numeroHabitaciones ser.numeroBanos = serv.numeroBanos ser.servicioLimpieza = serv.servicioLimpieza ser.servicioWifi = serv.servicioWifi res.resultado = "encontrado" ser.save() return res @rpc(_returns=[Boolean, Array(AlojamientoRes)]) def getServiciosAlojamiento(ctx): list = models.Alojamiento.objects.all() res = [] for ser in list: aux = AlojamientoRes() aux.id = ser.id aux.nombre = ser.nombre aux.pais = ser.pais aux.ciudad = ser.ciudad aux.idioma = ser.idioma aux.costo = ser.costo aux.descripcion = ser.descripcion if (len(ser.foto) > 3): in_file = open(SERVICE_IMAGES + ser.foto, "rb") d = in_file.read() fo = base64.b64encode(d) aux.foto = fo.decode('ascii') in_file.close() aux.tipo = ser.foto.split(".") aux.tipo = aux.tipo[len(aux.tipo) - 1] else: aux.foto = " " aux.numeroPersonas = ser.numeroPersonas aux.nombreProveedor = ser.proveedor.nombreUsuario aux.tipoAlojamiento = ser.tipoAlojamiento aux.numeroHabitaciones = ser.numeroHabitaciones aux.numeroBanos = ser.numeroBanos aux.servicioLimpieza = ser.servicioLimpieza aux.servicioWifi = ser.servicioWifi res.append(aux) p = True if (len(res) == 0): p = False return [p, res] @rpc(Transporte, _returns=ResponseText) def createServicioTransporte(ctx, servicio): res = ResponseText() sc = models.Proveedor.objects.filter( nombreUsuario=servicio.nombreProveedor) if sc.count() > 0: serv = models.Transporte(nombre=servicio.nombre, pais=servicio.pais, ciudad=servicio.ciudad, idioma=servicio.idioma, costo=servicio.costo, descripcion=servicio.descripcion, numeroPersonas=servicio.numeroPersonas) serv.proveedor = sc[0] serv.empresa = servicio.empresa serv.tipoTransporte = servicio.tipoTransporte serv.origen = servicio.origen serv.destino = servicio.destino serv.horaSalida = servicio.horaSalida serv.horaLlegada = servicio.horaLlegada if (len(servicio.tipo) > 2 and len(servicio.foto[0]) > 10): ty = servicio.tipo.split("/")[1] cons = models.Servicio.objects.filter(proveedor=sc[0]).count() n = SERVICE_IMAGES + servicio.nombre + str( cons) + "_" + servicio.nombreProveedor + "img." + ty with open(n, "wb") as f: for x in servicio.foto: f.write(x) f.close() serv.foto = servicio.nombre + str( cons) + "_" + servicio.nombreProveedor + "img." + ty serv.save() res.resultado = "Servicio creado con exito" return res res.resultado = "No existe un Proveedor identificado con ese nombre" return res @rpc(Integer(), Transporte, _returns=ResponseText) def updateServicioTransporte(ctx, idServicio, servicio): res = ResponseText() sc = models.Transporte.objects.filter(id=idServicio) if sc.count() > 0: ser = sc[0] ser.nombre = servicio.nombre ser.pais = servicio.pais ser.ciudad = servicio.ciudad ser.idioma = servicio.idioma ser.costo = servicio.costo ser.descripcion = servicio.descripcion if (len(servicio.tipo) > 2 and len(servicio.foto[0]) > 10): if (len(ser.foto) > 1): os.remove(SERVICE_IMAGES + ser.foto) ty = servicio.tipo.split("/")[1] n = servicio.nombre + str( ser.id - 1) + "_" + servicio.nombreProveedor + "img." + ty ser.foto = n with open(SERVICE_IMAGES + n, "wb") as f: for x in servicio.foto: f.write(x) f.close() else: if (len(ser.foto) > 1): os.remove(SERVICE_IMAGES + ser.foto) ser.foto = " " ser.numeroPersonas = servicio.numeroPersonas ser.empresa = servicio.empresa ser.tipoTransporte = servicio.tipoTransporte ser.origen = servicio.origen ser.destino = servicio.destino ser.horaSalida = servicio.horaSalida ser.horaLlegada = servicio.horaLlegada res.resultado = "encontrado" ser.save() return res @rpc(_returns=[Boolean, Array(TransporteRes)]) def getServiciosTransporte(ctx): list = models.Transporte.objects.all() res = [] for ser in list: aux = TransporteRes() aux.id = ser.id aux.nombre = ser.nombre aux.pais = ser.pais aux.ciudad = ser.ciudad aux.idioma = ser.idioma aux.costo = ser.costo aux.descripcion = ser.descripcion if (len(ser.foto) > 3): in_file = open(SERVICE_IMAGES + ser.foto, "rb") d = in_file.read() fo = base64.b64encode(d) aux.foto = fo.decode('ascii') in_file.close() aux.tipo = ser.foto.split(".") aux.tipo = aux.tipo[len(aux.tipo) - 1] else: aux.foto = " " aux.numeroPersonas = ser.numeroPersonas aux.nombreProveedor = ser.proveedor.nombreUsuario aux.empresa = ser.empresa aux.tipoTransporte = ser.tipoTransporte aux.origen = ser.origen aux.destino = ser.destino aux.horaSalida = ser.horaSalida aux.horaLlegada = ser.horaLlegada res.append(aux) p = True if (len(res) == 0): p = False return [p, res] @rpc(_returns=[Boolean, Array(ServicioRes)]) def getServicios(ctx): list = models.Servicio.objects.all() res = [] for ser in list: aux = None if (isinstance(ser, models.Alimentacion)): aux = AlimentacionRes() aux.tipoServicio = "Alimentacion" aux.tipoComida = ser.tipoComida aux.cantidadPlatos = ser.cantidadPlatos elif (isinstance(ser, models.PaseoEcologico)): aux = PaseoEcologicoRes() aux.origen = ser.origen aux.destino = ser.destino aux.horaInicio = ser.horaInicio aux.horaFin = ser.horaFin aux.tipoServicio = "PaseoEcologico" elif (isinstance(ser, models.Alojamiento)): aux = AlojamientoRes() aux.tipoServicio = "Alojamiento" aux.tipoAlojamiento = ser.tipoAlojamiento aux.numeroHabitaciones = ser.numeroHabitaciones aux.numeroBanos = ser.numeroBanos aux.servicioLimpieza = ser.servicioLimpieza aux.servicioWifi = ser.servicioWifi elif (isinstance(ser, models.Transporte)): aux = TransporteRes() aux.tipoServicio = "Transporte" aux.empresa = ser.empresa aux.tipoTransporte = ser.tipoTransporte aux.origen = ser.origen aux.destino = ser.destino aux.horaSalida = ser.horaSalida aux.horaLlegada = ser.horaLlegada aux.id = ser.id aux.nombre = ser.nombre aux.pais = ser.pais aux.ciudad = ser.ciudad aux.idioma = ser.idioma aux.costo = ser.costo aux.descripcion = ser.descripcion if (len(ser.foto) > 3): in_file = open(SERVICE_IMAGES + ser.foto, "rb") d = in_file.read() fo = base64.b64encode(d) aux.foto = fo.decode('ascii') in_file.close() aux.tipo = ser.foto.split(".") aux.tipo = aux.tipo[len(aux.tipo) - 1] else: aux.foto = "*" aux.numeroPersonas = ser.numeroPersonas aux.nombreProveedor = ser.proveedor.nombreUsuario res.append(aux) p = True if (len(res) == 0): p = False return [p, res] @rpc(String, _returns=[Boolean, Array(ServicioRes)]) def getServiciosProveedor(ctx, nombreUsuario): list = models.Servicio.objects.filter( proveedor__nombreUsuario=nombreUsuario) res = [] for ser in list: aux = None if (isinstance(ser, models.Alimentacion)): aux = AlimentacionRes() aux.tipoServicio = "Alimentacion" aux.tipoComida = ser.tipoComida aux.cantidadPlatos = ser.cantidadPlatos elif (isinstance(ser, models.PaseoEcologico)): aux = PaseoEcologicoRes() aux.origen = ser.origen aux.destino = ser.destino aux.horaInicio = ser.horaInicio aux.horaFin = ser.horaFin aux.tipoServicio = "PaseoEcologico" elif (isinstance(ser, models.Alojamiento)): aux = AlojamientoRes() aux.tipoServicio = "Alojamiento" aux.tipoAlojamiento = ser.tipoAlojamiento aux.numeroHabitaciones = ser.numeroHabitaciones aux.numeroBanos = ser.numeroBanos aux.servicioLimpieza = ser.servicioLimpieza aux.servicioWifi = ser.servicioWifi elif (isinstance(ser, models.Transporte)): aux = TransporteRes() aux.tipoServicio = "Transporte" aux.empresa = ser.empresa aux.tipoTransporte = ser.tipoTransporte aux.origen = ser.origen aux.destino = ser.destino aux.horaSalida = ser.horaSalida aux.horaLlegada = ser.horaLlegada aux.id = ser.id aux.nombre = ser.nombre aux.pais = ser.pais aux.ciudad = ser.ciudad aux.idioma = ser.idioma aux.costo = ser.costo aux.descripcion = ser.descripcion if (len(ser.foto) > 3): in_file = open(SERVICE_IMAGES + ser.foto, "rb") d = in_file.read() fo = base64.b64encode(d) aux.foto = fo.decode('ascii') in_file.close() aux.tipo = ser.foto.split(".") aux.tipo = aux.tipo[len(aux.tipo) - 1] else: aux.foto = " " aux.numeroPersonas = ser.numeroPersonas aux.nombreProveedor = ser.proveedor.nombreUsuario res.append(aux) p = True if (len(res) == 0): p = False return [p, res] @rpc(Integer, _returns=[ResponseText, ServicioRes]) def readServicio(ctx, serviceId): res = ResponseText() sc = models.Servicio.objects.filter(id=serviceId) if sc.count() > 0: ser = sc[0] aux = None if (isinstance(ser, models.Alimentacion)): aux = AlimentacionRes() aux.tipoServicio = "Alimentacion" aux.tipoComida = ser.tipoComida aux.cantidadPlatos = ser.cantidadPlatos elif (isinstance(ser, models.PaseoEcologico)): aux = PaseoEcologicoRes() aux.origen = ser.origen aux.destino = ser.destino aux.horaInicio = ser.horaInicio aux.horaFin = ser.horaFin aux.tipoServicio = "PaseoEcologico" elif (isinstance(ser, models.Alojamiento)): aux = AlojamientoRes() aux.tipoServicio = "Alojamiento" aux.tipoAlojamiento = ser.tipoAlojamiento aux.numeroHabitaciones = ser.numeroHabitaciones aux.numeroBanos = ser.numeroBanos aux.servicioLimpieza = ser.servicioLimpieza aux.servicioWifi = ser.servicioWifi elif (isinstance(ser, models.Transporte)): aux = TransporteRes() aux.tipoServicio = "Transporte" aux.empresa = ser.empresa aux.tipoTransporte = ser.tipoTransporte aux.origen = ser.origen aux.destino = ser.destino aux.horaSalida = ser.horaSalida aux.horaLlegada = ser.horaLlegada aux.id = ser.id aux.nombre = ser.nombre aux.pais = ser.pais aux.ciudad = ser.ciudad aux.idioma = ser.idioma aux.costo = ser.costo aux.descripcion = ser.descripcion if (len(ser.foto) > 3): in_file = open(SERVICE_IMAGES + ser.foto, "rb") d = in_file.read() fo = base64.b64encode(d) aux.foto = fo.decode('ascii') in_file.close() aux.tipo = ser.foto.split(".") aux.tipo = aux.tipo[len(aux.tipo) - 1] else: aux.foto = " " aux.numeroPersonas = ser.numeroPersonas aux.nombreProveedor = ser.proveedor.nombreUsuario res.resultado = "encontrado" return [res, aux] @rpc(String, Integer, _returns=ResponseText) def agregarAlCarrito(ctx, nomUsuario, idServicio): sc = models.Cliente.objects.filter(nombreUsuario=nomUsuario) sc1 = models.Servicio.objects.filter(id=idServicio) res = ResponseText() if (sc.count() > 0 and sc1.count() > 0): sc2 = models.CarritoCompras.objects.filter( cliente__nombreUsuario=nomUsuario) if (sc2.count() == 0): res.resultado = "carrito creado con exito" carrito = models.CarritoCompras(numServicios=1, costoTotal=sc1[0].costo, cliente=sc[0]) carrito.save() servi = models.Carrito_servicio(carrito=carrito, servicio=sc1[0]) servi.save() else: sc2 = sc2[0] sc2.numServicios = sc2.servicios.count() + 1 sc2.costoTotal += sc1[0].costo sc2.save() servi = models.Carrito_servicio(carrito=sc2, servicio=sc1[0]) servi.save() res.resultado = "carrito actualizado con exito" return res @rpc(String, Integer, _returns=ResponseText) def removerDelCarrito(ctx, nomUsuario, idServicio): sc1 = models.Servicio.objects.filter(id=idServicio) res = ResponseText() if (sc1.count() > 0): sc2 = models.Carrito_servicio.objects.filter( carrito__cliente__nombreUsuario=nomUsuario, servicio=sc1[0]) if (sc2.count() > 0): sc2 = sc2[0] sc2.carrito.costoTotal -= sc1[0].costo sc2.carrito.numServicios -= 1 sc2.carrito.save() sc2.delete() res.resultado = "servicio removido" else: res.resultado = "servicio no encontrado" return res @rpc(String, _returns=[Boolean, CarritoCompras]) def getCarrito(ctx, nomUsuario): sc = models.CarritoCompras.objects.filter( cliente__nombreUsuario=nomUsuario) if (sc.count() > 0): car = CarritoCompras() car.costoTotal = sc[0].costoTotal car.numServicios = sc[0].numServicios return [True, car] return [False, None] @rpc(String, _returns=[Boolean, Array(ServicioRes)]) def getCarritoServicios(ctx, nomUsuario): sc = models.CarritoCompras.objects.filter( cliente__nombreUsuario=nomUsuario) if (sc.count() > 0): car = [] for s in sc[0].servicios.all(): aux = ServicioRes() aux.nombreProveedor = s.proveedor.nombreUsuario aux.nombre = s.nombre aux.numeroPersonas = s.numeroPersonas aux.descripcion = s.descripcion aux.costo = s.costo aux.idioma = s.idioma aux.id = s.id aux.ciudad = s.ciudad aux.pais = s.pais car.append(aux) p = True if (sc[0].servicios.all().count() == 0): p = False return [p, car] return [False, []] @rpc(String, _returns=ResponseText) def pagarCarrito(ctx, nomUsuario): sc = models.CarritoCompras.objects.filter( cliente__nombreUsuario=nomUsuario) res = ResponseText() if (sc.count() > 0): carrito = sc[0] carrito.delete() res.resultado = "carrito pagado con exito" else: res.resultado = "carrito no encontrado" return res @rpc(LogInReq, _returns=[ResponseText, LogInRes]) def LogIn(ctx, request): res = ResponseText() reslog = LogInRes() sc = models.Usuario.objects.filter(nombreUsuario=request.nombreUsuario) if (sc.count() > 0): if (sc[0].contrasena == request.contrasena): res.resultado = "inicio de sesion exitoso" if (isinstance(sc[0], models.Proveedor)): reslog.tipoUsuaro = "proveedor" return [res, reslog] reslog.tipoUsuaro = "usuario" return [res, reslog] res.resultado = "inicio de sesion fallido contrasena invalida" return [res, reslog] res.resultado = "inicio de sesion fallido nombre de usuario no existe" return [res, reslog] @rpc(Pregunta, _returns=ResponseText) def createPregunta(ctx, pregun): clien = models.Cliente.objects.filter( nombreUsuario=pregun.nombreUsuario) serv = models.Servicio.objects.filter(id=pregun.idServicio) res = ResponseText() if (clien.count() > 0 and serv.count() > 0): pregunta = models.Pregunta( pregunta=pregun.pregunta, fechaPregunta=str( datetime.datetime.now().strftime("%d/%m/%Y %H:%M:%S")), servicio=serv[0], cliente=clien[0]) pregunta.save() res.resultado = "pregunta creada con exito" else: res.resultado = " usuario o servicio no encontrado" return res @rpc(String, Integer, _returns=ResponseText) def agregarRespuesta(ctx, respuesta, idPregunta): preg = models.Pregunta.objects.filter(id=idPregunta) res = ResponseText() if preg.count() > 0: preg = preg[0] preg.respuesta = respuesta preg.fechaRespuesta = str( datetime.datetime.now().strftime("%d/%m/%Y %H:%M:%S")) preg.save() res.resultado = "respuesta agregada con exito" else: res.resultado = "pregunta no existe" return res @rpc(Integer, _returns=[Boolean, Array(PreguntaRes)]) def getPreguntasServicio(self, idServicio): preguntas = models.Pregunta.objects.filter(servicio__id=idServicio) if (preguntas.count() > 0): res = [] for p in preguntas: aux = PreguntaRes() aux.id = p.id aux.pregunta = p.pregunta aux.fechaPregunta = p.fechaPregunta aux.repuesta = p.respuesta aux.fechaRespuesta = p.fechaRespuesta aux.cliente = p.cliente if len(p.cliente.foto) > 3: aux.cliente.tipo = p.cliente.foto.split(".") aux.cliente.tipo = aux.cliente.tipo[len(aux.cliente.tipo) - 1] in_file = open(CLIENT_IMAGES + p.cliente.foto, "rb") d = in_file.read() fo = base64.b64encode(d) aux.cliente.foto = fo.decode('ascii') in_file.close() else: aux.cliente.foto = " " res.append(aux) return [True, res] else: return [False, []]
class Config(ComplexModel): daemon = DaemonConfig db = Array(DatabaseConfig) app = ApplicationConfig
def test_cust_array(self): A = Array(Unicode) assert A.__orig__ is Array assert A.__extends__ is None assert issubclass(A, Array)
class Category(ComplexModel): id = Integer(min_occurs=1, max_occurs=1, nillable=False) children = Array(SelfReference)
class Person(ComplexModel): name = String birthdate = DateTime age = Integer addresses = Array(Address) titles = Array(String)
def test_array_nonwrapped(self): i = Array(Integer, wrapped=False) assert issubclass(i, Integer), i assert i.Attributes.max_occurs == D('infinity')
class Category(ComplexModel): children = Array(Unicode)
class CM(ComplexModel): i = Array(Integer)
class SomeObject(ComplexModel): _type_info = [ ('ints', Array(Integer)), ]
class Server(ServiceBase): @rpc(String, String, String, String, _returns=String) def sendEmail(self, String_url, String_payload, String_title, String_id): # 邮件地址为_url,内容为_payload username = '******' password = '******' rcptto = String_url msg = MIMEMultipart('alternative') msg['Subject'] = Header(String_title).encode() msg['From'] = '%s <%s>' % (Header(String_id).encode(), username) msg['To'] = rcptto msg['Message-id'] = email.utils.make_msgid() msg['Date'] = email.utils.formatdate() texthtml = MIMEText(String_payload, _subtype='html', _charset='UTF-8') msg.attach(texthtml) try: client = smtplib.SMTP() client.connect('smtpdm.aliyun.com', 25) client.set_debuglevel(0) client.login(username, password) client.sendmail(username, rcptto, msg.as_string()) client.quit() print('邮件发送成功!') return "Y" except smtplib.SMTPConnectError as e: print('邮件发送失败,连接失败:', e.smtp_code, e.smtp_error) return "N" except smtplib.SMTPAuthenticationError as e: print('邮件发送失败,认证错误:', e.smtp_code, e.smtp_error) return "N" except smtplib.SMTPSenderRefused as e: print('邮件发送失败,发件人被拒绝:', e.smtp_code, e.smtp_error) return "N" except smtplib.SMTPRecipientsRefused as e: print('邮件发送失败,收件人被拒绝:', e.smtp_code, e.smtp_error) return "N" except smtplib.SMTPDataError as e: print('邮件发送失败,数据接收拒绝:', e.smtp_code, e.smtp_error) return "N" except smtplib.SMTPException as e: print('邮件发送失败, ', e.message) return "N" except Exception as e: print('邮件发送异常, ', str(e)) return @rpc(Array(String), String, String, String, _returns=String) def sendEmailBatch(self, String_url, String_payload, String_title, String_id): # 批量发送邮件 username = '******' password = '******' msg = MIMEMultipart('alternative') msg['Subject'] = Header(String_title).encode() msg['From'] = '%s <%s>' % (Header(String_id).encode(), username) msg['Message-id'] = email.utils.make_msgid() msg['Date'] = email.utils.formatdate() texthtml = MIMEText(String_payload, _subtype='html', _charset='UTF-8') msg.attach(texthtml) # 发送邮件 try: client = smtplib.SMTP() client.connect('smtpdm.aliyun.com', 25) client.set_debuglevel(0) client.login(username, password) client.sendmail(username, String_url, msg.as_string()) client.quit() print('邮件发送成功!') return "Y" except smtplib.SMTPConnectError as e: print('邮件发送失败,连接失败:', e.smtp_code, e.smtp_error) return "N" except smtplib.SMTPAuthenticationError as e: print('邮件发送失败,认证错误:', e.smtp_code, e.smtp_error) return "N" except smtplib.SMTPSenderRefused as e: print('邮件发送失败,发件人被拒绝:', e.smtp_code, e.smtp_error) return "N" except smtplib.SMTPRecipientsRefused as e: print('邮件发送失败,收件人被拒绝:', e.smtp_code, e.smtp_error) return "N" except smtplib.SMTPDataError as e: print('邮件发送失败,数据接收拒绝:', e.smtp_code, e.smtp_error) return "N" except smtplib.SMTPException as e: print('邮件发送失败, ', e.message) return "N" except Exception as e: print('邮件发送异常, ', str(e)) return "N"
class SomeObject(ComplexModel): s = Array(Integer(min_occurs=1))
class BenchmarkConfig(ComplexModel): framework = M(Unicode) tests = Array(BenchmarkConfigElement, wrapped=False)
def log_repr(obj, cls=None, given_len=None, parent=None, from_array=False, tags=None, prot=None): """Use this function if you want to serialize a ComplexModelBase instance to logs. It will: * Limit size of the String types * Limit size of Array types * Not try to iterate on iterators, push data, etc. """ if tags is None: tags = set() if obj is None: return 'None' objcls = None if hasattr(obj, '__class__'): objcls = obj.__class__ if objcls in (list, tuple): objcls = Array(Any) elif objcls is dict: objcls = AnyDict elif objcls in NATIVE_MAP: objcls = NATIVE_MAP[objcls] if objcls is not None and (cls is None or issubclass(objcls, cls)): cls = objcls cls_attrs = None logged = None if hasattr(cls, 'Attributes'): if prot is None: cls_attrs = cls.Attributes else: cls_attrs = prot.get_cls_attrs(cls) logged = cls_attrs.logged if not logged: return "%s(...)" % cls.get_type_name() if logged == '...': return "(...)" if issubclass(cls, File) and isinstance(obj, File.Value): cls = obj.__class__ if cls_attrs.logged == 'len': l = '?' try: if isinstance(obj, (list, tuple)): l = str(sum([len(o) for o in obj])) else: l = str(len(obj)) except (TypeError, ValueError): if given_len is not None: l = str(given_len) return "<len=%s>" % l if callable(cls_attrs.logged): try: return cls_attrs.logged(obj) except Exception as e: logger.error("Exception %r in log_repr transformer ignored", e) logger.exception(e) pass if issubclass(cls, AnyDict): retval = [] if isinstance(obj, dict): if logged == 'full': for i, (k, v) in enumerate(obj.items()): retval.append('%r: %r' % (k, v)) elif logged == 'keys': for i, k in enumerate(obj.keys()): if i >= MAX_DICT_ELEMENT_NUM: retval.append("(...)") break retval.append('%r: (...)' % (k, )) elif logged == 'values': for i, v in enumerate(obj.values()): if i >= MAX_DICT_ELEMENT_NUM: retval.append("(...)") break retval.append('(...): %s' % (log_repr(v, tags=tags), )) elif logged == 'keys-full': for k in obj.keys(): retval.append('%r: (...)' % (k, )) elif logged == 'values-full': for v in obj.values(): retval.append('(...): %r' % (v, )) elif logged is True: # default behaviour for i, (k, v) in enumerate(obj.items()): if i >= MAX_DICT_ELEMENT_NUM: retval.append("(...)") break retval.append('%r: %s' % (k, log_repr(v, parent=k, tags=tags))) else: raise ValueError("Invalid value logged=%r", logged) return "{%s}" % ', '.join(retval) else: if logged in ('full', 'keys-full', 'values-full'): retval = [repr(s) for s in obj] else: for i, v in enumerate(obj): if i >= MAX_DICT_ELEMENT_NUM: retval.append("(...)") break retval.append(log_repr(v, tags=tags)) return "[%s]" % ', '.join(retval) if (issubclass(cls, Array) or (cls_attrs.max_occurs > 1)) and not from_array: if id(obj) in tags: return "%s(...)" % obj.__class__.__name__ tags.add(id(obj)) retval = [] subcls = cls if issubclass(cls, Array): subcls, = cls._type_info.values() if isinstance(obj, PushBase): return '[<PushData>]' if logged is None: logged = cls_attrs.logged for i, o in enumerate(obj): if logged != 'full' and i >= MAX_ARRAY_ELEMENT_NUM: retval.append("(...)") break retval.append(log_repr(o, subcls, from_array=True, tags=tags)) return "[%s]" % (', '.join(retval)) if issubclass(cls, ComplexModelBase): if id(obj) in tags: return "%s(...)" % obj.__class__.__name__ tags.add(id(obj)) retval = [] i = 0 for k, t in cls.get_flat_type_info(cls).items(): if i >= MAX_FIELD_NUM: retval.append("(...)") break if not t.Attributes.logged: continue if logged == '...': retval.append("%s=(...)" % k) continue try: v = getattr(obj, k, None) except (AttributeError, KeyError, DetachedInstanceError): v = None # HACK!: sometimes non-db attributes restored from database don't # get properly reinitialized. if isclass(v) and issubclass(v, ModelBase): continue polymap = t.Attributes.polymap if polymap is not None: t = polymap.get(v.__class__, t) if v is not None: retval.append("%s=%s" % (k, log_repr(v, t, parent=k, tags=tags))) i += 1 return "%s(%s)" % (cls.get_type_name(), ', '.join(retval)) if issubclass(cls, Unicode) and isinstance(obj, six.string_types): if len(obj) > MAX_STRING_FIELD_LENGTH: return '%r(...)' % obj[:MAX_STRING_FIELD_LENGTH] return repr(obj) if issubclass(cls, File) and isinstance(obj, FileData): return log_repr(obj, FileData, tags=tags) retval = repr(obj) if len(retval) > MAX_STRING_FIELD_LENGTH: retval = retval[:MAX_STRING_FIELD_LENGTH] + "(...)" return retval
class SomeObject(ComplexModel): s = Array(Integer)
class UserManager(ServiceBase): @srpc(User, _returns=Integer) def add_user(user): add_user(user) return user.userid @srpc(_returns=User) def super_user(): return user_database[0] @srpc(_returns=User) def random_user(): retval = User(username=randchars(random.randrange(3, 12)), firstname=randchars(random.randrange(3, 12)).title(), lastname=randchars(random.randrange(3, 12)).title(), permissions=randperms( random.randint(1, len(all_permissions)))) add_user(retval) return retval @srpc(Integer, _returns=User) def get_user(userid): global user_database # If you rely on dict lookup raising KeyError here, you'll return an # internal error to the client, which tells the client that there's # something wrong in the server. However in this case, KeyError means # invalid request, so it's best to return a client error. # For the HttpRpc case, internal error is 500 whereas # ResourceNotFoundError is 404. if not (userid in user_database): raise ResourceNotFoundError(userid) return user_database[userid] @srpc(User) def modify_user(user): global user_database if not (user.userid in user_database): raise ResourceNotFoundError(user.userid) user_database[user.userid] = user @srpc(Integer) def delete_user(userid): global user_database if not (userid in user_database): raise ResourceNotFoundError(userid) del user_database[userid] @srpc(_returns=Array(User)) def list_users(): global user_database return user_database.values()