Ejemplo n.º 1
0
    def create_get_variable_info_response(self, varArg=None):

        if (varArg == None or varArg == ''):
            variableResultArr = self.dao.get_all_variables()
        else:
            varCodesArr = varArg.split(',')
            varCodesArr = [self.get_variable_code(v)
                           for v in varCodesArr]
            variableResultArr = self.dao.get_variables_by_codes(varCodesArr)

        variableInfoResponse = WaterML.VariablesResponseType()

        # TODO: Should queryInfo be in thois response?  Suds doesn't
        # like when it is.  If it should be in the response, then the
        # WSDL needs to be updated

        queryInfo = WaterML.QueryInfoType()
        criteria = WaterML.criteriaType(MethodCalled='GetVariableInfo')
        if varArg is not None:
            pType_var = WaterML.parameterType(name='variable',value=varArg)
            criteria.add_parameter(pType_var)
        queryInfo.set_criteria(criteria)
        queryInfoNote = WaterML.NoteType('Web Service')
        queryInfo.add_note(queryInfoNote)
        #queryInfo.set_extension('')
        variableInfoResponse.set_queryInfo(queryInfo)

        variables = WaterML.variablesType()
        for variableResult in variableResultArr:
            v = self.create_variable_element(variableResult)
            variables.add_variable(v)
        variableInfoResponse.set_variables(variables)
        return variableInfoResponse
Ejemplo n.º 2
0
    def create_get_site_response(self, siteArg=None):
        if siteArg == None or siteArg == '':
            siteResultArr = self.dao.get_all_sites()
        else:
            siteCodesArr = siteArg.split(',')
            siteCodesArr = [self.get_site_code(s)
                            for s in siteCodesArr]
            siteResultArr = self.dao.get_sites_by_codes(siteCodesArr)

        #if len(siteResultArr) == 0:
        #    return None

        siteInfoResponse = WaterML.SiteInfoResponseType()

        queryInfo = WaterML.QueryInfoType(creationTime=datetime.datetime.now())
        #TODO: check on how this should be done for multiple sites
        pType = WaterML.parameterType(name='site',value=siteArg)
        criteria = WaterML.criteriaType(MethodCalled='GetSites')
        criteria.add_parameter(pType)
        queryInfo.set_criteria(criteria)
        #queryInfoNote = WaterML.NoteType()
        #queryInfo.add_note(queryInfoNote)
        #queryInfo.set_extension('')
        siteInfoResponse.set_queryInfo(queryInfo)

        if siteResultArr:
            for siteResult in siteResultArr:
                s = self.create_site_element(siteResult)
                siteInfoResponse.add_site(s)
        else:
            #site = WaterML.site()
            #siteInfoResponse.add_site(site)
            raise Exception("Site,'%s', Not Found" % siteArg)

        return siteInfoResponse
Ejemplo n.º 3
0
    def create_get_site_info_multiple_response(self, siteArg):
        siteCodesArr = siteArg.split(',')
        siteCodesArr = [self.get_site_code(s)
                        for s in siteCodesArr]

        siteInfoResponse = WaterML.SiteInfoResponseType()

        queryInfo = WaterML.QueryInfoType(creationTime=datetime.datetime.now())
        criteria = WaterML.criteriaType(MethodCalled='GetSiteInfo')
        pType_site = WaterML.parameterType(name='site',value=siteArg)
        criteria.add_parameter(pType_site)
        queryInfo.set_criteria(criteria)
        #queryInfoNote = WaterML.NoteType()
        #queryInfo.add_note(queryInfoNote)
        #queryInfo.set_extension('')
        siteInfoResponse.set_queryInfo(queryInfo)

        for siteArg in siteCodesArr:
            siteCode = self.get_site_code(siteArg)
            siteResult = self.dao.get_site_by_code(siteCode)
            seriesResultArr = self.dao.get_series_by_sitecode(siteCode)

            #if len(seriesResultArr) == 0:
            #    return None
            s = self.create_site_element(siteResult, seriesResultArr)
            siteInfoResponse.add_site(s)

        return siteInfoResponse
