コード例 #1
0
 def test_add_show_comment_valid(self):
     username = '******'
     firstname = 'First Name'
     lastname = 'Last Name'
     password = utils.hash_password('password')
     email = '*****@*****.**'
     query = ExploriumDbApi.USERS_TABLE.delete().where(ExploriumDbApi.USERS_TABLE.c.username == username)
     ExploriumDbApi.conn.execute(query)
     query = ExploriumDbApi.USERS_TABLE.insert().values(username=username, password=password, email=email,
                                                        firstname=firstname, lastname=lastname)
     ExploriumDbApi.conn.execute(query)
     it = Itinerary('New York')
     it_id = ExploriumDbApi.save_itinerary(username, it)
     it.db_id = it_id
     self.assertNotEqual(it, None)
     self.assertNotEqual(it.db_id, None)
     add_res = ExploriumDbApi.add_comment(username, it.db_id, 'Hello World')
     self.assertEqual(add_res, None)
     comments = ExploriumDbApi.get_itinerary_comments(it.db_id)
     self.assertNotEqual(comments, None)
     in_comments = False
     for comment in comments:
         if comment['comment'] == 'Hello World' and comment['username'] == username:
             in_comments = True
     self.assertTrue(in_comments)
     query = ExploriumDbApi.ITINERARY_TABLE.delete().where(ExploriumDbApi.ITINERARY_TABLE.c.itinerary_id == it.db_id)
     ExploriumDbApi.conn.execute(query)
コード例 #2
0
def regenerate(city):
    if 'username' not in session or 'password' not in session:
        return redirect(url_for('signin'))

    old = session['current_view_itinerary']
    try:
        preferences = dict()
        preferences['time_spent'] = request.form.get('days')
        if int(preferences['time_spent']) > DAY_LIMIT:
            preferences['time_spent'] = DAY_LIMIT
        preferences['max_price'] = request.form.get('price')
        itinerary = Itinerary(city, preferences=preferences)

        if 'db_id' in session['current_view_itinerary']:
            new_db_id = ExploriumDbApi.save_itinerary(session['username'], itinerary)
            itinerary.db_id = new_db_id
            query = ExploriumDbApi.COMMENTS.update().where(ExploriumDbApi.COMMENTS.c.itinerary_id == session['current_view_itinerary']['db_id']).values(itinerary_id=new_db_id)
            ExploriumDbApi.conn.execute(query)
            ExploriumDbApi.delete_itinerary(session['current_view_itinerary']['db_id'])
            session['current_view_itinerary'] = itinerary.to_dict()
            return redirect(url_for('get_itinerary_by_id', db_id=session['current_view_itinerary']['db_id']))
        return render_template('show_itinerary.html', this_username=session['username'], city=session['current_view_itinerary']['city'], itinerary=itinerary.to_dict(), error="")
    except Exception as e:
        #print e
        session['current_view_itinerary'] = old
        if 'username' not in session or 'password' not in session:
            return redirect(url_for('signin'))
        return render_template('show_itinerary.html', this_username=session['username'], city=session['current_view_itinerary']['city'], itinerary=session['current_view_itinerary'], error="")
コード例 #3
0
    def test_remove_user(self):
        username1 = 'xc3lrea8cfngas'
        firstname = 'First Name'
        lastname = 'Last Name'
        password = utils.hash_password('password')
        email = '*****@*****.**'
        query = ExploriumDbApi.USERS_TABLE.delete().where(ExploriumDbApi.USERS_TABLE.c.username == username1)
        ExploriumDbApi.conn.execute(query)
        query = ExploriumDbApi.USERS_TABLE.insert().values(username=username1, password=password, email=email,
                                                           firstname=firstname, lastname=lastname)
        ExploriumDbApi.conn.execute(query)
        username2 = 'a8casuxdas'
        firstname = 'First Name'
        lastname = 'Last Name'
        password = utils.hash_password('password')
        email = '*****@*****.**'
        query = ExploriumDbApi.USERS_TABLE.delete().where(ExploriumDbApi.USERS_TABLE.c.username == username2)
        ExploriumDbApi.conn.execute(query)

        query = ExploriumDbApi.USERS_TABLE.insert().values(username=username2, password=password, email=email,
                                                           firstname=firstname, lastname=lastname)
        ExploriumDbApi.conn.execute(query)
        it = Itinerary('New York')
        it_id = ExploriumDbApi.save_itinerary(username1, it)
        it.db_id = it_id
        self.assertNotEqual(it.db_id, None)
        ExploriumDbApi.add_user(username2, it.db_id)
        del_res = ExploriumDbApi.remove_user(username2, it.db_id)
        self.assertEqual(del_res, None)
        ExploriumDbApi.delete_itinerary(it.db_id)
