Example #1
0
    def upload_track(self):
        print "In upload", request.params.get("gpstrack", None)
        if 'asplan' in request.params:
            t = request.params.get("gpstrack", None)
            orderint = 0
            curid = 100
            tripsharing.cancel()
            tripname, waypoints = parse_gpx_fplan(t.value)
            tripname = self.get_free_tripname(tripname)
            trip = Trip(tripuser(), tripname)
            meta.Session.add(trip)
            meta.Session.flush()
            out = []
            for waypoint in waypoints:
                name = waypoint['name']
                pos = waypoint['pos']
                alt = waypoint['alt']
                waypoint = Waypoint(tripuser(), trip.trip, pos, curid,
                                    orderint, name, alt)
                meta.Session.add(waypoint)
                out.append(waypoint)
                orderint += 1
                curid += 1
            for w1, w2 in zip(out, out[1:]):
                r = Route(tripuser(),
                          trip.trip,
                          w1.id,
                          w2.id,
                          altitude=str(w2.altitude))
                meta.Session.add(r)
            acs = meta.Session.query(Aircraft).filter(
                sa.and_(Aircraft.user == tripuser())).all()
            if len(acs):
                trip.aircraft = acs[0].aircraft

            session['current_trip'] = tripname
            session.save()
            meta.Session.commit()
            redirect(
                h.url_for(controller='mapview', action="zoom", zoom='auto'))
            return
        t = request.params.get("gpstrack", None)
        if t != None:
            if len(t.value) > 30000000:
                redirect(
                    h.url_for(controller='error',
                              action="document",
                              message="GPX file is too large."))
            session['showtrack'] = parse_gpx(t.value,
                                             request.params.get('start'),
                                             request.params.get('end'))
            session['showarea'] = ''
            session['showarea_id'] = ''
            session.save()
        redirect(h.url_for(controller='mapview', action="zoom", zoom='auto'))
Example #2
0
    def upload_track(self):
        print "In upload",request.params.get("gpstrack",None)
        if 'asplan' in request.params:
            t=request.params.get("gpstrack",None)
            orderint=0
            curid=100
            tripsharing.cancel()
            tripname,waypoints=parse_gpx_fplan(t.value)
            tripname=self.get_free_tripname(tripname)
            trip=Trip(tripuser(), tripname)
            meta.Session.add(trip)
            meta.Session.flush()
            out=[]
            for waypoint in waypoints:
                name=waypoint['name']
                pos=waypoint['pos']
                alt=waypoint['alt']
                waypoint=Waypoint(tripuser(),trip.trip,pos,curid,orderint,name,alt)
                meta.Session.add(waypoint)
                out.append(waypoint)
                orderint+=1
                curid+=1
            for w1,w2 in zip(out,out[1:]):
                r=Route(tripuser(),trip.trip,
                    w1.id,w2.id,altitude=str(w2.altitude))
                meta.Session.add(r)
            acs=meta.Session.query(Aircraft).filter(sa.and_(
                Aircraft.user==tripuser())).all()
            if len(acs):
                trip.aircraft=acs[0].aircraft

            session['current_trip']=tripname
            session.save()       
            meta.Session.commit()
            redirect(h.url_for(controller='mapview',action="zoom",zoom='auto'))
            return
        t=request.params.get("gpstrack",None)
        if t!=None:
            if len(t.value)>30000000:
                redirect(h.url_for(controller='error',action="document",message="GPX file is too large."))
            session['showtrack']=parse_gpx(t.value,request.params.get('start'),request.params.get('end'))
            session['showarea']=''
            session['showarea_id']=''
            session.save()
        redirect(h.url_for(controller='mapview',action="zoom",zoom='auto'))
