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 orphaned_data_xml(request): """ Get a zip file containing all orphaned submissions """ context = {} inner_qs = SubmissionHandlingOccurrence.objects.all().values('pk').query orphans = Submission.objects.exclude(id__in=inner_qs) attachments = Attachment.objects.filter(submission__in=orphans) xforms = attachments.filter(attachment_uri=XFORM_URI) return get_zipfile( xforms.values_list('filepath', flat=True) )
def export_xml(request, formdef_id): """ Get a zip file containing all submissions for this schema """ formdef = get_object_or_404(FormDefModel, pk=formdef_id) metadata = Metadata.objects.filter(formdefmodel=formdef).order_by('id') file_list = [] for datum in metadata: file_list.append( datum.attachment.filepath ) return get_zipfile(file_list)
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)