コード例 #4
0
ファイル: main.py プロジェクト: shanecroberts/FuelManager
def manage_single_route(home_airport,
                        other_airports,
                        aircraft_code,
                        real_exch_rates=True,
                        append_date_time=True,
                        empty_tank=False,
                        hubs=[],
                        stopover_cost=0,
                        constraints=[],
                        airport_file="input files/airport.csv",
                        aircraft_file="input files/aircraft.csv",
                        currency_file="input files/countrycurrency.csv",
                        exchange_rate_file="input files/currencyrates.csv",
                        output_file="bestroutes/bestroutes.csv"):
    airport_list = [home_airport] + other_airports

    # read data from input files and handle errors reading the files
    try:
        airport_atlas = AirportAtlas(airport_file)
    except FileNotFoundError:
        title = "File not found"
        message = "Unable to open the file: " + str(airport_file) + "\nPlease check the file path and try again"
        messagebox.showerror(title, message)
        return None
    try:
        currency_table = CurrencyTable(currency_file, exchange_rate_file, real_exch_rates)
    except CountryCurrencyFileError:
        title = "Unable to find the currency file"
        message = "Unable to open the file: " + str(currency_file) + "\nPlease check the file path and try again"
        messagebox.showerror(title, message)
        return None
    except ExchangeRateFileError:
        title = "Unable to find the currency file"
        message = "Unable to open the file: " + str(exchange_rate_file) + "\nPlease check the file path and try again"
        messagebox.showerror(title, message)
        return None
    try:
        aircraft_catalogue = AircraftCatalog(aircraft_file)
    except FileNotFoundError:
        title = "File not found"
        message = "Unable to open the file: " + str(aircraft_file) + "\nPlease check the file path and try again"
        messagebox.showerror(title, message)
        return None
    try:
        aircraft_range = aircraft_catalogue.get_aircraft_range(aircraft_code)
    except KeyError:
        title = "Invalid aircraft code"
        message = "Unable to find the aircraft code " + str(aircraft_code) + "\nPlease check the code and try again"
        messagebox.showerror(title, message)
        return None

    # calculate the best route and output the result
    itinerary = Itinerary(airport_atlas, currency_table, airport_list, aircraft_code,
                          aircraft_range, empty_tank, hubs, stopover_cost, constraints)
    print(itinerary)
    itinerary.get_cheapest_route()
    if itinerary.get_error_message() is None:
        output_file = make_output_filename(output_file, append_date_time)
        write_to_csv(output_file, itinerary.cheapest_route.make_csv_row())
コード例 #5
0
 def test_add_spot(self):
     it = Itinerary('New York', None)
     old_items = sum(it.touristSpots, [])
     #it.add_spot(TouristSpot())
     ts = ExploriumDbApi.load_tourist_spot(google_id='ChIJ2y1Dpbm6woARP3MtcSoZ8OI')
     it.add_spot(ts)
     new_items = sum(it.touristSpots, [])
     self.assertGreater(len(new_items), len(old_items))
コード例 #6
0
 def test_itinerary_to_dict(self):
     it = Itinerary('New York', None)
     self.assertNotEqual(it, None)
     self.assertNotEqual(it.touristSpots, None)
     self.assertGreater(len(it.touristSpots), 0)
     dict = it.to_dict()
     self.assertEqual(dict['city'], 'New York')
     self.assertEqual(dict['db_id'], it.db_id)
コード例 #7
0
 def test_init_itinerary_dict(self):
     it1 = Itinerary('New York', None)
     it2 = Itinerary('New York', itinerary=it1.to_dict())
     self.assertNotEqual(it2, None)
     self.assertEqual(len(it1.touristSpots), len(it2.touristSpots))
     for i in range(len(it1.touristSpots)):
         self.assertEqual(len(it1.touristSpots[i]), len(it2.touristSpots[i]))
         for j in range(len(it1.touristSpots[i])):
             self.assertEqual(it1.touristSpots[i][j].destinationID, it2.touristSpots[i][j].destinationID)
コード例 #8
0
def get_itinerary_by_id(db_id):
    if 'username' not in session or 'password' not in session:
        return redirect(url_for('signin'))

    query = ExploriumDbApi.ITINERARY_TABLE.select().where(ExploriumDbApi.ITINERARY_TABLE.c.itinerary_id == db_id)
    result = ExploriumDbApi.conn.execute(query).fetchone()

    if result:
        itinerary = Itinerary(result['city'], db_id=db_id)
        session['current_view_itinerary'] = itinerary.to_dict()
        return render_template('show_itinerary.html', this_username=session['username'], itinerary=session['current_view_itinerary'], error="")
    return redirect(url_for('view_itineraries'))
