コード例 #1
0
ファイル: views.py プロジェクト: rhouck/lsapi
def search_info(request, slug, all=False):

    if not request.user.is_authenticated():
        cred = check_creds(request.GET, Platform)
        if not cred['success']:
            return HttpResponse(json.encode(cred), content_type="application/json")

    search = get_object_or_404(Searches, key=slug)

    purch_date_time = current_time_aware()
    search_date_date = search.search_date
    """
    if not all:
        expired = True if (purch_date_time - search_date_date) > datetime.timedelta(minutes = 60) else False
        if expired:
            return HttpResponse(json.encode({'success': False, 'error': 'The quoted price has expired or the related contract has already been purchased. Please run a new search.'}), content_type="application/json")
    """
    search_dict = search.__dict__

    for k, v in search_dict.iteritems():
        if isinstance(v,datetime.date):
            search_dict[k] = conv_to_js_date(v)

    del search_dict['_state']
    del search_dict['open_status']
    del search_dict['id']
    #del search_dict['search_type']
    del search_dict['holding_per']
    del search_dict['error']

    # convert to refund system
    #search_dict = refund_format_conversion(search_dict)

    search_dict['success'] = True
    return HttpResponse(json.encode(search_dict), content_type="application/json")
コード例 #2
0
ファイル: views.py プロジェクト: rhouck/lsapi
def search_info(request, slug, all=False):

    if not request.user.is_authenticated():
        cred = check_creds(request.GET, Platform)
        if not cred['success']:
            return HttpResponse(json.encode(cred),
                                content_type="application/json")

    search = get_object_or_404(Searches, key=slug)

    purch_date_time = current_time_aware()
    search_date_date = search.search_date
    """
    if not all:
        expired = True if (purch_date_time - search_date_date) > datetime.timedelta(minutes = 60) else False
        if expired:
            return HttpResponse(json.encode({'success': False, 'error': 'The quoted price has expired or the related contract has already been purchased. Please run a new search.'}), content_type="application/json")
    """
    search_dict = search.__dict__

    for k, v in search_dict.iteritems():
        if isinstance(v, datetime.date):
            search_dict[k] = conv_to_js_date(v)

    del search_dict['_state']
    del search_dict['open_status']
    del search_dict['id']
    #del search_dict['search_type']
    del search_dict['holding_per']
    del search_dict['error']

    # convert to refund system
    #search_dict = refund_format_conversion(search_dict)

    search_dict['success'] = True
    return HttpResponse(json.encode(search_dict),
                        content_type="application/json")
コード例 #3
0
ファイル: models.py プロジェクト: rhouck/lsapi
    def calc_exposure_by_date(self, date=current_time_aware()):
        """
        @summary: this should be used to estimate risk expsore in extreme or 1% scenarios
        """
        # this represents the percentage increase in expected value to get to 99 conf risk based on fare and number options outstanding
        high_risk_grid = {
            5000: {
                10: 2.36,
                50: 1.31,
                100: 0.63,
                250: 0.52,
                50000: 0.26
            },
            #'1000': {'10': 50, '50': 25, '100': 20, '200': 15, '500': 10},
            #'5000': {'10': 70, '50': 50, '100': 40, '200': 25, '500': 20},
        }
        fare_cats = high_risk_grid.keys()
        fare_cats.sort()
        quant_cats = high_risk_grid[fare_cats[0]].keys()
        quant_cats.sort()

        outstanding_options = Contract.objects.filter(
            search__exp_date__gte=date)
        open_opts = [opt for opt in outstanding_options if opt.outstanding()]

        num_outstanding = len(open_opts)

        quant_cat = None
        for i in quant_cats:
            if num_outstanding <= i:
                quant_cat = i
                break
        if not quant_cat:
            quant_cat = quant_cats[0]

        # this function calculates the max risk for each individual option
        def calc_max(opt, fare_cats, quant_cat, num_outstanding, grid):
            fare_cat = None
            for i in fare_cats:
                if opt.search.locked_fare <= i:
                    fare_cat = i
                    break
            if not fare_cat:
                fare_cat = fare_cats[-1]

            return opt.search.expected_risk * (grid[fare_cat][quant_cat] + 1)

        if num_outstanding == 0:
            exp_exposure, max_current_exposure = 0, 0
        else:
            exposure = numpy.asarray([[
                opt.search.expected_risk,
                calc_max(opt, fare_cats, quant_cat, num_outstanding,
                         high_risk_grid)
            ] for opt in open_opts])
            exp_exposure = exposure[:, 0].sum()
            max_current_exposure = exposure[:, 1].sum()

        js_date = conv_to_js_date(date)
        next_expiration = outstanding_options.aggregate(
            Min('search__exp_date'))['search__exp_date__min']

        return {
            'expected_exposure': exp_exposure,
            'max_current_exposure': max_current_exposure,
            'num_outstanding': num_outstanding,
            'js_date': js_date,
            'next_expiration': next_expiration
        }