Example #3
0
    def index(self):
        print "Index called", session.get('zoom', -1)
        #print "index called",request.params
        #user=meta.Session.query(User).filter(
        #        User.user==tripuser()).one()
        user = meta.Session.query(User).filter(
            User.user == session['user']).one()

        ua = request.headers.get('User-Agent', '').lower()
        c.ie = False
        if ua.count("msie") and not (ua.count("firefox") or ua.count("chrom")
                                     or ua.count("safari")):
            c.ie = True
        #print "IE mode:",c.ie

        c.all_trips = list(
            meta.Session.query(Trip).filter(
                Trip.user == session['user']).all())
        print "current trip:", session.get('current_trip', None)
        if not ('current_trip' in session) or session['current_trip'] == None:
            if user.lasttrip != None:
                print "Reusing lasttrip:", user.lasttrip
                session['current_trip'] = user.lasttrip

        if 'current_trip' in session and meta.Session.query(Trip).filter(
                sa.and_(Trip.user == tripuser(), Trip.trip
                        == session['current_trip'])).count() == 0:
            session['current_trip'] = None

        if not 'current_trip' in session or session['current_trip'] == None:
            trips = meta.Session.query(Trip).filter(
                Trip.user == tripuser()).all()
            if len(trips) == 0:
                trip = Trip(tripuser(), "Default Trip")
                meta.Session.add(trip)
                meta.Session.flush()
                meta.Session.commit()
            else:
                trip = min(
                    trips, key=lambda x: x.trip
                )  #Select first trip, alphabetically - we have no better idea.
            session['current_trip'] = trip.trip
            session.save()
            trip = None
        if session.get('current_trip', None) != user.lasttrip:
            user.lasttrip = session.get('current_trip', None)
            print "Storing lasttrip=", user.lasttrip
            meta.Session.flush()
            meta.Session.commit()

        c.mapvariant = session.get('mapvariant', "airspace")

        self.set_pos_zoom()
        zoomlevel = session['zoom']
        if c.mapvariant == "elev":
            if zoomlevel > 8:
                session['zoom'] = 8
                session.save()
                try:
                    session['last_pos'] = mapper.latlon2merc(
                        mapper.merc2latlon(session['last_pos'], zoomlevel), 8)
                except Exception:
                    session['last_pos'] = mapper.latlon2merc((59, 18), 8)
                    print "Setting session last pos to 59,18", session[
                        'last_pos']
                zoomlevel = 8

        print "Last pos is:", mapper.merc2latlon(session['last_pos'],
                                                 zoomlevel)
        c.merc_x, c.merc_y = session['last_pos']

        c.merc5_limx1, c.merc5_limy1, c.merc5_limx2, c.merc5_limy2 = merc_limits(
            5, conservative=False, hd=True)

        c.waypoints = list(
            meta.Session.query(Waypoint).filter(
                sa.and_(Waypoint.user == tripuser(),
                        Waypoint.trip == session['current_trip'])).order_by(
                            Waypoint.ordering).all())
        c.tripname = session['current_trip']
        c.showarea = session.get('showarea', '')
        c.showtrack = session.get('showtrack', None) != None
        c.fastmap = user.fastmap
        #print "Zoomlevel active: ",zoomlevel
        c.zoomlevel = zoomlevel
        c.dynamic_id = ''
        c.sharing = tripsharing.sharing_active()
        c.mtime = maptilereader.get_mtime()
        for way in c.waypoints:
            print "Name:", way.waypoint
        if len(c.waypoints):
            c.next_waypoint_id = max([way.id for way in c.waypoints]) + 1
        else:
            c.next_waypoint_id = 100
        assert type(c.next_waypoint_id) == int
        if c.sharing:
            c.shared_by = tripuser()
        if session.get('showarea', ''):
            c.dynamic_id = session.get('showarea_id', '')
        if session.get('showtrack', ''):
            if hasattr(session['showtrack'], 'dynamic_id'):
                c.dynamic_id = session['showtrack'].dynamic_id
        return render('/mapview.mako')
Example #4
0
    def trip_actions(self):
        #print "trip actions:",request.params

        if request.params.get('addtripname', None):
            tripsharing.cancel()
            tripname = self.get_free_tripname(request.params['addtripname'])
            trip = Trip(tripuser(), tripname)
            acs = meta.Session.query(Aircraft).filter(
                sa.and_(Aircraft.user == tripuser())).all()
            if len(acs):
                trip.aircraft = acs[0].aircraft

            print "Adding trip:", trip
            meta.Session.add(trip)
            session['current_trip'] = tripname
            session.save()
        if request.params.get('opentripname', None):
            tripsharing.cancel()
            tripname = request.params['opentripname']
            if meta.Session.query(Trip).filter(
                    sa.and_(Trip.user == tripuser(),
                            Trip.trip == tripname)).count():
                session['current_trip'] = tripname
                session.save()
        if request.params.get('reversetripname', None):
            tripsharing.cancel()
            username = tripuser()
            print "Reversing"
            tripname = request.params['reversetripname']
            wps = list(
                meta.Session.query(Waypoint).filter(
                    sa.and_(Waypoint.user == username,
                            Waypoint.trip == tripname)).order_by(
                                Waypoint.ordering).all())
            if len(wps):
                maxord = max([wp.ordering for wp in wps])
                for wp in wps:
                    wp.ordering = maxord + 1 - wp.ordering
                    print "Reversed order of", wp.waypoint, " = ", wp.ordering
                    meta.Session.add(wp)
                firststays = meta.Session.query(Stay).filter(
                    sa.and_(Stay.user == username, Stay.trip == tripname,
                            Stay.waypoint_id == wps[0].id)).all()
                if len(firststays) == 1:
                    stay, = firststays
                    stay.waypoint_id = wps[-1].id

        if request.params.get('copytripname', None):
            tripsharing.cancel()
            tripobj = meta.Session.query(Trip).filter(
                sa.and_(Trip.user == tripuser(),
                        Trip.trip == request.params['copytripname'])).first()
            newtripname = self.get_free_tripname(tripobj.trip + "(copy)")
            trip = Trip(tripuser(), newtripname)
            meta.Session.add(trip)
            acs = meta.Session.query(Aircraft).filter(
                sa.and_(Aircraft.user == tripuser(),
                        Aircraft.aircraft == tripobj.aircraft)).all()
            if len(acs):
                trip.aircraft = acs[0].aircraft

            for origwp in meta.Session.query(Waypoint).filter(
                    sa.and_(Waypoint.user == tripuser(),
                            Waypoint.trip == tripobj.trip)).all():
                wp = Waypoint(user=origwp.user,
                              trip=newtripname,
                              pos=origwp.pos,
                              id_=origwp.id,
                              ordering=origwp.ordering,
                              waypoint=origwp.waypoint,
                              altitude=origwp.altitude)
                meta.Session.add(wp)
            for origrt in meta.Session.query(Route).filter(
                    sa.and_(Route.user == tripuser(),
                            Route.trip == tripobj.trip)).all():
                rt = Route(user=origrt.user,
                           trip=newtripname,
                           waypoint1=origrt.waypoint1,
                           waypoint2=origrt.waypoint2,
                           tas=origrt.tas,
                           winddir=origrt.winddir,
                           windvel=origrt.windvel,
                           variation=origrt.variation)
                meta.Session.add(rt)
            for origstay in meta.Session.query(Stay).filter(
                    sa.and_(Stay.user == tripuser(),
                            Stay.trip == tripobj.trip)).all():
                stay = Stay(user=origstay.user,
                            trip=newtripname,
                            waypoint_id=origstay.waypoint_id,
                            fuel=origstay.fuel,
                            date_of_flight=origstay.date_of_flight,
                            departure_time=origstay.departure_time,
                            nr_persons=origstay.nr_persons,
                            fueladjust=origstay.fueladjust)
                meta.Session.add(stay)
            print "Adding trip:", trip
            session['current_trip'] = newtripname
            session.save()

        if request.params.get('deletetripname',
                              None) and not tripsharing.sharing_active():
            meta.Session.query(Trip).filter(
                sa.and_(
                    Trip.user == tripuser(),
                    Trip.trip == request.params['deletetripname'])).delete()
            del session['current_trip']
            session.save()

        meta.Session.flush()
        meta.Session.commit()
        redirect(h.url_for(controller='mapview', action="index"))