Ejemplo n.º 4
0
    def create_get_site_info_response(self, siteArg, varArg=None):
        siteCode = self.get_site_code(siteArg)
        siteResult = self.dao.get_site_by_code(siteCode)

        if (varArg == None or varArg == ''):
            seriesResultArr = self.dao.get_series_by_sitecode(siteCode)
        else:
            varCode = self.get_variable_code(varArg)
            seriesResultArr = self.dao.get_series_by_sitecode_and_varcode(
                siteCode, varCode)

        #if len(seriesResultArr) == 0:
        #    return None

        siteInfoResponse = WaterML.SiteInfoResponseType()

        queryInfo = WaterML.QueryInfoType(creationTime=datetime.datetime.now())
        criteria = WaterML.criteriaType(MethodCalled='GetSiteInfo')
        pType_site = WaterML.parameterType(name='site',value=siteArg)
        criteria.add_parameter(pType_site)
        if varArg is not None:
            pType_var = WaterML.parameterType(name='variable',value=varArg)
            criteria.add_parameter(pType_var)
        queryInfo.set_criteria(criteria)
        #queryInfoNote = WaterML.NoteType()
        #queryInfo.add_note(queryInfoNote)
        #queryInfo.set_extension('')
        siteInfoResponse.set_queryInfo(queryInfo)

        s = self.create_site_element(siteResult, seriesResultArr)
        siteInfoResponse.add_site(s)

        return siteInfoResponse
Ejemplo n.º 5
0
    def create_variable_element(self, variableResult):
        variable = WaterML.VariableInfoType(
            variableName=variableResult.VariableName,
            valueType=variableResult.ValueType,
            dataType=variableResult.DataType,
            generalCategory=variableResult.GeneralCategory,
            sampleMedium=variableResult.SampleMedium,
            noDataValue=variableResult.NoDataValue,
            variableDescription=variableResult.VariableDescription,
            speciation=variableResult.Speciation)

        #For specimen data
        v_code = variableResult.VariableCode
        v_code_i = v_code.find('::')
        if v_code_i != -1:
            v_code = v_code[0:v_code_i]

        variableCode = WaterML.variableCodeType()
        variableCode.vocabulary = self.vocabulary
        #TODO: What is this, should it always be true?
        variableCode.default = "true"
        variableCode.variableID = variableResult.VariableID
        variableCode.valueOf_ = v_code

        variable.add_variableCode(variableCode)

        if variableResult.VariableUnits:
            units = WaterML.UnitsType(
                unitAbbreviation=variableResult.VariableUnits.UnitsAbbreviation,
                unitCode=variableResult.VariableUnitsID,
                unitType=variableResult.VariableUnits.UnitsType,
                unitName=variableResult.VariableUnits.UnitsName)

            variable.set_unit(units)

        timeSupport = WaterML.timeScaleType()
        timeSupport.isRegular = variableResult.IsRegular

        if variableResult.TimeUnits:
            timeUnits = WaterML.UnitsType(
                unitID=variableResult.TimeUnits.UnitsID,
                unitName=variableResult.TimeUnits.UnitsName,
                unitDescription=variableResult.TimeUnits.UnitsName,
                unitType=variableResult.TimeUnits.UnitsType,
                unitAbbreviation=variableResult.TimeUnits.UnitsAbbreviation)

            timeSupport.set_unit(timeUnits)

        # TODO: time interval is not the same as time support.
        # Time interval refers to a spacing between values for regular data,
        # which isn't stored in ODM.
        if variableResult.TimeSupport:
            # integer in WaterML 1.0
            timeSupport.timeSupport = float(variableResult.TimeSupport)
        variable.set_timeScale(timeSupport)
        return variable
Ejemplo n.º 6
0
    def create_series_element(self, seriesResult):
        series = WaterML.seriesType()

        #Variable
        variable = self.create_variable_element(seriesResult.Variable)
        series.set_variable(variable)

        series.valueCount = WaterML.valueCountType(
            valueOf_=str(seriesResult.ValueCount))

        beginDateTime = core._get_datavalues_datetime(
            seriesResult, "BeginDateTime", "BeginDateTimeUTC")
        endDateTime = core._get_datavalues_datetime(
            seriesResult, "EndDateTime", "EndDateTimeUTC")
        # WML1_1 wants a datetime, no zone. breaks the conversion
        try:
            beginDateTime =  dateutil.parser.parse(beginDateTime)
            endDateTime =  dateutil.parser.parse(endDateTime)
        except Exception as inst:
              logging.error('bad datetime conversion')

        #TimeInterval
        if beginDateTime is None:
            beginDateTime = datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S")
        if endDateTime is None:
            endDateTime = datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S")

        variableTimeInt = WaterML.TimeIntervalType(
            beginDateTime=beginDateTime,
            endDateTime=endDateTime)
        series.variableTimeInterval = variableTimeInt

        #Method
        if seriesResult.Method:
            method = self.create_method_element(seriesResult.Method)
            series.Method = method

        #Source
        if seriesResult.Source:
            source = self.create_source_element(seriesResult.Source)
            series.Source = source

        #QualityControlLevel
        qualityControlLevel = WaterML.QualityControlLevelType(
                    qualityControlLevelID=seriesResult.QualityControlLevelID,
                    qualityControlLevelCode=seriesResult.QualityControlLevelCode,
                    definition=seriesResult.Definition,
                    explanation=seriesResult.Explanation)

        series.QualityControlLevel = qualityControlLevel

        return series
