def get_context(self): """ Prepare the context for templates. """ self.title = _('%s List') % to_force_unicode(self.opts.verbose_name) model_fields = [(f, f.name in self.list_display, self.get_check_field_url(f)) for f in (list(self.opts.fields) + self.get_model_method_fields()) if f.name not in self.list_exclude] new_context = { 'model_name': to_force_unicode(self.opts.verbose_name_plural), 'title': self.title, 'cl': self, 'model_fields': model_fields, 'clean_select_field_url': self.get_query_string(remove=[COL_LIST_VAR]), 'has_add_permission': self.has_add_permission(), 'app_label': self.app_label, 'brand_name': self.opts.verbose_name_plural, 'brand_icon': self.get_model_icon(self.model), 'add_url': self.model_admin_url('add'), 'result_headers': self.result_headers(), 'results': self.results() } context = super(ListAdminView, self).get_context() context.update(new_context) return context
def get_context(self): context = super(RevisionListView, self).get_context() opts = self.opts action_list = [ { "revision": version.revision, "url": self.model_admin_url('revision', quote(version.object_id), version.id), "version": version } for version in self._reversion_order_version_queryset(Version.objects.get_for_object_reference( self.model, self.obj.pk, ).select_related("revision__user")) ] context.update({ 'title': _('Change history: %s') % to_force_unicode(self.obj), 'action_list': action_list, 'model_name': capfirst(to_force_unicode(opts.verbose_name_plural)), 'object': self.obj, 'app_label': opts.app_label, "changelist_url": self.model_admin_url("changelist"), "update_url": self.model_admin_url("change", self.obj.pk), 'opts': opts, }) return context
def post_response(self): self.message_user(_('The %(name)s "%(obj)s" was deleted successfully.') % {'name': to_force_unicode(self.opts.verbose_name), 'obj': to_force_unicode(self.obj)}, 'success') if not self.has_view_permission(): return self.get_admin_url('index') return self.model_admin_url('changelist')
def get_brand_name(self): if len(self.to_objs) == 1: to_model_name = str(self.to_objs[0]) else: to_model_name = to_force_unicode(self.to_model._meta.verbose_name) return mark_safe( u"<span class='rel-brand'>%s <i class='fa fa-caret-right'></i></span> %s" % (to_model_name, to_force_unicode(self.opts.verbose_name_plural)))
def do_action(self, queryset): if not self.has_change_permission(): raise PermissionDenied change_fields = [ f for f in self.request.POST.getlist(BATCH_CHECKBOX_NAME) if f in self.batch_fields ] if change_fields and self.request.POST.get('post'): self.form_obj = self.get_change_form(True, change_fields)( data=self.request.POST, files=self.request.FILES) if self.form_obj.is_valid(): self.change_models(queryset, self.form_obj.cleaned_data) return None else: self.form_obj = self.get_change_form(False, self.batch_fields)() helper = FormHelper() helper.form_tag = False helper.include_media = False helper.add_layout( Layout( Container( Col('full', Fieldset("", *self.form_obj.fields.keys(), css_class="unsort no_title"), horizontal=True, span=12)))) self.form_obj.helper = helper count = len(queryset) if count == 1: objects_name = to_force_unicode(self.opts.verbose_name) else: objects_name = to_force_unicode(self.opts.verbose_name_plural) context = self.get_context() context.update({ "title": _("Batch change %s") % objects_name, 'objects_name': objects_name, 'form': self.form_obj, 'queryset': queryset, 'count': count, "opts": self.opts, "app_label": self.app_label, 'action_checkbox_name': ACTION_CHECKBOX_NAME, }) return TemplateResponse( self.request, self.batch_change_form_template or self.get_template_list('views/batch_change_form.html'), context, current_app=self.admin_site.name)
def do_action(self, queryset): # Check that the user has delete permission for the actual model if not self.has_delete_permission(): raise PermissionDenied using = router.db_for_write(self.model) # Populate deletable_objects, a data structure of all related objects that # will also be deleted. deletable_objects, model_count, perms_needed, protected = get_deleted_objects( queryset, self.opts, self.user, self.admin_site, using) # The user has already confirmed the deletion. # Do the deletion and return a None to display the change list view again. if self.request.POST.get('post'): if perms_needed: raise PermissionDenied self.delete_models(queryset) # Return None to display the change list page again. return None if len(queryset) == 1: objects_name = to_force_unicode(self.opts.verbose_name) else: objects_name = to_force_unicode(self.opts.verbose_name_plural) if perms_needed or protected: title = _("Cannot delete %(name)s") % {"name": objects_name} else: title = _("Are you sure?") context = self.get_context() context.update({ "title": title, "objects_name": objects_name, "deletable_objects": [deletable_objects], 'queryset': queryset, "perms_lacking": perms_needed, "protected": protected, "opts": self.opts, "app_label": self.app_label, 'action_checkbox_name': ACTION_CHECKBOX_NAME, }) # Display the confirmation page return TemplateResponse( self.request, self.delete_selected_confirmation_template or self.get_template_list('views/model_delete_selected_confirm.html'), context, current_app=self.admin_site.name)
def render(self, name, value, attrs=None): if value is None: value = '' final_attrs = self.build_attrs(attrs, name=name) final_attrs['class'] = 'nav nav-pills nav-stacked' output = [u'<ul%s>' % flatatt(final_attrs)] options = self.render_options(to_force_unicode(value), final_attrs['id']) if options: output.append(options) output.append(u'</ul>') output.append( '<input type="hidden" id="%s_input" name="%s" value="%s"/>' % (final_attrs['id'], name, to_force_unicode(value))) return mark_safe(u'\n'.join(output))
def get_context(self): new_context = { 'title': _('Add %s') % to_force_unicode(self.opts.verbose_name), } context = super(CreateAdminView, self).get_context() context.update(new_context) return context
def get_breadcrumb(self): bcs = super(DetailAdminView, self).get_breadcrumb() item = {'title': to_force_unicode(self.obj)} if self.has_view_permission(): item['url'] = self.model_admin_url('detail', self.obj.pk) bcs.append(item) return bcs
def related_link(self, instance): links = [] for rel, view_perm, add_perm in self.get_related_list(): opts = rel.related_model._meta label = opts.app_label model_name = opts.model_name field = rel.field rel_name = rel.get_related_field().name verbose_name = to_force_unicode(opts.verbose_name) lookup_name = '%s__%s__exact' % (field.name, rel_name) link = ''.join(( '<li class="with_menu_btn">', '<a href="%s?%s=%s" title="%s"><i class="icon fa fa-th-list"></i> %s</a>' % (reverse('%s:%s_%s_changelist' % (self.admin_site.app_name, label, model_name)), RELATE_PREFIX + lookup_name, str(instance.pk), verbose_name, verbose_name) if view_perm else '<a><span class="text-muted"><i class="icon fa fa-blank"></i> %s</span></a>' % verbose_name, '<a class="add_link dropdown-menu-btn" href="%s?%s=%s"><i class="icon fa fa-plus ' 'pull-right"></i></a>' % (reverse('%s:%s_%s_add' % (self.admin_site.app_name, label, model_name)), RELATE_PREFIX + lookup_name, str(instance.pk)) if add_perm else "", '</li>')) links.append(link) ul_html = '<ul class="dropdown-menu" role="menu">%s</ul>' % ''.join( links) return '<div class="dropdown related_menu pull-right"><a title="%s" class="relate_menu dropdown-toggle" ' \ 'data-toggle="dropdown"><i class="icon fa fa-list"></i></a>%s</div>' % ( _('Related Objects'), ul_html)
def get_context(self): new_context = { 'title': _('Change %s') % to_force_unicode(self.org_obj), 'object_id': str(self.org_obj.pk), } context = super(UpdateAdminView, self).get_context() context.update(new_context) return context
def label(self): text = mark_safe( self.text) if self.allow_tags else conditional_escape(self.text) if to_force_unicode(text) == '': text = mark_safe(' ') for wrap in self.wraps: text = mark_safe(wrap % text) return text
def get_breadcrumb(self): bcs = super(ModelFormAdminView, self).get_breadcrumb() item = { 'title': _('Add %s') % to_force_unicode(self.opts.verbose_name) } if self.has_add_permission(): item['url'] = self.model_admin_url('add') bcs.append(item) return bcs
def val(self): text = mark_safe( self.text) if self.allow_tags else conditional_escape(self.text) if to_force_unicode(text) == '' or text == 'None' or text == _(EMPTY_CHANGELIST_VALUE): text = mark_safe( '<span class="text-muted">%s</span>' % _(EMPTY_CHANGELIST_VALUE)) for wrap in self.wraps: text = mark_safe(wrap % text) return text
def get_breadcrumb(self): bcs = super(ModelFormAdminView, self).get_breadcrumb() item = {'title': to_force_unicode(self.org_obj)} if self.has_change_permission(): item['url'] = self.model_admin_url('change', self.org_obj.pk) bcs.append(item) return bcs
def render(self, name, value, attrs=None, choices=()): if attrs is None: attrs = {} attrs['class'] = '' if self.is_stacked: attrs['class'] += 'stacked' if value is None: value = [] final_attrs = self.build_attrs(attrs, name=name) selected_choices = set(to_force_unicode(v) for v in value) available_output = [] chosen_output = [] for option_value, option_label in chain(self.choices, choices): if isinstance(option_label, (list, tuple)): available_output.append(u'<optgroup label="%s">' % escape(to_force_unicode(option_value))) for option in option_label: output, selected = self.render_opt(selected_choices, *option) if selected: chosen_output.append(output) else: available_output.append(output) available_output.append(u'</optgroup>') else: output, selected = self.render_opt(selected_choices, option_value, option_label) if selected: chosen_output.append(output) else: available_output.append(output) context = { 'verbose_name': self.verbose_name, 'attrs': attrs, 'field_id': attrs['id'], 'flatatts': flatatt(final_attrs), 'available_options': u'\n'.join(available_output), 'chosen_options': u'\n'.join(chosen_output), } return mark_safe( loader.render_to_string('xadmin/forms/transfer.html', context))
def init_request(self, object_id, *args, **kwargs): self.obj = self.get_object(unquote(object_id)) if not self.has_view_permission(self.obj): raise PermissionDenied if self.obj is None: raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % {'name': to_force_unicode(self.opts.verbose_name), 'key': escape(object_id)}) self.org_obj = self.obj
def get_context(self): new_context = { "opts": self.opts, "app_label": self.app_label, "model_name": self.model_name, "verbose_name": to_force_unicode(self.opts.verbose_name), 'model_icon': self.get_model_icon(self.model), } context = super(ModelAdminView, self).get_context() context.update(new_context) return context
def get_breadcrumb(self): bcs = super(DeleteAdminView, self).get_breadcrumb() bcs.append({ 'title': to_force_unicode(self.obj), 'url': self.get_object_url(self.obj) }) item = {'title': _('Delete')} if self.has_delete_permission(): item['url'] = self.model_admin_url('delete', self.obj.pk) bcs.append(item) return bcs
def post_response(self): """ Determines the HttpResponse for the change_view stage. """ opts = self.new_obj._meta obj = self.new_obj request = self.request verbose_name = opts.verbose_name pk_value = obj._get_pk_val() msg = _('The %(name)s "%(obj)s" was changed successfully.') % { 'name': to_force_unicode(verbose_name), 'obj': to_force_unicode(obj) } if "_continue" in request.POST: self.message_user(msg + ' ' + _("You may edit it again below."), 'success') return request.path elif "_addanother" in request.POST: self.message_user( msg + ' ' + (_("You may add another %s below.") % to_force_unicode(verbose_name)), 'success') return self.model_admin_url('add') else: self.message_user(msg, 'success') # Figure out where to redirect. If the user has change permission, # redirect to the change-list page for this object. Otherwise, # redirect to the admin index. if "_redirect" in request.POST: return request.POST["_redirect"] elif self.has_view_permission(): change_list_url = self.model_admin_url('changelist') if 'LIST_QUERY' in self.request.session \ and self.request.session['LIST_QUERY'][0] == self.model_info: change_list_url += '?' + self.request.session[ 'LIST_QUERY'][1] return change_list_url else: return self.get_admin_url('index')
def get_context(self): new_context = { 'title': _('%s Detail') % to_force_unicode(self.opts.verbose_name), 'form': self.form_obj, 'object': self.obj, 'has_change_permission': self.has_change_permission(self.obj), 'has_delete_permission': self.has_delete_permission(self.obj), 'content_type_id': ContentType.objects.get_for_model(self.model).id, } context = super(DetailAdminView, self).get_context() context.update(new_context) return context
def get_context(self): context = super(RecoverListView, self).get_context() opts = self.opts deleted = self._order_version_queryset(Version.objects.get_deleted(self.model)) context.update({ "opts": opts, "app_label": opts.app_label, "model_name": capfirst(opts.verbose_name), "title": _("Recover deleted %(name)s") % {"name": to_force_unicode(opts.verbose_name_plural)}, "deleted": deleted, "changelist_url": self.model_admin_url("changelist"), }) return context
def post_response(self): """ Determines the HttpResponse for the add_view stage. """ request = self.request msg = _('The %(name)s "%(obj)s" was added successfully.') % { 'name': to_force_unicode(self.opts.verbose_name), 'obj': "<a class='alert-link' href='%s'>%s</a>" % (self.model_admin_url('change', self.new_obj._get_pk_val()), to_force_unicode(self.new_obj)) } if "_continue" in request.POST: self.message_user(msg + ' ' + _("You may edit it again below."), 'success') return self.model_admin_url('change', self.new_obj._get_pk_val()) if "_addanother" in request.POST: self.message_user( msg + ' ' + (_("You may add another %s below.") % to_force_unicode(self.opts.verbose_name)), 'success') return request.path else: self.message_user(msg, 'success') # Figure out where to redirect. If the user has change permission, # redirect to the change-list page for this object. Otherwise, # redirect to the admin index. if "_redirect" in request.POST: return request.POST["_redirect"] elif self.has_view_permission(): return self.model_admin_url('changelist') else: return self.get_admin_url('index')
def init_request(self, object_id, *args, **kwargs): self.org_obj = self.get_object(unquote(object_id)) # For list view get new field display html self.pk_attname = self.opts.pk.attname if not self.has_change_permission(self.org_obj): raise PermissionDenied if self.org_obj is None: raise Http404( _('%(name)s object with primary key %(key)r does not exist.') % { 'name': to_force_unicode(self.opts.verbose_name), 'key': escape(object_id) })
def init_request(self, object_id, *args, **kwargs): "The 'delete' admin view for this model." self.obj = self.get_object(unquote(object_id)) if not self.has_delete_permission(self.obj): raise PermissionDenied if self.obj is None: raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % { 'name': to_force_unicode(self.opts.verbose_name), 'key': escape(object_id)}) using = router.db_for_write(self.model) # Populate deleted_objects, a data structure of all related objects that # will also be deleted. (self.deleted_objects, model_count, self.perms_needed, self.protected) = get_deleted_objects( [self.obj], self.opts, self.request.user, self.admin_site, using)
def get_context(self): if self.perms_needed or self.protected: title = _("Cannot delete %(name)s") % {"name": to_force_unicode(self.opts.verbose_name)} else: title = _("Are you sure?") new_context = { "title": title, "object": self.obj, "deleted_objects": self.deleted_objects, "perms_lacking": self.perms_needed, "protected": self.protected, } context = super(DeleteAdminView, self).get_context() context.update(new_context) return context
def get_result_list(self, response): av = self.admin_view base_fields = self.get_list_display(av.base_list_display) headers = dict([(c.field_name, to_force_unicode(c.text)) for c in av.result_headers().cells if c.field_name in base_fields]) objects = [ dict([(o.field_name, escape(str(o.value))) for i, o in enumerate( filter(lambda c: c.field_name in base_fields, r.cells))]) for r in av.results() ] return self.render_response({ 'headers': headers, 'objects': objects, 'total_count': av.result_count, 'has_more': av.has_more })
def get(self, request, name): if name not in self.data_charts: return HttpResponseNotFound() self.chart = self.data_charts[name] self.x_field = self.chart['x-field'] y_fields = self.chart['y-field'] self.y_fields = ( y_fields,) if type(y_fields) not in (list, tuple) else y_fields datas = [{"data": [], "label": to_force_unicode(label_for_field(i, self.model, model_admin=self))} for i in self.y_fields] self.make_result_list() for obj in self.result_list: xf, attrs, value = lookup_field(self.x_field, obj, self) for i, yfname in enumerate(self.y_fields): yf, yattrs, yv = lookup_field(yfname, obj, self) datas[i]["data"].append((value, yv)) option = {'series': {'lines': {'show': True}, 'points': {'show': False}}, 'grid': {'hoverable': True, 'clickable': True}} try: xfield = self.opts.get_field(self.x_field) if type(xfield) in (models.DateTimeField, models.DateField, models.TimeField): option['xaxis'] = {'mode': "time", 'tickLength': 5} if type(xfield) is models.DateField: option['xaxis']['timeformat'] = "%y/%m/%d" elif type(xfield) is models.TimeField: option['xaxis']['timeformat'] = "%H:%M:%S" else: option['xaxis']['timeformat'] = "%y/%m/%d %H:%M:%S" except Exception: pass option.update(self.chart.get('option', {})) content = {'data': datas, 'option': option} result = json.dumps(content, cls=JSONEncoder, ensure_ascii=False) return HttpResponse(result)
def post_response(self): self.message_user(_('The %(model)s "%(name)s" was recovered successfully. You may edit it again below.') % {"model": to_force_unicode(self.opts.verbose_name), "name": to_unicode(self.new_obj)}, 'success') return HttpResponseRedirect(self.model_admin_url('change', self.new_obj.pk))
def get_context(self): context = super(RevisionView, self).get_context() context["title"] = _( "Revert %s") % to_force_unicode(self.model._meta.verbose_name) return context