Exemple #1
0
    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)
Exemple #2
0
    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)
Exemple #3
0
    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)
Exemple #4
0
    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)
Exemple #5
0
    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)
Exemple #6
0
 class Category(ComplexModel):
     id = XmlData(Integer(min_occurs=1, max_occurs=1, nillable=False))
     children = Array(Unicode)
Exemple #7
0
 def test_array_type_name(self):
     assert Array(String, type_name='punk').__type_name__ == 'punk'
Exemple #8
0
class Level1(ComplexModel):
    level2 = Level2
    level3 = Array(Level3)
    level4 = Array(Level4)
Exemple #9
0
 class A(ComplexModel):
     s = Array(Unicode)
Exemple #10
0
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),
    )
Exemple #11
0
 class CCM(ComplexModel):
     c = Array(CM)
Exemple #12
0
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'))
Exemple #13
0
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, []]
Exemple #14
0
class Config(ComplexModel):
    daemon = DaemonConfig
    db = Array(DatabaseConfig)
    app = ApplicationConfig
Exemple #15
0
    def test_cust_array(self):
        A = Array(Unicode)

        assert A.__orig__ is Array
        assert A.__extends__ is None
        assert issubclass(A, Array)
Exemple #16
0
 class Category(ComplexModel):
     id = Integer(min_occurs=1, max_occurs=1, nillable=False)
     children = Array(SelfReference)
Exemple #17
0
class Person(ComplexModel):
    name = String
    birthdate = DateTime
    age = Integer
    addresses = Array(Address)
    titles = Array(String)
Exemple #18
0
    def test_array_nonwrapped(self):
        i = Array(Integer, wrapped=False)

        assert issubclass(i, Integer), i
        assert i.Attributes.max_occurs == D('infinity')
Exemple #19
0
 class Category(ComplexModel):
     children = Array(Unicode)
Exemple #20
0
 class CM(ComplexModel):
     i = Array(Integer)
Exemple #21
0
 class SomeObject(ComplexModel):
     _type_info = [
         ('ints', Array(Integer)),
     ]
Exemple #22
0
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"
Exemple #23
0
 class SomeObject(ComplexModel):
     s = Array(Integer(min_occurs=1))
Exemple #24
0
class BenchmarkConfig(ComplexModel):
    framework = M(Unicode)
    tests = Array(BenchmarkConfigElement, wrapped=False)
Exemple #25
0
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
Exemple #26
0
 class SomeObject(ComplexModel):
     s = Array(Integer)
Exemple #27
0
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()