コード例 #9
0
 def test_add_flight(self):
     """test adding flight to class"""
     response_1 = requests.get(
         "https://api.skypicker.com/flights?flyFrom=MEL&to=SYD&curr=AUD&dateFrom=12/12/2020&dateTo=15/12/2020&partner=picky&v=3"
     )
     data = json.loads(response_1.text)
     test_response = data["data"][0]
     test_flight = Flight(test_response)
     test_itinerary = Itinerary()
     test_itinerary.add_flight(test_flight)
     # make sure class attribute contains flight
     self.assertTrue(test_itinerary.itineraries)
コード例 #10
0
def save():
    if 'username' not in session or 'password' not in session:
        return redirect(url_for('signin'))
    
    if 'current_view_itinerary' in session and session['current_view_itinerary']['db_id'] is None:
        itinerary = session['current_view_itinerary']
        cur_itinerary = Itinerary(itinerary['city'], itinerary=itinerary)
        db_id = ExploriumDbApi.save_itinerary(session['username'], cur_itinerary)
        cur_itinerary.db_id = db_id
        session['current_view_itinerary'] = cur_itinerary.to_dict()
        return redirect(url_for('get_itinerary_by_id', db_id=session['current_view_itinerary']['db_id']))
        #return render_template('show_itinerary.html', this_username=session['username'], city=cur_itinerary.city, itinerary=session['current_view_itinerary'], error="")
    return render_template('show_itinerary.html', this_username=session['username'], itinerary=session['current_view_itinerary'], error="")
コード例 #11
0
    def loadData(self,Data):

        numofairports=len(Data)-1 #minus one because last index is aircraftcode

        airportlist=[]

        for i in range(numofairports): #seperates airports from aircraft
            airportlist.append(Data[i])

        aircraftcode=Data[numofairports]

        cheapestroutelist,mincost,cheapestroutedist,shortestroutelist,shortestroutecost,shortestroutedist=ItineraryList.calculationForFiveRoutes(self,airportlist,aircraftcode)
        self.obj1=Itinerary(cheapestroutelist,mincost,cheapestroutedist,shortestroutelist,shortestroutecost,shortestroutedist,Data[5])
コード例 #12
0
 def test_add_delete_tourist_spot(self):
     tester = app.test_client(self)
     user = '******'
     it = Itinerary('New York', None)
     self.assertNotEqual(it, None)
     it_id = ExploriumDbApi.save_itinerary(user, it)
     query = ExploriumDbApi.ITINERARY_TABLE.select().where(ExploriumDbApi.ITINERARY_TABLE.c.itinerary_id == it_id)
     result = ExploriumDbApi.conn.execute(query).fetchone()
     self.assertNotEqual(result, None)
     tester.post(
         '/signin',
         data=dict(user_username="******", user_password="******"),
         follow_redirects=True
     )
     add_response = tester.post(
         '/add_spot/661',
         data={
             'itinerary': str(it_id)
         },
         follow_redirects=True
     )
     tester.get('/itinerary/'+str(it_id), follow_redirects=True, content_type='html/text')
     self.assertIn('The Palm Los Angeles', add_response.data)
     del_response = tester.get('/delete_spot/661', follow_redirects=True, content_type='html/text') 
     self.assertNotIn('The Palm Los Angeles', del_response.data)
コード例 #13
0
 def test_save_delete_itinerary(self):
     user = '******'
     it = Itinerary('New York', None)
     self.assertNotEqual(it, None)
     it_id = ExploriumDbApi.save_itinerary(user, it)
     self.assertNotEqual(it_id, None)
     ExploriumDbApi.delete_itinerary(it_id)
