@@ -16,13 +16,15 @@ def export_series_data(self, series_id, filename, utc=False, site=False, var=Fal
1616 if series is None :
1717 return False
1818
19- writer = csv .writer (open (filename , 'wb' ))
20- plainWriter = open (filename , 'w' )
2119 print "filename: "
2220 print filename
23- self .write_data_header (plainWriter , series , utc , site , var , offset , qual , src , qcl )
21+ plainWriter = open (filename , 'w' )
22+ self .write_text_header (plainWriter , series , utc , site , var , offset , qual , src , qcl )
23+ plainWriter .close ()
24+ writer = csv .writer (open (filename , 'a' ))
25+ self .write_data_header (writer , utc , site , var , offset , qual , src , qcl )
2426 # for dv in series.data_values:
25- # self.write_data_row(writer, series, dv, utc, site, var, offset, qual, src, qcl)
27+ # self.write_data_row(writer, series, dv, utc, site, var, offset, qual, src, qcl)
2628
2729 def export_data (self , series_ids , filename ):
2830 if series_ids is None :
@@ -37,12 +39,132 @@ def export_data(self, series_ids, filename):
3739 if file_exists :
3840 pass
3941
40- def write_data_header (self , plainWriter , series , utc , site , var , offset , qual , src , qcl ):
42+ def write_data_header (self , writer , utc , site , var , offset , qual , src , qcl ):
43+ # Build header list
44+ header = []
45+ header .append ("SeriesId" )
46+ header .append ("ValueId" )
47+ header .append ("DataValue" )
48+ header .append ("ValueAccuracy" )
49+ header .append ("LocalDateTime" )
50+ if utc :
51+ header .append ("UTCOffset" )
52+ header .append ("DateTimeUTC" )
53+ header .append ("SiteCode" )
54+ if site :
55+ header .append ("SiteName" )
56+ header .append ("SiteType" )
57+ header .append ("Latitude" )
58+ header .append ("Longitude" )
59+ header .append ("SRSName" )
60+ header .append ("VariableCode" )
61+ if var :
62+ header .append ("VariableName" )
63+ header .append ("Speciation" )
64+ header .append ("VariableUnitsName" )
65+ header .append ("VariableUnitsAbbreviation" )
66+ header .append ("SampleMedium" )
67+ header .append ("OffsetValue" )
68+ header .append ("OffsetTypeID" )
69+ if offset :
70+ header .append ("OffsetDescription" )
71+ header .append ("OffsetUnitsName" )
72+ header .append ("CensorCode" )
73+ header .append ("QualifierID" )
74+ if qual :
75+ header .append ("QualifierCode" )
76+ header .append ("QualifierDescription" )
77+ if src :
78+ header .append ("Organization" )
79+ header .append ("SourceDescription" )
80+ header .append ("Citation" )
81+ if qcl :
82+ header .append ("QualityControlLevelCode" )
83+ header .append ("Definition" )
84+ header .append ("Explanation" )
85+ header .append ("SampleID" )
86+
87+ writer .writerow (header )
88+
89+ def write_data_row (self , writer , series , dv , utc , site , var , offset , qual , src , qcl ):
90+ data = []
91+ data .append (series .id )
92+ data .append (dv .id )
93+ data .append (dv .data_value )
94+ data .append (dv .value_accuracy )
95+ data .append (dv .local_date_time )
96+ if utc :
97+ data .append (dv .utc_offset )
98+ data .append (dv .date_time_utc )
99+ data .append (series .site_code )
100+ if site :
101+ data .append (series .site_name )
102+ data .append (series .site .type )
103+ data .append (series .site .latitude )
104+ data .append (series .site .longitude )
105+ data .append (series .site .spatial_ref .srs_name )
106+ data .append (series .variable_code )
107+ if var :
108+ data .append (series .variable_name )
109+ data .append (series .speciation )
110+ data .append (series .variable_units_name )
111+ data .append (series .variable .variable_unit .abbreviation )
112+ data .append (series .sample_medium )
113+ data .append (dv .offset_value )
114+ data .append (dv .offset_type_id )
115+ if offset :
116+ if dv .offset_type is not None :
117+ data .append (dv .offset_type .description )
118+ data .append (dv .offset_type .unit .name )
119+ else :
120+ data .append ('' )
121+ data .append ('' )
122+ data .append (dv .censor_code )
123+ data .append (dv .qualifier_id )
124+ if qual :
125+ if dv .qualifier is not None :
126+ data .append (dv .qualifier .code )
127+ data .append (dv .qualifier .description )
128+ else :
129+ data .append ('' )
130+ data .append ('' )
131+ if src :
132+ data .append (series .organization )
133+ data .append (series .source_description )
134+ data .append (series .citation )
135+ if qcl :
136+ data .append (series .quality_control_level_code )
137+ data .append (series .quality_control_level .definition )
138+ data .append (series .quality_control_level .explanation )
139+ data .append (dv .sample_id )
140+
141+ writer .writerow (data )
142+
143+ def write_text_header (self , plainWriter , series , utc , site , var , offset , qual , src , qcl ):
41144 self .write_warning_header (plainWriter )
42145 self .write_site_information (plainWriter , series , site )
43146 self .write_variable_and_method_information (plainWriter , series )
147+ self .write_source_information (plainWriter , series )
148+ self .write_qualifier_information (plainWriter , series )
44149
45150
151+ def write_warning_header (self , plainWriter ):
152+ plainWriter .write (
153+ '# ------------------------------------------------------------------------------------------\n ' )
154+ plainWriter .write ('# WARNING: The data are released on the condition that neither iUTAH nor any of its \n ' )
155+ plainWriter .write ('# participants may be held liable for any damages resulting from their use. The following \n ' )
156+ plainWriter .write ('# metadata describe the data in this file:\n ' )
157+ plainWriter .write (
158+ '# ------------------------------------------------------------------------------------------\n ' )
159+ plainWriter .write ('#\n ' )
160+ plainWriter .write ('# Quality Control Level Information\n ' )
161+ plainWriter .write ('# -----------------------------------------------\n ' )
162+ plainWriter .write ('# These data have passed QA/QC procedures such as sensor calibration and\n ' )
163+ plainWriter .write ('# visual inspection and removal of obvious errors. These data are approved\n ' )
164+ plainWriter .write ('# by Technicians as the best available version of the data. See published\n ' )
165+ plainWriter .write ('# script for correction steps specific to this data series.\n ' )
166+ plainWriter .write ('#\n ' )
167+
46168 def write_site_information (self , plainWriter , series , site ):
47169 plainWriter .write ('# Site Information\n ' )
48170 plainWriter .write ('# ----------------------------------\n ' )
@@ -65,21 +187,59 @@ def write_variable_and_method_information(self, plainWriter, series):
65187 plainWriter .write ('# Variable and Method Information\n ' )
66188 plainWriter .write ('# ----------------------------------\n ' )
67189 plainWriter .write ('# VariableCode: ' + str (series .VariableObj .VariableCode ) + '\n ' )
68- plainWriter .write ('# VariableName: ' + str (series .VariableObj .VariableName ) + '\n ' )
190+ plainWriter .write ('# VariableName: ' + str (series .VariableObj .VariableNameCV ) + '\n ' )
191+ plainWriter .write ('# ValueType: ' + 'TBD' + '\n ' )
192+ plainWriter .write ('# DataType: ' + 'TBD' + '\n ' )
193+ plainWriter .write ('# GeneralCategory: ' + 'TBD' + '\n ' )
194+ plainWriter .write ('# SampleMedium: ' + 'TBD' + '\n ' )
195+ plainWriter .write ('# VariableUnitsName: ' + str (series .UnitsObj .UnitsName ) + '\n ' )
196+ plainWriter .write ('# VariableUnitsType: ' + str (series .UnitsObj .UnitsTypeCV ) + '\n ' )
197+ plainWriter .write ('# VariableUnitsAbbreviation: ' + str (series .UnitsObj .UnitsAbbreviation ) + '\n ' )
198+ plainWriter .write ('# NoDataValue: ' + str (series .VariableObj .NoDataValue ) + '\n ' )
199+ plainWriter .write ('# TimeSupport: ' + 'TBD' + '\n ' )
200+ plainWriter .write ('# TimeSupportUnitsAbbreviation: ' + 'TBD' + '\n ' )
201+ plainWriter .write ('# TimeSupportUnitsType: ' + 'TBD' + '\n ' )
202+ plainWriter .write ('# TimeSupportUnitsName: ' + 'TBD' + '\n ' )
203+ plainWriter .write ('# MethodDescription: ' +
204+ str (series .FeatureActionObj .ActionObj .MethodObj .MethodDescription ) + '\n ' )
205+ plainWriter .write ('# MethodLink: ' +
206+ str (series .FeatureActionObj .ActionObj .MethodObj .MethodLink ) + '\n ' )
207+ plainWriter .write ('#\n ' )
208+
209+ def write_source_information (self , plainWriter , series ):
210+ plainWriter .write ('# Source Information\n ' )
211+ plainWriter .write ('# ----------------------------------\n ' )
212+ if (series .FeatureActionObj .ActionObj .MethodObj .OrganizationObj != None ):
213+ plainWriter .write ('# Organization: ' +
214+ str (series .FeatureActionObj .ActionObj .MethodObj .OrganizationObj .OrganizationName ) + '\n ' )
215+ plainWriter .write ('# SourceDescription: ' +
216+ str (series .FeatureActionObj .ActionObj .MethodObj .OrganizationObj .OrganizationDescription ) +
217+ '\n ' )
218+ plainWriter .write ('# SourceLink: ' +
219+ str (series .FeatureActionObj .ActionObj .MethodObj .OrganizationObj .OrganizationLink ) + '\n ' )
220+ plainWriter .write ('# ContactName: ' +
221+ str (series .FeatureActionObj .ActionObj .MethodObj .OrganizationObj .
222+ AffiliationObj .PersonObj .PersonFirstName ) + ' ' + (
223+ series .FeatureActionObj .ActionObj .MethodObj .OrganizationObj .
224+ AffiliationObj .PersonObj .PersonLastName
225+ ) + '\n ' )
226+ plainWriter .write ('# SourceLink: ' +
227+ str (series .FeatureActionObj .ActionObj .MethodObj .OrganizationObj .AffiliationObj .PrimaryPhone ) + '\n ' )
228+ plainWriter .write ('# SourceLink: ' +
229+ str (
230+ series .FeatureActionObj .ActionObj .MethodObj .OrganizationObj .AffiliationObj .PrimaryEmail ) + '\n ' )
231+ plainWriter .write ('# Citation: ' + 'TBD' + '\n ' )
69232
70- def write_warning_header (self , plainWriter ):
71- plainWriter .write (
72- '# ------------------------------------------------------------------------------------------\n ' )
73- plainWriter .write ('# WARNING: The data are released on the condition that neither iUTAH nor any of its \n ' )
74- plainWriter .write ('# participants may be held liable for any damages resulting from their use. The following \n ' )
75- plainWriter .write ('# metadata describe the data in this file:\n ' )
76- plainWriter .write (
77- '# ------------------------------------------------------------------------------------------\n ' )
78233 plainWriter .write ('#\n ' )
79- plainWriter .write ('# Quality Control Level Information\n ' )
80- plainWriter .write ('# -----------------------------------------------\n ' )
81- plainWriter .write ('# These data have passed QA/QC procedures such as sensor calibration and\n ' )
82- plainWriter .write ('# visual inspection and removal of obvious errors. These data are approved\n ' )
83- plainWriter .write ('# by Technicians as the best available version of the data. See published\n ' )
84- plainWriter .write ('# script for correction steps specific to this data series.\n ' )
85- plainWriter .write ('#\n ' )
234+
235+ def write_qualifier_information (self , plainWriter , series ):
236+ plainWriter .write ('# Qualifier Information\n ' )
237+ plainWriter .write ('# ----------------------------------\n ' )
238+ plainWriter .write ('# Code Description\n ' )
239+ plainWriter .write ('# LI Linear Interpolation\n ' )
240+ plainWriter .write ('# SM Sensor Malfunction\n ' )
241+ plainWriter .write ('# PF Power Failure\n ' )
242+ plainWriter .write ('# S Suspicious Values\n ' )
243+ plainWriter .write ('# MNT Erroneous or missing data due to maintenance\n ' )
244+ plainWriter .write ('#\n ' )
245+ plainWriter .write ('#\n ' )
0 commit comments