# Any command line argument will cause this script to run in testing mode. If the
# argument is "push" all the 25day and 10day images will be pushed to the 50Webs
# server.
# To use this file:
# Edit charts_input_testing.html (if needed)
# Edit this file (if needed) and run it (with a "test" or "push" argument)
# Then view the charts_testing.html file on the NUC.
# Then finally, run the publish bat file.
# System and OS
import sys, os, shutil, random
# Strings
import string
# HTML fetching
import urllib2
# Windows extensions (pywin32-220.win32-py2.7.exe)
import win32com.client
import pywintypes # supports exceptions names
# time and date functionality
import time
from datetime import datetime
# FTP
from ftplib import FTP
#==Functions====================================================================
def uploadBinaryFile(serverPath, localPath, filename):
ftp.storbinary('STOR ' + serverPath + filename, open(localPath + filename, 'rb'))
def uploadTextFile(serverPath, localPath, filename):
ftp.storlines('STOR ' + serverPath + filename, open(localPath + filename, 'r'))
def getChart( stationRegion, stationName, sensorName, nDays, imageFileName):
# One-day charts will use the 24Hour option.
webpage_url = ("http://" + "nuc/" + webSite + "/rosy.asp?Region=" + stationRegion +
"&Region_state=old&Location=" + stationName + "&Sensor=" + sensorName +
"&Days=" + nDays + "&chk24Hrs=on&chkRA=on&jS=T&specName=" + imageFileName)
#print sensorName, webpage_url
request = urllib2.Request(webpage_url, headers={'User-Agent': 'Mozilla/5.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'})
page = urllib2.urlopen(request)
return page
def updateCharts(station):
stationRegion = station[0]
stationName = station[1]
newImageLine = "not found"
multiDayChartsUpdated = False
# Get the wind chart from the local Waconia site.
windPage24hr = getChart( stationRegion, stationName, "Wind40", "1", "WindChart")
# Find the div that references the image files.
for line in windPage24hr:
#print "once per line..."
if "id='directions'" in line:
print "Found the new 'directions' line in source file."
newImageLine = line
# Get the temperature and pressure charts from the local Waconia site.
getChart( stationRegion, stationName, "Temperature", "1", "TemperatureChart")
getChart( stationRegion, stationName, "Pressure", "1", "PressureChart")
# Copy the image files to the 50webs-dev site on NUC.
pathToSourceFolderForImages = 'C:\\Users\\Jim\\Documents\\webcontent\\waconia\\' + sitePath + '\\chart-images\\'
pathToTargetFolder = "C:\\Users\\Jim\\Documents\\webcontent\\waconia\\50webs-dev\\"
shutil.copy(pathToSourceFolderForImages + 'WindChart.jpg', pathToTargetFolder + 'chart-images')
shutil.copy(pathToSourceFolderForImages + 'TemperatureChart.jpg', pathToTargetFolder + 'chart-images')
shutil.copy(pathToSourceFolderForImages + 'PressureChart.jpg', pathToTargetFolder + 'chart-images')
# Upload the image files to the 50Webs host.
if not testingMode:
uploadBinaryFile('chart-images/', pathToSourceFolderForImages, 'WindChart.jpg')
uploadBinaryFile('chart-images/', pathToSourceFolderForImages, 'TemperatureChart.jpg')
uploadBinaryFile('chart-images/', pathToSourceFolderForImages, 'PressureChart.jpg')
# Get a 25-day pressure chart for Barrow and Barking Sands. Trigger this based on the first location in
# the randomized site list. This special trigger will keep this from frequent uploads.
#print "station trigger (PABR, PHBK) = ", stationList[0][1], stationList[1][1]
print "station trigger (PABR or RMTN) = ", stationName
#if (stationList[0][1]=="PABR" and stationList[1][1]=="PHBK"):
if (stationName=="PABR") or (stationName=="RMTN") or pushImagesToServer:
getChart( "Misc", "PABR", "Pressure", "25", "25DayPressureChart-1")
getChart( "Misc", "PABR", "Temperature", "25", "25DayTemperatureChart")
getChart( "CR", "300A", "Pressure" , "25", "25DayPressureChart-2")
getChart( "Misc", "PHBK", "Pressure", "25", "25DayPressureChart-3")
getChart( "CR", "KTTD", "DeltaP2", "10", "DeltaPressureChart")
shutil.copy(pathToSourceFolderForImages + '25DayPressureChart-1.jpg', pathToTargetFolder + 'chart-images')
shutil.copy(pathToSourceFolderForImages + '25DayTemperatureChart.jpg', pathToTargetFolder + 'chart-images')
shutil.copy(pathToSourceFolderForImages + '25DayPressureChart-2.jpg', pathToTargetFolder + 'chart-images')
shutil.copy(pathToSourceFolderForImages + '25DayPressureChart-3.jpg', pathToTargetFolder + 'chart-images')
shutil.copy(pathToSourceFolderForImages + 'DeltaPressureChart.jpg', pathToTargetFolder + 'chart-images')
if (not testingMode) or pushImagesToServer:
uploadBinaryFile('chart-images/', pathToSourceFolderForImages, '25DayPressureChart-1.jpg')
uploadBinaryFile('chart-images/', pathToSourceFolderForImages, '25DayTemperatureChart.jpg')
uploadBinaryFile('chart-images/', pathToSourceFolderForImages, '25DayPressureChart-2.jpg')
uploadBinaryFile('chart-images/', pathToSourceFolderForImages, '25DayPressureChart-3.jpg')
uploadBinaryFile('chart-images/', pathToSourceFolderForImages, 'DeltaPressureChart.jpg')
print "25-day pressure charts have updated."
multiDayChartsUpdated = True
# Edit the local html file to include the specifics of the div that holds the
# two images: chart and second # y-axis scale. Also update the two timestamps.
inputFile = open(pathToTargetFolder + inputHTMLFileName, 'r')
outputFile = open(pathToTargetFolder + outputHTMLFileName, 'w')
for oldLine in inputFile:
if ("id='directions'" in oldLine) and (newImageLine <> "not found"):
print "Found the 'directions' line in input file."
#print "Old line= ", oldLine
#print "New line= ", newImageLine
outputFile.write(newImageLine)
elif "24-hour charts" in oldLine:
print 'Updated the 24hr-charts timestamp.'
outputFile.write("24-hour charts updated " + datetime.now().strftime("%A, %B %d, %Y at %I:%M%p") + " (Central).\n")
elif ("Multi-day charts" in oldLine) and multiDayChartsUpdated:
print 'Updated the multi-day-charts timestamp.'
outputFile.write("Multi-day charts updated " + datetime.now().strftime("%A, %B %d, %Y at %I:%M%p") + " (Central).\n")
else:
outputFile.write(oldLine)
#print oldLine,
inputFile.close()
outputFile.close()
# Upload the html file from the 50Webs dev site on the NUC to 50Webs.
uploadTextFile('', 'C:\\Users\\Jim\\Documents\\webcontent\\waconia\\50webs-dev\\', outputHTMLFileName)
# Replace the old input file with the newly generated output file. This carries over the prior time-stamp on
# the multi-day charts even if they are not updated.
shutil.copyfile(pathToTargetFolder + outputHTMLFileName, pathToTargetFolder + inputHTMLFileName)
#==Main=========================================================================
# Generate the image and send the image and page (for all hours after 6am).
if (datetime.now().hour > 6):
pushImagesToServer = False
if len(sys.argv) > 1:
# If there is a command line argument, run this in testing mode.
print "In testing mode..."
testingMode = True
if sys.argv[1] == "push":
pushImagesToServer = True
else:
testingMode = False
# Shift gears if in testing mode.
if testingMode == True:
webSite = "waconia-dev"
inputHTMLFileName = "charts_input_testing.html"
outputHTMLFileName = "charts_testing.html"
sitePath = "website-dev"
else:
webSite = "waconia"
inputHTMLFileName = "charts_input.html"
outputHTMLFileName = "charts.html"
sitePath = "website-prod"
# Connect to the server.
ftp = FTP('jimandlaurie.50webs.com')
ftp.login(user='jb_miller', passwd='77d9b54688')
ftp.cwd('/waconia.timetocode.org')
#ftp.dir()
# List of Stations.
stationList = [ ['CR','RMTN'], ['CR','RMTN'], ['CR','KRLD'], ['MN','KMKT'], ['Misc','PABR'], ['Misc','PHBK'] ]
random.shuffle(stationList)
randomStation = stationList[0]
print randomStation
updateCharts(randomStation)
ftp.quit()