def getSinglePoint(): cityName = request.args.get('city', None) pointName = request.args.get('point', None) if cityName and pointName: cityName = urlDecode(cityName) pointName = urlDecode(pointName) return jsonify(getTopPointsOfCity(cityName, 150)['points'][pointName]) return 'invalid city/point'
def getCityPointsOrder(): cityName = request.args.get('city', None) amount = int(request.args.get('amount', 100)) if cityName: cityName = urlDecode(cityName) return jsonify(getTopPointsOfCity(cityName, amount)['pointsOrder']) return 'invalid city'
def planner(): cityName = clientDefaultCity cityName = request.args.get('city', cityName) if cityName: cityName = urlDecode(cityName) strFormat = '%y/%m/%d' startDate = datetime.datetime.now().strftime(strFormat) endDate = (datetime.datetime.now() + datetime.timedelta(days=clientDefaultTripLength-1)).strftime(strFormat) startDayTime, endDayTime = clientDefaultStartTime, clientDefaultEndTime startDate = request.args.get('startDate', startDate) endDate = request.args.get('endDate', endDate) startDayTime = float(request.args.get('startDayTime', startDayTime)) endDayTime = float(request.args.get('endDayTime', endDayTime)) numDays = getNumDays(startDate, endDate) likes = request.args.get('likes', []) likesTimings = request.args.get('likesTimings', []) mustVisit = {dayNum: [] for dayNum in range(1, numDays + 1)} if likes and likesTimings: likes = list(map(urlDecode, likes.split('|'))) likesTimings = list(map(urlDecode, likesTimings.split('|'))) for pointName, timing in zip(likes, likesTimings): dayNum, enterTime, exitTime = map(float, timing.split('-')) mustVisit[dayNum].append((enterTime, exitTime, pointName)) for dayNum in mustVisit: mustVisit[dayNum] = list(sorted(mustVisit[dayNum])) dislikes = request.args.get('dislikes', []) if dislikes: dislikes = list(map(urlDecode, dislikes.split('|'))) constraints = { 'cityName': cityName, 'likes': likes, 'likesTimings': likesTimings, 'dislikes': dislikes, 'startDate': startDate, 'endDate': endDate, 'startDayTime': startDayTime, 'endDayTime': endDayTime, 'page': 1, 'pFactor': 'less', 'algo': 'static' } return render_template('planner.html', initialConstraints=json.dumps(constraints), apiKey=getRandomAPIKey())
def fetchImage(): url = request.args.get('url') width = request.args.get('width', 'null') height = request.args.get('height', 'null') # print('Requested image-fetch', url, width, height) url = urlDecode(url) if width != 'null' and height != 'null': size = int(width), int(height) else: size = None image = getImageFromMemcache(url, size) # print(image) output = io.BytesIO() image.convert('RGBA').save(output, format='PNG') output.seek(0, 0) return send_file(output, mimetype='image/png', as_attachment=False)
def getItinerary(): tstart = time.time() cityName = clientDefaultCity cityName = request.args.get('city', cityName) if cityName: cityName = urlDecode(cityName) strFormat = '%y/%m/%d' startDate = datetime.datetime.now().strftime(strFormat) endDate = (datetime.datetime.now() + datetime.timedelta(days=clientDefaultTripLength - 1)).strftime(strFormat) startDayTime, endDayTime = clientDefaultStartTime, clientDefaultEndTime startDate = request.args.get('startDate', startDate) endDate = request.args.get('endDate', endDate) startDayTime = float(request.args.get('startDayTime', startDayTime)) endDayTime = float(request.args.get('endDayTime', endDayTime)) numDays = getNumDays(startDate, endDate) likes = request.args.get('likes', []) likesTimings = request.args.get('likesTimings', []) mustVisit = {dayNum: [] for dayNum in range(1, numDays + 1)} if likes and likesTimings: likes = list(map(urlDecode, likes.split('|'))) likesTimings = list(map(urlDecode, likesTimings.split('|'))) for pointName, timing in zip(likes, likesTimings): dayNum, enterTime, exitTime = map(float, timing.split('-')) mustVisit[dayNum].append((enterTime, exitTime, pointName)) for dayNum in mustVisit: mustVisit[dayNum] = list(sorted(mustVisit[dayNum])) tupleMustVisit = [] for dayNum in range(1, numDays + 1): tupleMustVisit.append((dayNum, tuple(map(tuple, mustVisit[dayNum])))) dislikes = request.args.get('dislikes', []) if dislikes: dislikes = list(map(urlDecode, dislikes.split('|'))) page = int(request.args.get('page', '1')) algo = request.args.get('algo', 'static') pFactor = request.args.get('pFactor', 'less') itineraryFunction = _getItinerary_static if algo == 'incremental': itineraryFunction = _getItinerary_incremental itinerary = itineraryFunction(cityName=cityName, likes=likes, mustVisit=tupleMustVisit, dislikes=dislikes, startDate=startDate, endDate=endDate, startDayTime=startDayTime, endDayTime=endDayTime, page=page, pFactor=pFactor) mustVisitItinerary = [] start = datetime.datetime(*list(map(int, startDate.strip().split('/')))) pointMap = getTopPointsOfCity(cityName, 100)['points'] for dayNum in range(1, numDays + 1): today = start + datetime.timedelta(days=dayNum - 1) datePoint = { 'point': { 'pointName': '__newday__' }, 'dayNum': dayNum, 'date': today.strftime('%A/ %d %B /%y') } mustVisitItinerary.append(datePoint) for enterTime, exitTime, pointName in mustVisit[dayNum]: visit = { 'point': pointMap[pointName], 'dayNum': dayNum, 'enterTime': enterTime, 'exitTime': exitTime } mustVisitItinerary.append(visit) itineraryCallUUID = request.args.get('uuid', None) result = { 'itinerary': itinerary, 'mustVisit': mustVisitItinerary, 'mustNotVisit': dislikes, 'uuid': itineraryCallUUID } result = json.loads(json.dumps(result)) tend = time.time() print('Time for request:', tend - tstart) return jsonify(result)
def validateLikes(): cityName = clientDefaultCity cityName = request.args.get('city', cityName) if cityName: cityName = urlDecode(cityName) strFormat = '%y/%m/%d' startDate = datetime.datetime.now().strftime(strFormat) endDate = (datetime.datetime.now() + datetime.timedelta(days=clientDefaultTripLength - 1)).strftime(strFormat) startDayTime, endDayTime = clientDefaultStartTime, clientDefaultEndTime startDate = request.args.get('startDate', startDate) endDate = request.args.get('endDate', endDate) startDayTime = float(request.args.get('startDayTime', startDayTime)) endDayTime = float(request.args.get('endDayTime', endDayTime)) numDays = getNumDays(startDate, endDate) likes = request.args.get('likes', []) likesTimings = request.args.get('likesTimings', []) mustVisit = {dayNum: [] for dayNum in range(1, numDays + 1)} if likes and likesTimings: likes = list(map(urlDecode, likes.split('|'))) likesTimings = list(map(urlDecode, likesTimings.split('|'))) for pointName, timing in zip(likes, likesTimings): dayNum, enterTime, exitTime = map(float, timing.split('-')) if dayNum not in mustVisit: return 'Invalid day number {}'.format(int(dayNum)) mustVisit[dayNum].append((enterTime, exitTime, pointName)) for dayNum in mustVisit: mustVisit[dayNum] = list(sorted(mustVisit[dayNum])) dislikes = request.args.get('dislikes', []) if dislikes: dislikes = set(map(urlDecode, dislikes.split('|'))) start = datetime.datetime(*list(map(int, startDate.strip().split('/')))) today = start weekDay = (today.weekday() + 1) % 7 weekDays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] pointMap = getTopPointsOfCity(cityName, 100)['points'] for dayNum, visits in mustVisit.items(): previousPoint = None previousExitTime = None for enterTime, exitTime, pointName in visits: if pointName in dislikes: return 'You\'ve asked us not to show {}'.format(pointName) point = pointMap[pointName] if 'openingHour' not in point or 'closingHour' not in point: continue opening = point['openingHour'].split(',')[weekDay] closing = point['closingHour'].split(',')[weekDay] if opening == '$' or closing == '$': return '{} is closed on the day {} of your plan'.format(point['pointName'], dayNum) opening = float(opening) closing = float(closing) if not (opening <= enterTime < exitTime <= closing): return 'Unacceptable enter and exit time. {} is open from {} to {} on {}'.format( point['pointName'], opening, closing, weekDays[weekDay] ) if previousPoint: travelTime = latlngDistance(*previousPoint['coordinates'].split(','), *point['coordinates'].split(',')) / avgSpeedOfTravel travelTime = roundUpTime(travelTime) if previousExitTime + travelTime > enterTime: return 'It takes {} hours to travel from {} to {}. You can\'t exit {} at {} and enter {} at {}'.format( travelTime, previousPoint['pointName'], point['pointName'], previousPoint['pointName'], previousExitTime, point['pointName'], enterTime ) previousPoint = point previousExitTime = exitTime weekDay = (weekDay + 1) % 7 return 'success'