def test_flight_search(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 = flight_search_form(request.POST) if form.is_valid(): cd = form.cleaned_data res = run_flight_search(cd['origin_code'], cd['destination_code'], cd['depart_date1'], cd['return_date1'], cd['depart_times'], cd['return_times'], cd['convenience'], airlines=cd['airlines'], cached=False) #return HttpResponse(json.encode(res), mimetype="application/json") build = {'form': form, 'results': res} else: build = {'results': {'success': False, 'error': "Invalid inputs."}} else: form = flight_search_form() combined_results = None build = {'form': form, 'results': combined_results} return gen_search_display(request, build, clean, method='post')
def promo_details(request): if request.user.is_authenticated(): clean = False else: clean = True inputs = request.POST if request.POST else None if clean: cred = check_creds(request.POST, Platform) if not cred['success']: return HttpResponse(json.encode(cred), mimetype="application/json") form = PromoDetail(inputs) build = {'form': form} if (inputs) and form.is_valid(): cd = form.cleaned_data try: find_platform = Platform.objects.get(key=cd['platform_key']) find_cust = Customer.objects.get(email=cd['email'], platform=find_platform) find_promo = Promo.objects.get(customer=find_cust, code=cd['code']) if find_promo.contract: raise Exception("Promotional code already used.") except (Customer.DoesNotExist): build['error_message'] = 'The customer is not registered.' build['results'] = {'success': False, 'error': 'The customer is not registered.'} except (Promo.DoesNotExist): build['error_message'] = 'The promo code is not valid.' build['results'] = {'success': False, 'error': 'The promo code is not valid.'} except (Exception) as err: build['error_message'] = '%s' % err build['results'] = {'success': False, 'error': '%s' % err} else: results = find_promo.__dict__ for i in ('id', 'contract_id', 'customer_id', '_state'): if i in results: del results[i] if 'created_date' in results: results['created_date'] = str(results['created_date']) build['results'] = results build['results']['success'] = True 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')
def create_promo(request): inputs = request.POST if request.POST else None form = CreatePromoForm(inputs) build = {'form': form} if (inputs) and form.is_valid(): cd = form.cleaned_data try: find_platform = Platform.objects.get(key=cd['platform_key']) find_cust = Customer.objects.get(email=cd['email'], platform=find_platform) new_promo = Promo(customer=find_cust, value=cd['value'], created_date=current_time_aware(), code=gen_alphanum_key()) new_promo.save() except (Customer.DoesNotExist): build['error_message'] = 'The customer is not registered.' build['results'] = { 'success': False, 'error': 'The customer is not registered.' } except (Platform.DoesNotExist): build['error_message'] = 'The platform key is not valid.' build['results'] = { 'success': False, 'error': 'The platform key is not valid.' } except (Exception) as err: build['error_message'] = '%s' % err build['results'] = {'success': False, 'error': '%s' % err} else: results = new_promo.__dict__ for i in ('id', 'customer_id', '_state'): if i in results: del results[i] if 'created_date' in results: results['created_date'] = str(results['created_date']) build['results'] = results build['results']['success'] = True 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, False, method='post')
def create_promo(request): inputs = request.POST if request.POST else None form = CreatePromoForm(inputs) build = {'form': form} if (inputs) and form.is_valid(): cd = form.cleaned_data try: find_platform = Platform.objects.get(key=cd['platform_key']) find_cust = Customer.objects.get(email=cd['email'], platform=find_platform) new_promo = Promo(customer=find_cust, value=cd['value'], created_date= current_time_aware(), code=gen_alphanum_key()) new_promo.save() except (Customer.DoesNotExist): build['error_message'] = 'The customer is not registered.' build['results'] = {'success': False, 'error': 'The customer is not registered.'} except (Platform.DoesNotExist): build['error_message'] = 'The platform key is not valid.' build['results'] = {'success': False, 'error': 'The platform key is not valid.'} except (Exception) as err: build['error_message'] = '%s' % err build['results'] = {'success': False, 'error': '%s' % err} else: results = new_promo.__dict__ for i in ('id', 'customer_id', '_state'): if i in results: del results[i] if 'created_date' in results: results['created_date'] = str(results['created_date']) build['results'] = results build['results']['success'] = True 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, False, method='post')
def promo_details(request): if request.user.is_authenticated(): clean = False else: clean = True inputs = request.POST if request.POST else None if clean: cred = check_creds(request.POST, Platform) if not cred['success']: return HttpResponse(json.encode(cred), mimetype="application/json") form = PromoDetail(inputs) build = {'form': form} if (inputs) and form.is_valid(): cd = form.cleaned_data try: find_platform = Platform.objects.get(key=cd['platform_key']) find_cust = Customer.objects.get(email=cd['email'], platform=find_platform) find_promo = Promo.objects.get(customer=find_cust, code=cd['code']) if find_promo.contract: raise Exception("Promotional code already used.") except (Customer.DoesNotExist): build['error_message'] = 'The customer is not registered.' build['results'] = { 'success': False, 'error': 'The customer is not registered.' } except (Promo.DoesNotExist): build['error_message'] = 'The promo code is not valid.' build['results'] = { 'success': False, 'error': 'The promo code is not valid.' } except (Exception) as err: build['error_message'] = '%s' % err build['results'] = {'success': False, 'error': '%s' % err} else: results = find_promo.__dict__ for i in ('id', 'contract_id', 'customer_id', '_state'): if i in results: del results[i] if 'created_date' in results: results['created_date'] = str(results['created_date']) build['results'] = results build['results']['success'] = True 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')
def close_contests(request): if request.user.is_authenticated(): clean = False else: clean = True inputs = request.POST if request.POST else None if clean: cred = check_creds(request.POST, Platform) if not cred['success']: return HttpResponse(json.encode(cred), mimetype="application/json") current_time = current_time_aware() yesterday = current_time - datetime.timedelta(days=1) contests = Contest.objects.filter(closed=False) contest_data = [] for i in contests: if i.end_price_date() < current_time and i.end_price_date( ) >= yesterday: contest_meta_data = {'key': i.key} subs = Submission.objects.filter( contest=i).order_by('created_date') contest_meta_data['subs'] = subs.count() if subs: # build list of current flights res = run_flight_search(i.origin_code, i.destination_code, i.depart_date, i.return_date, 'any', 'any', 'any', 'any', cached=True) if res['success']: #return HttpResponse(json.encode(res), mimetype="application/json") i.end_price = res['min_fare'] if not i.end_price: i.closed = True i.save() else: try: # find earliest-closest entry closest = None for k in subs: dif = abs(k.value - i.end_price) if not closest: closest = (k, dif) else: if dif < closest[1]: closest = (k, dif) # create promo for this user new_promo = Promo(customer=closest[0].customer, created_date=current_time, value=i.value, code=gen_alphanum_key()) new_promo.save() # send email subject = "You won the fare prediction contest!" title = "Dang, you are good." body = "You may remember entering a fare prediction contest on %s. We told you we'd let you know if your guess was closest to the actual fare and here we are. Also as promised, here's a promo code which let's you buy a Flex Fare for just $1:\n\n%s\n\nThe Level Skies Team" % ( closest[0].created_date.strftime("%B %d"), new_promo.code) try: send_template_email(closest[0].customer.email, subject, title, body) except: pass # close contest i.closed = True i.save() except Exception as err: contest_meta_data['error'] = err contest_data.append(contest_meta_data) results = {'success': True, 'contest_data': contest_data} return gen_search_display(request, {'results': results}, clean, method='post')
def make_submission(request): if request.user.is_authenticated(): clean = False else: clean = True inputs = request.POST if request.POST else None if clean: cred = check_creds(request.POST, Platform) if not cred['success']: return HttpResponse(json.encode(cred), mimetype="application/json") form = ContestSubmissionForm(inputs) build = {'form': form} if (inputs) and form.is_valid(): cd = form.cleaned_data try: find_platform = Platform.objects.get(key=cd['platform_key']) find_contest = Contest.objects.get(key=cd['contest_key']) # either find the existing customer associated with the platform and email addres or create it try: find_cust = Customer.objects.get(email=cd['email'], platform=find_platform) except: inps = {} inps['key'] = gen_alphanum_key() inps['reg_date'] = current_time_aware().date() inps['platform'] = find_platform inps['email'] = cd['email'] find_cust = Customer(**inps) find_cust.save() find_cust.create_highrise_account() find_cust.add_highrise_tag('contest') try: sub = Submission.objects.get(customer=find_cust, contest=find_contest) except: sub = Submission(contest=find_contest, customer=find_cust, created_date=current_time_aware(), value=cd['value']) sub.save() else: raise Exception( "A submission has already been made to this contest with this email address." ) except (Contest.DoesNotExist): build['error_message'] = 'The contest key entered is not valid.' build['results'] = { 'success': False, 'error': 'The contest key entered is not valid.' } except (Exception) as err: build['error_message'] = '%s' % err build['results'] = { 'success': False, 'error': 'Could not record your entry. %s' % err } else: # send email if subission successful subject = "We got your submission" title = "Now let's see how well you do..." if find_contest.decision_time == 1: time = "another week" elif find_contest.decision_time == 2: time = "another two weeks" elif find_contest.decision_time == 3: time = "another three weeks" elif find_contest.decision_time == 4: time = "another four weeks" else: time = "several days" body = "This contest is over soon but we won't know the final price of the flight for %s. When that happens we'll let you know if you won and earned a discount on your next Flex Fare. Don't worry, you don't have to wait long and you can enter the next contest as soon as it starts." % ( time) try: send_template_email(sub.customer.email, subject, title, body) except: pass build['results'] = {'success': True} 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')
def contest(request): if request.user.is_authenticated(): clean = False else: clean = True if clean: cred = check_creds(request.POST, Platform) if not cred['success']: return HttpResponse(json.encode(cred), mimetype="application/json") contest_length = 1 promotion_value = 500 current_time = current_time_aware() try: filt_date = (current_time - datetime.timedelta(days=contest_length + 1)) contest = Contest.objects.filter(expire_date__gte=filt_date) if contest: contest = contest.latest('expire_date') if contest.expire_date < current_time: contest = None # create new contest none exist or most recent has expired if not contest: # select route origins = ['SFO', 'LAX', 'JFK', 'PHL', 'ORD'] destinations = [ 'SFO', 'LAX', 'JFK', 'PHL', 'ATL', 'BOS', 'ORD', 'DFW', 'SAN', 'IAD' ] origin = random.choice(origins) if origin in destinations: destinations.remove(origin) destination = random.choice(destinations) # select decision time decision_times = [ 1, 2, ] decision_time = random.choice(decision_times) # select travel dates current_date = current_time.date() depart_date = current_date + datetime.timedelta(days=( (decision_time * 7) + random.randrange(14, 60))) return_date = depart_date + datetime.timedelta( days=random.randrange(2, 20)) contest = Contest( key=gen_alphanum_key(), created_date=current_time, expire_date=(current_time + datetime.timedelta(days=contest_length)), origin_code=origin, destination_code=destination, decision_time=decision_time, depart_date=depart_date, return_date=return_date, value=promotion_value) contest.save() # add try except if can't create contest results = contest.__dict__ for i in ('id', '_state'): if i in results: del results[i] if not contest: raise Exception( 'No contest currently available. Please check again shortly') # build list of current flights res = run_flight_search(contest.origin_code, contest.destination_code, contest.depart_date, contest.return_date, 'any', 'any', 'any', 'any', cached=True) if res['success']: for i in ('success', 'min_flight', 'airlines'): del res[i] results['flights'] = res #return HttpResponse(json.encode(res), content_type="application/json") else: raise Exception( 'No contest currently available. Please check again shortly') results['success'] = True except Exception as err: results = {'success': False, 'error': err} # format date types for json for k, v in results.iteritems(): if isinstance(v, (datetime.date, datetime.datetime)): results[k] = str(v) #return HttpResponse(json.encode(results), content_type="application/json") return gen_search_display(request, {'results': results}, clean, method='post')
def sweep_expired(request): """ @summary: run this daily to find prices on searches that expired within 24 hours this will help with analysis and model building cycle through recently expired options """ 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") # ensure this query is not run more than once/24hrs current_time = current_time_aware() run_dates = ExpiredSearchPriceCheck.objects if not run_dates.exists() or (current_time - run_dates.latest( 'run_date').run_date) >= datetime.timedelta(hours=23): latest_price_check = ExpiredSearchPriceCheck(run_date=current_time) latest_price_check.save() # pull searches expiring in last 24 hours yesterday = current_time - datetime.timedelta(days=1) recent_expired = Searches.objects.filter( exp_date__range=[yesterday, current_time]) # check expired demos exp_demo_query = Demo.objects.filter( search__exp_date__range=[yesterday, current_time]) demo_keys = [str(i.search.key) for i in exp_demo_query] # run flight search query on each recently expired option expired_searches = [] expired_demos = [] for i in recent_expired: flights = pull_fares_range(i.origin_code, i.destination_code, (i.depart_date1, i.depart_date2), (i.return_date1, i.return_date2), i.depart_times, i.return_times, i.convenience, i.airlines, cached=True) expired_searches.append({ 'search': i.key, 'success': flights['success'] }) # check if search relates to an expired demo contract, if so, check if customer would have saved money if i.key in demo_keys and flights['success']: savings_string = "" for j in flights['fares']: savings = math.floor(float(j['fare']) - i.locked_fare) # don't alert customer of savings unless greater than X dollars if savings >= 10: """ dep_flights = " | ".join(["%s %s" % (k['airline_short_name'], k['flight_number']) for k in j['flight']['departing']['detail']]) ret_flights = " | ".join(["%s %s" % (k['airline_short_name'], k['flight_number']) for k in j['flight']['returning']['detail']]) dep_datetime = parse(j['flight']['departing']['take_off_time']).strftime("%B %d, %Y at %I:%M%p") ret_datetime = parse(j['flight']['returning']['take_off_time']).strftime("%B %d, %Y at %I:%M%p") savings_string += "$%s departing %s on %s \nand returning %s on %s\n\n" % (savings, dep_datetime, dep_flights, ret_datetime, ret_flights) """ dep_datetime = parse( j['flight']['departing'] ['take_off_time']).strftime("%B %d, %Y") ret_datetime = parse( j['flight']['returning'] ['take_off_time']).strftime("%B %d, %Y") savings_string += "$%s departing %s and returning %s\n\n" % ( savings, dep_datetime, ret_datetime) # send customer email describing potential savings if savings were possible if savings_string: try: title = "Here's what you could have saved by buying a Flex Fare" body = "Thanks for checking out Level Skies and for taking a closer look at the Flex Fare. You previously signed up for a trial run of the Flex Fare and now we're hear to show you what could have happened had you actually made the purchase. Prices on the flights you were looking at went up, as they tend to do! Here are the potential savings that would have been available to you:\n\n" body += savings_string + "\n\nWe hope you check in with us again soon becasue we'd love to save you some real cash!\n\nThe Level Skies Team" email_address = exp_demo_query.get( search__key=i.key).customer.email send_template_email(email_address, 'Flex Fare Trial', title, body) except: pass expired_demos.append({ 'search': i.key, 'savings': True if savings_string else False }) # check fares on open contracts contracts_query = Contract.objects.filter( search__exp_date__gt=current_time, ex_date=None) open_contracts = [] for i in contracts_query: flights = pull_fares_range( i.search.origin_code, i.search.destination_code, (i.search.depart_date1, i.search.depart_date2), (i.search.return_date1, i.search.return_date2), i.search.depart_times, i.search.return_times, i.search.convenience, i.search.airlines, cached=True) open_contracts.append({ 'search': i.search.key, 'success': flights['success'] }) duration = current_time_aware() - current_time results = { 'success': True, 'time_run': str(current_time), 'expired_demos': expired_demos, 'expired_searches': expired_searches, 'open_contracts': open_contracts, 'duration': str(duration), 'count': recent_expired.count() } # send email to sysadmin summarizing expired searches #if MODE == 'live': try: searches_email_string = "" for i in expired_searches: searches_email_string += "%s : %s\n" % (i['search'], i['success']) contracts_email_string = "" for i in open_contracts: contracts_email_string += "%s : %s\n" % (i['search'], i['success']) demos_email_string = "" for i in expired_demos: demos_email_string += "%s : %s\n" % (i['search'], i['savings']) email_body = 'Completed flight search for %s expired searches with duration of %s.\n\nSearch Key : Success status\n%s\n\n' % ( results['count'], results['duration'], searches_email_string) email_body += 'Completed %s open contracts.\n\nSearch Key : Success status\n%s\n\n' % ( len(open_contracts), contracts_email_string) email_body += 'Completed %s expired demos.\n\nSearch Key : Savings\n%s' % ( len(expired_demos), demos_email_string) send_mail('Expired searches price check', email_body, '*****@*****.**', ['*****@*****.**'], fail_silently=False) except: pass else: results = { 'success': False, 'error': 'Expired search price check ran within last 24 hours.' } return gen_search_display(request, {'results': results}, clean)
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 close_contests(request): if request.user.is_authenticated(): clean = False else: clean = True inputs = request.POST if request.POST else None if clean: cred = check_creds(request.POST, Platform) if not cred['success']: return HttpResponse(json.encode(cred), mimetype="application/json") current_time = current_time_aware() yesterday = current_time - datetime.timedelta(days=1) contests = Contest.objects.filter(closed=False) contest_data = [] for i in contests: if i.end_price_date() < current_time and i.end_price_date() >= yesterday: contest_meta_data = {'key': i.key} subs = Submission.objects.filter(contest=i).order_by('created_date') contest_meta_data['subs'] = subs.count() if subs: # build list of current flights res = run_flight_search(i.origin_code, i.destination_code, i.depart_date, i.return_date, 'any', 'any', 'any', 'any', cached=True) if res['success']: #return HttpResponse(json.encode(res), mimetype="application/json") i.end_price = res['min_fare'] if not i.end_price: i.closed = True i.save() else: try: # find earliest-closest entry closest = None for k in subs: dif = abs(k.value-i.end_price) if not closest: closest = (k, dif) else: if dif < closest[1]: closest = (k, dif) # create promo for this user new_promo = Promo(customer=closest[0].customer, created_date=current_time, value=i.value, code=gen_alphanum_key()) new_promo.save() # send email subject = "You won the fare prediction contest!" title = "Dang, you are good." body = "You may remember entering a fare prediction contest on %s. We told you we'd let you know if your guess was closest to the actual fare and here we are. Also as promised, here's a promo code which let's you buy a Flex Fare for just $1:\n\n%s\n\nThe Level Skies Team" % (closest[0].created_date.strftime("%B %d"), new_promo.code) try: send_template_email(closest[0].customer.email, subject, title, body) except: pass # close contest i.closed = True i.save() except Exception as err: contest_meta_data['error'] = err contest_data.append(contest_meta_data) results = {'success': True, 'contest_data': contest_data} return gen_search_display(request, {'results': results}, clean, method='post')
def make_submission(request): if request.user.is_authenticated(): clean = False else: clean = True inputs = request.POST if request.POST else None if clean: cred = check_creds(request.POST, Platform) if not cred['success']: return HttpResponse(json.encode(cred), mimetype="application/json") form = ContestSubmissionForm(inputs) build = {'form': form} if (inputs) and form.is_valid(): cd = form.cleaned_data try: find_platform = Platform.objects.get(key=cd['platform_key']) find_contest = Contest.objects.get(key=cd['contest_key']) # either find the existing customer associated with the platform and email addres or create it try: find_cust = Customer.objects.get(email=cd['email'], platform=find_platform) except: inps = {} inps['key'] = gen_alphanum_key() inps['reg_date'] = current_time_aware().date() inps['platform'] = find_platform inps['email'] = cd['email'] find_cust = Customer(**inps) find_cust.save() find_cust.create_highrise_account() find_cust.add_highrise_tag('contest') try: sub = Submission.objects.get(customer=find_cust, contest=find_contest) except: sub = Submission(contest=find_contest, customer=find_cust, created_date=current_time_aware(), value=cd['value']) sub.save() else: raise Exception("A submission has already been made to this contest with this email address.") except (Contest.DoesNotExist): build['error_message'] = 'The contest key entered is not valid.' build['results'] = {'success': False, 'error': 'The contest key entered is not valid.'} except (Exception) as err: build['error_message'] = '%s' % err build['results'] = {'success': False, 'error': 'Could not record your entry. %s' % err} else: # send email if subission successful subject = "We got your submission" title = "Now let's see how well you do..." if find_contest.decision_time == 1: time = "another week" elif find_contest.decision_time == 2: time = "another two weeks" elif find_contest.decision_time == 3: time = "another three weeks" elif find_contest.decision_time == 4: time = "another four weeks" else: time = "several days" body = "This contest is over soon but we won't know the final price of the flight for %s. When that happens we'll let you know if you won and earned a discount on your next Flex Fare. Don't worry, you don't have to wait long and you can enter the next contest as soon as it starts." % (time) try: send_template_email(sub.customer.email, subject, title, body) except: pass build['results'] = {'success': True} 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')
def contest(request): if request.user.is_authenticated(): clean = False else: clean = True if clean: cred = check_creds(request.POST, Platform) if not cred['success']: return HttpResponse(json.encode(cred), mimetype="application/json") contest_length = 1 promotion_value = 500 current_time = current_time_aware() try: filt_date = (current_time-datetime.timedelta(days=contest_length+1)) contest = Contest.objects.filter(expire_date__gte=filt_date) if contest: contest = contest.latest('expire_date') if contest.expire_date < current_time: contest = None # create new contest none exist or most recent has expired if not contest: # select route origins = ['SFO', 'LAX', 'JFK', 'PHL', 'ORD'] destinations = ['SFO', 'LAX', 'JFK', 'PHL', 'ATL', 'BOS', 'ORD', 'DFW', 'SAN', 'IAD'] origin = random.choice(origins) if origin in destinations: destinations.remove(origin) destination = random.choice(destinations) # select decision time decision_times = [1,2,] decision_time = random.choice(decision_times) # select travel dates current_date = current_time.date() depart_date = current_date + datetime.timedelta(days=((decision_time*7)+ random.randrange(14,60))) return_date = depart_date + datetime.timedelta(days=random.randrange(2,20)) contest = Contest(key=gen_alphanum_key(), created_date=current_time, expire_date=(current_time + datetime.timedelta(days=contest_length)), origin_code=origin, destination_code=destination, decision_time=decision_time, depart_date=depart_date, return_date=return_date, value=promotion_value) contest.save() # add try except if can't create contest results = contest.__dict__ for i in ('id', '_state'): if i in results: del results[i] if not contest: raise Exception('No contest currently available. Please check again shortly') # build list of current flights res = run_flight_search(contest.origin_code, contest.destination_code, contest.depart_date, contest.return_date, 'any', 'any', 'any', 'any', cached=True) if res['success']: for i in ('success', 'min_flight', 'airlines'): del res[i] results['flights'] = res #return HttpResponse(json.encode(res), content_type="application/json") else: raise Exception('No contest currently available. Please check again shortly') results['success'] = True except Exception as err: results = {'success': False, 'error': err} # format date types for json for k, v in results.iteritems(): if isinstance(v, (datetime.date, datetime.datetime)): results[k] = str(v) #return HttpResponse(json.encode(results), content_type="application/json") return gen_search_display(request, {'results': results}, clean, method='post')
def sweep_expired(request): """ @summary: run this daily to find prices on searches that expired within 24 hours this will help with analysis and model building cycle through recently expired options """ 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") # ensure this query is not run more than once/24hrs current_time = current_time_aware() run_dates = ExpiredSearchPriceCheck.objects if not run_dates.exists() or (current_time - run_dates.latest('run_date').run_date) >= datetime.timedelta(hours=23): latest_price_check = ExpiredSearchPriceCheck(run_date=current_time) latest_price_check.save() # pull searches expiring in last 24 hours yesterday = current_time - datetime.timedelta(days=1) recent_expired = Searches.objects.filter(exp_date__range=[yesterday, current_time]) # check expired demos exp_demo_query = Demo.objects.filter(search__exp_date__range=[yesterday, current_time]) demo_keys = [str(i.search.key) for i in exp_demo_query] # run flight search query on each recently expired option expired_searches = [] expired_demos = [] for i in recent_expired: flights = pull_fares_range(i.origin_code, i.destination_code, (i.depart_date1, i.depart_date2), (i.return_date1, i.return_date2), i.depart_times, i.return_times, i.convenience, i.airlines, cached=True) expired_searches.append({'search': i.key, 'success': flights['success']}) # check if search relates to an expired demo contract, if so, check if customer would have saved money if i.key in demo_keys and flights['success']: savings_string = "" for j in flights['fares']: savings = math.floor(float(j['fare']) - i.locked_fare) # don't alert customer of savings unless greater than X dollars if savings >= 10: """ dep_flights = " | ".join(["%s %s" % (k['airline_short_name'], k['flight_number']) for k in j['flight']['departing']['detail']]) ret_flights = " | ".join(["%s %s" % (k['airline_short_name'], k['flight_number']) for k in j['flight']['returning']['detail']]) dep_datetime = parse(j['flight']['departing']['take_off_time']).strftime("%B %d, %Y at %I:%M%p") ret_datetime = parse(j['flight']['returning']['take_off_time']).strftime("%B %d, %Y at %I:%M%p") savings_string += "$%s departing %s on %s \nand returning %s on %s\n\n" % (savings, dep_datetime, dep_flights, ret_datetime, ret_flights) """ dep_datetime = parse(j['flight']['departing']['take_off_time']).strftime("%B %d, %Y") ret_datetime = parse(j['flight']['returning']['take_off_time']).strftime("%B %d, %Y") savings_string += "$%s departing %s and returning %s\n\n" % (savings, dep_datetime, ret_datetime) # send customer email describing potential savings if savings were possible if savings_string: try: title = "Here's what you could have saved by buying a Flex Fare" body = "Thanks for checking out Level Skies and for taking a closer look at the Flex Fare. You previously signed up for a trial run of the Flex Fare and now we're hear to show you what could have happened had you actually made the purchase. Prices on the flights you were looking at went up, as they tend to do! Here are the potential savings that would have been available to you:\n\n" body += savings_string + "\n\nWe hope you check in with us again soon becasue we'd love to save you some real cash!\n\nThe Level Skies Team" email_address = exp_demo_query.get(search__key=i.key).customer.email send_template_email(email_address, 'Flex Fare Trial', title, body) except: pass expired_demos.append({'search': i.key, 'savings': True if savings_string else False}) # check fares on open contracts contracts_query = Contract.objects.filter(search__exp_date__gt=current_time, ex_date=None) open_contracts = [] for i in contracts_query: flights = pull_fares_range(i.search.origin_code, i.search.destination_code, (i.search.depart_date1, i.search.depart_date2), (i.search.return_date1, i.search.return_date2), i.search.depart_times, i.search.return_times, i.search.convenience, i.search.airlines, cached=True) open_contracts.append({'search': i.search.key, 'success': flights['success']}) duration = current_time_aware() - current_time results = {'success': True, 'time_run': str(current_time), 'expired_demos': expired_demos, 'expired_searches': expired_searches, 'open_contracts': open_contracts, 'duration': str(duration), 'count': recent_expired.count()} # send email to sysadmin summarizing expired searches #if MODE == 'live': try: searches_email_string = "" for i in expired_searches: searches_email_string += "%s : %s\n" % (i['search'], i['success']) contracts_email_string = "" for i in open_contracts: contracts_email_string += "%s : %s\n" % (i['search'], i['success']) demos_email_string = "" for i in expired_demos: demos_email_string += "%s : %s\n" % (i['search'], i['savings']) email_body = 'Completed flight search for %s expired searches with duration of %s.\n\nSearch Key : Success status\n%s\n\n' % (results['count'], results['duration'], searches_email_string) email_body += 'Completed %s open contracts.\n\nSearch Key : Success status\n%s\n\n' % (len(open_contracts), contracts_email_string) email_body += 'Completed %s expired demos.\n\nSearch Key : Savings\n%s' % (len(expired_demos), demos_email_string) send_mail('Expired searches price check', email_body, '*****@*****.**', ['*****@*****.**'], fail_silently=False) except: pass else: results = {'success': False, 'error': 'Expired search price check ran within last 24 hours.'} return gen_search_display(request, {'results': results}, clean)
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')