Example #5
0
    def save(self):
        try:
            if 'pos' in request.params and 'zoomlevel' in request.params:
                save_merc_x, save_merc_y = [
                    int(x) for x in request.params['pos'].split(",")
                ]
                save_zoom = int(request.params['zoomlevel'])
                pos = mapper.merc2latlon((save_merc_x, save_merc_y), save_zoom)
                self.set_pos_zoom(pos, save_zoom)

            wps = self.get_waypoints(request.params)

            oldname = request.params.get('oldtripname', '')
            tripname = request.params.get('tripname', '')
            if tripsharing.sharing_active():
                #Can't rename trips while tripsharing is active!
                tripname = session['current_trip']
                if oldname != session['current_trip']:
                    #In some strange way a non-tripsharing oldname appeared in the post. This
                    #means that something has gone awry. Don't save!
                    print "Bad trip oldname while tripsharing active!"
                    return "notok"

            if 'showarea' in request.params and request.params['showarea']:
                sha = request.params['showarea']
                if (sha == '.'):
                    session['showarea'] = ''
                    session['showarea_id'] = ''
                    session['showtrack'] = None
                else:
                    session['showarea'] = sha
                    session['showarea_id'] = md5(
                        sha.encode('utf8')).hexdigest()
                    session['showtrack'] = None

            session['mapvariant'] = request.params.get('mapvariant',
                                                       'airspace')

            #print "Req:",request.params
            oldtrip = None
            if not oldname.strip():
                oldname = tripname
            oldtrips = meta.Session.query(Trip).filter(
                sa.and_(Trip.user == tripuser(), Trip.trip == oldname)).all()
            if len(oldtrips) == 1:
                oldtrip = oldtrips[0]
            if oldtrip:
                trip = oldtrip
                if trip.trip != tripname:
                    if tripsharing.sharing_active():
                        #attempt to rename someone elses trip! Can't be allowed! set tripname to old name
                        print "Attempt to rename trip while viewing shared trip (tripsharing)"
                        return "notok"
                    else:
                        trip.trip = self.get_free_tripname(tripname)
                if session[
                        'current_trip'] != trip.trip and tripsharing.sharing_active(
                        ):
                    #internal error if we get here - the earlier test for current_trip not changing failed.
                    print "Unexpected tripsharing error #2"
                    return "notok"

                session['current_trip'] = trip.trip
            else:
                if tripsharing.sharing_active():
                    #we use sharing, but the shared trip can't be found!
                    print "Tripsharing active, but named trip didn't exist (deleted, probably)"
                    return "notok"
                tripname = self.get_free_tripname(tripname)
                trip = Trip(tripuser(), tripname)
                acs = meta.Session.query(Aircraft).filter(
                    sa.and_(Aircraft.user == tripuser())).all()
                if len(acs):
                    trip.aircraft = acs[0].aircraft

                meta.Session.add(trip)
                session['current_trip'] = tripname

            oldwps = set([(wp.id)
                          for wp in meta.Session.query(Waypoint).filter(
                              sa.and_(Waypoint.user == tripuser(),
                                      Waypoint.trip == trip.trip)).all()])

            newwps = set(wps.keys())
            #print "NEW WPS",wps
            removed = oldwps.difference(newwps)
            added = newwps.difference(oldwps)
            updated = newwps.intersection(oldwps)

            print "Removed: ", removed

            addedwps = added
            removedwps = removed
            updatedwps = updated
            ordering2wpid = dict()
            for remord in removed:
                meta.Session.query(Waypoint).filter(
                    sa.and_(Waypoint.user == tripuser(),
                            Waypoint.trip == trip.trip,
                            Waypoint.id == remord)).delete()
                #print "\n\n====DELETING!=====\n%s\n\n"%(rem,)
            resultant_by_order = dict()
            resultant_id2order = dict()
            waypointlink = dict()
            for add in added:
                wp = wps[add]
                waypoint = Waypoint(tripuser(), trip.trip, wp['pos'],
                                    int(wp['id']), int(wp['ordering']),
                                    wp['name'], wp['altitude'])
                resultant_by_order[int(wp['ordering'])] = waypoint
                resultant_id2order[int(wp['id'])] = wp['ordering']
                #print "\n\n====ADDING!=====\n%s %s %s\n\n"%(waypoint.id,waypoint.pos,waypoint.waypoint)
                meta.Session.add(waypoint)
            for upd in updated:
                wp = wps[upd]
                us = meta.Session.query(Waypoint).filter(
                    sa.and_(Waypoint.user == tripuser(),
                            Waypoint.trip == trip.trip,
                            Waypoint.id == upd)).all()
                if len(us) > 0:
                    u = us[0]
                    prevpos = mapper.from_str(u.pos)
                    newpos = mapper.from_str(wp['pos'])
                    approxdist = (prevpos[0] - newpos[0])**2 + (prevpos[1] -
                                                                newpos[1])**2
                    if approxdist > (
                            1.0 / 36000.0
                    )**2:  #if moved more than 0.1 arc-second, otherwise leave be.
                        u.pos = wp['pos']
                        print "Waypoint %d moved! (%f deg)" % (
                            u.id, math.sqrt(approxdist))
                    else:
                        print "Waypoint %d has only moved a little (%f deg)" % (
                            u.id, math.sqrt(approxdist))

                    u.waypoint = wp['name']
                    assert u.id == int(wp['id'])
                    u.ordering = wp['ordering']
                    u.altitude = wp['altitude']
                    resultant_by_order[int(wp['ordering'])] = u
                    resultant_id2order[int(wp['id'])] = wp['ordering']
                    #print "\n\n====UPDATING!=====\n%s %s %s\n\n"%(u.id,u.pos,u.waypoint)

            #print "Resultant by ordering: %s"%(resultant_by_order,)
            seq = list(sorted(resultant_by_order.items()))
            newroutes = set()
            for (ord1, waypoint1), (ord2, waypoint2) in zip(seq[:-1], seq[1:]):
                if not int(ord1) + 1 == int(ord2):
                    print "Waypoints %s and %s not consecutive (#%d, #%d)" % (
                        waypoint1, waypoint2, int(ord1), int(ord2))
                assert int(ord1) + 1 == int(ord2)
                newroutes.add((waypoint1.id, waypoint2.id))

            oldrouteobjs = list(
                meta.Session.query(Route).filter(
                    sa.and_(Route.user == tripuser(),
                            Route.trip == trip.trip)).all())
            oldroutes = set([(route.waypoint1, route.waypoint2)
                             for route in oldrouteobjs])
            prevalts = dict()
            for rt in oldrouteobjs:
                prevalts[(rt.a.id, +1)] = rt.altitude
                prevalts[(rt.b.id, -1)] = rt.altitude

            #Routes:
            removed = oldroutes.difference(newroutes)
            added = newroutes.difference(oldroutes)
            updated = newroutes.intersection(oldroutes)
            print "Removed routes:", removed
            print "Added routes:", added
            print "Kept routes: ", updated
            for rem1, rem2 in removed:
                meta.Session.query(Route).filter(
                    sa.and_(Route.user == tripuser(), Route.trip == trip.trip,
                            Route.waypoint1 == rem1,
                            Route.waypoint2 == rem2)).delete()
            sel_acs = meta.Session.query(Aircraft).filter(
                sa.and_(Aircraft.aircraft == trip.aircraft,
                        Aircraft.user == tripuser())).all()
            if len(sel_acs):
                tas = sel_acs[0].cruise_speed
            else:
                tas = 75
            for a1, a2 in added:
                cruisealt = ""
                a = None
                if a1 in addedwps:
                    startord = resultant_id2order.get(int(a1), 0)
                elif a2 in addedwps:
                    startord = resultant_id2order.get(int(a2), 0)
                else:
                    startord = resultant_id2order.get(int(a1), 0)

                print "Ordering of new wp: %d is %d" % (a1, startord)
                num_waypoints = len(resultant_by_order)

                def searchpattern(begin, num):
                    assert begin >= 0 and begin < num
                    down = begin - 1
                    up = begin + 1
                    while True:
                        work = False
                        if down >= 0:
                            yield down
                            down -= 1
                            work = True
                        if up < num:
                            yield up
                            up += 1
                            work = True
                        if not work: break

                for wpord in searchpattern(startord, num_waypoints):
                    wp = resultant_by_order.get(wpord, None)
                    print "Searchpattern visiting order: %d" % (wpord, )
                    if wp:
                        if wpord < startord:
                            cruisealt = prevalts.get((wp.id, +1), '')
                            print "Looking for alt previously after wp %d, got: %s" % (
                                wp.id, cruisealt)
                        else:
                            cruisealt = prevalts.get((wp.id, -1), '')
                            print "Looking for alt previously before wp %d, got: %s" % (
                                wp.id, cruisealt)
                        if cruisealt != "": break
                if cruisealt == "":
                    cruisealt = "1500"
                r = Route(tripuser(), trip.trip, a1, a2, 0, 0, tas, None,
                          cruisealt)
                meta.Session.add(r)

            session.save()

            meta.Session.flush()
            meta.Session.commit()

            ret = json.dumps([tripname])
            print "mapview returning json:", ret
            return ret
        except Exception, cause:
            #print line number and stuff as well
            print cause
            #TODO: ONLY FOR TESTING!!!!
            raise
            return "notok"
