def submission_export(form_id): form = services.forms.get_or_404(pk=form_id) queryset = services.submissions.find( form=form, submission_type='M').order_by('location') dataset = aggregated_dataframe(queryset, form).to_csv( encoding='utf-8', index=False, float_format='%d') # TODO: any other way to control/stream the output? # currently it just takes the name of the form ID return Response( dataset, mimetype='text/csv')
def submission_list(form_id): form = services.forms.get_or_404(pk=form_id) permissions.require_item_perm('view_forms', form) filter_class = generate_submission_filter(form) page_title = form.name template_name = 'frontend/submission_list.html' data = request.args.to_dict() data['form_id'] = unicode(form.pk) page = int(data.pop('page', 1)) loc_types = displayable_location_types(is_administrative=True) location = None if request.args.get('location'): location = services.locations.find( pk=request.args.get('location')).first() if request.args.get('export') and permissions.export_submissions.can(): mode = request.args.get('export') if mode in ['master', 'aggregated']: queryset = services.submissions.find( submission_type='M', form=form ).order_by('location') else: queryset = services.submissions.find( submission_type='O', form=form ).order_by('location', 'contributor') query_filterset = filter_class(queryset, request.args) basename = slugify_unicode('%s %s %s %s' % ( g.event.name.lower(), form.name.lower(), datetime.utcnow().strftime('%Y %m %d %H%M%S'), mode)) content_disposition = 'attachment; filename=%s.csv' % basename if mode == 'aggregated': # TODO: you want to change the float format or even remove it # if you have columns that have float values dataset = aggregated_dataframe(query_filterset.qs, form)\ .to_csv(encoding='utf-8', index=False, float_format='%d') else: dataset = services.submissions.export_list( query_filterset.qs, g.deployment) return Response( dataset, headers={'Content-Disposition': content_disposition}, mimetype="text/csv" ) # first retrieve observer submissions for the form # NOTE: this implicitly restricts selected submissions # to the currently selected event. queryset = services.submissions.find( submission_type='O', form=form ).order_by('location', 'contributor') query_filterset = filter_class(queryset, request.args) filter_form = query_filterset.form if request.form.get('action') == 'send_message': message = request.form.get('message', '') recipients = filter( lambda x: x is not '', [submission.contributor.phone if submission.contributor and submission.contributor.phone else '' for submission in query_filterset.qs.only( 'contributor').select_related(1)]) recipients.extend(current_app.config.get('MESSAGING_CC')) if message and recipients and permissions.send_messages.can(): send_messages.delay(str(g.event.pk), message, recipients) return 'OK' else: abort(400) if form.form_type == 'CHECKLIST': form_fields = [] else: form_fields = [field for group in form.groups for field in group.fields if not field.is_comment_field] return render_template( template_name, args=data, filter_form=filter_form, form=form, form_fields=form_fields, location_types=loc_types, location=location, page_title=page_title, pager=query_filterset.qs.paginate( page=page, per_page=current_app.config.get('PAGE_SIZE')) )