Exemplo n.º 1
1
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)
Exemplo n.º 2
1
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)
Exemplo n.º 3
0
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)