コード例 #4
0
ファイル: views.py プロジェクト: rhouck/lsapi
def price_edu_combo(request):

    if request.user.is_authenticated():
        clean = False
    else:
        clean = True

    if (request.POST):
        if clean:
            cred = check_creds(request.POST, Platform)
            if not cred['success']:
                return HttpResponse(json.encode(cred),
                                    content_type="application/json")

        form = full_option_info(request.POST)
        build = {'form': form}
        if form.is_valid():
            cd = form.cleaned_data
            #inp_errors = sim_errors(self.db, cd['origin_code'], cd['destination_code'],self.lockin_per,self.start_date,self.d_date1,self.d_date2,self.r_date1,self.r_date2,self.final_proj_week, self.max_trip_length, self.geography)

            open_status = Open.objects.get(pk=1)

            current_time = current_time_aware()
            current_date = current_time.date()
            general = {
                'search_date': current_time,
                'open_status': open_status.get_status(),
                'key': gen_alphanum_key(),
            }

            model_in = {
                'origin_code': cd['origin_code'],
                'destination_code': cd['destination_code'],
                'holding_per': cd['holding_per'],
                'depart_date1': str(cd['depart_date1']),
                'depart_date2': str(cd['depart_date2']),
                'return_date1': str(cd['return_date1']),
                'return_date2': str(cd['return_date2']),
                'search_type': 'rt',
                'depart_times': cd['depart_times'],
                'return_times': cd['return_times'],
                'convenience': cd['convenience'],
                'airlines': cd['airlines']
            }

            combined = dict(general.items() + model_in.items())

            if open_status.get_status():
                if (cd['depart_date2'] - cd['depart_date1']).days > 2 or (
                        cd['return_date2'] - cd['return_date1']).days > 2:
                    model_out = {
                        'error':
                        'Travel date ranges must not be more than two days in length'
                    }
                elif (cd['depart_date2'] < cd['depart_date1']) or (
                        cd['return_date2'] < cd['return_date1']):
                    model_out = {'error': 'Travel date ranges are wrong'}
                elif (cd['depart_date1'] - datetime.timedelta(days=13)) < (
                        current_date +
                        datetime.timedelta(days=(cd['holding_per'] * 7))):
                    model_out = {
                        'error':
                        'Cannot purchase fare protection valid closer than two weeks to departure.'
                    }
                else:
                    flights = pull_fares_range(
                        cd['origin_code'],
                        cd['destination_code'],
                        (cd['depart_date1'], cd['depart_date2']),
                        (cd['return_date1'], cd['return_date2']),
                        cd['depart_times'],
                        cd['return_times'],
                        cd['convenience'],
                        cd['airlines'],
                        search_key=combined['key'])
                    #return HttpResponse(json.encode(flights), content_type="application/json")

                    if flights['success']:
                        #prices = calc_price(cd['origin_code'], cd['destination_code'], flights['fares'], cd['holding_per']*7, [cd['depart_date1'],cd['depart_date2']], [cd['return_date1'],cd['return_date2']], general['search_date'])
                        prices = calc_price(cd['origin_code'],
                                            cd['destination_code'],
                                            flights['fares'],
                                            cd['holding_per'] * 7,
                                            general['search_date'])
                        model_out = {
                            'holding_price': prices['holding_price'],
                            'locked_fare': prices['locked_fare'],
                            'expected_risk': prices['expected_risk'],
                            'exp_date': prices['exp_date'],
                            'total_flexibility': prices['total_flexibility'],
                            'time_to_departure': prices['time_to_departure'],
                            'error': prices['error']
                        }
                    else:
                        model_out = {'error': flights['error']}
            else:
                model_out = {
                    'error':
                    'Due to high demand, we are currently not making any additional sales. Please check again later.'
                }

            # save in model
            combined.update(model_out.items())
            search_params = Searches(**combined)
            search_params.save()
            search_key = search_params.key

            # add current flight list if no errors and 'show_flights' is true
            if not model_out['error']:
                pass
                #model_out = refund_format_conversion(model_out)
            #combined_results = {'pricing_results': model_out, 'context': 'this flight gets expensive fast', 'inputs': model_in, 'key': search_key,}
            combined_results = {
                'pricing_results': model_out,
                'inputs': model_in,
                'key': search_key,
            }

            # convert all dates into js time-stamp
            date_bank = {}
            for i in ('inputs', 'pricing_results'):
                date_bank[i] = {}
                for k, v in combined_results[i].iteritems():
                    try:
                        date = parse(v)
                        combined_results[i][k] = conv_to_js_date(date)
                        date_bank[i]["%s_readable" % (k)] = v
                    except:
                        pass
            if date_bank:
                for i in ('inputs', 'pricing_results'):
                    combined_results[i].update(date_bank[i])

            if not model_out['error']:
                combined_results.update({'success': True})

                #combined_results['raw'] = flights
                #return HttpResponse(json.encode(combined_results), content_type="application/json")

                #if cd['disp_depart_date'] and cd['disp_return_date']:
                #    combined_results.update({'flights': flights['flights']})

            else:
                # checks for short error if generated in pull_fares_range function
                try:
                    err = flights['short_error']
                except:
                    err = model_out['error']

                combined_results.update({'success': False, 'error': err})

            build = {'form': form, 'results': combined_results}
        else:
            err_string = ""
            for error in form.errors.iteritems():
                err_string += "%s - %s " % (
                    error[0],
                    unicode(striptags(error[1]) if striptags else error[1]))

            build['results'] = {'success': False, 'error': err_string}

        return gen_search_display(request, build, clean, method='post')
    else:
        form = full_option_info()
        combined_results = None
        build = {'form': form, 'results': combined_results}
        return gen_search_display(request, build, clean, method='post')
