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")
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")
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 }
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')
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, }
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')