def async_csv_export(job, model, query, display_filters): instance = job.instance if model == 'species': initial_qs = (Species.objects.filter(instance=instance)) extra_select, values = extra_select_and_values_for_model( instance, job, 'treemap_species', 'Species') ordered_fields = values + extra_select.keys() limited_qs = initial_qs.extra(select=extra_select)\ .values(*ordered_fields) else: # model == 'tree' # TODO: if an anonymous job with the given query has been # done since the last update to the audit records table, # just return that job # get the plots for the provided # query and turn them into a tree queryset initial_qs = Filter(query, display_filters, instance)\ .get_objects(Tree) extra_select_tree, values_tree = extra_select_and_values_for_model( instance, job, 'treemap_tree', 'Tree') extra_select_plot, values_plot = extra_select_and_values_for_model( instance, job, 'treemap_mapfeature', 'Plot', prefix='plot') extra_select_sp, values_sp = extra_select_and_values_for_model( instance, job, 'treemap_species', 'Species', prefix='species') if 'plot__geom' in values_plot: values_plot = [f for f in values_plot if f != 'plot__geom'] values_plot += ['plot__geom__x', 'plot__geom__y'] get_ll = 'ST_Transform(treemap_mapfeature.the_geom_webmercator, 4326)' extra_select = { 'plot__geom__x': 'ST_X(%s)' % get_ll, 'plot__geom__y': 'ST_Y(%s)' % get_ll } extra_select.update(extra_select_tree) extra_select.update(extra_select_plot) extra_select.update(extra_select_sp) ordered_fields = (sorted(values_tree) + sorted(values_plot) + sorted(values_sp)) if ordered_fields: limited_qs = initial_qs.extra(select=extra_select)\ .values(*ordered_fields) else: limited_qs = initial_qs.none() if not initial_qs.exists(): job.status = ExportJob.EMPTY_QUERYSET_ERROR # if the initial queryset was not empty but the limited queryset # is empty, it means that there were no fields which the user # was allowed to export. elif not limited_qs.exists(): job.status = ExportJob.MODEL_PERMISSION_ERROR else: csv_file = TemporaryFile() write_csv(limited_qs, csv_file, field_order=ordered_fields) job.complete_with(generate_filename(limited_qs), File(csv_file)) job.save()
def async_csv_export(job, model, query, display_filters): instance = job.instance select = OrderedDict() select_params = [] field_header_map = {} field_serializer_map = {} if model == 'species': initial_qs = (Species.objects. filter(instance=instance)) values = _values_for_model(instance, job, 'treemap_species', 'Species', select, select_params) field_names = values + select.keys() limited_qs = (initial_qs .extra(select=select, select_params=select_params) .values(*field_names)) else: # model == 'tree' # TODO: if an anonymous job with the given query has been # done since the last update to the audit records table, # just return that job # get the plots for the provided # query and turn them into a tree queryset initial_qs = Filter(query, display_filters, instance)\ .get_objects(Plot) tree_fields = _values_for_model( instance, job, 'treemap_tree', 'Tree', select, select_params, prefix='tree') plot_fields = _values_for_model( instance, job, 'treemap_mapfeature', 'Plot', select, select_params) species_fields = _values_for_model( instance, job, 'treemap_species', 'Species', select, select_params, prefix='tree__species') if 'geom' in plot_fields: plot_fields = [f for f in plot_fields if f != 'geom'] plot_fields += ['geom__x', 'geom__y'] if tree_fields: select['tree_present'] = "treemap_tree.id is not null" plot_fields += ['tree_present'] get_ll = 'ST_Transform(treemap_mapfeature.the_geom_webmercator, 4326)' select['geom__x'] = 'ST_X(%s)' % get_ll select['geom__y'] = 'ST_Y(%s)' % get_ll plot_fields += ['updated_by__username'] field_names = set(tree_fields + plot_fields + species_fields) if field_names: field_header_map = _csv_field_header_map(field_names) field_serializer_map = _csv_field_serializer_map(instance, field_names) limited_qs = (initial_qs .extra(select=select, select_params=select_params) .values(*field_header_map.keys())) else: limited_qs = initial_qs.none() if not initial_qs.exists(): job.status = ExportJob.EMPTY_QUERYSET_ERROR # if the initial queryset was not empty but the limited queryset # is empty, it means that there were no fields which the user # was allowed to export. elif not limited_qs.exists(): job.status = ExportJob.MODEL_PERMISSION_ERROR else: csv_file = TemporaryFile() write_csv(limited_qs, csv_file, field_order=field_header_map.keys(), field_header_map=field_header_map, field_serializer_map=field_serializer_map) filename = generate_filename(limited_qs).replace('plot', 'tree') job.complete_with(filename, File(csv_file)) job.save()
def async_csv_export(job, model, query, display_filters): instance = job.instance select = OrderedDict() select_params = [] field_header_map = {} if model == 'species': initial_qs = (Species.objects.filter(instance=instance)) values = _values_for_model(instance, job, 'treemap_species', 'Species', select, select_params) field_names = values + select.keys() limited_qs = (initial_qs.extra( select=select, select_params=select_params).values(*field_names)) else: # model == 'tree' # TODO: if an anonymous job with the given query has been # done since the last update to the audit records table, # just return that job # get the plots for the provided # query and turn them into a tree queryset initial_qs = Filter(query, display_filters, instance)\ .get_objects(Plot) tree_fields = _values_for_model(instance, job, 'treemap_tree', 'Tree', select, select_params, prefix='tree') plot_fields = _values_for_model(instance, job, 'treemap_mapfeature', 'Plot', select, select_params) species_fields = _values_for_model(instance, job, 'treemap_species', 'Species', select, select_params, prefix='tree__species') if 'geom' in plot_fields: plot_fields = [f for f in plot_fields if f != 'geom'] plot_fields += ['geom__x', 'geom__y'] if tree_fields: select['tree_present'] = "treemap_tree.id is not null" plot_fields += ['tree_present'] get_ll = 'ST_Transform(treemap_mapfeature.the_geom_webmercator, 4326)' select['geom__x'] = 'ST_X(%s)' % get_ll select['geom__y'] = 'ST_Y(%s)' % get_ll field_names = set(tree_fields + plot_fields + species_fields) if field_names: field_header_map = _csv_field_header_map(field_names) limited_qs = (initial_qs.extra( select=select, select_params=select_params).values(*field_header_map.keys())) else: limited_qs = initial_qs.none() if not initial_qs.exists(): job.status = ExportJob.EMPTY_QUERYSET_ERROR # if the initial queryset was not empty but the limited queryset # is empty, it means that there were no fields which the user # was allowed to export. elif not limited_qs.exists(): job.status = ExportJob.MODEL_PERMISSION_ERROR else: csv_file = TemporaryFile() write_csv(limited_qs, csv_file, field_order=field_header_map.keys(), field_header_map=field_header_map) filename = generate_filename(limited_qs).replace('plot', 'tree') job.complete_with(filename, File(csv_file)) job.save()
def csv_export(job_pk, model, query, display_filters): job = ExportJob.objects.get(pk=job_pk) instance = job.instance if model == 'species': initial_qs = (Species.objects. filter(instance=instance)) extra_select, values = extra_select_and_values_for_model( instance, job, 'treemap_species', 'species') ordered_fields = values + extra_select.keys() limited_qs = initial_qs.extra(select=extra_select)\ .values(*ordered_fields) else: # model == 'tree' # TODO: if an anonymous job with the given query has been # done since the last update to the audit records table, # just return that job # get the plots for the provided # query and turn them into a tree queryset initial_qs = Filter(query, display_filters, instance)\ .get_objects(Tree) extra_select_tree, values_tree = extra_select_and_values_for_model( instance, job, 'treemap_tree', 'Tree') extra_select_plot, values_plot = extra_select_and_values_for_model( instance, job, 'treemap_mapfeature', 'Plot', prefix='plot') extra_select_sp, values_sp = extra_select_and_values_for_model( instance, job, 'treemap_species', 'Species', prefix='species') if 'plot__geom' in values_plot: values_plot = [f for f in values_plot if f != 'plot__geom'] values_plot += ['plot__geom__x', 'plot__geom__y'] extra_select = {'plot__geom__x': 'ST_X(treemap_mapfeature.the_geom_webmercator)', 'plot__geom__y': 'ST_Y(treemap_mapfeature.the_geom_webmercator)'} extra_select.update(extra_select_tree) extra_select.update(extra_select_plot) extra_select.update(extra_select_sp) ordered_fields = (sorted(values_tree) + sorted(values_plot) + sorted(values_sp)) if ordered_fields: limited_qs = initial_qs.extra(select=extra_select)\ .values(*ordered_fields) else: limited_qs = initial_qs.none() if not initial_qs.exists(): job.status = ExportJob.EMPTY_QUERYSET_ERROR # if the initial queryset was not empty but the limited queryset # is empty, it means that there were no fields which the user # was allowed to export. elif not limited_qs.exists(): job.status = ExportJob.MODEL_PERMISSION_ERROR else: csv_file = TemporaryFile() write_csv(limited_qs, csv_file, field_order=ordered_fields) csv_name = generate_filename(limited_qs) job.outfile.save(csv_name, File(csv_file)) job.status = ExportJob.COMPLETE job.save()
def async_csv_export(job, model, query, display_filters): instance = job.instance select = OrderedDict() select_params = [] if model == "species": initial_qs = Species.objects.filter(instance=instance) values = values_for_model(instance, job, "treemap_species", "Species", select, select_params) ordered_fields = values + select.keys() limited_qs = initial_qs.extra(select=select, select_params=select_params).values(*ordered_fields) else: # model == 'tree' # TODO: if an anonymous job with the given query has been # done since the last update to the audit records table, # just return that job # get the plots for the provided # query and turn them into a tree queryset initial_qs = Filter(query, display_filters, instance).get_objects(Tree) values_tree = values_for_model(instance, job, "treemap_tree", "Tree", select, select_params) values_plot = values_for_model( instance, job, "treemap_mapfeature", "Plot", select, select_params, prefix="plot" ) values_sp = values_for_model( instance, job, "treemap_species", "Species", select, select_params, prefix="species" ) if "plot__geom" in values_plot: values_plot = [f for f in values_plot if f != "plot__geom"] values_plot += ["plot__geom__x", "plot__geom__y"] get_ll = "ST_Transform(treemap_mapfeature.the_geom_webmercator, 4326)" select["plot__geom__x"] = "ST_X(%s)" % get_ll select["plot__geom__y"] = "ST_Y(%s)" % get_ll ordered_fields = sorted(values_tree) + sorted(values_plot) + sorted(values_sp) if ordered_fields: limited_qs = initial_qs.extra(select=select, select_params=select_params).values(*ordered_fields) else: limited_qs = initial_qs.none() if not initial_qs.exists(): job.status = ExportJob.EMPTY_QUERYSET_ERROR # if the initial queryset was not empty but the limited queryset # is empty, it means that there were no fields which the user # was allowed to export. elif not limited_qs.exists(): job.status = ExportJob.MODEL_PERMISSION_ERROR else: csv_file = TemporaryFile() write_csv(limited_qs, csv_file, field_order=ordered_fields) job.complete_with(generate_filename(limited_qs), File(csv_file)) job.save()