コード例 #5
0
ファイル: models.py プロジェクト: rhouck/lsapi
    def calc_exposure_by_date(self, date=current_time_aware()):
        """
        @summary: this should be used to estimate risk expsore in extreme or 1% scenarios
        """
        # this represents the percentage increase in expected value to get to 99 conf risk based on fare and number options outstanding
        high_risk_grid = {
            5000: {10: 2.36, 50: 1.31, 100: 0.63, 250: 0.52, 50000: 0.26},
            #'1000': {'10': 50, '50': 25, '100': 20, '200': 15, '500': 10},
            #'5000': {'10': 70, '50': 50, '100': 40, '200': 25, '500': 20},
        }
        fare_cats = high_risk_grid.keys()
        fare_cats.sort()
        quant_cats = high_risk_grid[fare_cats[0]].keys()
        quant_cats.sort()

        outstanding_options = Contract.objects.filter(search__exp_date__gte=date)
        open_opts = [opt for opt in outstanding_options if opt.outstanding()]

        num_outstanding = len(open_opts)

        quant_cat = None
        for i in quant_cats:
            if num_outstanding <= i:
                quant_cat = i
                break
        if not quant_cat:
            quant_cat = quant_cats[0]

        # this function calculates the max risk for each individual option
        def calc_max(opt, fare_cats, quant_cat, num_outstanding, grid):
            fare_cat = None
            for i in fare_cats:
                if opt.search.locked_fare <= i:
                    fare_cat = i
                    break
            if not fare_cat:
                fare_cat = fare_cats[-1]

            return opt.search.expected_risk * (grid[fare_cat][quant_cat] + 1)

        if num_outstanding == 0:
            exp_exposure, max_current_exposure = 0, 0
        else:
            exposure = numpy.asarray(
                [
                    [opt.search.expected_risk, calc_max(opt, fare_cats, quant_cat, num_outstanding, high_risk_grid)]
                    for opt in open_opts
                ]
            )
            exp_exposure = exposure[:, 0].sum()
            max_current_exposure = exposure[:, 1].sum()

        js_date = conv_to_js_date(date)
        next_expiration = outstanding_options.aggregate(Min("search__exp_date"))["search__exp_date__min"]

        return {
            "expected_exposure": exp_exposure,
            "max_current_exposure": max_current_exposure,
            "num_outstanding": num_outstanding,
            "js_date": js_date,
            "next_expiration": next_expiration,
        }
