def get(self, request, *args, **kwargs): self.filter_form = SelectDateForm(request.GET) if request.GET.get('action') == 'CSV': return self.csv() return super().get(request, *args, **kwargs)
def list_submissions(request, page_id): if not get_forms_for_user(request.user).filter(id=page_id).exists(): raise PermissionDenied form_page = get_object_or_404(Page, id=page_id).specific form_submission_class = form_page.get_submission_class() data_fields = form_page.get_data_fields() submissions = form_submission_class.objects.filter(page=form_page) data_headings = [label for name, label in data_fields] select_date_form = SelectDateForm(request.GET) if select_date_form.is_valid(): date_from = select_date_form.cleaned_data.get('date_from') date_to = select_date_form.cleaned_data.get('date_to') # careful: date_to should be increased by 1 day since the submit_time # is a time so it will always be greater if date_to: date_to += datetime.timedelta(days=1) if date_from and date_to: submissions = submissions.filter(submit_time__range=[date_from, date_to]) elif date_from and not date_to: submissions = submissions.filter(submit_time__gte=date_from) elif not date_from and date_to: submissions = submissions.filter(submit_time__lte=date_to) if request.GET.get('action') == 'CSV': # return a CSV instead response = HttpResponse(content_type='text/csv; charset=utf-8') response['Content-Disposition'] = 'attachment;filename=export.csv' # Prevents UnicodeEncodeError for labels with non-ansi symbols data_headings = [smart_str(label) for label in data_headings] writer = csv.writer(response) writer.writerow(data_headings) for s in submissions: data_row = [] form_data = s.get_data() for name, label in data_fields: data_row.append(smart_str(form_data.get(name))) writer.writerow(data_row) return response paginator, submissions = paginate(request, submissions) data_rows = [] for s in submissions: form_data = s.get_data() data_row = [form_data.get(name) for name, label in data_fields] data_rows.append({ "model_id": s.id, "fields": data_row }) return render(request, 'wagtailforms/index_submissions.html', { 'form_page': form_page, 'select_date_form': select_date_form, 'submissions': submissions, 'data_headings': data_headings, 'data_rows': data_rows })
def list_submissions(request, page_id): if not get_forms_for_user(request.user).filter(id=page_id).exists(): raise PermissionDenied form_page = get_object_or_404(Page, id=page_id).specific form_submission_class = form_page.get_submission_class() data_fields = form_page.get_data_fields() submissions = form_submission_class.objects.filter( page=form_page).order_by('submit_time') data_headings = [label for name, label in data_fields] select_date_form = SelectDateForm(request.GET) if select_date_form.is_valid(): date_from = select_date_form.cleaned_data.get('date_from') date_to = select_date_form.cleaned_data.get('date_to') # careful: date_to should be increased by 1 day since the submit_time # is a time so it will always be greater if date_to: date_to += datetime.timedelta(days=1) if date_from and date_to: submissions = submissions.filter( submit_time__range=[date_from, date_to]) elif date_from and not date_to: submissions = submissions.filter(submit_time__gte=date_from) elif not date_from and date_to: submissions = submissions.filter(submit_time__lte=date_to) if request.GET.get('action') == 'CSV': # return a CSV instead response = HttpResponse(content_type='text/csv; charset=utf-8') response['Content-Disposition'] = 'attachment;filename=export.csv' # Prevents UnicodeEncodeError for labels with non-ansi symbols data_headings = [smart_str(label) for label in data_headings] writer = csv.writer(response) writer.writerow(data_headings) for s in submissions: data_row = [] form_data = s.get_data() for name, label in data_fields: data_row.append(smart_str(form_data.get(name))) writer.writerow(data_row) return response paginator, submissions = paginate(request, submissions) data_rows = [] for s in submissions: form_data = s.get_data() data_row = [form_data.get(name) for name, label in data_fields] data_rows.append({"model_id": s.id, "fields": data_row}) return render( request, 'wagtailforms/index_submissions.html', { 'form_page': form_page, 'select_date_form': select_date_form, 'submissions': submissions, 'data_headings': data_headings, 'data_rows': data_rows })
def list_submissions(request, page_id): form_page = get_object_or_404(Page, id=page_id).specific if not get_forms_for_user(request.user).filter(id=page_id).exists(): raise PermissionDenied data_fields = [ (field.clean_name, field.label) for field in form_page.form_fields.all() ] submissions = FormSubmission.objects.filter(page=form_page) select_date_form = SelectDateForm(request.GET) if select_date_form.is_valid(): date_from = select_date_form.cleaned_data.get('date_from') date_to = select_date_form.cleaned_data.get('date_to') # careful: date_to should be increased by 1 day since the submit_time # is a time so it will always be greater if date_to: date_to += datetime.timedelta(days=1) if date_from and date_to: submissions = submissions.filter(submit_time__range=[date_from, date_to]) elif date_from and not date_to: submissions = submissions.filter(submit_time__gte=date_from) elif not date_from and date_to: submissions = submissions.filter(submit_time__lte=date_to) if request.GET.get('action') == 'CSV': # return a CSV instead response = HttpResponse(content_type='text/csv; charset=utf-8') response['Content-Disposition'] = 'attachment;filename=export.csv' writer = unicodecsv.writer(response, encoding='utf-8') header_row = ['Submission date'] + [label for name, label in data_fields] writer.writerow(header_row) for s in submissions: data_row = [s.submit_time] form_data = s.get_data() for name, label in data_fields: data_row.append(form_data.get(name)) writer.writerow(data_row) return response p = request.GET.get('p', 1) paginator = Paginator(submissions, 20) try: submissions = paginator.page(p) except PageNotAnInteger: submissions = paginator.page(1) except EmptyPage: submissions = paginator.page(paginator.num_pages) data_headings = [label for name, label in data_fields] data_rows = [] for s in submissions: form_data = s.get_data() data_row = [s.submit_time] + [form_data.get(name) for name, label in data_fields] data_rows.append(data_row) return render(request, 'wagtailforms/index_submissions.html', { 'form_page': form_page, 'select_date_form': select_date_form, 'submissions': submissions, 'data_headings': data_headings, 'data_rows': data_rows })
class SubmissionListView(SingleObjectMixin, ListView): paginate_by = 25 page_kwarg = 'p' template_name = 'streamforms/submissions.html' filter_form = None model = BaseForm @property def permission_helper(self): return PermissionHelper(model=self.object.specific_class) def dispatch(self, request, *args, **kwargs): self.object = self.get_object() if not self.permission_helper.user_can_list(self.request.user): raise PermissionDenied return super().dispatch(request, *args, **kwargs) def get_object(self, queryset=None): pk = self.kwargs.get(self.pk_url_kwarg) try: return self.model.objects.get(pk=pk).specific except self.model.DoesNotExist: raise Http404(_("No BaseForm found matching the query")) def get(self, request, *args, **kwargs): self.filter_form = SelectDateForm(request.GET) if request.GET.get('action') == 'CSV': return self.csv() return super().get(request, *args, **kwargs) def csv(self): queryset = self.get_queryset() data_fields = self.object.get_data_fields() data_headings = [smart_str(label) for name, label in data_fields] response = HttpResponse(content_type='text/csv; charset=utf-8') response['Content-Disposition'] = 'attachment;filename=export.csv' writer = csv.writer(response) writer.writerow(data_headings) for s in queryset: data_row = [] form_data = s.get_data() for name, label in data_fields: data_row.append(smart_str(form_data.get(name))) writer.writerow(data_row) return response def get_queryset(self): submission_class = self.object.get_submission_class() self.queryset = submission_class._default_manager.filter( form=self.object) # filter the queryset by the required dates if self.filter_form.is_valid(): date_from = self.filter_form.cleaned_data.get('date_from') date_to = self.filter_form.cleaned_data.get('date_to') if date_from: self.queryset = self.queryset.filter( submit_time__gte=date_from) if date_to: date_to += datetime.timedelta(days=1) self.queryset = self.queryset.filter(submit_time__lte=date_to) return self.queryset def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) data_fields = self.object.get_data_fields() data_headings = [label for name, label in data_fields] # populate data rows from paginator data_rows = [] for s in context['page_obj']: form_data = s.get_data() data_row = [form_data.get(name) for name, label in data_fields] data_rows.append({'model_id': s.id, 'fields': data_row}) context.update({ 'filter_form': self.filter_form, 'data_rows': data_rows, 'data_headings': data_headings, 'has_delete_permission': self.permission_helper.user_can_delete_obj(self.request.user, self.object) }) return context
def list_submissions(request, page_id): form_page = get_object_or_404(Page, id=page_id).specific if not get_forms_for_user(request.user).filter(id=page_id).exists(): raise PermissionDenied data_fields = [(field.clean_name, field.label) for field in form_page.form_fields.all()] submissions = FormSubmission.objects.filter(page=form_page) select_date_form = SelectDateForm(request.GET) if select_date_form.is_valid(): date_from = select_date_form.cleaned_data.get("date_from") date_to = select_date_form.cleaned_data.get("date_to") # careful: date_to should be increased by 1 day since the submit_time # is a time so it will always be greater if date_to: date_to += datetime.timedelta(days=1) if date_from and date_to: submissions = submissions.filter(submit_time__range=[date_from, date_to]) elif date_from and not date_to: submissions = submissions.filter(submit_time__gte=date_from) elif not date_from and date_to: submissions = submissions.filter(submit_time__lte=date_to) if request.GET.get("action") == "CSV": # return a CSV instead response = HttpResponse(content_type="text/csv; charset=utf-8") response["Content-Disposition"] = "attachment;filename=export.csv" writer = csv.writer(response) header_row = ["Submission date"] + [label for name, label in data_fields] writer.writerow(header_row) for s in submissions: data_row = [s.submit_time] form_data = s.get_data() for name, label in data_fields: data_row.append(smart_str(form_data.get(name))) writer.writerow(data_row) return response paginator, submissions = paginate(request, submissions) data_headings = [label for name, label in data_fields] data_rows = [] for s in submissions: form_data = s.get_data() data_row = [s.submit_time] + [form_data.get(name) for name, label in data_fields] data_rows.append({"model_id": s.id, "fields": data_row}) return render( request, "wagtailforms/index_submissions.html", { "form_page": form_page, "select_date_form": select_date_form, "submissions": submissions, "data_headings": data_headings, "data_rows": data_rows, }, )
def list_submissions(request, page_id): if not get_forms_for_user(request.user).filter(id=page_id).exists(): raise PermissionDenied form_page = get_object_or_404(Page, id=page_id).specific form_submission_class = form_page.get_submission_class() data_fields = form_page.get_data_fields() ordering = form_page.get_field_ordering(request.GET.getlist('order_by')) # convert ordering tuples to a list of strings like ['-submit_time'] ordering_strings = [ '%s%s' % ('-' if order_str[1] == 'descending' else '', order_str[0]) for order_str in ordering ] if request.GET.get('action') == 'CSV': # Revert to CSV being sorted submit_time ascending for backwards compatibility submissions = form_submission_class.objects.filter( page=form_page).order_by('submit_time') else: submissions = form_submission_class.objects.filter( page=form_page).order_by(*ordering_strings) data_fields_with_ordering = [] for name, label in data_fields: order = None for order_value in [o[1] for o in ordering if o[0] == name]: order = order_value data_fields_with_ordering.append({ "name": name, "label": label, "order": order, }) data_headings = [label for name, label in data_fields] select_date_form = SelectDateForm(request.GET) if select_date_form.is_valid(): date_from = select_date_form.cleaned_data.get('date_from') date_to = select_date_form.cleaned_data.get('date_to') # careful: date_to should be increased by 1 day since the submit_time # is a time so it will always be greater if date_to: date_to += datetime.timedelta(days=1) if date_from and date_to: submissions = submissions.filter( submit_time__range=[date_from, date_to]) elif date_from and not date_to: submissions = submissions.filter(submit_time__gte=date_from) elif not date_from and date_to: submissions = submissions.filter(submit_time__lte=date_to) if request.GET.get('action') == 'CSV': # return a CSV instead response = HttpResponse(content_type='text/csv; charset=utf-8') response['Content-Disposition'] = 'attachment;filename=export.csv' # Prevents UnicodeEncodeError for labels with non-ansi symbols data_headings = [smart_str(label) for label in data_headings] writer = csv.writer(response) writer.writerow(data_headings) for s in submissions: data_row = [] form_data = s.get_data() for name, label in data_fields: val = form_data.get(name) if isinstance(val, list): val = ', '.join(val) data_row.append(smart_str(val)) writer.writerow(data_row) return response paginator, submissions = paginate(request, submissions) data_rows = [] for s in submissions: form_data = s.get_data() data_row = [] for name, label in data_fields: val = form_data.get(name) if isinstance(val, list): val = ', '.join(val) data_row.append(val) data_rows.append({"model_id": s.id, "fields": data_row}) return render( request, 'wagtailforms/index_submissions.html', { 'form_page': form_page, 'select_date_form': select_date_form, 'submissions': submissions, 'data_fields_with_ordering': data_fields_with_ordering, 'data_rows': data_rows })