def get_temp_csv(elem): temp = tempfile.NamedTemporaryFile() format_csv(elem.get_rows(), elem.get_column_names(), '', file=temp) # this isn't that nice, but closing temp would delete it # and we need to make sure the file has been written to: temp.flush() return temp
def export_csv(request, formdef_id): xsd = get_object_or_404( FormDefModel, pk=formdef_id) root = xsd.element if ElementDefModel.objects.filter(parent=root).count(): tempfiles = [] def make_filename(table_name): if table_name == root.table_name: return "root.csv" else: start = len(root.table_name) + 1 return table_name[start:] + ".csv" visited = set() current = ElementDefModel.objects.filter(id=root.id) while current.count(): for element in current: if element not in visited: tempfiles.append( (get_temp_csv(element), make_filename(element.table_name)) ) visited.add(element) current = ElementDefModel.objects.filter(parent=current) return get_zipfile([(temp.name, filename) for (temp, filename) in tempfiles], "%s.zip" % xsd.form_name) else: return format_csv(root.get_rows(), root.get_column_names(), xsd.form_name)
def read(self, request, formdef_id, form_id): """ return data from a specific submission """ if request.REQUEST.has_key('format'): if request.GET['format'].lower() == 'xml': formdef = FormDefModel.objects.get(pk=formdef_id) if not formdef: return HttpResponseBadRequest(\ "Schema with primary key %s was not found." % formdef_id) try: meta = Metadata.objects.get(raw_data=form_id, formdefmodel=formdef) except Metadata.DoesNotExist: return HttpResponseBadRequest(\ "Instance with id %s and schema %s was not found." % form_id, formdef.id) fin = open( meta.xml_file_location() ,"r") response = HttpResponse(fin.read(), mimetype='text/xml') fin.close() return response #default to CSV try: formdef = FormDefModel.objects.get(pk=formdef_id ) except FormDefModel.DoesNotExist: return HttpResponseBadRequest("Schema with primary key %s was not found." % formdef_id) row = formdef.get_row(form_id) if row is None: return HttpResponseBadRequest("Instance matching %s of schema %s was not found." % (form_id,formdef_id) ) columns = formdef.get_column_names() return format_csv(row, columns, formdef.form_name, form_id!=0)
def sql_report_csv(request, report_id): '''View a single sql report.''' extuser = request.extuser report = SqlReport.objects.get(id=report_id) whereclause = util.get_whereclause(request.GET) cols, data = report.get_data({"whereclause": whereclause}) return format_csv(data, cols, report.title)
def read(self, request, formdef_id): """ list all submitted instance data for a particular schema """ try: formdef = FormDefModel.objects.get(pk=formdef_id) except FormDefModel.DoesNotExist: return HttpResponseBadRequest("Schema with id %s could not found." % formdef_id) metadata = Metadata.objects.filter(formdefmodel=formdef).order_by('id') if not metadata: return HttpResponseBadRequest("Metadata of schema with id %s not found." % formdef_id) filter = [] if request.REQUEST.has_key('start-id'): if filter: filter = filter + " AND " filter = filter + "id >= " + request.GET['start-id'] metadata = metadata.filter(raw_data__gte=request.GET['start-id']) if request.REQUEST.has_key('end-id'): if filter: filter = filter + " AND " filter = filter + "id <= " + request.GET['end-id'] metadata = metadata.filter(raw_data__lte=request.GET['end-id']) if request.REQUEST.has_key('start-submit-date'): date = datetime.strptime(request.GET['start-submit-date'],"%Y-%m-%d") # not the most efficient way of doing this # but it keeps our django orm reference and sql work separate metadata = metadata.filter(attachment__submission__submit_time__gte=date) raw_ids = [int(m.raw_data) for m in metadata] filter.append( ['id','IN',tuple(raw_ids)] ) if request.REQUEST.has_key('end-submit-date'): date = datetime.strptime(request.GET['end-submit-date'],"%Y-%m-%d") metadata = metadata.filter(attachment__submission__submit_time__lte=date) raw_ids = [int(m.raw_data) for m in metadata] filter.append( ['id','IN',tuple(raw_ids)] ) if request.REQUEST.has_key('format'): if request.GET['format'].lower() == 'xml' or \ request.GET['format'].lower() == 'zip': file_list = [] for datum in metadata: file_list.append( datum.attachment.filepath ) return get_zipfile(file_list) # default to csv export rows = formdef.get_rows( column_filters=filter ) column = formdef.get_column_names() return format_csv(rows, column, formdef.form_name)
def get_csv_from_form(formdef_id, form_id=0, filter=''): try: xsd = FormDefModel.objects.get(id=formdef_id) except FormDefModel.DoesNotExist: return HttpResponseBadRequest("Schema with id %s not found." % formdef_id) cursor = connection.cursor() row_count = 0 if form_id == 0: try: query= 'SELECT * FROM ' + xsd.form_name if filter: query = query + " WHERE " + filter query = query + ' ORDER BY id' cursor.execute(query) except Exception, e: return HttpResponseBadRequest(\ "Schema %s could not be queried with query %s" % \ ( xsd.form_name,query) ) rows = cursor.fetchall() else: try: cursor.execute("SELECT * FROM " + xsd.form_name + ' where id=%s', [form_id]) except Exception, e: return HttpResponseBadRequest(\ "Instance with id %s for schema %s not found." % (form_id,xsd.form_name) ) rows = cursor.fetchone() row_count = 1 columns = xsd.get_column_names() name = xsd.form_name return format_csv(rows, columns, name, row_count)