Example #6
0
def test_adv_route_info():

    from fplan.config.environment import load_environment
    from fplan.model import meta
    from fplan.model import Waypoint, Route, Trip, User, Aircraft
    import sqlalchemy as sa

    from pylons import config

    # meta.Session.query(User).filter(User.user==u'testuser')

    u = User(u'testuser', u'password')
    meta.Session.add(u)
    meta.Session.flush()
    ac = Aircraft(u'testuser', u'eurocub')
    ac.adv_cruise_speed = (75, 75, 75, 76, 76, 75, 74, 73, 72, 71)
    ac.adv_climb_speed = (60, 60, 60, 60, 61, 61, 61, 62, 63, 64)
    ac.adv_descent_speed = (80, 80, 81, 81, 82, 82, 83, 84, 85, 86)
    ac.adv_climb_rate = (750, 700, 650, 600, 550, 500, 450, 300, 200, 000)
    ac.adv_descent_rate = (500, 500, 500, 500, 525, 525, 550, 550, 575, 600)
    ac.adv_cruise_burn = (16, 16, 16, 16, 15.5, 15.25, 15.0, 14.75, 14.5, 14.0)
    ac.adv_climb_burn = (20, 20, 20, 20, 19, 19, 18, 17, 15, 14.0)
    ac.adv_descent_burn = (14, 14, 14, 14, 14, 14, 14, 14, 14, 13.5)
    ac.advanced_model = True

    meta.Session.add(ac)
    meta.Session.flush()
    trip = Trip(u"testuser", u"mytrip", u'eurocub')
    meta.Session.add(trip)
    meta.Session.flush()
    wp1 = Waypoint(u'testuser', u'mytrip', '59,18', 0, 100, u'bromma')
    wp2 = Waypoint(u'testuser', u'mytrip', '60,18', 1, 101, u'arlanda')
    wp3 = Waypoint(u'testuser', u'mytrip', '61,18', 2, 102, u'gävle')
    wp4 = Waypoint(u'testuser', u'mytrip', '61.01,18', 3, 103, u'gävleclose')
    meta.Session.add(wp1)
    meta.Session.add(wp2)
    meta.Session.add(wp3)
    meta.Session.add(wp4)
    meta.Session.flush()
    rt1 = Route(u'testuser', u'mytrip', 0, 1)
    rt1.altitude = "1000"
    rt2 = Route(u'testuser', u'mytrip', 1, 2)
    rt2.altitude = "10000"
    rt2.windvel = 25
    rt2.winddir = 0
    rt3 = Route(u'testuser', u'mytrip', 2, 3)
    rt3.altitude = "0"
    for s in [wp1, wp2, wp3, rt1, rt2, rt3]:
        meta.Session.add(s)
    meta.Session.flush()
    tripobj = meta.Session.query(Trip).filter(
        sa.and_(Trip.user == u'testuser', Trip.trip == u'mytrip')).one()
    print "Got tripobj", tripobj

    class Temp(object):
        pass

    dummy, route = calc.get_route(u'testuser', u'mytrip')
    D = 60.153204103671705
    assert abs(route[0].d - D) < 1e-5
    #print route[0].__dict__
    ch = route[0].ch
    assert abs(ch - 355) < 2  #This changes as earths magnetic field does
    #print "Climbtime: %f, Cruisetime: %f, expected tot: %f, calculated tot time: %f"%(climbtime,cruisetime,climbtime+cruisetime,route[0].time_hours)
    t = route[0].time_hours
    assert abs(t - 0.806) < 0.1
    m = route[0].mid_alt
    print "m:", m
    assert m == 1000
    m = route[1].mid_alt
    print "m:", m
    assert m == 9000
    #print route[1].wca

    m = route[2].subs[0].startalt
    print "last startalt", m
    #assert m==9000
    print "Last time", route[2].accum_time_hours
    assert abs(route[2].accum_time_hours - 2.1281958051) < 1e-9