コード例 #14
0
class testItineraryClass(unittest.TestCase):
    """Unit tests for Itinerary class"""
    def setUp(self):
        self.route = ["DUB", "HEA", "AAA", "MEL", "POL"]
        self.testItinerary1 = Itinerary(self.route, "747")

    # Test to check if itinerary attributes are correctly set up
    def testItineraryAttributes(self):
        self.assertEqual(self.testItinerary1.route, ["DUB", "HEA", "AAA", "MEL", "POL"])
        self.assertEqual(str(self.testItinerary1.aircraft), "Boeing 747")
        self.assertEqual(self.testItinerary1.revisitCode, "")

    # Test to check printing of itinerary string
    def testItineraryString(self):
        self.assertEqual(str(self.testItinerary1), "Route: {}; Aircraft: Boeing 747".format(self.route))

    # Test to check setting an aircraft in the itinerary
    def testSetValidAircraft(self):
        self.testItinerary1.setAircraft("777")
        self.assertEqual(str(self.testItinerary1.aircraft), "Boeing 777")

    # Test to check setting an invalid aircraft in the itinerary
    def testSetInvalidAircraft(self):
        self.testItinerary1.setAircraft("abc")
        self.assertEqual(str(self.testItinerary1.aircraft), "Boeing 747")

    # Test to check setting of revisit airport
    def testValidateRevisit(self):
        code = self.testItinerary1.validateRevisit("AAA")  # Valid revisit airport
        self.assertEqual(code, "AAA")
        code = self.testItinerary1.validateRevisit("a")  # Invalid revisit airport
        self.assertEqual(code, "")
        code = self.testItinerary1.validateRevisit([2,3])  # Invalid revisit airport
        self.assertEqual(code, "")
コード例 #15
0
 def test_save_route(self):
     user = '******'
     city = 'New York'
     pref = dict()
     pref['types'] = 'museums'
     pref['min_price'] = 2000
     pref['max_price'] = 5000
     pref['radius'] = 2000
     itinerary = Itinerary(city, preferences=pref)
コード例 #16
0
def getItinList(db,restrictions=None):
	outputList={}
	itins = db.query("select * from itin")
	for itin in itins:
		if restrictions is not None and getattr(restrictions,"restrictedLocations") is not None and itin[0] in restrictions.restrictedLocations: continue	#Ignore any restricted locations when building list
		itinId=itin[0]
		weatherLoc=itin[6]
		weatherLocElevation=db.conn.cursor().execute("select elevation from stations where noaaID=?",(weatherLoc,)).fetchone()[0]
		outputList[itinId]=Itinerary(db,itinId,itin[1],itin[2],itin[3],itin[4],itin[5],weatherLoc,itin[7],itin[8],itin[9],itin[10],itin[11],itin[12],itin[13],itin[14],weatherLocElevation)
	return outputList
コード例 #17
0
 def test_itinerary2(self):
     user = '******'
     city = 'New York'
     pref = dict()
     pref['types'] = 'museums'
     pref['min_price'] = 2000
     pref['max_price'] = 1000
     pref['radius'] = 2000
     itinerary = Itinerary(city, preferences=pref)
     SystemTests.itinerary = itinerary
     assert itinerary.city is 'New York'
コード例 #18
0
def route():
    if 'username' not in session or 'password' not in session:
        return redirect(url_for('signin'))
    if request.method == 'GET':
        return render_template('route.html', this_username=session['username'], error="")
    else:
        try:
            preferences = dict()
            preferences['time_spent'] = request.form.get('rangeInput')
            if int(preferences['time_spent']) > DAY_LIMIT:
                preferences['time_spent'] = DAY_LIMIT 
            preferences['max_price'] = request.form.get('price')
            city = request.form.get('city')
            preferences['types'] = request.form.getlist('t_spot')
            itinerary = Itinerary(city, preferences=preferences)
            session['current_view_itinerary'] = itinerary.to_dict()

            return render_template('show_itinerary.html', this_username=session['username'], itinerary=session['current_view_itinerary'], error="")
        except Exception as e:
            #print e
            if 'username' not in session or 'password' not in session:
                return redirect(url_for('signin'))
            return render_template('index.html', this_username=session['username'], show_what="Welcome!",
                                   result_info_list='')
コード例 #19
0
 def test_1(self):
     try:
         user = '******'
         city = 'New York'
         pref = dict()
 
         pref['types'] = 'museums'
         pref['min_price'] = 2000
         pref['max_price'] = 5000
         pref['radius'] = -1
         itinerary = Itinerary(city, preferences=pref)
         SystemTests.itinerary = itinerary
         assert itinerary.city is not 'New York'
     except Exception as e:
         pass
     else:
         assert itinerary.city is 'New York'
コード例 #20
0
 def test_DBApi_save_load_itinerary(self):
     user = '******'
     city = 'New York'
     pref = dict()
     pref['types'] = 'museums'
     pref['min_price'] = 1
     pref['max_price'] = 3
     pref['radius'] = 2000
     itinerary = Itinerary(city, preferences=pref)
     ExploriumDbApi.save_itinerary(user, itinerary)
     result = ExploriumDbApi.get_user_itineraries(user)
     ##print('------------------------------------------')
     ##print(result)
     ##print('------------------------------------------')
     state = 0
     if result is not None or u"":
         state = 1
     assert state == 1