Ejemplo n.º 7
0
    def create_get_values_response(self, siteArg, varArg, startDateTime=None,
                                   endDateTime=None):

        #TODO: Tim thinks the DAO should handle network and vocab parsing,
        #      not WOF
        siteCode = self.get_site_code(siteArg)
        varCode = self.get_variable_code(varArg)

        valueResultArr = self.dao.get_datavalues(siteCode, varCode,
                                                 startDateTime, endDateTime)
        #if not valueResultArr:
        #    raise Exception("ERROR: No data found for %s:%s for dates %s - %s" % (
        #        siteCode, varCode, startDateTime, endDateTime))

        timeSeriesResponse = WaterML.TimeSeriesResponseType()

        queryInfo = WaterML.QueryInfoType(creationTime=datetime.datetime.now())
        criteria = WaterML.criteriaType(MethodCalled='GetValues')
        pType_site = WaterML.parameterType(name='site',value=siteArg)
        criteria.add_parameter(pType_site)
        pType_var = WaterML.parameterType(name='variable',value=varArg)
        criteria.add_parameter(pType_var)
        if startDateTime is not None:
            pType_sdate = WaterML.parameterType(name='startDate',value=startDateTime)
            criteria.add_parameter(pType_sdate)
        if endDateTime is not None:
            pType_edate = WaterML.parameterType(name='endDate',value=endDateTime)
            criteria.add_parameter(pType_edate)
        queryInfo.set_criteria(criteria)
        #queryInfoNote = WaterML.NoteType()
        #queryInfo.add_note(queryInfoNote)
        #queryInfo.set_extension('')
        timeSeriesResponse.set_queryInfo(queryInfo)

        #if not valueResultArr:
        #    timeSeries = WaterML.TimeSeriesType()
        #    timeSeriesResponse.add_timeSeries(timeSeries)
        #    return timeSeriesResponse

        if not valueResultArr:
            raise Exception("Values Not Found for %s:%s for dates %s - %s" % (
                siteCode, varCode, startDateTime, endDateTime))

        if isinstance(valueResultArr,dict):
            for key in valueResultArr.keys():
                timeSeries = self.create_timeseries(siteCode,key,valueResultArr[key])
                timeSeriesResponse.add_timeSeries(timeSeries)
        else:
            timeSeries = self.create_timeseries(siteCode,varCode,valueResultArr)
            timeSeriesResponse.add_timeSeries(timeSeries)
        return timeSeriesResponse
Ejemplo n.º 8
0
    def create_site_info_element(self, siteResult):
        siteInfo = WaterML.SiteInfoType()
        siteInfo.set_siteName(siteResult.SiteName)

        #TODO: agencyName
        siteCode = WaterML.siteCodeType(network=self.network,
                                    siteID=siteResult.SiteID,
                                    valueOf_=siteResult.SiteCode
                                    )

        siteInfo.add_siteCode(siteCode)

        # TODO: Maybe remove this?  None of the other WOF services
        # return this info probably because it is not that useful
        #timeZoneInfo = WaterML.timeZoneInfoType(siteUsesDaylightSavingsTime=False,
        #                                    daylightSavingsTimeZone=None)
        #timeZoneInfo.defaultTimeZone = WaterML.defaultTimeZoneType(
        #    zoneOffset=self.timezone,
        #    zoneAbbreviation=self.timezone_abbr)

        #siteInfo.set_timeZoneInfo(timeZoneInfo)
        geoLocation = WaterML.geoLocationType()
        geogLocation = WaterML.LatLonPointType(
            srs="EPSG:{0}".format(siteResult.LatLongDatum.SRSID),
            latitude=siteResult.Latitude,
            longitude=siteResult.Longitude)
        geoLocation.set_geogLocation(geogLocation)

        if (siteResult.LocalX and siteResult.LocalY):
            localSiteXY = WaterML.localSiteXYType()
            localSiteXY.projectionInformation = \
                                        siteResult.LocalProjection.SRSName
            localSiteXY.X = siteResult.LocalX
            localSiteXY.Y = siteResult.LocalY
            geoLocation.add_localSiteXY(localSiteXY)

        siteInfo.set_geoLocation(geoLocation)
        siteInfo.set_verticalDatum(siteResult.VerticalDatum)

        # need at least one extension element to meet WaterML 1.0
        # schema validation

        #siteInfo.set_extension('')

        # need at least one altname element to meet WaterML 1.0 schema
        # validation
        #siteInfo.set_altname('')
        return siteInfo