Example #7
0
def test_route_optimize():

    from fplan.config.environment import load_environment
    from fplan.model import meta
    from fplan.model import Waypoint, Route, Trip, User, Aircraft
    import sqlalchemy as sa

    from pylons import config

    # meta.Session.query(User).filter(User.user==u'testuser')

    u = User(u'testuser', u'password')
    meta.Session.add(u)
    meta.Session.flush()
    ac = Aircraft(u'testuser', u'eurocub')
    ac.adv_cruise_speed = (75, 75, 75, 76, 76, 75, 74, 73, 72, 71)
    ac.adv_climb_speed = (60, 60, 60, 60, 61, 61, 61, 62, 63, 64)
    ac.adv_descent_speed = (80, 80, 81, 81, 82, 82, 83, 84, 85, 86)
    ac.adv_climb_rate = (750, 700, 650, 600, 550, 500, 450, 300, 200, 000)
    ac.adv_descent_rate = (500, 500, 500, 500, 525, 525, 550, 550, 575, 600)
    ac.adv_cruise_burn = (16, 16, 16, 16, 15.5, 15.25, 15.0, 14.75, 14.5, 14.0)
    ac.adv_climb_burn = (20, 20, 20, 20, 19, 19, 18, 17, 15, 14.0)
    ac.adv_descent_burn = (14, 14, 14, 14, 14, 14, 14, 14, 14, 13.5)
    ac.advanced_model = True

    meta.Session.add(ac)
    meta.Session.flush()
    trip = Trip(u"testuser", u"mytrip", u'eurocub')
    meta.Session.add(trip)
    meta.Session.flush()
    wp1 = Waypoint(u'testuser', u'mytrip', '56,14', 0, 100, u'bromma')
    wp2 = Waypoint(u'testuser', u'mytrip', '58,14', 1, 101, u'arlanda')
    wp3 = Waypoint(u'testuser', u'mytrip', '59,14', 2, 102, u'gävle')
    wp4 = Waypoint(u'testuser', u'mytrip', '60,14', 3, 103, u'norr')
    wp5 = Waypoint(u'testuser', u'mytrip', '60.01,14', 4, 104, u'norr2')
    meta.Session.add(wp1)
    meta.Session.add(wp2)
    meta.Session.add(wp3)
    meta.Session.add(wp4)
    meta.Session.add(wp5)
    meta.Session.flush()
    rt1 = Route(u'testuser', u'mytrip', 0, 1)
    rt1.altitude = "0"
    rt2 = Route(u'testuser', u'mytrip', 1, 2)
    rt2.altitude = "0"
    rt3 = Route(u'testuser', u'mytrip', 2, 3)
    rt3.altitude = "0"
    rt4 = Route(u'testuser', u'mytrip', 3, 4)
    rt4.altitude = "0"
    for s in [wp1, wp2, wp3, wp4, rt1, rt2, rt3, rt4]:
        meta.Session.add(s)
    meta.Session.flush()
    tripobj = meta.Session.query(Trip).filter(
        sa.and_(Trip.user == u'testuser', Trip.trip == u'mytrip')).one()
    print "Got tripobj", tripobj

    class Temp(object):
        pass

    res, routes = calc.get_optimized(u'testuser', u'mytrip', 'fuel')
    print[r.altitude for r in routes]
