コード例 #1
0
    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
コード例 #2
0
ファイル: xversion.py プロジェクト: meishild/xadmin
    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
コード例 #3
0
    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')
コード例 #4
0
ファイル: relate.py プロジェクト: meishild/xadmin
    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)))
コード例 #5
0
ファイル: batch.py プロジェクト: meishild/xadmin
    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)
コード例 #6
0
ファイル: actions.py プロジェクト: meishild/xadmin
    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)
コード例 #7
0
ファイル: dashboard.py プロジェクト: meishild/xadmin
 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))
コード例 #8
0
 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
コード例 #9
0
ファイル: detail.py プロジェクト: meishild/xadmin
 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
コード例 #10
0
ファイル: relate.py プロジェクト: meishild/xadmin
    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)
コード例 #11
0
 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
コード例 #12
0
 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('&nbsp;')
     for wrap in self.wraps:
         text = mark_safe(wrap % text)
     return text
コード例 #13
0
 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
コード例 #14
0
ファイル: detail.py プロジェクト: meishild/xadmin
 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
コード例 #15
0
    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
コード例 #16
0
    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))
コード例 #17
0
ファイル: detail.py プロジェクト: meishild/xadmin
    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
コード例 #18
0
ファイル: base.py プロジェクト: meishild/xadmin
 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
コード例 #19
0
    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
コード例 #20
0
    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')
コード例 #21
0
ファイル: detail.py プロジェクト: meishild/xadmin
    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
コード例 #22
0
ファイル: xversion.py プロジェクト: meishild/xadmin
 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
コード例 #23
0
    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')
コード例 #24
0
ファイル: editable.py プロジェクト: meishild/xadmin
    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)
                })
コード例 #25
0
    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)
コード例 #26
0
    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
コード例 #27
0
    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
        })
コード例 #28
0
ファイル: chart.py プロジェクト: meishild/xadmin
    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)
コード例 #29
0
ファイル: xversion.py プロジェクト: meishild/xadmin
 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))
コード例 #30
0
ファイル: xversion.py プロジェクト: meishild/xadmin
 def get_context(self):
     context = super(RevisionView, self).get_context()
     context["title"] = _(
         "Revert %s") % to_force_unicode(self.model._meta.verbose_name)
     return context