コード例 #6
0
ファイル: views.py プロジェクト: rhouck/lsapi
def price_edu_combo(request):

        if request.user.is_authenticated():
            clean = False
        else:
            clean = True

        if (request.POST):
            if clean:
                cred = check_creds(request.POST, Platform)
                if not cred['success']:
                    return HttpResponse(json.encode(cred), content_type="application/json")


            form = full_option_info(request.POST)
            build = {'form': form}
            if form.is_valid():
                cd = form.cleaned_data
                #inp_errors = sim_errors(self.db, cd['origin_code'], cd['destination_code'],self.lockin_per,self.start_date,self.d_date1,self.d_date2,self.r_date1,self.r_date2,self.final_proj_week, self.max_trip_length, self.geography)


                open_status = Open.objects.get(pk=1)

                current_time = current_time_aware()
                current_date = current_time.date()
                general = {'search_date': current_time, 'open_status': open_status.get_status(), 'key': gen_alphanum_key(),}

                model_in = {'origin_code': cd['origin_code'], 
                            'destination_code': cd['destination_code'], 
                            'holding_per': cd['holding_per'],
                            'depart_date1': str(cd['depart_date1']), 
                            'depart_date2': str(cd['depart_date2']), 
                            'return_date1': str(cd['return_date1']), 
                            'return_date2': str(cd['return_date2']),
                            'search_type': 'rt', 
                            'depart_times': cd['depart_times'], 
                            'return_times': cd['return_times'], 
                            'convenience': cd['convenience'], 
                            'airlines': cd['airlines']}

                combined = dict(general.items() + model_in.items())

                if open_status.get_status():
                    if (cd['depart_date2'] - cd['depart_date1']).days > 2 or (cd['return_date2'] - cd['return_date1']).days > 2:
                        model_out = {'error': 'Travel date ranges must not be more than two days in length'}
                    elif (cd['depart_date2'] < cd['depart_date1']) or (cd['return_date2'] < cd['return_date1']):
                        model_out = {'error': 'Travel date ranges are wrong'}
                    elif (cd['depart_date1'] - datetime.timedelta(days=13)) < (current_date + datetime.timedelta(days=(cd['holding_per']*7))):
                        model_out = {'error': 'Cannot purchase fare protection valid closer than two weeks to departure.'}    
                    else:           
                        flights = pull_fares_range(cd['origin_code'], cd['destination_code'], (cd['depart_date1'], cd['depart_date2']), (cd['return_date1'], cd['return_date2']), cd['depart_times'], cd['return_times'], cd['convenience'], cd['airlines'], search_key=combined['key'])
                        #return HttpResponse(json.encode(flights), content_type="application/json")

                        if flights['success']:
                            #prices = calc_price(cd['origin_code'], cd['destination_code'], flights['fares'], cd['holding_per']*7, [cd['depart_date1'],cd['depart_date2']], [cd['return_date1'],cd['return_date2']], general['search_date'])
                            prices = calc_price(cd['origin_code'], cd['destination_code'], flights['fares'], cd['holding_per']*7, general['search_date'])
                            model_out = {'holding_price': prices['holding_price'], 'locked_fare': prices['locked_fare'], 'expected_risk': prices['expected_risk'],
                                            'exp_date': prices['exp_date'], 'total_flexibility': prices['total_flexibility'], 'time_to_departure': prices['time_to_departure'], 'error': prices['error'] }
                        else:
                            model_out = {'error': flights['error']}
                else:
                    model_out = {'error': 'Due to high demand, we are currently not making any additional sales. Please check again later.'}


                # save in model
                combined.update(model_out.items())
                search_params = Searches(**combined)
                search_params.save()
                search_key = search_params.key


                # add current flight list if no errors and 'show_flights' is true
                if not model_out['error']:
                    pass
                    #model_out = refund_format_conversion(model_out)
                #combined_results = {'pricing_results': model_out, 'context': 'this flight gets expensive fast', 'inputs': model_in, 'key': search_key,}
                combined_results = {'pricing_results': model_out, 'inputs': model_in, 'key': search_key,}

                # convert all dates into js time-stamp
                date_bank = {}
                for i in ('inputs', 'pricing_results'):
                    date_bank[i] = {}
                    for k, v in combined_results[i].iteritems():
                        try:
                            date = parse(v)
                            combined_results[i][k] = conv_to_js_date(date)
                            date_bank[i]["%s_readable" % (k)] = v
                        except:
                            pass
                if date_bank:
                    for i in ('inputs', 'pricing_results'):
                        combined_results[i].update(date_bank[i])


                if not model_out['error']:
                    combined_results.update({'success': True})

                    #combined_results['raw'] = flights
                    #return HttpResponse(json.encode(combined_results), content_type="application/json")

                    #if cd['disp_depart_date'] and cd['disp_return_date']:
                    #    combined_results.update({'flights': flights['flights']})
                    
                else:
                    # checks for short error if generated in pull_fares_range function
                    try:
                        err = flights['short_error']
                    except: 
                        err = model_out['error']

                    combined_results.update({'success': False, 'error': err})

                build = {'form': form, 'results': combined_results}
            else:
                err_string = ""
                for error in form.errors.iteritems():
                    err_string += "%s - %s " % (error[0], unicode(striptags(error[1]) if striptags else error[1]))

                build['results'] = {'success': False, 'error': err_string}
                
                
            return gen_search_display(request, build, clean, method='post')
        else:
            form = full_option_info()
            combined_results = None
            build = {'form': form, 'results': combined_results}
            return gen_search_display(request, build, clean, method='post')