def import_gmf_scenario(fileobj, user=None): """ Parse the file with the GMF fields and import it into the table gmf_scenario. It also creates a new output record, unrelated to a job. Works both with XML files and tab-separated files with format (imt, gmvs, location). :returns: the generated :class:`openquake.engine.db.models.Output` object and the generated :class:`openquake.engine.db.models.HazardCalculation` object. """ fname = fileobj.name owner = models.OqUser.objects.get(user_name=user) \ if user else get_current_user() hc = models.HazardCalculation.objects.create( owner=owner, base_path=os.path.dirname(fname), description='Scenario importer, file %s' % os.path.basename(fname), calculation_mode='scenario', maximum_distance=100) # XXX: probably the maximum_distance should be entered by the user out = models.Output.objects.create( owner=owner, display_name='Imported from %r' % fname, output_type='gmf_scenario') gmf_coll = models.Gmf.objects.create(output=out) rows = [] if fname.endswith('.xml'): # convert the XML into a tab-separated StringIO for imt, gmvs, loc in GMFScenarioParser(fileobj).parse(): imt_type, sa_period, sa_damping = models.parse_imt(imt) sa_period = '\N' if sa_period is None else str(sa_period) sa_damping = '\N' if sa_damping is None else str(sa_damping) gmvs = '{%s}' % str(gmvs)[1:-1] rows.append([imt_type, sa_period, sa_damping, gmvs, loc]) else: # assume a tab-separated file for line in fileobj: rows.append(line.split('\t')) import_rows(hc, gmf_coll, rows) return out, hc
def import_hazard_curves(fileobj, user=None): """ Parse the file with the hazard curves and import it into the tables hazard_curve and hazard_curve_data. It also creates a new output record, unrelated to a job. :param fileobj: a file-like object associated to an XML file :returns: the generated :class:`openquake.engine.db.models.Output` object and the generated :class:`openquake.engine.db.models.HazardCalculation` object. """ fname = fileobj.name curs = connections['reslt_writer'].cursor().cursor.cursor # DB API cursor owner = models.OqUser.objects.get(user_name=user) \ if user else get_current_user() hc = models.HazardCalculation.objects.create( owner=owner, base_path=os.path.dirname(fname), description='HazardCurve importer, file %s' % os.path.basename(fname), calculation_mode='classical', maximum_distance=100) # XXX: what about the maximum_distance? out = models.Output.objects.create( owner=owner, display_name='Imported from %r' % fname, output_type='hazard_curve') f = StringIO() # convert the XML into a tab-separated StringIO hazcurve = HazardCurveParser(fileobj).parse() haz_curve = models.HazardCurve.objects.create( investigation_time=hazcurve.investigation_time, imt=hazcurve.imt, imls=hazcurve.imls, quantile=hazcurve.quantile_value, statistics=hazcurve.statistics, sa_damping=hazcurve.sa_damping, sa_period=hazcurve.sa_period, output=out) hazard_curve_id = str(haz_curve.id) for node in hazcurve: loc = node.location poes = node.poes poes = '{%s}' % str(poes)[1:-1] print >> f, '\t'.join([hazard_curve_id, poes, 'SRID=4326;POINT(%s %s)' % (loc.x, loc.y)]) f.reset() ## import the file-like object with a COPY FROM try: curs.copy_expert( 'copy hzrdr.hazard_curve_data (hazard_curve_id, poes, location) ' 'from stdin', f) except: curs.connection.rollback() raise else: curs.connection.commit() finally: f.close() return out, hc