awips2/cave/com.raytheon.viz.gfe/localization/gfe/userPython/textUtilities/ConfigurableIssuance.py
2022-05-05 12:34:50 -05:00

202 lines
7.9 KiB
Python

##
# This software was developed and / or modified by Raytheon Company,
# pursuant to Contract DG133W-05-CQ-1067 with the US Government.
#
# U.S. EXPORT CONTROLLED TECHNICAL DATA
# This software product contains export-restricted data whose
# export/transfer/disclosure is restricted by U.S. law. Dissemination
# to non-U.S. persons whether in the United States or abroad requires
# an export license or other authorization.
#
# Contractor Name: Raytheon Company
# Contractor Address: 6825 Pine Street, Suite 340
# Mail Stop B8
# Omaha, NE 68106
# 402.291.0100
#
# See the AWIPS II Master Rights File ("Master Rights File.pdf") for
# further licensing information.
##
# ----------------------------------------------------------------------------
# This software is in the public domain, furnished "as is", without technical
# support, and with no warranty, express or implied, as to its usefulness for
# any purpose.
#
# ConfigurableIssuance.py
# Methods for setting up configurable issuance.
#
# Author: hansen
# ----------------------------------------------------------------------------
##
# This is a base file that is not intended to be overridden.
##
import TimeRangeUtils
import time
import TimeRange, AbsTime
class ConfigurableIssuance(TimeRangeUtils.TimeRangeUtils):
def __init__(self):
TimeRangeUtils.TimeRangeUtils.__init__(self)
def getIssuanceInfo(self, productIssuance, issuanceList, creationTime=None):
# Create a NarrativeDef for a "narrative" type of product
# from an issuanceList and selected item
(currentLocalTime, self._shift) = self.determineTimeShift()
if creationTime is None:
day = currentLocalTime.day
month = currentLocalTime.month
year = currentLocalTime.year
hour = currentLocalTime.hour
minutes = currentLocalTime.minute
else:
localTime = time.localtime(creationTime)
year = localTime[0]
month = localTime[1]
day = localTime[2]
hour = localTime[3]
minutes = localTime[4]
# Determine "issuanceHour"
startTime = AbsTime.absTimeYMD(year,month,day,hour)
# find the entry for our selection
#print productIssuance, issuanceList
entry = self.getEntry(productIssuance, issuanceList)
desc, startHour, endHour, expireHour, p1Label, \
lateNightPhrase, lateDayPhrase, todayFlag, narrativeDef = entry
period1Label = p1Label
period1LateDayPhrase = lateDayPhrase
period1LateNightPhrase = lateNightPhrase
# Take care of "issuanceHour" variable
startHour = self.convertIssuanceHour(startHour, hour, minutes)
endHour = self.convertIssuanceHour(endHour, hour, minutes)
expireHour = self.convertIssuanceHour(expireHour, hour, minutes)
# Determine startTime and period1
startTime = AbsTime.absTimeYMD(year, month, day, 0)
startTime = startTime + startHour * 3600
endTime = AbsTime.absTimeYMD(year, month, day, 0)
endTime = endTime + endHour * 3600
period1 = (endTime.unixTime() - startTime.unixTime()) // 3600
# Set "period1" if it appears in narrativeDef
newNarrativeDef = []
totalHours = 0
firstPeriod = 1
for component, period in narrativeDef:
# Handle custom components - added in OB8.2.
# "Custom" components are intended to replace "priorPeriod" which is removed.
# "Custom" component entries in a narrative definition are of the form:
# ("Custom", (componentName, timeRange))
# where timeRange can be (start_hours, end_hours) or an AFPS.TimeRange.
# Start_hours and end_hours are relative to midnight local time
# of the product creation date.
if component == "Custom":
newNarrativeDef.append((component, period))
continue
if firstPeriod:
if period == "period1":
period = period1
else:
period1 = period
firstPeriod = 0
totalHours = totalHours + period
newNarrativeDef.append((component, period))
# Convert to GMT time before making time range
startTime = startTime - self._shift
tr = TimeRange.TimeRange(startTime, startTime + (totalHours * 3600))
timeRange = tr
period1TimeRange = TimeRange.TimeRange(
tr.startTime(), tr.startTime() + period1*3600)
narrativeDef = newNarrativeDef
# Expiration time -- convert to GMT
expireStartTime = AbsTime.absTimeYMD(year, month, day, 0) - self._shift
expireStartTime = expireStartTime + expireHour * 3600
expireTime = expireStartTime
issueTime = AbsTime.current()
#issueTime = self.getCurrentTime(
# None, "%l%M %p %Z %a %b %e %Y", stripLeading=1)
#expireTimeRange = AFPS.TimeRange(expireStartTime, expireStartTime + 3600)
# expireTime = self.timeDisplay(expireTimeRange, "", "", "%d%H%M", "").upper()
return Issuance(entry, timeRange, expireTime, issueTime, narrativeDef,
period1TimeRange, period1LateDayPhrase, period1LateNightPhrase,
period1Label, todayFlag)
def convertIssuanceHour(self, issuanceHour, currentHour, currentMinutes):
if type(issuanceHour) is str:
if currentMinutes > self.issuanceHour_minutesPastHour():
currentHour = currentHour + 1
# Don't cross to the next day
if currentHour == 24:
currentHour = 23
issuanceHour = issuanceHour.replace("issuanceHour", repr(currentHour))
resultHour = eval(issuanceHour)
return resultHour
else:
return issuanceHour
def getEntry(self, productIssuance, issuanceList):
found =0
for entry in issuanceList:
issuanceDescription = entry[0]
if productIssuance == issuanceDescription:
found = 1
break
if found == 0:
return None
else:
return entry
def issuanceHour_minutesPastHour(self):
# Minutes past the hour after which "issuanceHour" will jump to the next hour
# The exception is Hour 23 which will always be truncated i.e. we won't jump
# to the next day.
#
# Default is to truncate the hour so that we always get the hazards
# reported for that hour.
return 65
class Issuance:
def __init__(self, entry, timeRange, expireTime, issueTime, narrativeDef,
period1TimeRange, period1LateDayPhrase, period1LateNightPhrase,
period1Label, todayFlag):
self.__entry = entry
self.__timeRange = timeRange
self.__expireTime = expireTime
self.__issueTime = issueTime
self.__narrativeDef = narrativeDef
self.__period1TimeRange = period1TimeRange
self.__period1LateDayPhrase = period1LateDayPhrase
self.__period1LateNightPhrase = period1LateNightPhrase
self.__period1Label = period1Label
self.__todayFlag = todayFlag
def entry(self):
return self.__entry
def timeRange(self):
return self.__timeRange
def expireTime(self):
return self.__expireTime
def issueTime(self):
return self.__issueTime
def narrativeDef(self):
return self.__narrativeDef
def period1TimeRange(self):
return self.__period1TimeRange
def period1LateDayPhrase(self):
return self.__period1LateDayPhrase
def period1LateNightPhrase(self):
return self.__period1LateNightPhrase
def period1Label(self):
return self.__period1Label
def todayFlag(self):
return self.__todayFlag