def crearPersona(payload): nuevo = Asistente() nuevo.primiparo = fechaAhora enriquecerEntidad(payload, Asistente) if not payload.has_key('monitor'): payload['monitor'] = 0 #significa que esta por asignar rta = comun.llenarYpersistir(Asistente, nuevo, payload, None) return rta
def post(): logging.info('post ' + str(ident) + ' with ') completo = simplejson.loads(request.raw_post_data) todo = completo['payload'] leng = completo['leng'] nuevo = class_(id=ident) otro = comun.llenarYpersistir(class_, nuevo, todo, leng) ans = {} ans['error'] = 0 ans['payload'] = otro response.write(simplejson.dumps(ans))
def actualizarPersona(payload, viejo): llave = ndb.Key(Asistente, payload['id']) viejo2 = llave.get() if (viejo2): enriquecerEntidad(payload, Asistente) logging.info(payload) #existe el que voy a actualizar if (viejo is None or viejo.key.id() == viejo2.key.id()): rta = comun.llenarYpersistir(Asistente, viejo2, payload, None) return {'error': 0, 'rta': rta} else: return { 'error': 4, 'msg': 'La cédula ' + str(payload['cedula']) + ' ya existe' }
def RESTfulHandler(request, ident): response = HttpResponse("", content_type='application/json') tokens = re.findall('(/?)(\w+)/(.*)$', ident) if len(tokens) > 0: nombre = tokens[0][1] ident = tokens[0][2] else: nombre = 'Documento' if ident.isnumeric(): ident = long(ident) if not users.is_current_user_admin() and request.method in [ 'POST', 'PUT', 'DELETE' ]: return HttpResponse(status=401) module = __import__('models') class_ = getattr(module, nombre) def post(): logging.info('post ' + str(ident) + ' with ') completo = simplejson.loads(request.raw_post_data) todo = completo['payload'] leng = completo['leng'] nuevo = class_(id=ident) otro = comun.llenarYpersistir(class_, nuevo, todo, leng) ans = {} ans['error'] = 0 ans['payload'] = otro response.write(simplejson.dumps(ans)) if request.method == 'GET': logging.info('get') if ident: llave = ndb.Key(nombre, ident) greetings = llave.get() else: greetings = buscarTodos(nombre) todos = simplejson.dumps(comun.to_dict(greetings)) response.write(todos) if request.method == 'POST': post() if request.method == 'PUT': logging.info('put ' + str(ident) + ' with ') #tiene problemas con el unicode completo = simplejson.loads(request.raw_post_data) tmp = completo['payload'] leng = completo['leng'] viejo = None if ident: llave = ndb.Key(nombre, ident) else: if (tmp.has_key('id')): llave = ndb.Key(nombre, tmp['id']) else: llave = None if (llave): viejo = llave.get() if viejo: otro = comun.llenarYpersistir(class_, viejo, tmp, leng) ans = {} ans['error'] = 0 ans['payload'] = otro response.write(simplejson.dumps(ans)) else: post() if request.method == 'DELETE': logging.info('delete ' + str(ident)) if ident: llave = ndb.Key(nombre, ident) llave.delete() response.write('{"error":0, "msg": "' + nombre + ' (' + str(ident) + ') borrado"}') else: return HttpResponse(status=403) return response
def CitasHandler(request, ident): to = comun.fechaAhora.__format__("%Y-%m-%d") cursor = None response = HttpResponse("", content_type='application/json') try: if request.method == 'PUT': #{"title": "edelgado", "start": 1460691726, "end": 1460691726, "maxper": 2} tmp = {} if (request.raw_post_data): tmp = simplejson.loads(request.raw_post_data) rta = {} if (tmp.has_key('id')): llave = ndb.Key(Cita, tmp['id']) viejo = llave.get() if viejo: rta = comun.llenarYpersistir(Cita, viejo, tmp, None) else: nuevo = Cita() rta = comun.llenarYpersistir(Cita, nuevo, tmp, None) response.write(simplejson.dumps({'error': 0, 'rta': rta})) def buscar(request): ti = request.GET.get('start', to) tf = request.GET.get('end', to) persona = request.GET.get('persona', None) varn = request.GET.get('n', 100) varnext = request.GET.get('next', '') varti = datetime.datetime.strptime(ti, "%Y-%m-%d") vartf = datetime.datetime.strptime(tf, "%Y-%m-%d") varttitext = varti.strftime("%Y, %m, %d, %H, %M, %S") varttftext = vartf.strftime("%Y, %m, %d, %H, %M, %S") #Recordar que GQL no tiene OR! Ademas no puedo usar dos variables para start <= X and end <= busqueda = "SELECT * FROM Cita " busqueda += "WHERE " busqueda += "start >= DATETIME(" + varttitext + ") AND start <= DATETIME(" + varttftext + ") " if persona != None: busqueda += "and persona=" + persona + " " busqueda += "ORDER BY start ASC" objeto = comun.buscarGQL({ "q": busqueda, "n": long(varn), "next": varnext }) return objeto if request.method == 'GET': objeto = buscar(request) entidades = comun.to_dict(objeto['datos'], 'to_dict2') #if (objeto.has_key('next')): # cursor = objeto['next'] #response.write(simplejson.dumps({'error':0, 'entidades': entidades, 'next': cursor})) response.write(simplejson.dumps(entidades)) if request.method == 'DELETE': miid = request.GET.get('id', None) llave = ndb.Key(Cita, long(miid)) llave.delete() response.write(simplejson.dumps({'error': 0, 'borradas': 1})) except Exception, e: logging.error(str(e)) response.write( simplejson.dumps({ 'error': 1, 'msg': 'Error de servidor: ' + str(e) }))
def ApiRestHandler(request, ident, val2): response = HttpResponse("", content_type='application/json') ahora = datetime.datetime.now() cursor = None TOKEN_VERSION = 1; TOKEN_SEPARADOR = ":" def generarToken(): return base64.b64encode(str(TOKEN_VERSION)+TOKEN_SEPARADOR+str(time.mktime(ahora.timetuple()))) def decodificarToken(token): try: texto = base64.b64decode(token) partes = texto.split(TOKEN_SEPARADOR) versionToken = int(partes[0]) ultimaModificacion = float(partes[1]) if versionToken < TOKEN_VERSION: return None return datetime.datetime.fromtimestamp(ultimaModificacion) except: raise Exception('Token no se puede decodificar') try: def buscar(request, fechaToken): #Para paginacion varn = request.GET.get('n', 100) varnext = request.GET.get('next', '') argumentos = {} if fechaToken == None: argumentos = {"borrado":None} busqueda = "SELECT * FROM Evento WHERE borrado = :borrado" else: argumentos = {"modificado":fechaToken} busqueda = "SELECT * FROM Evento WHERE modificado >= :modificado" objeto = comun.buscarGQL2({"q":busqueda, "n":long(varn), "next": varnext, "argumentos": argumentos}) return objeto def limpiarModelo(dato, tipo): #metadata interna if (tipo == 'PUT'): if dato.has_key('borrado'): del dato['borrado'] if dato.has_key('id'): del dato['id'] if (tipo == 'GET'): if not dato.has_key('borrado') or dato['borrado'] == None: dato['borrado'] = False if dato.has_key('modificado'): del dato['modificado'] return dato def predeterminados(dato, tipo): if not dato.has_key('fecha'): dato['fecha'] = time.mktime(ahora.timetuple()) if not dato.has_key('titulo'): dato['titulo'] = 'Evento en '+ahora.strftime("%Y, %m, %d, %H, %M, %S") if not dato.has_key('descripcion'): dato['descripcion'] = 'Descripcion de evento en '+ahora.strftime("%Y, %m, %d, %H, %M, %S") return limpiarModelo(dato, tipo) if request.method == 'GET': #Para sincronizacion token = request.GET.get('token', None) fechaToken = None if token != None: fechaToken = decodificarToken(token) token = generarToken() else: token = generarToken() objeto = buscar(request, fechaToken) entidades = comun.to_dict(objeto['datos']) if (objeto.has_key('next')): cursor = objeto['next'] entidades2 = [] for val in entidades: entidades2.append(limpiarModelo(val, 'GET')) response.write(simplejson.dumps({'error':0, 'entidades': entidades2, 'next': cursor, 'token': token})) if request.method == 'PUT': #Crea o actualiza tmp = {} if (request.raw_post_data): tmp = simplejson.loads(request.raw_post_data) dato = predeterminados(tmp, 'PUT') rta = {} if (ident != None and len(ident) > 0): llave = ndb.Key(Evento, long(ident)) viejo = llave.get() if viejo: rta = comun.llenarYpersistir(Evento, viejo, dato, None) else: raise Exception('Modelo no encontrado') else: nuevo = Evento() rta = comun.llenarYpersistir(Evento, nuevo, dato, None) response.write(simplejson.dumps({'error':0, 'rta':rta})) if request.method == 'DELETE': if (ident != None): llave = ndb.Key(Evento, long(ident)) viejo = llave.get() if viejo: viejo.borrado = True viejo.put() response.write(simplejson.dumps({'error':0})) else: raise Exception('Modelo no encontrado') else: raise Exception('Debe proveer id') except Exception, e: response.write(simplejson.dumps({'error':1, 'mensaje': 'Error de servidor: '+str(e)}))