func FixupComplaint(c *types.Complaint, key *datastore.Key) { // 0. Snag the key, so we can refer to this object later c.DatastoreKey = key.Encode() // 1. GAE datastore helpfully converts timezones to UTC upon storage; fix that c.Timestamp = date.InPdt(c.Timestamp) // 2. Compute the flight details URL, if within 24 days age := date.NowInPdt().Sub(c.Timestamp) if age < time.Hour*24 { // c.AircraftOverhead.Fr24Url = c.AircraftOverhead.PlaybackUrl() c.AircraftOverhead.Fr24Url = "http://flightaware.com/live/flight/" + c.AircraftOverhead.FlightNumber // Or: http://flightaware.com/live/flight/UAL337/history/20151215/ [0655Z/KLAX/KSFO] // date is UTC of departure time; might be tricky to guess :/ } // 3. Compute distances, if we have an aircraft if c.AircraftOverhead.FlightNumber != "" { a := c.AircraftOverhead aircraftPos := geo.Latlong{a.Lat, a.Long} observerPos := geo.Latlong{c.Profile.Lat, c.Profile.Long} c.Dist2KM = observerPos.Dist(aircraftPos) c.Dist3KM = observerPos.Dist3(aircraftPos, a.Altitude) } }
func form2Complaint(r *http.Request) types.Complaint { c := types.Complaint{ Description: r.FormValue("content"), Timestamp: time.Now(), // No point setting a timezone, it gets reset to UTC HeardSpeedbreaks: FormValueCheckbox(r, "speedbrakes"), Loudness: int(FormValueInt64(r, "loudness")), Activity: r.FormValue("activity"), Browser: types.Browser{ UUID: r.FormValue("browser_uuid"), Name: r.FormValue("browser_name"), Version: r.FormValue("browser_version"), Vendor: r.FormValue("browser_vendor"), Platform: r.FormValue("browser_platform"), }, } // This field is set during updates (it identifies a complaint to update) if r.FormValue("datastorekey") != "" { c.DatastoreKey = r.FormValue("datastorekey") } // These fields are set directly in CGI args, for historical population if r.FormValue("timestamp_epoch") != "" { c.Timestamp = time.Unix(FormValueInt64(r, "timestamp_epoch"), 0) } if r.FormValue("flight") != "" { c.AircraftOverhead.FlightNumber = r.FormValue("flight") } return c }