Example #8
0
    def save(self):
        try:
            if 'pos' in request.params and 'zoomlevel' in request.params:
                save_merc_x,save_merc_y=[int(x) for x in request.params['pos'].split(",")]
                save_zoom=int(request.params['zoomlevel'])
                pos=mapper.merc2latlon((save_merc_x,save_merc_y),save_zoom)
                self.set_pos_zoom(pos,save_zoom)
                

            wps=self.get_waypoints(request.params)
            
            oldname=request.params.get('oldtripname','')
            tripname=request.params.get('tripname','')
            if tripsharing.sharing_active():
                #Can't rename trips while tripsharing is active!                
                tripname=session['current_trip']
                if oldname!=session['current_trip']:
                    #In some strange way a non-tripsharing oldname appeared in the post. This
                    #means that something has gone awry. Don't save!
                    print "Bad trip oldname while tripsharing active!"
                    return "notok"
                    
            if 'showarea' in request.params and request.params['showarea']:
                sha=request.params['showarea']
                if (sha=='.'):
                    session['showarea']=''
                    session['showarea_id']=''
                    session['showtrack']=None
                else:
                    session['showarea']=sha
                    session['showarea_id']=md5(sha.encode('utf8')).hexdigest()
                    session['showtrack']=None
            
            session['mapvariant']=request.params.get('mapvariant','airspace')
                
            #print "Req:",request.params
            oldtrip=None
            if not oldname.strip():
                oldname=tripname
            oldtrips=meta.Session.query(Trip).filter(sa.and_(Trip.user==tripuser(),Trip.trip==oldname)).all()
            if len(oldtrips)==1:
                oldtrip=oldtrips[0]
            if oldtrip:
                trip=oldtrip
                if trip.trip!=tripname:
                    if tripsharing.sharing_active():
                        #attempt to rename someone elses trip! Can't be allowed! set tripname to old name
                        print "Attempt to rename trip while viewing shared trip (tripsharing)"
                        return "notok"
                    else:
                        trip.trip=self.get_free_tripname(tripname)
                if session['current_trip']!=trip.trip and tripsharing.sharing_active():
                    #internal error if we get here - the earlier test for current_trip not changing failed.
                    print "Unexpected tripsharing error #2"
                    return "notok"
                    
                session['current_trip']=trip.trip
            else:
                if tripsharing.sharing_active():
                    #we use sharing, but the shared trip can't be found!
                    print "Tripsharing active, but named trip didn't exist (deleted, probably)"
                    return "notok"
                tripname=self.get_free_tripname(tripname)
                trip = Trip(tripuser(), tripname)
                acs=meta.Session.query(Aircraft).filter(sa.and_(
                    Aircraft.user==tripuser())).all()
                if len(acs):
                    trip.aircraft=acs[0].aircraft

                meta.Session.add(trip)
                session['current_trip']=tripname
            
            oldwps=set([(wp.id) for wp in meta.Session.query(Waypoint).filter(sa.and_(
                    Waypoint.user==tripuser(),Waypoint.trip==trip.trip)).all()])
            
            newwps=set(wps.keys())
            #print "NEW WPS",wps
            removed=oldwps.difference(newwps)
            added=newwps.difference(oldwps)
            updated=newwps.intersection(oldwps)
            
            print "Removed: ",removed
            
            addedwps=added
            removedwps=removed
            updatedwps=updated
            ordering2wpid=dict()
            for remord in removed:
                meta.Session.query(Waypoint).filter(
                    sa.and_(Waypoint.user==tripuser(),Waypoint.trip==trip.trip,
                            Waypoint.id==remord)).delete()
                #print "\n\n====DELETING!=====\n%s\n\n"%(rem,)
            resultant_by_order=dict()
            resultant_id2order=dict()
            waypointlink=dict()
            for add in added:                
                wp=wps[add]
                waypoint=Waypoint(tripuser(),trip.trip,wp['pos'],int(wp['id']),int(wp['ordering']),wp['name'],wp['altitude'])
                resultant_by_order[int(wp['ordering'])]=waypoint
                resultant_id2order[int(wp['id'])]=wp['ordering']
                #print "\n\n====ADDING!=====\n%s %s %s\n\n"%(waypoint.id,waypoint.pos,waypoint.waypoint)
                meta.Session.add(waypoint)
            for upd in updated:
                wp=wps[upd]
                us=meta.Session.query(Waypoint).filter(
                    sa.and_(Waypoint.user==tripuser(),Waypoint.trip==trip.trip,
                            Waypoint.id==upd)).all()
                if len(us)>0:
                    u=us[0]
                    prevpos=mapper.from_str(u.pos)
                    newpos=mapper.from_str(wp['pos'])
                    approxdist=(prevpos[0]-newpos[0])**2+(prevpos[1]-newpos[1])**2
                    if approxdist>(1.0/36000.0)**2: #if moved more than 0.1 arc-second, otherwise leave be.                                        
                        u.pos=wp['pos']
                        print "Waypoint %d moved! (%f deg)"%(u.id,math.sqrt(approxdist))
                    else:
                        print "Waypoint %d has only moved a little (%f deg)"%(u.id,math.sqrt(approxdist))
                        
                    u.waypoint=wp['name']
                    assert u.id==int(wp['id'])
                    u.ordering=wp['ordering']
                    u.altitude=wp['altitude']
                    resultant_by_order[int(wp['ordering'])]=u
                    resultant_id2order[int(wp['id'])]=wp['ordering']
                    #print "\n\n====UPDATING!=====\n%s %s %s\n\n"%(u.id,u.pos,u.waypoint)
            
            #print "Resultant by ordering: %s"%(resultant_by_order,)
            seq=list(sorted(resultant_by_order.items()))
            newroutes=set()
            for (ord1,waypoint1),(ord2,waypoint2) in zip(seq[:-1],seq[1:]):
                if not int(ord1)+1==int(ord2):
                    print "Waypoints %s and %s not consecutive (#%d, #%d)"%(waypoint1,waypoint2,int(ord1),int(ord2))
                assert int(ord1)+1==int(ord2)
                newroutes.add((waypoint1.id,waypoint2.id))

            oldrouteobjs=list(meta.Session.query(Route).filter(sa.and_(
                    Route.user==tripuser(),Route.trip==trip.trip)).all())
            oldroutes=set([(route.waypoint1,route.waypoint2) for route in oldrouteobjs])
            prevalts=dict()
            for rt in oldrouteobjs:
                prevalts[(rt.a.id,+1)]=rt.altitude
                prevalts[(rt.b.id,-1)]=rt.altitude
            
            #Routes:
            removed=oldroutes.difference(newroutes)
            added=newroutes.difference(oldroutes)
            updated=newroutes.intersection(oldroutes)
            print "Removed routes:",removed
            print "Added routes:",added
            print "Kept routes: ",updated
            for rem1,rem2 in removed:
                meta.Session.query(Route).filter(
                    sa.and_(Route.user==tripuser(),Route.trip==trip.trip,
                            Route.waypoint1==rem1,Route.waypoint2==rem2)).delete()
            sel_acs=meta.Session.query(Aircraft).filter(sa.and_(
                Aircraft.aircraft==trip.aircraft,Aircraft.user==tripuser())).all()
            if len(sel_acs):
                tas=sel_acs[0].cruise_speed
            else:
                tas=75
            for a1,a2 in added:
                cruisealt=""
                a=None
                if a1 in addedwps:                    
                    startord=resultant_id2order.get(int(a1),0)
                elif a2 in addedwps:
                    startord=resultant_id2order.get(int(a2),0)
                else:
                    startord=resultant_id2order.get(int(a1),0)
                    
                print "Ordering of new wp: %d is %d"%(a1,startord)
                num_waypoints=len(resultant_by_order)
                def searchpattern(begin,num):
                    assert begin>=0 and begin<num
                    down=begin-1
                    up=begin+1
                    while True:
                        work=False
                        if down>=0:
                            yield down
                            down-=1
                            work=True
                        if up<num:
                            yield up
                            up+=1
                            work=True
                        if not work: break
                            
                for wpord in searchpattern(startord,num_waypoints):
                    wp=resultant_by_order.get(wpord,None)
                    print "Searchpattern visiting order: %d"%(wpord,)
                    if wp:
                        if wpord<startord:
                            cruisealt=prevalts.get((wp.id,+1),'')
                            print "Looking for alt previously after wp %d, got: %s"%(wp.id,cruisealt)
                        else:
                            cruisealt=prevalts.get((wp.id,-1),'')
                            print "Looking for alt previously before wp %d, got: %s"%(wp.id,cruisealt)
                        if cruisealt!="": break
                if cruisealt=="":
                    cruisealt="1500"
                r=Route(tripuser(),trip.trip,
                        a1,a2,0,0,tas,None,cruisealt)
                meta.Session.add(r)
            
            session.save()

            meta.Session.flush()
            meta.Session.commit();
                        
            ret=json.dumps([tripname])
            print "mapview returning json:",ret
            return ret
        except Exception,cause:                    
            #print line number and stuff as well
            print cause
            #TODO: ONLY FOR TESTING!!!!
            raise
            return "notok"        