Ejemplo n.º 9
0
    def create_site_element(self, siteResult, seriesResultArr=None, IncludeSeries=True):
        site = WaterML.siteType()
        siteInfo = self.create_site_info_element(siteResult)

        site.set_siteInfo(siteInfo)

        #need at least one note element to meet WaterML 1.0 schema validation
        if (not siteResult.County
            and not siteResult.State
            and not siteResult.Comments):

            siteInfo.add_note(WaterML.PropertyType())
        else:
            if siteResult.County:
                countyNote = WaterML.PropertyType(name="County",
                                              valueOf_=siteResult.County)
                siteInfo.add_siteProperty(countyNote)

            if siteResult.State:
                stateNote = WaterML.PropertyType(name="State",
                                             valueOf_=siteResult.State)
                siteInfo.add_siteProperty(stateNote)

            if siteResult.Comments:
                commentsNote = WaterML.PropertyType(
                    name="Site Comments",
                    valueOf_=escape(siteResult.Comments))
                siteInfo.add_siteProperty(commentsNote)

        if IncludeSeries:
            seriesCatalog = WaterML.seriesCatalogType()
            if seriesResultArr is not None:
                seriesCatalog.menuGroupName = self.menu_group_name
                #TODO: Make sure this is set properly in config fileame
                seriesCatalog.serviceWsdl = self.service_wsdl

                for seriesResult in seriesResultArr:
                    series = self.create_series_element(seriesResult)
                    seriesCatalog.add_series(series)

            site.add_seriesCatalog(seriesCatalog)

        # need at least one extension element to meet WaterML 1.0
        # schema validation
        #site.set_extension('')
        return site
Ejemplo n.º 10
0
    def create_get_values_site_response(self, site,
                                        startDateTime,
                                        endDateTime):

        timeSeriesResponse = WaterML.TimeSeriesResponseType()
        queryInfo = WaterML.QueryInfoType(creationTime=datetime.datetime.now())
        criteria = WaterML.criteriaType(MethodCalled='GetValuesForASite')
        pType_site = WaterML.parameterType(name='site',value=site)
        criteria.add_parameter(pType_site)
        if startDateTime is not None:
            pType_sdate = WaterML.parameterType(name='startDate',value=startDateTime)
            criteria.add_parameter(pType_sdate)
        if endDateTime is not None:
            pType_edate = WaterML.parameterType(name='endDate',value=endDateTime)
            criteria.add_parameter(pType_edate)
        queryInfo.set_criteria(criteria)
        #queryInfoNote = WaterML.NoteType()
        #queryInfo.add_note(queryInfoNote)
        #queryInfo.set_extension('')
        timeSeriesResponse.set_queryInfo(queryInfo)

        siteCode = self.get_site_code(site)
        seriesResultArr = self.dao.get_series_by_sitecode(siteCode)
        if seriesResultArr:
            for seriesResult in seriesResultArr:
                valueResultArr = self.dao.get_datavalues(siteCode,
                                                         seriesResult.Variable.VariableCode,
                                                         startDateTime,
                                                         endDateTime)
                #if not valueResultArr:
                #    raise Exception("ERROR: No data found for %s for dates %s - %s" % (
                #                    site, startDateTime, endDateTime))
                if not valueResultArr:
                    continue

                timeSeries = self.create_timeseries(siteCode,
                                                    seriesResult.Variable.VariableCode,
                                                    valueResultArr)
                timeSeriesResponse.add_timeSeries(timeSeries)

        return timeSeriesResponse
Ejemplo n.º 11
0
    def create_get_site_box_response(self, west,south,east,north,IncludeSeries):

        IncludeSeries = self.to_bool(IncludeSeries)
        siteResultArr = self.dao.get_sites_by_box(west,south,east,north)

        siteInfoResponse = WaterML.SiteInfoResponseType()

        queryInfo = WaterML.QueryInfoType(creationTime=datetime.datetime.now())
        criteria = WaterML.criteriaType(MethodCalled='GetSitesByBox')
        pType_west = WaterML.parameterType(name='west',value=west)
        pType_west = WaterML.parameterType(name='south',value=south)
        pType_west = WaterML.parameterType(name='east',value=east)
        pType_west = WaterML.parameterType(name='north',value=north)
        pType_west = WaterML.parameterType(name='IncludeSeries',value=IncludeSeries)
        criteria.add_parameter(pType_west)
        queryInfo.set_criteria(criteria)
        #queryInfoNote = WaterML.NoteType()
        #queryInfo.add_note(queryInfoNote)
        #queryInfo.set_extension('')
        siteInfoResponse.set_queryInfo(queryInfo)

        for siteResult in siteResultArr:
            seriesResultArr = None
            if IncludeSeries:
                seriesResultArr = self.dao.get_series_by_sitecode(siteResult.SiteCode)

            #if len(seriesResultArr) == 0:
            #    return None
            s = self.create_site_element(siteResult,seriesResultArr,IncludeSeries)
            siteInfoResponse.add_site(s)

        return siteInfoResponse