def add_type_view(self, request, form_url=""): """ Display a choice form to select which page type to add. """ if not self.has_add_permission(request): raise PermissionDenied extra_qs = "" if request.META["QUERY_STRING"]: # QUERY_STRING is bytes in Python 3, using force_str() to decode it as string. # See QueryDict how Django deals with that. extra_qs = "&{}".format(force_str(request.META["QUERY_STRING"])) choices = self.get_child_type_choices(request, "add") if len(choices) == 0: raise PermissionDenied if len(choices) == 1: return HttpResponseRedirect(f"?ct_id={choices[0][0]}{extra_qs}") # Create form form = self.add_type_form( data=request.POST if request.method == "POST" else None, initial={"ct_id": choices[0][0]}, ) form.fields["ct_id"].choices = choices if form.is_valid(): return HttpResponseRedirect("?ct_id={}{}".format( form.cleaned_data["ct_id"], extra_qs)) # Wrap in all admin layout fieldsets = ((None, {"fields": ("ct_id", )}), ) adminForm = AdminForm(form, fieldsets, {}, model_admin=self) media = self.media + adminForm.media opts = self.model._meta context = { "title": _("Add %s") % force_str(opts.verbose_name), "adminform": adminForm, "is_popup": ("_popup" in request.POST or "_popup" in request.GET), "media": mark_safe(media), "errors": AdminErrorList(form, ()), "app_label": opts.app_label, } return self.render_add_type_form(request, context, form_url)
def add_type_view(self, request, form_url=''): """ Display a choice form to select which page type to add. """ if not self.has_add_permission(request): raise PermissionDenied extra_qs = '' if request.META['QUERY_STRING']: # QUERY_STRING is bytes in Python 3, using force_text() to decode it as string. # See QueryDict how Django deals with that. extra_qs = '&{0}'.format(force_text(request.META['QUERY_STRING'])) choices = self.get_child_type_choices(request, 'add') if len(choices) == 1: return HttpResponseRedirect('?ct_id={0}{1}'.format(choices[0][0], extra_qs)) # Create form form = self.add_type_form( data=request.POST if request.method == 'POST' else None, initial={'ct_id': choices[0][0]} ) form.fields['ct_id'].choices = choices if form.is_valid(): return HttpResponseRedirect('?ct_id={0}{1}'.format(form.cleaned_data['ct_id'], extra_qs)) # Wrap in all admin layout fieldsets = ((None, {'fields': ('ct_id',)}),) adminForm = AdminForm(form, fieldsets, {}, model_admin=self) media = self.media + adminForm.media opts = self.model._meta context = { 'title': _('Add %s') % force_text(opts.verbose_name), 'adminform': adminForm, 'is_popup': ("_popup" in request.POST or "_popup" in request.GET), 'media': mark_safe(media), 'errors': AdminErrorList(form, ()), 'app_label': opts.app_label, } return self.render_add_type_form(request, context, form_url)
def select_site_view(self, request, form_url=''): """ Display a choice form to select which site to add settings. """ if not self.has_add_permission(request): raise PermissionDenied extra_qs = '' if request.META['QUERY_STRING']: extra_qs = '&' + request.META['QUERY_STRING'] site_choices = self.get_site_choices() if len(site_choices) == 1: return HttpResponseRedirect('?site_id={0}{1}'.format( site_choices[0][0], extra_qs)) # Create form form = self.select_site_form( data=request.POST if request.method == 'POST' else None, initial={'site': site_choices[0][0]}) form.fields['site'].choices = site_choices if form.is_valid(): return HttpResponseRedirect('?site_id={0}{1}'.format( form.cleaned_data['site'], extra_qs)) # Wrap in all admin layout fieldsets = ((None, {'fields': ('site', )}), ) adminForm = AdminForm(form, fieldsets, {}, model_admin=self) media = self.media + adminForm.media context = { 'title': _('Add %s') % force_text(self.opts.verbose_name), 'adminform': adminForm, 'is_popup': '_popup' in request.GET, 'media': mark_safe(media), 'errors': AdminErrorList(form, ()), 'app_label': self.opts.app_label, } return self.render_select_site_form(request, context, form_url)
def _get_custom_form(self, request, form, title): from django.contrib.admin.helpers import AdminForm, AdminErrorList admin_form = AdminForm(form, form.get_fieldsets(), {}, model_admin=self) media = self.media + admin_form.media inline_formsets = [] context = dict( self.admin_site.each_context(request), title=force_text(title), media=media, adminform=admin_form, is_popup=False, show_save_and_continue=False, inline_admin_formsets=inline_formsets, errors=AdminErrorList(form, inline_formsets), ) return self.render_change_form(request, context, add=True)
def add_type_view(self, request, form_url=''): """ Display a choice form to select which page type to add. """ extra_qs = '' if request.META['QUERY_STRING']: extra_qs = '&' + request.META['QUERY_STRING'] choices = self.get_child_type_choices() if len(choices) == 1: return HttpResponseRedirect('?ct_id={0}{1}'.format( choices[0][0], extra_qs)) # Create form form = self.add_type_form( data=request.POST if request.method == 'POST' else None, initial={'ct_id': choices[0][0]}) form.fields['ct_id'].choices = choices if form.is_valid(): return HttpResponseRedirect('?ct_id={0}{1}'.format( form.cleaned_data['ct_id'], extra_qs)) # Wrap in all admin layout fieldsets = ((None, {'fields': ('ct_id', )}), ) adminForm = AdminForm(form, fieldsets, {}, model_admin=self) media = self.media + adminForm.media opts = self.model._meta context = { 'title': _('Add %s') % force_unicode(opts.verbose_name), 'adminform': adminForm, 'is_popup': "_popup" in request.REQUEST, 'media': mark_safe(media), 'errors': AdminErrorList(form, ()), 'app_label': opts.app_label, } return self.render_add_type_form(request, context, form_url)
def export_view(self, request, form_url=''): """The 'export' admin view for this model.""" info = self.opts.app_label, self.opts.model_name if not self.has_export_permission(request): raise PermissionDenied form = SubmissionExportForm( data=request.POST if request.method == 'POST' else None) if form.is_valid(): data = form.cleaned_data queryset = self.get_queryset(request) \ .filter(plugin_id=data.get('form')) \ .select_related('created_by', 'plugin', ) from_date, to_date = data.get('from_date'), data.get('to_date') headers = data.get('headers', []) if from_date: queryset = queryset.filter(creation_date__gte=from_date) if to_date: queryset = queryset.filter(creation_date__lt=to_date + datetime.timedelta(days=1)) if not queryset.exists(): message = _( 'No matching %s found for the given criteria. ' 'Please try again.') % self.opts.verbose_name_plural self.message_user(request, message, level=messages.WARNING) if request.is_ajax(): data = { 'reloadBrowser': True, 'submissionCount': 0, } return JsonResponse(data) return redirect('admin:%s_%s_export' % info) latest_submission = queryset[:1].get() dataset = Dataset( title=Truncator(latest_submission.plugin.name).chars(31)) if not headers: headers = [ field['label'].strip() for field in latest_submission.form_data ] for submission in queryset: for field in submission.form_data: label = field['label'].strip() if label not in headers: headers.append(label) if request.is_ajax(): data = { 'reloadBrowser': False, 'submissionCount': queryset.count(), 'availableHeaders': headers, } return JsonResponse(data) headers.extend( ['Submitted By', 'Submitted on', 'Sender IP', 'Referrer URL']) dataset.headers = headers def humanize(field): value = field['value'] field_type = field['type'] if value in (None, '', [], (), {}): return None if field_type == 'checkbox': value = yesno(bool(value), u'{0},{1}'.format(_('Yes'), _('No'))) if field_type == 'checkbox_multiple': value = ', '.join(list(value)) return value for submission in queryset: row = [None] * len(headers) for field in submission.form_data: label = field['label'].strip() if label in headers: row[headers.index(label)] = humanize(field) row[-4] = force_text(submission.created_by or _('Unknown')) row[-3] = submission.creation_date.strftime( settings.DJANGOCMS_FORMS_DATETIME_FORMAT) row[-2] = submission.ip row[-1] = submission.referrer dataset.append(row) mimetype = { 'xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'csv': 'text/csv', 'html': 'text/html', 'yaml': 'text/yaml', 'json': 'application/json', } file_type = data.get('file_type', 'xlsx') filename = settings.DJANGOCMS_FORMS_EXPORT_FILENAME.format( form_name=slugify(latest_submission.plugin.name)) filename = timezone.now().strftime(filename) filename = '%s.%s' % (filename, file_type) response = HttpResponse( getattr(dataset, file_type), { 'content_type': mimetype.get(file_type, 'application/octet-stream') }) response[ 'Content-Disposition'] = 'attachment; filename=%s' % filename return response # Wrap in all admin layout fieldsets = ((None, {'fields': form.fields.keys()}), ) adminform = AdminForm(form, fieldsets, {}, model_admin=self) media = self.media + adminform.media context = { 'title': _('Export %s') % force_text(self.opts.verbose_name_plural), 'adminform': adminform, 'is_popup': (IS_POPUP_VAR in request.POST or IS_POPUP_VAR in request.GET), 'media': mark_safe(media), 'errors': AdminErrorList(form, ()), 'app_label': self.opts.app_label, } return self.render_export_form(request, context, form_url)
def upload_view(self, request, form_url='', extra_context=None): model = self.model opts = model._meta if not self.has_add_permission(request): raise PermissionDenied formsets = [] inline_instances = self.get_inline_instances(request) if request.method == 'POST': form = UploadForm(request.POST, request.FILES) if form.is_valid(): new_object = self.save_form(request, form, change=False) form_validated = True else: form_validated = False new_object = self.model() if form_validated: self.save_model(request, new_object, form, False) self.log_addition(request, new_object) return self.response_add(request, new_object) else: initial = dict(request.GET.items()) initial['author'] = request.user for k in initial: try: f = opts.get_field(k) except models.FieldDoesNotExist: continue if isinstance(f, models.ManyToManyField): initial[k] = initial[k].split(",") form = UploadForm(initial=initial) prefixes = {} adminForm = AdminForm(form, [(None, { 'fields': list(form.base_fields) + list(self.get_readonly_fields(request)) })], {}, self.get_readonly_fields(request), model_admin=self) media = self.media + adminForm.media context = { 'title': _('Add %s') % opts.verbose_name, 'adminform': adminForm, 'is_popup': "_popup" in request.REQUEST, 'media': media, 'inline_admin_formsets': [], 'errors': AdminErrorList(form, formsets), 'app_label': opts.app_label, 'show_delete': False } context.update(extra_context or {}) return self.render_change_form(request, context, form_url=form_url, add=True)