Example #9
0
 def trip_actions(self):
     #print "trip actions:",request.params
         
     if request.params.get('addtripname',None):
         tripsharing.cancel()
         tripname=self.get_free_tripname(request.params['addtripname'])
         trip = Trip(tripuser(), tripname)
         acs=meta.Session.query(Aircraft).filter(sa.and_(
             Aircraft.user==tripuser())).all()
         if len(acs):
             trip.aircraft=acs[0].aircraft
         
         print "Adding trip:",trip
         meta.Session.add(trip)
         session['current_trip']=tripname
         session.save()       
     if request.params.get('opentripname',None):
         tripsharing.cancel()
         tripname=request.params['opentripname']
         if meta.Session.query(Trip).filter(sa.and_(Trip.user==tripuser(),
             Trip.trip==tripname)).count():
             session['current_trip']=tripname
             session.save()
     if request.params.get('reversetripname',None):
         tripsharing.cancel()
         username=tripuser()
         print "Reversing"
         tripname=request.params['reversetripname']
         wps=list(meta.Session.query(Waypoint).filter(sa.and_(Waypoint.user==username,Waypoint.trip==tripname)).order_by(Waypoint.ordering).all())
         if len(wps):
             maxord=max([wp.ordering for wp in wps])
             for wp in wps:
                 wp.ordering=maxord+1-wp.ordering
                 print "Reversed order of",wp.waypoint," = ",wp.ordering
                 meta.Session.add(wp)
             firststays=meta.Session.query(Stay).filter(sa.and_(Stay.user==username,Stay.trip==tripname,Stay.waypoint_id==wps[0].id)).all()
             if len(firststays)==1:
                 stay,=firststays
                 stay.waypoint_id=wps[-1].id
         
     if request.params.get('copytripname',None):
         tripsharing.cancel()
         tripobj=meta.Session.query(Trip).filter(sa.and_(Trip.user==tripuser(),
             Trip.trip==request.params['copytripname'])).first()
         newtripname=self.get_free_tripname(tripobj.trip+"(copy)")            
         trip = Trip(tripuser(), newtripname)
         meta.Session.add(trip)
         acs=meta.Session.query(Aircraft).filter(sa.and_(
             Aircraft.user==tripuser(),Aircraft.aircraft==tripobj.aircraft)).all()
         if len(acs):
             trip.aircraft=acs[0].aircraft
         
         for origwp in meta.Session.query(Waypoint).filter(sa.and_(Waypoint.user==tripuser(),Waypoint.trip==tripobj.trip)).all():
             wp=Waypoint(user=origwp.user,trip=newtripname,pos=origwp.pos,id_=origwp.id,
                         ordering=origwp.ordering,waypoint=origwp.waypoint,altitude=origwp.altitude)
             meta.Session.add(wp)
         for origrt in meta.Session.query(Route).filter(sa.and_(Route.user==tripuser(),Route.trip==tripobj.trip)).all():
             rt=Route(user=origrt.user,trip=newtripname,waypoint1=origrt.waypoint1,waypoint2=origrt.waypoint2,tas=origrt.tas,
                      winddir=origrt.winddir,windvel=origrt.windvel,variation=origrt.variation)
             meta.Session.add(rt)
         for origstay in meta.Session.query(Stay).filter(sa.and_(Stay.user==tripuser(),Stay.trip==tripobj.trip)).all():
             stay=Stay(user=origstay.user,trip=newtripname,waypoint_id=origstay.waypoint_id,
                       fuel=origstay.fuel,date_of_flight=origstay.date_of_flight,
                       departure_time=origstay.departure_time,
                       nr_persons=origstay.nr_persons,fueladjust=origstay.fueladjust)
             meta.Session.add(stay)
         print "Adding trip:",trip
         session['current_trip']=newtripname
         session.save()       
         
     if request.params.get('deletetripname',None) and not tripsharing.sharing_active():
         meta.Session.query(Trip).filter(sa.and_(Trip.user==tripuser(),
             Trip.trip==request.params['deletetripname'])).delete()
         del session['current_trip']
         session.save()
         
     meta.Session.flush()
     meta.Session.commit();
     redirect(h.url_for(controller='mapview',action="index"))