import sys, os sys.path.append('/var/lib/django') from django.core.management import setup_environ from pbp_com import settings setup_environ(settings) import re import urllib import urllib2 from BeautifulSoup import BeautifulSoup import time from datetime import datetime, timedelta import dateutil from almanac.models import Day, AstroChart year = '2014' place = 'Stonington' state = 'ME' def get_table(year="", state="", place="", type=""): parser = re.compile('\d\d ') '''A special parser for lunar fraction tables ''' lparser = re.compile(' \d\d ') if type=="sun": type=0 elif type=="moon": type=1 elif type=="civil_tw": type=2 elif type=="nautical_tw": type=3 elif type=="astro_tw": type=4 elif type=="lunar_fraction": type=5 else: type=0 if type < 5: url = "http://aa.usno.navy.mil/cgi-bin/aa_rstablew.pl" post_data = {'FFX' : '1', 'xxy' : year, 'type' : type, 'st' : state, 'place' : place, 'ZZZ' : 'END' } else: url = "http://aa.usno.navy.mil/cgi-bin/aa_moonill2.pl" post_data = {'time':'00', 'xxy':year, 'zone':'-05', 'ZZZ':'END'} data = urllib.urlencode(post_data) req = urllib2.Request(url, data) response = urllib2.urlopen(req) page = response.read() data = page.split('\n') table=[] for line in data: if type <5: if parser.match(line): table.append(line) else: if lparser.match(line): table.append(line) return table ''' End of get_table() ''' def fix_time(str, today, chart): if str == ' ': str = None else: if chart.dst_start < today < chart.dst_end: delta=timedelta(hours=1) else: delta=timedelta(hours=0) str= time.strftime("%H:%M", (datetime(*time.strptime(str, "%H%M")[0:5])+delta).timetuple()) return str ''' End of fix_time() ''' '''### THE HEAVY LIFTING ### ''' sun_table = get_table(year, state, place, 'sun') moon_table = get_table(year, state, place, 'moon') civil_tw_table = get_table(year, state, place, 'civil_tw') naut_tw_table = get_table(year, state, place, 'nautical_tw') astro_tw_table = get_table(year, state, place, 'astro_tw') lunar_fraction = get_table(year, '', '', 'lunar_fraction') month=0 astro_table=[] ''' Here we go over the table 12 times for each month. For each month, we keep running till we hit a blank. Load the day, month and year into the table and go. ''' offset=4 moon_iter=0 civil_iter=0 naut_iter=0 astro_iter=0 lunar_offset=8 lunar_iter=0 try: chart=AstroChart.objects.get(year__exact=year) except AstroChart.DoesNotExist: pass #Add code here to add chart if it doesn't exist while (month < 12): month = month +1 for entry in sun_table: if entry[offset:offset+9] == ' ': pass else: if month < 10: date = datetime.strptime(year + '0' + str(month)+entry[:2], "%Y%m%d").date() else: date = datetime.strptime(year + str(month) + entry[:2], "%Y%m%d").date() astro_table.append({'date':date, 'sunrise':fix_time(entry[offset:offset+4], date,chart), 'sunset':fix_time(entry[offset+5:offset+9], date,chart)}) for entry in moon_table: if entry[offset:offset+9] == ' ': pass else: date=astro_table[moon_iter]['date'] astro_table[moon_iter]['moonrise']=fix_time(entry[offset:offset+4],date, chart) astro_table[moon_iter]['moonset']=fix_time(entry[offset+5:offset+9], date, chart) moon_iter = moon_iter+1 for entry in civil_tw_table: if entry[offset:offset+9] == ' ': pass else: date=astro_table[civil_iter]['date'] astro_table[civil_iter]['civil_twilight_am']=fix_time(entry[offset:offset+4], date, chart) astro_table[civil_iter]['civil_twilight_pm']=fix_time(entry[offset+5:offset+9], date, chart) civil_iter = civil_iter+1 for entry in naut_tw_table: if entry[offset:offset+9] == ' ': pass else: date=astro_table[naut_iter]['date'] astro_table[naut_iter]['nautical_twilight_am']=fix_time(entry[offset:offset+4], date, chart) astro_table[naut_iter]['nautical_twilight_pm']=fix_time(entry[offset+5:offset+9], date, chart) naut_iter = naut_iter+1 ''' Want astronomical twilight? for entry in astro_tw_table: if entry[offset:offset+9] == ' ': pass else: astro_table[astro_iter]['astro_tw_start']=entry[offset:offset+4] astro_table[astro_iter]['astro_tw_end']=entry[offset+5:offset+9] astro_iter = astro_iter+1 ''' for entry in lunar_fraction: if entry[lunar_offset:lunar_offset+4] == ' ': pass else: frac = entry[lunar_offset:lunar_offset+4] if frac == "1.00": astro_table[lunar_iter]['moonphase']=2 # FULL elif frac == "0.00": astro_table[lunar_iter]['moonphase']=0 # NEW elif 0.6 > float(frac) > 0.5 and past_phase == "full": astro_table[lunar_iter]['moonphase']=3 # 3rd Q. elif 0.6 > float(frac) > 0.5 and past_phase == "new": astro_table[lunar_iter]['moonphase']=1 # 1st Q. astro_table[lunar_iter]['moonphase_fraction']=entry[lunar_offset:lunar_offset+4] lunar_iter = lunar_iter+1 if frac == "1.00": past_phase = "full" elif frac=="0.00": past_phase = "new" lunar_offset=lunar_offset +9 offset=offset +11 ''' Load the data into the DB ''' for entry in astro_table: print entry entry['chart']=chart day=Day.objects.create(**entry) day.save()