Beispiel #1
0
    def input(self, csv_path):
        """Takes csv input from command-line and checks for errors"""
        # test_routes_csv = csv.reader(io.open(
        #     csv_path.csv_file_path, "r", encoding=csv_path.encoding), delimiter=",", quotechar='"')

        inputFile = open(csv_path.csv_file_path, 'r', encoding='utf-8')
        fileReader = csv.reader(inputFile, delimiter=',')
        finalCsv = []
        aircrafts = []
        aircraftRange = []
        for row in fileReader:
            self.__csv_data = []
            # print("ROW:::", row)
            #finding duplicate values
            D = [k for k, v in Counter(row).items() if v > 1]
            if len(D) != 0:
                print("There are duplicate values")
                #dont append row to csv_data

            _airdict = Airport()
            parsedAirportDict = _airdict.parseAirport('airport.csv')
            parsedAircraft = _airdict.Aircraft('aircraft.csv')
            # print(parsedAircraft)
            #Checking for incorrect IATA codes
            dests = row[:-1]
            # print(dests)
            if len(dests) <= 1:
                print("Need to enter a minimum of 2 aircodes", '\n')
            else:
                for i in dests:
                    if i in list(parsedAirportDict.keys()):
                        self.__csv_data.append(i)
                    else:
                        print("Incorrect IATA entered", '\n')

            #Presuming Aircraft code will always be last item in csv file
            aircraft_code = row[-1]
            #print(aircraft_code)

            if aircraft_code in list(parsedAircraft.keys()):
                print("Aircraft range for", aircraft_code, "is:",
                      parsedAircraft.get(aircraft_code))
                #self.__csv_data.append(parsedAircraft.get(aircraft_code))
            else:
                print("Warning, please specify aircraft model")
            aircrafts.append(aircraft_code)
            aircraftRange.append(parsedAircraft.get(aircraft_code))
            finalCsv.append(self.__csv_data)
        return finalCsv, aircrafts, aircraftRange
Beispiel #2
0
def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("csv_file_path")
    parser.add_argument("--encoding", default="utf_8")
    options = parser.parse_args()
    _utObject = utils()
    testCsv, aircraftCode, aircraftRange = _utObject.input(options)
    # print("TESTCSV:::::::::",testCsv)
    # print(aircraftCode)
    # print(aircraftRange)
    outputList = []
    _airdict = Airport()
    parsedAirportDict = _airdict.parseAirport('airport.csv')
    for tCi, tC in enumerate(testCsv):
        #Iterates over IATA code in testCsv storing their into a dictionary as tuples
        #Saving lat and long values for each IATA
        distances = {}
        for row in tC:
            data = parsedAirportDict.get(row)
            distances[row] = data
        # print(distances)

        #Calculating all possible distances between routes and storing them in a dict
        dict_air = {}
        for airs in distances:
            src = airs
            indivDist = []
            for airs2 in distances:
                dest = airs2
                indivDist.append(
                    _airdict.distanceBetweenAirports(distances[src][0],
                                                     distances[src][1],
                                                     distances[dest][0],
                                                     distances[dest][1]))
            dict_air[src] = indivDist
        #print(dict_air)

        #transform nodes(keys) of dict into a sequence
        graph_nodes = (list(dict_air.keys()))

        # _min_distance_obj = MinDist()
        # shortest_path = _min_distance_obj.bruteForce(graph_nodes,dict_air)

        airports_visited = []
        min_dist = []
        airIndices = []
        new_source = graph_nodes[0]
        # airIndices.append(0)
        for s in graph_nodes:
            # print("Destination:", new_source)
            airports_visited.append(new_source)
            distances = dict_air.get(new_source)
            for i in airIndices:
                # print(s)
                distances[i] = 9999999
            # print(distances)
            index = -1
            for i, element in enumerate(distances):
                if element == 0:
                    index = i
                    distances[i] = 9999999
            airIndices.append(index)
            mDist = min(distances)
            #print(mDist)
            airpIndex = distances.index(mDist)
            airIndices.append(airpIndex)
            #print("Index:",airpIndex)
            new_source = graph_nodes[airpIndex]
            min_dist.append(min(distances))

        #Popping last element off stack to get 4 shortest distances
        min_dist.pop()
        #print(min_dist)

        finalSource = airports_visited[-1]
        finalDestination = airports_visited[0]
        finalSourceDist = parsedAirportDict.get(finalSource)
        finalDestinationDist = parsedAirportDict.get(finalDestination)

        finalDistance = _airdict.distanceBetweenAirports(
            finalSourceDist[0], finalSourceDist[1], finalDestinationDist[0],
            finalDestinationDist[1])
        #print(finalDistance)
        #Append final dist to list of distances
        airports_visited.append(finalDestination)
        print("Itinerary:", airports_visited, '\n')

        min_dist.append(finalDistance)
        print("Itinerary Distances:", min_dist, '\n')
        print('________________________________________________', '\n')
        #Destination is the last index of airports_visited list
        _currencyobject = Currency()
        parsedCurrencyCost = _currencyobject.currencyParser(
            'Currency_code_concat.csv')

        billingCountry = airports_visited[-1]

        _costObject = Cost()
        toEuroRate = _costObject.toEuroRate(billingCountry, 'airport.csv',
                                            'countrycurrency.csv',
                                            'currencyrates.csv')
        print(toEuroRate)

        print("Cost of round trip: ", "€", (sum(min_dist) // toEuroRate))

        #Also calculate distance from last dest in list to home
        #

        print('________________________________________________')
        print("Checking if Itinerary is possible with provided aircraft")
        journeyPossible = _airdict.isItineraryPossible(aircraftRange[tCi],
                                                       min_dist)
        if journeyPossible == False:
            print(
                "Sorry, with the provided aircraft this journey cannot be made. Try again!"
            )
            airports_visited.append("No Route")
            outputList.append(airports_visited)
        else:
            remainingFuel = aircraftRange[tCi]
            print("\t\t\tRemaining Fuel::: ", remainingFuel)
            totalCosttoRefuel = 0
            toEuroRate = _costObject.toEuroRate(airports_visited[0],
                                                'airport.csv',
                                                'countrycurrency.csv',
                                                'currencyrates.csv')
            print("\t\t\t\t\tItinerary Scheduled:  ", airports_visited)
            print("\t\t\t\t\tItinerary Scheduled:  ", min_dist)
            totalCosttoRefuel += aircraftRange[tCi] * toEuroRate
            for i, val in enumerate(min_dist):
                toEuroRate = _costObject.toEuroRate(airports_visited[i + 1],
                                                    'airport.csv',
                                                    'countrycurrency.csv',
                                                    'currencyrates.csv')

                print("\t\t\tAT Airport: ", airports_visited[i + 1])
                print("\t\t\tAT Airport: ", airports_visited[i + 1],
                      "the EURO Rate is: ", toEuroRate)
                if remainingFuel >= val:
                    print("\t\t\t\tProceeding")
                    remainingFuel -= val
                else:
                    print("\t\t\tRefueling")
                    costOfRefuel = (aircraftRange[tCi] -
                                    remainingFuel) * toEuroRate
                    totalCosttoRefuel += costOfRefuel
                    remainingFuel = aircraftRange[tCi] - val
                    print("\t\t\t\t", costOfRefuel)
                print("\t\t\t\tRemaining", remainingFuel)
            airports_visited.append(totalCosttoRefuel)
            outputList.append(airports_visited)
            print("TOTAL COST FOR ITINERARY IS: ", totalCosttoRefuel)

    print("Generating output csv file")
    _utObject.tocsv(outputList)