コード例 #21
0
 def test_controller_add_remove_user_id(self):
     query = ExploriumDbApi.USER_ITINERARIES.delete().where(ExploriumDbApi.USER_ITINERARIES.c.user_id == 1144)
     ExploriumDbApi.conn.execute(query)
     tester = app.test_client(self)
     user = '******'
     it = Itinerary('New York', None)
     self.assertNotEqual(it, None)
     it_id = ExploriumDbApi.save_itinerary(user, it)
     tester.post(
         '/signin',
         data=dict(user_username="******", user_password="******"),
         follow_redirects=True
     )
     tester.post(
         '/route',
         data={
             'rangeInput': 15,
             'price': 1000,
             'max_price': 5000,
             'city': "Paris",
             't_spot': ["museums"]
         },
         follow_redirects=True
     )
     tester.post(
         '/add_user/'+str(it_id),
          data={
             'user': '******',
         },
         follow_redirects=True
     )
     response = tester.get('/view_itineraries', content_type='html/text')
     self.assertIn(b'helloworld', response.data)
     tester.post(
         '/remove_user/'+str(it_id),
          data={
             'user': '******',
         },
         follow_redirects=True
     ) 
     response = tester.get('/view_itineraries', content_type='html/text')
     self.assertNotIn(b'helloworld', response.data)
コード例 #22
0
def add_tourist_spot(t_id):
    if 'username' not in session or 'password' not in session:
        return redirect(url_for('signin'))
    it_id = request.args.get('itinerary')
    query = ExploriumDbApi.ITINERARY_TABLE.select().where(ExploriumDbApi.ITINERARY_TABLE.c.itinerary_id == it_id)
    result = ExploriumDbApi.conn.execute(query).fetchone()
    if result:   
        cur_itinerary = Itinerary(result['city'], db_id=it_id)
        cur_itinerary.add_spot(ExploriumDbApi.load_tourist_spot(ts_id=t_id))
        new_db_id = ExploriumDbApi.save_itinerary(session['username'], cur_itinerary)
        cur_itinerary.db_id = new_db_id
        query = ExploriumDbApi.COMMENTS.update().where(ExploriumDbApi.COMMENTS.c.itinerary_id == it_id).values(itinerary_id=new_db_id)
        ExploriumDbApi.conn.execute(query)
        cur_itinerary.db_id = new_db_id
        ExploriumDbApi.delete_itinerary(it_id)
    return redirect(url_for('spotdetail', dest_id=t_id))
コード例 #23
0
def delete_tourist_spot(t_id):
    if 'username' not in session or 'password' not in session:
        return redirect(url_for('signin'))

    if 'current_view_itinerary' in session:
        if session['current_view_itinerary']['db_id'] is not None:
            cur_itinerary = Itinerary(session['current_view_itinerary']['city'], db_id =session['current_view_itinerary']['db_id'])
            cur_itinerary.del_spot(ExploriumDbApi.load_tourist_spot(ts_id=t_id))
            new_db_id = ExploriumDbApi.save_itinerary(session['username'], cur_itinerary)
            query = ExploriumDbApi.COMMENTS.update().where(ExploriumDbApi.COMMENTS.c.itinerary_id == session['current_view_itinerary']['db_id']).values(itinerary_id=new_db_id)
            ExploriumDbApi.conn.execute(query)
            cur_itinerary.db_id = new_db_id
            ExploriumDbApi.delete_itinerary(session['current_view_itinerary']['db_id'])
            session['current_view_itinerary'] = cur_itinerary.to_dict() 
        return render_template('show_itinerary.html', this_username=session['username'], city=session['current_view_itinerary']['city'], itinerary=session['current_view_itinerary'], error="")
    return render_template('index.html', this_username=session['username'], show_what="Welcome!", result_info_list='')
