Advertisement
Guest User

Untitled

a guest
Jul 1st, 2016
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 25.59 KB | None | 0 0
  1. from flask import Flask, request, jsonify, request, send_from_directory
  2. from flask_restful import Resource, Api, abort
  3. from flask_httpauth import HTTPBasicAuth
  4. from pymongo import MongoClient
  5. from bson.objectid import ObjectId
  6. from pymongo.errors import DuplicateKeyError
  7. from geopy.geocoders import Nominatim
  8. from geopy.exc import GeocoderTimedOut
  9. from dateutil.parser import parse as dateparse
  10. from recommended_script import computeRecommended
  11. from nearby_script import computNearby
  12. from operator import itemgetter
  13. from datetime import datetime
  14. from glob import glob
  15. import shutil
  16. import os
  17. import imghdr
  18.  
  19. today = datetime.utcnow()
  20.  
  21. events = MongoClient('localhost', 27017)['app']['events']
  22. users = MongoClient('localhost', 27017)['app']['users']
  23. '''
  24. recommended = MongoClient('localhost', 27017)['app']['recommended']
  25. nearby = MongoClient('localhost', 27017)['app']['nearby']
  26. '''
  27.  
  28. def joinPath(base_dir, fileDir):
  29.     return os.path.join(base_dir, fileDir)
  30.  
  31. def currentPath():
  32.     return os.path.dirname(os.path.abspath(__file__))
  33.  
  34. def parentDir(currentDir):
  35.     return os.path.abspath(os.path.join(currentDir, os.pardir))
  36.  
  37. upload_dir = parentDir(parentDir(currentPath()))
  38. if not os.path.isdir(joinPath(upload_dir, "users")):
  39.     os.makedirs(joinPath(upload_dir, "users"))
  40.  
  41. app = Flask(__name__, static_url_path = "", static_folder = upload_dir)
  42. auth = HTTPBasicAuth()
  43. geolocator = Nominatim()
  44.  
  45.  
  46. @auth.get_password
  47. def get_password(user_id):
  48.     query = users.find({"_id": user_id})
  49.     if query.count() == 1:
  50.         return query[0]['password']
  51.     return None
  52.  
  53. class Verify(Resource):
  54.     '''
  55.    Essa rota deve ser chamada pelo app sempre que o usuario tocar no campo
  56.    "Meus Eventos" e possuir conexao (obvio).
  57.    Acionando o metodo get dessa rota,
  58.    o servidor ira atualizar a lista de eventos passados e futuros daquele usuario
  59.    O metodo get dessa rota tambem serve para a verificacao da existencia do usuario.
  60.    '''
  61.     decorators = [auth.login_required]
  62.  
  63.     def get(self, user_id):
  64.        
  65.         query = users.find({"_id": user_id})
  66.  
  67.         if query.count() == 1:
  68.            
  69.             if 'next' in query[0]:
  70.  
  71.                 past_id = [i for i in query[0]['next'] if i['date'] < today]
  72.  
  73.                 users.update_one({"_id": user_id}, {'$pull':{'next':{'date': {'$lt':today}}}})
  74.  
  75.                 for i in past_id:
  76.                     users.update_one({"_id": user_id}, {'$push':{'past':i}})
  77.  
  78.                 return {"response": True}
  79.  
  80.             return {"response": True}
  81.  
  82.         else:
  83.             return {"response": False}
  84.  
  85.  
  86. class NewUser(Resource):
  87.     '''
  88.    Cadastro via e-mail: Recebe os dados usuais e uma hash de senha
  89.    Cadastro via Facebook: Recebe os dados usuais e uma senha padrao 'Facebook'
  90.    '''
  91.     def post(self):
  92.         '''
  93.        O id do usuario sera seu email
  94.        '''
  95.         data = request.get_json()
  96.         if not data:
  97.             abort(400)
  98.  
  99.         else:
  100.             _id = request.json.get('_id')
  101.             f_name = request.json.get('first_name')
  102.             l_name = request.json.get('last_name')
  103.             password = request.json.get('password')
  104.             preference = request.json.get('preferences')
  105.             gender = request.json.get('gender')
  106.             #Se algum desses campos acima for vazio, erro 400 eh acionado
  107.  
  108.             if _id is None or password is None or f_name is None or l_name is None or preference is None or gender is None:
  109.                 abort(400)
  110.  
  111.             #Se existir algum _id com o mesmo que estamos tentando inserir, retorna mensagem de erro
  112.            
  113.             if users.find({'_id':_id}).count() == 1:
  114.                 return {'response': False}
  115.  
  116.             else:
  117.                 #Se nao, adiciona o _id do usuario nas outras colecoes
  118.                 users.insert_one(data)
  119.  
  120.                 user_dir = joinPath(joinPath(upload_dir,"users"),_id)
  121.  
  122.                 for i in ['profile', 'events']:
  123.                     os.makedirs(joinPath(user_dir, i))
  124.  
  125.                 '''
  126.                nearby.insert_one({'_id': _id, "events_near": []})
  127.                recommended.insert_one({'_id': _id, "similarities": []})
  128.                '''
  129.                 return {'response': True}
  130.  
  131.  
  132.  
  133. class UserLogged(Resource):
  134.  
  135.     decorators = [auth.login_required]
  136.    
  137.     def post(self, user_id):
  138.  
  139.         '''
  140.        O metodo get dessa rota foi pensado tanto pra recuperacao de login de um usuario
  141.        quanto pra busca de um usuario por outro
  142.        '''
  143.         flag = request.json.get('flag')
  144.         if flag is None:
  145.             abort(400)
  146.         '''
  147.        Recebe uma flag, pois se for o proprio usuario que requisita a consulta sobre si mesmo,
  148.        ele retorna mais detalhes. Isso acontece na inicializacao do app para usuario ja cadastrados
  149.        '''
  150.  
  151.         query = users.find({"_id": user_id},{'address':0, 'coordinates':0, 'password': 0})
  152.         if query.count() == 1:
  153.             user = query[0]
  154.  
  155.             if flag is True:
  156.                 if 'past' in user:
  157.                     user['past'] = [str(i['event_id']) for i in user['past']]
  158.                 if 'next' in user:
  159.                     user['next'] = [str(i['event_id']) for i in user['next']]
  160.                 if 'by_me' in user:
  161.                     user['by_me'] = [str(i['event_id']) for i in user['by_me']]
  162.             else:
  163.                 user.pop("past", None)
  164.                 user.pop("next", None)
  165.                 user.pop("by_me", None)
  166.                 user.pop("preferences", None)
  167.  
  168.             return jsonify(user)
  169.  
  170.         else:
  171.             return {"message": "no user found"}
  172.  
  173.  
  174.     def put(self, user_id):
  175.         #alterar alguma informacao dele mesmo
  176.         data = request.get_json()
  177.        
  178.         if not data:
  179.             abort(400)
  180.  
  181.         else:
  182.             resp = {"response": True}
  183.             '''
  184.            Se o cidadao quiser atualizar as coordenadas dele, teremos que fazer a verificacao
  185.            da existencia de um campo chamado coordinates
  186.            '''
  187.             if 'coordinates' in data:
  188.  
  189.                 try:
  190.                     '''
  191.                    Caso tenha, teremos que recuperar um endereco pra filtragem da comparacao posteriormente
  192.                    Aqui precisa de um try/except pois as vezes da falha de timeout
  193.                    '''
  194.                     location = geolocator.reverse(tuple(data['coordinates']))
  195.                     data.update({'address':{'state': location.raw['address']['state'], 'country':location.raw['address']['country']}})
  196.                
  197.                 except GeocoderTimedOut as e:
  198.                     resp.update({"response": False})
  199.            
  200.             if '_id' in data:
  201.                 '''
  202.                Aqui eh para quando for a alteracao do email, como no mongo nao da pra alterar um
  203.                _id, temos que criar um documento igual aquele cujo _id eh o anterior a alteracao
  204.                e depois que inserir no banco esse documento e a atualizacao dele, excluimos o anteior
  205.                '''
  206.                 user = users.find_one({"_id": user_id})
  207.                 #user["_id"] = data["_id"]
  208.                 user.update(data)
  209.  
  210.                 try:
  211.                     users.insert_one(user)
  212.  
  213.                 except DuplicateKeyError:
  214.                     return {"response": False}
  215.  
  216.                 users.delete_one({'_id': user_id})
  217.  
  218.                 return {"response": True}
  219.  
  220.             users.update_one({'_id': user_id}, {'$set': data})
  221.  
  222.         return resp
  223.        
  224.     #deletar seu perfil
  225.     def delete(self, user_id):
  226.  
  227.         user_item = users.delete_one({'_id': user_id})
  228.         try:
  229.             user_dir = joinPath(joinPath(upload_dir,"users"), user_id)
  230.             shutil.rmtree(user_dir)
  231.         except e:
  232.             print e
  233.             pass
  234.         '''
  235.        nearby_item = nearby.delete_one({'_id': user_id})
  236.        recommended_item = recommended.delete_one({'_id': user_id})
  237.        '''
  238.         if user_item.deleted_count:
  239.             return {"response":True}
  240.  
  241.         else:
  242.             {"response" : False}
  243.  
  244.  
  245.  
  246. class UniqueEventSearch(Resource):
  247.     decorators = [auth.login_required]
  248.     '''
  249.    Um usuario pode:
  250.    '''
  251.     def get(self, event_id):
  252.         #Recuperar informacoes de um evento qualquer
  253.         '''
  254.        event_id = request.json.get('event_id')
  255.        if event_id is None:
  256.                abort(400)
  257.        '''
  258.         try:
  259.             event_id = ObjectId(event_id)
  260.  
  261.         except:
  262.             abort(400)
  263.  
  264.         query = events.find({"_id": event_id},{'_id':0})
  265.  
  266.         if query.count() > 0:
  267.  
  268.             n_going = len(query[0]['going'])
  269.             query[0].update({'number_going':n_going})
  270.             return jsonify(query[0])
  271.            
  272.         else:
  273.             return {"message": "no event found"}
  274.  
  275.  
  276. class NearbyEventSearch(Resource):
  277.     decorators = [auth.login_required]
  278.  
  279.     def post(self, user_id):
  280.         data = request.get_json()
  281.  
  282.         if user_id:
  283.             '''
  284.            Pra calcular os eventos proximos, precisamos que o usuario tenha ativado a localizacao
  285.            e precisamos que ele mande a pareferencia de raio de busca
  286.            '''
  287.             skip = request.json.get('skip')
  288.             limit = request.json.get('limit')
  289.             preference = request.json.get('preference')
  290.             coordinates = request.json.get('coordinates')
  291.  
  292.             if skip is None or limit is None or coordinates is None:
  293.                 abort(400)
  294.             try:
  295.                 location = geolocator.reverse(tuple(coordinates), timeout = 50)
  296.                 users.update_one({"_id": user_id},{"$set":{'address':{'state': location.raw['address']['state'], 'country':location.raw['address']['country']}}}, upsert=True)
  297.            
  298.             except GeocoderTimedOut:
  299.  
  300.                 if(users.find_one({"_id": user_id, "address":{"$exists": True}})):
  301.                     pass
  302.  
  303.                 else:
  304.                     return jsonify({"message":"no location found"})
  305.  
  306.             finally:
  307.  
  308.                 events_nearby = computNearby(users.find_one({'_id':user_id}), events, preference, coordinates)
  309.                 events_nearby = events_nearby[skip:limit]
  310.  
  311.                 for i in range(len(events_nearby)):
  312.                     event = events.find_one({'_id': events_nearby[i]['event_id']},{'address':0, "promoter":0,'contact':0, 'coordinates':0, 'preferences':0})
  313.                     event.update({"distance": events_nearby[i]["distance"]})
  314.                     events_nearby[i] = event
  315.              
  316.                 [event.update({'_id':str(event['_id']), 'number_going': len(event['going'])}) for event in events_nearby]
  317.                
  318.                 [event.pop("going", None) for event in events_nearby]
  319.  
  320.                 return jsonify(events_nearby)
  321.  
  322.         else:
  323.             abort(400)
  324.  
  325. class PopularEventSearch(Resource):
  326.     decorators = [auth.login_required]
  327.  
  328.     def post(self):
  329.        
  330.         coordinates = request.json.get('coordinates')
  331.         skip = request.json.get('skip')
  332.         limit = request.json.get('limit')
  333.  
  334.         if coordinates is None or skip is None or limit is None:
  335.             abort(400)
  336.  
  337.         try:
  338.             location = geolocator.reverse(tuple(coordinates), timeout = 50)
  339.  
  340.             users.update_one({"_id": user_id},{"$set":{'address':{'state': location.raw['address']['state'], 'country':location.raw['address']['country']}}}, upsert=True)
  341.            
  342.         except GeocoderTimedOut:
  343.  
  344.             if(users.find_one({"_id": user_id, "address":{"$exists": True}})):
  345.                 pass
  346.  
  347.             else:
  348.                 return jsonify({"message":"no location found"})
  349.  
  350.         finally:
  351.  
  352.             allEvents = [e for e in events.find({"address":{'state':location.raw['address']['state'], 'country':location.raw['address']['country']}, 'date':{'$gte':today}},{'address':0, "promoter":0,'contact':0, 'coordinates':0})]
  353.             [event.update({'_id':str(event['_id']), 'number_going': len(event['going'])}) for event in allEvents]
  354.             L = sorted(allEvents, key=itemgetter('number_going'), reverse=True)
  355.             return jsonify(L[skip:limit])
  356.  
  357. class MyEvents(Resource):
  358.  
  359.     decorators = [auth.login_required]
  360.     '''
  361.    Um usuario pode requisitar os eventos que ou ele criou, ou ele foi ou ele vai
  362.    '''
  363.     def post(self, user_id):
  364.         if user_id:
  365.             skip = request.json.get('skip')
  366.             limit = request.json.get('limit')
  367.             #Exige que entre um skip e um limit de range para a lista de eventos
  368.             if skip is None or limit is None:
  369.                 abort(400)
  370.             #Abaixo esta sendo recuperada a lista dos eventos em by_me, next e past
  371.             byme_events_id = []
  372.             next_events_id = []
  373.             past_events_id = []
  374.  
  375.             by_me = users.find_one({"_id": user_id}, {"by_me": 1, "_id":0})
  376.             if "by_me" in by_me:
  377.                 byme_events_id = by_me["by_me"]
  378.  
  379.             next = users.find_one({"_id": user_id}, {"next": 1, "_id":0})
  380.             if "next" in next:
  381.                 next_events_id = next["next"]
  382.  
  383.             past = users.find_one({"_id": user_id}, {"past": 1, "_id":0})
  384.             if "past" in past:
  385.                 past_events_id = past["past"]
  386.  
  387.             #A lista de meus eventos vem primeiro, seguido pelos proximos e por ultipo vem os passados
  388.             MyEventsList_ids = byme_events_id + next_events_id + past_events_id
  389.             MyEventsList = [events.find_one({"_id": e["event_id"]}, {'_id':0}) for e in MyEventsList_ids]
  390.            
  391.             return jsonify(MyEventsList[skip:limit])
  392.        
  393. class RecommendedEventSearch(Resource):
  394.  
  395.     decorators = [auth.login_required]
  396.     '''
  397.    um usuario pode
  398.    '''
  399.     def post(self, user_id):
  400.         #requisitar uma lista de eventos recomendados
  401.         if user_id:
  402.  
  403.             skip = request.json.get('skip')
  404.             limit = request.json.get('limit')
  405.             coordinates = request.json.get('coordinates')
  406.  
  407.             if skip is None or limit is None or coordinates is None:
  408.                 abort(400)
  409.            
  410.             try:
  411.                 location = geolocator.reverse(tuple(coordinates), timeout = 50)
  412.                 users.update_one({"_id": user_id},{"$set":{'address':{'state': location.raw['address']['state'], 'country':location.raw['address']['country']}}}, upsert=True)
  413.            
  414.             except GeocoderTimedOut:
  415.  
  416.                 if(users.find_one({"_id": user_id, "address":{"$exists": True}})):
  417.                     pass
  418.  
  419.                 else:
  420.                     return jsonify({"message":"no location found"})
  421.  
  422.             finally:
  423.                
  424.                 events_recommended = computeRecommended(users.find_one({'_id':user_id}), events)
  425.                
  426.                 events_recommended = [events.find_one({'_id': d['event_id']},{'address':0, "promoter":0,'contact':0, 'coordinates':0, 'preferences':0}) for d in events_recommended[skip:limit]]
  427.                
  428.                 [event.update({'_id':str(event['_id']), 'number_going': len(event['going'])}) for event in events_recommended]
  429.                
  430.                 [event.pop("going", None) for event in events_recommended]
  431.  
  432.                 return jsonify(events_recommended)
  433.         else:
  434.             abort(400)
  435.  
  436.  
  437. class Event(Resource):
  438.  
  439.     decorators = [auth.login_required]
  440.     def post(self):
  441.  
  442.         data = request.get_json()
  443.         if not data:
  444.             abort(400)
  445.  
  446.         else:
  447.             '''
  448.            Um evento, assim como um usuario tem um campo chamado address que contem um state e um country,
  449.            porem um evento ainda tem o campo c_address que contem o endereco inserido pelo promoter do evento,
  450.            esse c_address eh o que aparecera no app, o address sera ignorado pelo app
  451.            '''
  452.             name = request.json.get('name')
  453.             promoter =  request.json.get('promoter')
  454.             contact = request.json.get('contact')
  455.             date = request.json.get('date')
  456.             preferences = request.json.get('preferences')
  457.             coordinates = request.json.get('coordinates')
  458.             c_address = request.json.get('c_address')
  459.             about = request.json.get('about')
  460.  
  461.             if about is None or coordinates is None or c_address is None or name is None or promoter is None or contact is None or date is None or preferences is None:
  462.                 abort(400)
  463.  
  464.             date = dateparse(date)
  465.            
  466.             event = events.find({"name": name, "promoter":promoter, "contact":contact, 'date':date, 'coordinates':coordinates})
  467.            
  468.             if event.count() == 0:
  469.                 try:
  470.                     '''
  471.                    Caso tenha, teremos que recuperar um endereco pra filtragem da comparacao posteriormente
  472.                    Aqui precisa de um try/except pois as vezes da falha de timeout
  473.                    '''
  474.                     location = geolocator.reverse(tuple(coordinates))
  475.  
  476.                     data.update({'address':{'state': location.raw['address']['state'], 'country':location.raw['address']['country']}})
  477.  
  478.                 except GeocoderTimedOut as e:
  479.                     return {'message': "location not found"}
  480.  
  481.                 data.update({'date':date, 'going':[]})
  482.                 event_id = events.insert_one(data)
  483.                 user = users.update_one({"_id": promoter}, {"$push":{"by_me": {"event_id": event_id.inserted_id, "date" : date}}})
  484.                
  485.                 user_dir = joinPath(joinPath(upload_dir,"users"), promoter)
  486.                 event_dir = joinPath(user_dir, "events")
  487.                 os.makedirs(joinPath(event_dir, str(event_id.inserted_id)))
  488.                
  489.                 return {'message' : str(event_id.inserted_id)}
  490.             else:
  491.                 return {'response' : False}
  492.  
  493.  
  494.     def put(self):
  495.         #alterar uma informacao do evento
  496.         data = request.get_json()
  497.  
  498.         if not data:
  499.             abort(400)
  500.  
  501.         else:
  502.             event_id = request.json.get('event_id')
  503.             date = request.json.get('date')
  504.             coordinates = request.json.get('coordinates')
  505.  
  506.             if event_id is None:
  507.                 abort(400)
  508.  
  509.             if date is not None:
  510.                 date = dateparse(date)
  511.                 data.update({'date':date})
  512.  
  513.             if coordinates is not None:
  514.                 try:
  515.                     '''
  516.                    Caso tenha, teremos que recuperar um endereco pra filtragem da comparacao posteriormente
  517.                    Aqui precisa de um try/except pois as vezes da falha de timeout
  518.                    '''
  519.                     location = geolocator.reverse(tuple(coordinates))
  520.                     data.update({'address':{'state': location.raw['address']['state'], 'country':location.raw['address']['country']}})
  521.                
  522.                 except GeocoderTimedOut as e:
  523.                     return {'response':False}
  524.  
  525.             #event = events.find({"name": name, "promoter":promoter, "contact":contact, 'date':date, 'coordinates':coordinates})
  526.            
  527.             try:
  528.                 event_id = ObjectId(event_id)
  529.  
  530.             except:
  531.                 abort(400)
  532.  
  533.             data.pop("_id",None)
  534.             events.update_one({"_id": event_id}, {'$set': data})
  535.  
  536.         return {'response': True}
  537.            
  538. class DeleteEvent(Resource):
  539.  
  540.     decorators = [auth.login_required]
  541.  
  542.     def delete(self, event_id):
  543.         #deletar um evento
  544.         '''
  545.        event_id = request.json.get('event_id')
  546.  
  547.        if event_id is None:
  548.                abort(400)
  549.        '''
  550.         try:
  551.             event_id = ObjectId(event_id)
  552.  
  553.         except:
  554.             abort(400)
  555.  
  556.         promoter = events.find_one({"_id": event_id})["promoter"]
  557.  
  558.  
  559.         event_item = events.delete_one({"_id":event_id})
  560.        
  561.         users.update_many({}, {'$pull':{'past':{'event_id': event_id}}})
  562.         users.update_many({}, {'$pull':{'next':{'event_id': event_id}}})
  563.         users.update({}, {'$pull':{'by_me':{'event_id': event_id}}})
  564.  
  565.         user_dir = joinPath(joinPath(upload_dir,"users"), promoter)
  566.         event_dir = joinPath(user_dir, "events")
  567.         if os.path.isdir(joinPath(event_dir, str(event_id))):
  568.             shutil.rmtree(joinPath(event_dir, str(event_id)))
  569.        
  570.         '''
  571.        nearby.update_many({},{'$pull':{'events_near':{'event_id': event_id}}})
  572.        recommended.update_many({}, {'$pull':{'similarities':{'event_id': event_id}}})
  573.        '''
  574.         if event_item.deleted_count:
  575.             return {"response":True}
  576.         else:
  577.             {"response" : False}
  578.  
  579.  
  580. class Going(Resource):
  581.     decorators = [auth.login_required]
  582.     '''
  583.    Para participar (post) e deixar de participar (delete) de um evento
  584.    '''
  585.     def post(self, user_id, event_id):
  586.         '''
  587.        user_id = request.json.get('_id')
  588.        if user_id is None:
  589.            abort(400)
  590.        '''
  591.         try:
  592.             event_id = ObjectId(event_id)
  593.             ObjectId(event_id)
  594.         except:
  595.             abort(400)
  596.  
  597.         else:
  598.             event = events.find_one({"_id":event_id, 'date':{'$gte':today}})
  599.             if event:
  600.  
  601.                 events.update_one({"_id":event_id},{'$push':{'going':user_id}})
  602.                 users.update_one({"_id":user_id}, {'$push':{'next':{"event_id": event_id, "date" : event['date']}}})
  603.  
  604.                 return {'response': True}
  605.             else:
  606.                 return {'response': False}
  607.  
  608.     def delete(self, user_id, event_id):
  609.         '''
  610.        user_id = request.json.get('_id')
  611.        if user_id is None:
  612.            abort(400)
  613.        '''
  614.         try:
  615.             event_id = ObjectId(event_id)
  616.             ObjectId(event_id)
  617.         except:
  618.             abort(400)
  619.  
  620.         else:
  621.             events.update_one({"_id":event_id},{'$pull':{'going':user_id}})
  622.             users.update_one({"_id":user_id}, {'$pull':{'next':{"event_id": event_id}}})
  623.             return {'response': True}
  624.  
  625.  
  626. class UserPhoto(Resource):
  627.     decorators = [auth.login_required]
  628.     def get(self,user_id):
  629.         '''
  630.        fazendo GET atraves do requests:
  631.        from PIL import Image
  632.        from StringIO import StringIO
  633.        r = requests.get('http://localhost:80/users/user_id')
  634.        i = Image.open(StringIO(r.content))
  635.        i.save("arquivo.jpeg")
  636.        '''
  637.  
  638.         photoDir = joinPath(upload_dir, joinPath(joinPath("users",user_id), "profile"))
  639.         try:
  640.             #ext = imghdr.what(glob(joinPath(photoDir,"*.*"))[0])          
  641.             #if ext in ['jpeg', 'jpg', 'png']:
  642.             image = send_from_directory(photoDir,"profile_photo_"+ user_id+".jpg")
  643.        
  644.         except Exception as e:
  645.             print e
  646.             return {"response": False}
  647.  
  648.         else:
  649.             return image
  650.  
  651.  
  652.     def post(self, user_id):
  653.  
  654.         if 'file' in request.files:
  655.  
  656.             file = request.files['file']
  657.  
  658.             if file:
  659.                 try:
  660.                     photoDir = joinPath(upload_dir, joinPath(joinPath("users",user_id), "profile"))
  661.                     file.save(joinPath(photoDir,"profile_photo_"+user_id+".jpg"))
  662.  
  663.                 except Exception as e:
  664.                     print e
  665.                     return {"response": False}
  666.  
  667.                 else:
  668.                     return {"response": True}
  669.             else:
  670.                 print 1
  671.                 abort(400)
  672.         else:
  673.             print 2
  674.             abort(400)
  675.  
  676. class EventPhoto(Resource):
  677.     decorators = [auth.login_required]
  678.     def get(self, user_id, event_id):
  679.         eventsDir = joinPath(upload_dir, joinPath(joinPath("users",user_id), "events"))
  680.         photoDir = joinPath(eventsDir,event_id)
  681.         try:
  682.             #ext = imghdr.what(glob(joinPath(photoDir,"*.*"))[0])          
  683.             #if ext in ['jpeg', 'jpg', 'png']:
  684.             image = send_from_directory(photoDir,"event_photo_"+ event_id+".jpeg")
  685.        
  686.         except Exception as e:
  687.             print e
  688.             return {"response": False}
  689.  
  690.         else:
  691.             return image
  692.  
  693.  
  694.     def post(self, user_id, event_id):
  695.         if 'file' in request.files:
  696.  
  697.             file = request.files['file']
  698.  
  699.             if file:
  700.                 try:
  701.                     eventDir = joinPath(upload_dir, joinPath(joinPath("users",user_id), "events"))
  702.                     photoDir = joinPath(eventDir,event_id)
  703.                     file.save(joinPath(photoDir,"event_photo_"+event_id+".jpg"))
  704.  
  705.                 except Exception as e:
  706.                     #print e
  707.                     return {"response": False}
  708.  
  709.                 else:
  710.                     return {"response": True}
  711.             else:
  712.                 abort(400)
  713.         else:
  714.             abort(400)
  715.  
  716.  
  717.  
  718. api = Api(app)
  719.  
  720.  
  721. api.add_resource(Verify, "/verify/<string:user_id>")
  722. api.add_resource(NewUser, "/new_user")
  723. api.add_resource(UserLogged, "/user/<string:user_id>")
  724. api.add_resource(UniqueEventSearch, "/unique_event_search/<string:event_id>")
  725. api.add_resource(NearbyEventSearch, "/nearby_event_search/<string:user_id>")
  726. api.add_resource(RecommendedEventSearch, "/recommended_event_search/<string:user_id>")
  727. api.add_resource(PopularEventSearch, "/popular_event_search")
  728. api.add_resource(Event, "/events")
  729. api.add_resource(DeleteEvent, "/events/<string:event_id>")
  730. api.add_resource(MyEvents, "/myevents/<string:user_id>")
  731. api.add_resource(Going, "/go/<string:user_id>/<string:event_id>")
  732. api.add_resource(UserPhoto, "/upload/<string:user_id>")
  733. api.add_resource(EventPhoto, "/upload/<string:user_id>/<string:event_id>")
  734.  
  735. if __name__ == '__main__':
  736.     app.run(host='0.0.0.0', port=80)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement