Exemple #1
0
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'
Exemple #2
0
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())
Exemple #4
0
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)
Exemple #5
0
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)
Exemple #6
0
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'