コード例 #24
0
    def read(self, flights, deps, sinks):
        itins = []
        self.f.readline()
        line = self.f.readline()
        while line is not '':
            args = line.split(',')

            ff = flights.get(int(args[0]), None)
            sf = flights.get(int(args[1]), None)
            psgrs = int(args[2])
            if sf is None:
                sink = sinks[ff.j.j]
            else:
                sink = sinks[sf.j.j]
            itin = Itinerary(ff, sf, psgrs, sink)
            itins.append(itin)
            line = self.f.readline()
        self.f.close()

        list = []
        for itin in itins:
            if itin.canceled():
                #Next-day flight arcs
                list.append(itin)
                nd = NextDayArc(itin, sinks[itin.end().j])
                itin.outgoing.append(nd)
                itin.end().incoming.append(nd)

                #Itinerary arrival arcs
                for dep in deps.get(itin.j.j, []):
                    if dep.t >= itin.t:
                        sa = TripStartArc(itin, dep)
                        itin.outgoing.append(sa)
                        dep.incoming.append(sa)
            else:
                itin.ff.reduce(itin.psgrs)
                if itin.sf != None:
                    itin.sf.reduce(itin.psgrs)

        return list
コード例 #25
0
ファイル: main.py プロジェクト: seanremenyi/Flight-Search
import sys
from Query import Query
from Flights import Flight
from Itinerary import Itinerary

# Create Query object
new_query = Query()

# Iterate through every flight in API respons
try:
    for flights in new_query.query_results:
        # Create flight objects and add to Itinerary object
        Itinerary.add_flight(Flight(flights))
except:
    # exit program if no flights found
    sys.exit(0)

# Print all flight objects to terminal
Itinerary.list_results()

# User chooses a flight
Itinerary.choose_flight()
コード例 #26
0
class ItineraryList:


    def __init__(self,Data):

        self.__routelist=self.loadData(Data)

    def loadData(self,Data):

        numofairports=len(Data)-1 #minus one because last index is aircraftcode

        airportlist=[]

        for i in range(numofairports): #seperates airports from aircraft
            airportlist.append(Data[i])

        aircraftcode=Data[numofairports]

        cheapestroutelist,mincost,cheapestroutedist,shortestroutelist,shortestroutecost,shortestroutedist=ItineraryList.calculationForFiveRoutes(self,airportlist,aircraftcode)
        self.obj1=Itinerary(cheapestroutelist,mincost,cheapestroutedist,shortestroutelist,shortestroutecost,shortestroutedist,Data[5])

    def getCheapestRouteList(self):
        return self.obj1.getCheapestRouteList()

    def getMinCost(self):
        return self.obj1.getMinCost()

    def getCheapestRouteDist(self):
        return self.obj1.getCheapestRouteDist()

    def getShortestRouteList(self):
        return self.obj1.getShortestRouteList()

    def getShortestRouteCost(self):
        return self.obj1.getShortestRouteCost()

    def getShortestRouteDist(self):
        return self.obj1.getShortestRouteDist()

    def getAircraft(self):
        return self.obj1.getAircraft()



    def permutations(homeairport,airportlist):

        possairportlist=list(permutations(airportlist))
        routelist=[]
        for row in possairportlist:
            row=list(row)
            row.insert(0,homeairport)
            row.insert(len(row),homeairport)
            routelist.append(row)
        return routelist

    def calculationForFiveRoutes(self,airportlist,aircraftcode):

        """
        The main code of the project. Takes the list of the airports and aircraft
        given by the user, eliminates all the impossible routes and with trial and
        error finds the optimum route. Returns the cheapest route, minimum cost,
        distance of the optimum route and the impossible routes distance.

        cheapestroutelist,mincost,routedist,impossible_routes_distancefuel
        **Parameters**\n
        ----------\n
        airportlist: A list consists of 5 airports (IATA codes) taken as an input
        from the user.
        aircraftcode: The aircraft's code which will carry on the itinerary.

        **Returns**\n
        -------\n
        cheapestroutelist: The sequence of airports regarding to the optimum route.
        mincost: The cost of the itinerary.
        routedist: THe total distance of the itinerary.
        impossible_routes_distancefuel: The list of the impossible routes.

        """


        homeairport=airportlist.pop(0)

        routelist=ItineraryList.permutations(homeairport,airportlist)
        cheapestroutelist,mincost,routedist,bestroutelist,cost1,bestroute,impossible_routes_fullrefuel=ItineraryList.fullrefuel(airportlist,routelist,aircraftcode)
        cheapestroutelistopt,mincostopt,routedistopt,impossible_routes_distancefuel=ItineraryList.distancerefuel(airportlist,routelist,aircraftcode)
        if mincostopt<mincost:
            mincost=mincostopt
            cheapestroutelist=cheapestroutelistopt
            routedist=routedistopt

        if len(impossible_routes_fullrefuel)==24 and len(impossible_routes_distancefuel)==24: #if all possible routes=(4!)*2 are impossible print ...
            messagebox.showinfo("Impossible route", "This plane cannot complete the specified routes please change the plane or routes")

        elif len(impossible_routes_fullrefuel)==24:
            mincost=mincostopt
            cheapestroutelist=cheapestroutelistopt
            routedist=routedistopt


        else:

            return cheapestroutelist,mincost,routedist,bestroutelist,cost1,bestroute

    def fullrefuel(airportlist,routelist,aircraftcode): #finds shortest and cheapest routes by full refuel

        try:
            aircraft=AircraftList('aircraft.csv')
        except FileNotFoundError:
            messagebox.showinfo("Loading error aircraft.csv file", "Unable to load 'aircraft.csv' file please make sure this file and aircraft.csv located on the same file and filename is 'aircraft.csv'")
            sys.exit(0)

        try:
            airport=AirportAtlas('airport.csv')
        except FileNotFoundError:
            messagebox.showinfo("Loading error airport.csv file", "Unable to load 'airport.csv' file please make sure this file and airport.csv located on the same file and filename is 'airport.csv'")
            sys.exit(0)

        try:
            countrycurr=CurrencyList('countrycurrency.csv')
        except FileNotFoundError:
            messagebox.showinfo("Loading error countrycurrency.csv file", "Unable to load 'countrycurrency.csv' file please make sure this file and countrycurrency.csv located on the same file and filename is 'countrycurrency.csv'")
            sys.exit(0)

        try:
            currencyrate=CurrencyRateList('currencyrates.csv')
        except FileNotFoundError:
            messagebox.showinfo("Loading error currencyrates.csv file", "Unable to load 'currencyrates.csv' file please make sure this file and currencyrates.csv located on the same file and filename is 'currencyrates.csv'")
            sys.exit(0)
        # some initial assignments
        initialaircraftrange=aircraft.getAircraftRange(aircraftcode)
        aircraftrange=initialaircraftrange
        bestroute=10**10
        mincost=10**10
        tobefueled=0
        cost=0
        indx=0
        currrate=0
        impossible_routes_fullrefuel=[]
        control=0 #for controling the impossible routes

        for j in range(len(routelist)):

            totalcost=0
            totalroute=0
            control=0 #sets control back to zero
            for k in range(len(airportlist)+1):


                distance=airport.distanceBetweenAirports(routelist[j][k],routelist[j][k+1])
                totalroute+=distance

                if routelist[j][k]==routelist[j][k+1]: #plane can visit one airport twice but departure and arrival cant be same airport
                    control=1

                if distance>aircraftrange:

                    tobefueled=initialaircraftrange-aircraftrange
                    where=airport.getAirportCountry(routelist[j][k])
                    iseuro=countrycurr.getCurrencyCode(where)
                    currrate=currencyrate.getCurrencyRate(iseuro)
                    cost=tobefueled*currrate
                    aircraftrange+=tobefueled
                    totalcost+=cost


                if distance>aircraftrange: #still distance is bigger than range even when gas tank is full
                    control=1 #if control is 1 bestroute and cheapest is not calculated

                indx+=1

                aircraftrange=aircraftrange-distance

            totalroute1=totalroute
            aircraftrange=initialaircraftrange
