def navplot(filename, firs, start_date, num_days, username, password, mapinfo): # Calculate dates if start_date == datetime.date.today(): utc = datetime.datetime.utcnow() start_hour = utc.hour start_min = utc.minute else: start_hour = 0 start_min = 0 end_date = start_date + datetime.timedelta(days=num_days-1) # Create browser, get login page and login br = mechanize.Browser() br.open(LOGIN_URL) br.select_form(name="mainForm") br["j_username"] = username br["j_password"] = password br.submit() # Get area brief request page br.select_form(name="menuView:menuForm") br.form.find_control("menuView:menuForm:_idcl").readonly = False br["menuView:menuForm:_idcl"] = "menuView:menuForm:notam_area" br.submit() # Get area brief br.select_form(name="mainForm") br["mainForm:startValidityDay"] = [str(start_date.day)] br["mainForm:startValidityMonth"] = [str(start_date.month-1)] br["mainForm:startValidityYear"] = [str(start_date.year)] br["mainForm:startValidityHour"] = [str(start_hour)] br["mainForm:startValidityMinute"] = [str(start_min)] br["mainForm:endValidityDay"] = [str(end_date.day)] br["mainForm:endValidityMonth"] = [str(end_date.month-1)] br["mainForm:endValidityYear"] = [str(end_date.year)] br["mainForm:endValidityHour"] = ["23"] br["mainForm:endValidityMinute"] = ["59"] br["mainForm:traffic"] = ["V"] br["mainForm:lowerFL"] = "000" br["mainForm:upperFL"] = "100" for i, fir in enumerate(firs): br["mainForm:fir_%d" % i] = fir response = br.submit() # Create soup from response and then parse for NOTAMs notam_soup = BeautifulSoup.BeautifulSoup(response.read()) notams = parse_notam_soup(notam_soup) # Get the header text div = notam_soup.find("div", {"id": "mainColContent"}) hdr = '\n'.join([' '.join([x.string.strip() for x in l(text=True)]) for l in div('li')]) # Create PDF document notamdoc.notamdoc(notams, hdr, firs, start_date, num_days, filename, mapinfo, COPYRIGHT_HOLDER)
def navplot(pdf_filename, firs, start_date, num_days, username, password, mapinfo, mapdata): """Download NOTAM data from EAD Basic website, parse NOTAM data and convert to PDF document.""" # Login to EAD url_base = 'http://www.ead.eurocontrol.int' url = url_base + '/publicuser/public/pu/login.do' values = { 'user': username, 'password': password } data = urllib.urlencode(values) response = urllib2.urlopen(url, data) # Get login session id s = re.search('jsessionid=([^"]*)', response.read()) if s is None: raise NavplotError("Unsuccessful login") session_id = s.group(1) # Get applications page and search for URL path (including a new # session id) for the NOTAM app url = url_base + "/publicuser/protect/pu/applicationenter.do" url = append_session_id(url, session_id) response = urllib2.urlopen(url) s = re.search("'Generate PIB', '([^']*)", response.read()) if s is None: raise NavplotError("Can't get NOTAM application path") notam_gen_path = s.group(1) # Get the new session id s = re.search("JSESSIONID=(.*)", notam_gen_path) notam_session_id = s.group(1) # Calculate duration (with adjustment if we are part way though day 1) duration = num_days*24 if start_date==datetime.date.today(): utc = datetime.datetime.utcnow() duration -= utc.hour + 1 start_hour = "%02d" % utc.hour start_min = "%02d" % utc.minute else: start_hour = "00" start_min = "00" # Build POST data for NOTAM request values = { #'action': 'generate', 'PIBSubject': 'navplot', 'Validity/Day': start_date.strftime('%d'), 'Validity/Month': start_date.strftime('%b').upper(), 'Validity/Year': start_date.strftime('%Y'), 'Validity/Hour': start_hour, 'Validity/Minute': start_min, 'Validity/Duration': str(duration), 'Traffic': 'V', 'Purpose': 'BM', 'FlightLevel/UpperFL': '100', 'FlightLevel/LowerFL': '000', 'MessageTypeList': 'SNOWTAM', 'Controls/Aerodrome': '', 'Controls/FIR': '' } for n, fir in enumerate(firs): values['SimpleGeoFilter/FIRList/FIR[%d]/ICAO' % (n+1)] = fir # POST multipart (why???) encoded NOTAM request url = url_base + notam_gen_path + "?action=generate" content_type, data = encode_multipart_formdata(values) request = urllib2.Request(url=url, data=data) request.add_header('content-type', content_type) response = urllib2.urlopen(request) # POST returns the orignal page with a NOTAM PIB id value # attribute of the HTML body s = re.search("<IDString>([^<]*)</IDString>", response.read()) if s is None: raise NavplotError("Can't get NOTAM page") pib_id = s.group(1) # Construct notam path using session and pib ID's notam_path =\ "/ino/servlet/PIBGenerator;jsessionid=%s?PIBId=%s&PIBLayout=XML" %\ (notam_session_id, pib_id) # Get briefing in XML format url = url_base + notam_path response = urllib2.urlopen(url) xml_str = response.read() # Logout from EAD url = url_base + '/publicuser/public/pu/logout.do' url = append_session_id(url, session_id) urllib2.urlopen(url, session_id) # Parse NOTAMS from XML root = ET.fromstring(xml_str) notams = parse_notams(root) # Make header text if len(notams): hdr = root.find('AreaPIBHeader') hdr_text = '%s - %s\n' % (hdr.findtext('AuthorityName'), hdr.findtext('AuthorityTitle')) hdr_text += 'Issued: %s\n' % hdr.findtext('Issued') hdr_text += 'Validity: %s to %s\n' % (hdr.findtext('Validity/ValidFrom'), hdr.findtext('Validity/ValidTo')) hdr_text += 'Height Limits: Lower FL%s, Upper FL%s\n' %\ (hdr.findtext('FlightLevel/LowerFL'), hdr.findtext('FlightLevel/UpperFL')) # Build NOTAM PDF document notamdoc.notamdoc(notams, hdr_text, firs, start_date, num_days, pdf_filename, mapinfo, mapdata, COPYRIGHT_HOLDER) return len(notams)
def navplot(filename, firs, start_date, num_days, username, password, mapinfo): # Calculate dates if start_date == datetime.date.today(): utc = datetime.datetime.utcnow() start_hour = utc.hour start_min = utc.minute else: start_hour = 0 start_min = 0 end_date = start_date + datetime.timedelta(days=num_days - 1) # Create browser, get login page and login br = mechanize.Browser() br.open(LOGIN_URL) br.select_form(name="mainForm") br["j_username"] = username br["j_password"] = password br.submit() # Get area brief request page br.select_form(name="menuView:menuForm") br.form.find_control("menuView:menuForm:_idcl").readonly = False br["menuView:menuForm:_idcl"] = "menuView:menuForm:notam_area" br.submit() # Get area brief br.select_form(name="mainForm") br["mainForm:startValidityDay"] = [str(start_date.day)] br["mainForm:startValidityMonth"] = [str(start_date.month - 1)] br["mainForm:startValidityYear"] = [str(start_date.year)] br["mainForm:startValidityHour"] = [str(start_hour)] br["mainForm:startValidityMinute"] = [str(start_min)] br["mainForm:endValidityDay"] = [str(end_date.day)] br["mainForm:endValidityMonth"] = [str(end_date.month - 1)] br["mainForm:endValidityYear"] = [str(end_date.year)] br["mainForm:endValidityHour"] = ["23"] br["mainForm:endValidityMinute"] = ["59"] br["mainForm:traffic"] = ["V"] br["mainForm:lowerFL"] = "000" br["mainForm:upperFL"] = "100" for i, fir in enumerate(firs): br["mainForm:fir_%d" % i] = fir response = br.submit() # Create soup from response and then parse for NOTAMs notam_soup = BeautifulSoup.BeautifulSoup(response.read()) notams = parse_notam_soup(notam_soup) # Get the header text div = notam_soup.find("div", {"id": "mainColContent"}) hdr = '\n'.join([ ' '.join([x.string.strip() for x in l(text=True)]) for l in div('li') ]) # Create PDF document notamdoc.notamdoc(notams, hdr, firs, start_date, num_days, filename, mapinfo, COPYRIGHT_HOLDER)