def _getPPData(self, startDatetime, endDatetime, platform, xParm, yParm, pvDict={}, returnIDs=False, sampleFlag=True): ''' Get Parameter-Parameter data regardless if Parameters are 'Sampled' or 'Measured in situ' ''' # Use same query builder that the STOQS UI uses request = HttpRequest request.META = {'dbAlias': self.args.database} pq = PQuery(request) pq.logger.setLevel(logging.ERROR) if self.args.verbose > 2: pq.logger.setLevel(logging.DEBUG) args = () kwargs = { 'time': (startDatetime.strftime('%Y-%m-%d %H:%M:%S'), endDatetime.strftime('%Y-%m-%d %H:%M:%S')), 'platforms': (platform, ), 'parameterparameter': [ Parameter.objects.using(self.args.database).get(name=xParm).id, Parameter.objects.using(self.args.database).get(name=yParm).id ], 'parametervalues': [pvDict] } px, py = kwargs['parameterparameter'] pq.buildPQuerySet(*args, **kwargs) pp = ParameterParameter(request, {'x': px, 'y': py}, None, pq, {}) pp.logger.setLevel(logging.ERROR) if self.args.verbose > 2: pp.logger.setLevel(logging.DEBUG) points = [] try: pp._getXYCData(strideFlag=False, latlonFlag=True, returnIDs=returnIDs, sampleFlag=sampleFlag) except PPDatabaseException, e: if platform or startDatetime or endDatetime: raise NoPPDataException( "No (%s, %s) data from (%s) between %s and %s" % (xParm, yParm, platform, startDatetime, endDatetime)) else: raise NoPPDataException("No (%s, %s) data returned" % (xParm, yParm))
def process_request(self): ''' Default request processing: Apply any query parameters and get fields for the values. Respond with requested format. ''' fields = self.getFields() geomFields = self.getGeomFields() self.assign_qs() if self.stoqs_object_name == 'measured_parameter': # Check if the query contains parametervalue constraints, in which case we need to wrap RawQuerySet in an MPQuerySet pvConstraints = self.parameterValueConstraints() if pvConstraints: mpq = MPQuery(self.request) pq = PQuery(self.request) sql = postgresifySQL(str(self.qs.query)) sql = pq.addParameterValuesSelfJoins( sql, pvConstraints, select_items=MPQuery.rest_select_items) self.qs = MPQuerySet(sql, MPQuerySet.rest_columns) else: self.qs = MPQuerySet(None, MPQuerySet.rest_columns, qs_mp=self.qs) # Process request based on format requested if self.format == 'csv' or self.format == 'tsv': response = HttpResponse() if self.format == 'tsv': response['Content-type'] = 'text/tab-separated-values' response[ 'Content-Disposition'] = 'attachment; filename=%s.tsv' % self.stoqs_object_name writer = csv.writer(response, delimiter='\t') else: response['Content-type'] = 'text/csv' response[ 'Content-Disposition'] = 'attachment; filename=%s.csv' % self.stoqs_object_name writer = csv.writer(response) writer.writerow(fields) for obj in self.qs: writer.writerow([obj[f] for f in fields]) return response elif self.format == 'xml': return HttpResponse(serializers.serialize('xml', self.query_set), 'application/xml') elif self.format == 'json': return HttpResponse( simplejson.dumps(self.qs, cls=encoders.STOQSJSONEncoder), 'application/json') elif self.format == 'kml': kml = KML(self.request, self.qs, self.qparams, self.stoqs_object_name) return kml.kmlResponse() elif self.format == 'kmln': kml = KML(self.request, self.qs, self.qparams, self.stoqs_object_name, withTimeStamps=False, withLineStrings=False, withFullIconURL=False) return kml.kmlResponse() elif self.format == 'count': count = self.qs.count() logger.debug('count = %d', count) return HttpResponse('%d' % count, mimetype='text/plain') elif self.format == 'help': helpText = 'Fields: %s\n\nField Lookups: %s' % (fields, self.fieldLookups) if geomFields: helpText += '\n\nSpatial and distance Lookups that may be appended to: %s\n\n%s\n\n%s' % ( geomFields, self.distanceLookups, self.spatialLookups) helpText += '\n\nResponses: %s' % (self.responses, ) response = HttpResponse(helpText, mimetype="text/plain") return response else: self.build_html_template() response = render_to_response( self.html_tmpl_file, { 'cols': fields, 'google_analytics_code': settings.GOOGLE_ANALYTICS_CODE }, context_instance=RequestContext(self.request)) fh = open(self.html_tmpl_path, 'w') for line in response: fh.write(line) fh.close() return render_to_response(self.html_tmpl_path, {'list': self.qs})
def process_request(self): ''' Default request processing: Apply any query parameters and get fields for the values. Respond with requested format. ''' fields = self.getFields() geomFields = self.getGeomFields() try: self.assign_qs() except EmptyQuerySetException: raise Http404 # A terrible hack to add latitude and longitude columns to the response - must call following assign_qs() fields = self.add_lon_lat_cols() if self.stoqs_object_name == 'measured_parameter': # Check if the query contains parametervalue constraints, in which case we need to wrap RawQuerySet in an MPQuerySet pvConstraints = self.parameterValueConstraints() if pvConstraints: pq = PQuery(self.request) sql = postgresifySQL(str(self.qs.query)) sql = pq.addParameterValuesSelfJoins( sql, pvConstraints, select_items=MPQuery.rest_select_items) self.qs = MPQuerySet(self.request.META['dbAlias'], sql, MPQuerySet.rest_columns) else: self.qs = MPQuerySet(self.request.META['dbAlias'], None, MPQuerySet.rest_columns, qs_mp=self.qs) # Process request based on format requested if self.format == 'csv' or self.format == 'tsv': response = HttpResponse() if self.format == 'tsv': response['Content-type'] = 'text/tab-separated-values' response[ 'Content-Disposition'] = 'attachment; filename=%s.tsv' % self.stoqs_object_name writer = csv.writer(response, delimiter='\t') else: response['Content-type'] = 'text/csv' response[ 'Content-Disposition'] = 'attachment; filename=%s.csv' % self.stoqs_object_name writer = csv.writer(response) writer.writerow(fields) for obj in self.qs: writer.writerow(self.row_of_fields(obj)) return response elif self.format == 'xml': return HttpResponse(serializers.serialize('xml', self.query_set), 'application/xml') elif self.format == 'json': return HttpResponse( json.dumps(self.qs, cls=encoders.STOQSJSONEncoder), 'application/json') elif self.format == 'kml': kml = KML(self.request, self.qs, self.qparams, self.stoqs_object_name) return kml.kmlResponse() elif self.format == 'kmln': kml = KML(self.request, self.qs, self.qparams, self.stoqs_object_name, withTimeStamps=False, withLineStrings=False, withFullIconURL=False) return kml.kmlResponse() elif self.format == 'count': count = self.qs.count() logger.debug('count = %d', count) return HttpResponse('%d' % count, content_type='text/plain') elif self.format == 'help': helpText = 'Fields: %s\n\nField Lookups: %s' % (fields, self.fieldLookups) if geomFields: helpText += '\n\nSpatial and distance Lookups that may be appended to: %s\n\n%s\n\n%s' % ( geomFields, self.distanceLookups, self.spatialLookups) helpText += '\n\nResponses: %s' % (self.responses, ) response = HttpResponse(helpText, content_type="text/plain") return response else: self.build_html_template() try: response = render(self.request, self.html_tmpl_file, context={ 'cols': fields, 'google_analytics_code': settings.GOOGLE_ANALYTICS_CODE }) except AttributeError: response = render(self.request, self.html_tmpl_file, context={'cols': fields}) fh = open(self.html_tmpl_path, 'w') for line in response: # Override Django's default datetime formatting with ISO 8601 format that includes seconds # STOQS model field names ending in 'timevalue' and 'date' are convertable datetimes # See: https://docs.djangoproject.com/en/1.11/ref/templates/builtins/#date line = line.decode("utf-8").replace('timevalue }', 'timevalue|date:"c" }') line = line.replace('date }', 'date|date:"c" }') fh.write(line) fh.close() return render(self.request, self.html_tmpl_path, context={'list': self.qs})