#================COMPARING===============================
            if control == 0:

                if bestroute>totalroute:
                    bestroute=totalroute
                    bestroutelist=routelist[j]
                    cost1=totalcost

                if mincost>totalcost:
                    mincost=totalcost
                    cheapestroutelist=routelist[j]
                    routedist=totalroute1
#=========================================================

            else:
                impossible_routes_fullrefuel.append(routelist[j]) # for counting impossible routes
                bestroutelist=0
                totalroute=0
                cost1=0
        if len(impossible_routes_fullrefuel)==24:
            cheapestroutelist=0
            mincost=10**10
            routedist=0
            bestroutelist=0
            cost1=10**10
            bestroute=0
            return cheapestroutelist,mincost,routedist,bestroutelist,cost1,bestroute,impossible_routes_fullrefuel
        else:
            return cheapestroutelist,mincost,routedist,bestroutelist,cost1,bestroute,impossible_routes_fullrefuel

    def distancerefuel(airportlist,routelist,aircraftcode): #Doing a small optimization by checking whether fully refueling or refueling enough for only that leg's distance is cheaper

        try:
            aircraft=AircraftList('aircraft.csv')
        except FileNotFoundError:
            messagebox.showinfo("Loading error aircraft.csv file", "Unable to load 'aircraft.csv' file please make sure this file and aircraft.csv located on the same file and filename is 'aircraft.csv'")
            sys.exit(0)

        try:
            airport=AirportAtlas('airport.csv')
        except FileNotFoundError:
            messagebox.showinfo("Loading error airport.csv file", "Unable to load 'airport.csv' file please make sure this file and airport.csv located on the same file and filename is 'airport.csv'")
            sys.exit(0)

        try:
            countrycurr=CurrencyList('countrycurrency.csv')
        except FileNotFoundError:
            messagebox.showinfo("Loading error countrycurrency.csv file", "Unable to load 'countrycurrency.csv' file please make sure this file and countrycurrency.csv located on the same file and filename is 'countrycurrency.csv'")
            sys.exit(0)

        try:
            currencyrate=CurrencyRateList('currencyrates.csv')
        except FileNotFoundError:
            messagebox.showinfo("Loading error currencyrates.csv file", "Unable to load 'currencyrates.csv' file please make sure this file and currencyrates.csv located on the same file and filename is 'currencyrates.csv'")
            sys.exit(0)

        initialaircraftrange=aircraft.getAircraftRange(aircraftcode)
        aircraftrange=initialaircraftrange
        mincost=10**10
        totalcostopt=0
        indx=0
        currrate=0
        impossible_routes_distancefuel=[]
        control=0

        for j in range(len(routelist)):
            totalroute=0
            totalcostopt=0
            control=0
            for k in range(len(airportlist)+1):


                distance=airport.distanceBetweenAirports(routelist[j][k],routelist[j][k+1])
                totalroute+=distance

                if routelist[j][k]==routelist[j][k+1]:
                    control=1

                if distance>aircraftrange:# refuel enough to complete this leg


                    where=airport.getAirportCountry(routelist[j][k])
                    iseuro=countrycurr.getCurrencyCode(where)
                    currrate=currencyrate.getCurrencyRate(iseuro)
                    if distance<initialaircraftrange:
                       tobefueledopt=distance-aircraftrange
                       costopt=tobefueledopt*currrate
                       aircraftrange+=tobefueledopt
                       totalcostopt+=costopt


                if distance>aircraftrange: #still distance is bigger than range even when gas tank is full
                    control=1 #if control is 1 bestroute and cheapest is not calculated

                indx+=1

                aircraftrange=aircraftrange-distance

            totalroute1=totalroute
            aircraftrange=initialaircraftrange


            if control == 0:

#=======================COMPARING======================
                if mincost>totalcostopt:
                    mincost=totalcostopt
                    cheapestroutelist=routelist[j]
                    routedist=totalroute1
#==================================================

            else:
                impossible_routes_distancefuel.append(routelist[j]) # for counting impossible routes
                bestroutelist=0
                totalroute=0
                cost1=0

        if len(impossible_routes_distancefuel)==24:
            cheapestroutelist=0
            mincost=10**10
            routedist=0
            return cheapestroutelist,mincost,routedist,impossible_routes_distancefuel
        else:
            return cheapestroutelist,mincost,routedist,impossible_routes_distancefuel
コード例 #27
0
 def setUp(self):
     self.route = ["DUB", "HEA", "AAA", "MEL", "POL"]
     self.testItinerary1 = Itinerary(self.route, "747")
コード例 #28
0
        return self.cur

    def __del__(self):
        self.conn.close()


if __name__ == '__main__':
    itinList = []
    dbManager = DatabaseManager("hikingData.db")
    conn = dbManager.conn
    cursor = conn.cursor()
    itins = cursor.execute("select * from itin")
    for itin in itins:
        itinList.append(
            Itinerary(dbManager, itin[0], itin[1], itin[2], itin[3], itin[4],
                      itin[5], itin[6], itin[7], itin[8], itin[9], itin[10],
                      itin[11], itin[12], itin[13],
                      itin[14]))  #append itin objects
    waypoint_distances = {}
    waypoint_durations = {}
    checkCount = 0
    addCount = 0

    #print(waypoint_distances)
    gmaps = googlemaps.Client(GOOGLE_MAPS_API_KEY)
    for (source, target) in combinations(itinList, 2):
        checkCount += 1
        #if checkCount%1000: print("Checked {} pairs".format(checkCount))
        sql = "select * from waypoints where source_ID={} and target_ID={}".format(
            source.id, target.id)  #Check for unique row in SQL table
        if cursor.execute(
                sql).fetchone() is not None:  #skip it if we already got it
コード例 #29
0
 def test_init_itinerary_valid(self):
     it = Itinerary('New York', None)
     self.assertNotEqual(it, None)
     self.assertNotEqual(it.touristSpots, None)
     self.assertGreater(len(it.touristSpots), 0)