示例#1
0
        ex_themes = cache.get(THEME_CACHE_KEY)
        if ex_themes:
            themes.extend(simplejson.loads(ex_themes))
        else:
            ex_themes = []
            try:
                watch_themes = simplejson.loads(urllib.urlopen("http://api.bootswatch.com/").read())["themes"]
                ex_themes.extend(
                    [
                        {
                            "name": t["name"],
                            "description": t["description"],
                            "css": t["css-min"],
                            "thumbnail": t["thumbnail"],
                        }
                        for t in watch_themes
                    ]
                )
            except Exception:
                pass

            cache.set(THEME_CACHE_KEY, simplejson.dumps(ex_themes), 24 * 3600)
            themes.extend(ex_themes)

        nodes.append(
            loader.render_to_string("admin/blocks/toptheme.html", {"themes": themes, "select_css": select_css})
        )


site.register_plugin(ThemePlugin, BaseAdminView)
示例#2
0
        if not self.title:
            self.title = unicode(bookmark)

        req = self.make_get_request("", data.items())
        self.list_view = self.get_view_class(ListAdminView, model, list_per_page=10, list_editable=[])(req)

    def has_perm(self):
        return True

    def context(self, context):
        list_view = self.list_view
        list_view.make_result_list()

        base_fields = list_view.base_list_display
        if len(base_fields) > 5:
            base_fields = base_fields[0:5]

        context['result_headers'] = [c for c in list_view.result_headers().cells if c.field_name in base_fields]
        context['results'] = [[o for i,o in \
            enumerate(filter(lambda c:c.field_name in base_fields, r.cells))] \
            for r in list_view.results()]
        context['result_count'] = list_view.result_count
        context['page_url'] = self.bookmark.url

site.register(Bookmark, BookmarkAdmin)
site.register_plugin(BookmarkPlugin, ListAdminView)
site.register_modelview(r'^bookmark/$', BookmarkView, name='%s_%s_bookmark')


示例#3
0
            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}
        json = simplejson.dumps(content, cls=JSONEncoder, ensure_ascii=False)

        return HttpResponse(json)

site.register_plugin(ChartsPlugin, ListAdminView)
site.register_modelview(r'^chart/(.+)/$', ChartsView, name='%s_%s_chart')


示例#4
0
    def init_request(self, obj):
        self.obj = obj
        self.org_obj = obj

class DetailInlineFormsetPlugin(InlineFormsetPlugin):

    def _get_formset_instance(self, inline):
        formset = inline.instance_form(extra=0, max_num=0, can_delete=0)
        formset.detail_page = True
        if formset.helper.layout:
            replace_field_to_value(formset.helper.layout, inline)
            model = inline.model
            opts = model._meta
            fake_admin_class = type.__new__(type, '%s%sFakeAdmin' % (opts.app_label, opts.module_name), (object, ), {'model': model})
            for form in formset.forms:
                instance = form.instance
                if instance.pk:
                    form.detail = self.get_view(DetailAdminUtil, fake_admin_class, instance)

        return formset

    def get_model_form(self, form, **kwargs):
        self.formsets = [self._get_formset_instance(inline) for inline in self.inline_instances]
        return form

site.register_plugin(InlineFormsetPlugin, ModelFormAdminView)
site.register_plugin(DetailInlineFormsetPlugin, DetailAdminView)


示例#5
0
class RefreshPlugin(BaseAdminPlugin):

    refresh_times = []

    # Media
    def get_media(self, media):
        if self.refresh_times and self.request.GET.get(REFRESH_VAR):
            media.add_js([self.static('exadmin/js/refresh.js')])
        return media

    # Block Views
    def block_top_toolbar(self, context, nodes):
        if self.refresh_times:
            current_refresh = self.request.GET.get(REFRESH_VAR)
            context.update({
                'has_refresh': bool(current_refresh),
                'clean_refresh_url': self.admin_view.get_query_string(remove=(REFRESH_VAR,)),
                'current_refresh': current_refresh,
                'refresh_times': [{
                    'time': r,
                    'url': self.admin_view.get_query_string({REFRESH_VAR: r}),
                    'selected': str(r) == current_refresh,
                } for r in self.refresh_times],
            })
            nodes.append(loader.render_to_string('admin/blocks/refresh.html', context_instance=context))


site.register_plugin(RefreshPlugin, ListAdminView)


示例#6
0
            return form_list.keyOrder[key]
        return None

    def get_step_index(self, step=None):
        """
        Returns the index for the given `step` name. If no step is given,
        the current step will be used to get the index.
        """
        if step is None:
            step = self.steps.current
        return self.get_form_list().keyOrder.index(step)

    def block_before_fieldsets(self, context, nodes):
        context.update(self.storage.extra_data)
        context['wizard'] = {
            'steps': self.steps,
            'management_form': ManagementForm(prefix=self.prefix, initial={
                'current_step': self.steps.current,
            }),
        }
        nodes.append(loader.render_to_string('admin/blocks/wizard_nav.html', context_instance=context))

    def block_submit_line(self, context, nodes):
        context.update(self.storage.extra_data)
        context['wizard'] = {
            'steps': self.steps
        }
        nodes.append(loader.render_to_string('admin/blocks/wizard_btn.html', context_instance=context))

site.register_plugin(WizardFormPlugin, ModelFormAdminView)
示例#7
0
class UserFieldPlugin(BaseAdminPlugin):

    user_fields = []

    def get_field_attrs(self, __, db_field, **kwargs):
        if self.user_fields and db_field.name in self.user_fields:
            return {'widget': forms.HiddenInput}
        return __()

    def get_form_datas(self, datas):
        if self.user_fields and datas.has_key('data'):
            for f in self.user_fields:
                datas['data'][f] = self.user.id
        return datas

site.register_plugin(UserFieldPlugin, ModelFormAdminView)

class ModelPermissionPlugin(BaseAdminPlugin):

    user_can_access_owned_objects_only = False
    user_owned_objects_field = 'user'

    def queryset(self, qs):
        if self.user_can_access_owned_objects_only and \
            not self.user.is_superuser:
            filters = {self.user_owned_objects_field: self.user}
            qs = qs.filter(**filters)
        return qs
        

site.register_plugin(ModelPermissionPlugin, ModelAdminView)
示例#8
0
        response.write(getattr(self, "get_%s_export" % file_type)(context))
        return response

    # View Methods
    def result_header(self, item, field_name, row):
        if self.request.GET.get("_do_") == "export":
            item.export = True
            if item.attr and not getattr(item.attr, "allow_export", False):
                item.export = False
        return item

    def result_item(self, item, obj, field_name, row):
        if self.request.GET.get("_do_") == "export":
            item.export = True
            if item.field is None and not getattr(item.attr, "allow_export", False):
                item.export = False
        return item

    def block_top_toolbar(self, context, nodes):
        if self.list_export:
            context.update(
                {
                    "form_params": self.admin_view.get_form_params({"_do_": "export"}, ("export_type",)),
                    "export_types": [{"type": et, "name": self.export_names[et]} for et in self.list_export],
                }
            )
            nodes.append(loader.render_to_string("admin/exports.html", context_instance=context))


site.register_plugin(ExportPlugin, ListAdminView)
示例#9
0
    user_fields = []

    def get_field_attrs(self, __, db_field, **kwargs):
        if self.user_fields and db_field.name in self.user_fields:
            return {"widget": forms.HiddenInput}
        return __()

    def get_form_datas(self, datas):
        if self.user_fields and datas.has_key("data"):
            for f in self.user_fields:
                datas["data"][f] = self.user.id
        return datas


site.register_plugin(UserFieldPlugin, ModelFormAdminView)


class ModelPermissionPlugin(BaseAdminPlugin):

    user_can_access_owned_objects_only = False
    user_owned_objects_field = "user"

    def queryset(self, qs):
        if self.user_can_access_owned_objects_only and not self.user.is_superuser:
            filters = {self.user_owned_objects_field: self.user}
            qs = qs.filter(**filters)
        return qs


site.register_plugin(ModelPermissionPlugin, ModelAdminView)
示例#10
0
class DetailsPlugin(BaseAdminPlugin):

    show_detail_fields = []
    show_all_rel_details = True

    def result_item(self, item, obj, field_name, row):
        if hasattr(item.field, 'rel') and isinstance(item.field.rel, models.ManyToOneRel) \
            and (self.show_all_rel_details or (field_name in self.show_detail_fields)):
            rel_obj = getattr(obj, field_name)
            if rel_obj and self.has_model_perm(rel_obj.__class__, 'view'):
                opts = rel_obj._meta
                item_res_uri = reverse('%s:%s_%s_detail' % (self.admin_site.app_name, opts.app_label, opts.module_name), \
                        args=(getattr(rel_obj, opts.pk.attname),))
                if item_res_uri:
                    edit_url = reverse('%s:%s_%s_change' % (self.admin_site.app_name, opts.app_label, opts.module_name), \
                        args=(getattr(rel_obj, opts.pk.attname),))
                    item.btns.append('<a data-res-uri="%s" data-edit-uri="%s" class="details-handler" rel="tooltip" title="%s"><i class="icon-info-sign"></i></a>' \
                        % (item_res_uri, edit_url, _(u'Details of %s' % str(rel_obj))))
        return item

    # Media
    def get_media(self, media):
        if self.show_all_rel_details or self.show_detail_fields:
            media.add_js([self.static('exadmin/js/details.js')])
            media.add_css({'screen': [self.static('exadmin/css/bootstrap-modal.css'), self.static('exadmin/css/form.css')]})
        return media

site.register_plugin(DetailsPlugin, ListAdminView)


示例#11
0
from django.http import HttpResponse
from django.utils import simplejson
from django.utils.html import escape
from exadmin.sites import site
from exadmin.views import BaseAdminPlugin, ModelFormAdminView

class QuickFormPlugin(BaseAdminPlugin):

    def init_request(self, *args, **kwargs):
        if self.request.method == 'GET' and self.request.is_ajax() or self.request.GET.get('_ajax'):
            self.admin_view.add_form_template = 'admin/quick_form.html'
            self.admin_view.change_form_template = 'admin/quick_form.html'

    def get_context(self, context):
        context['form_url'] = self.request.path
        return context

site.register_plugin(QuickFormPlugin, ModelFormAdminView)


示例#12
0
    def do_action_func(self, __):
        def _method():
            self.revision_context_manager.set_user(self.user)
            action_view = self.admin_view
            comment = action_view.description % model_format_dict(self.opts)

            self.revision_context_manager.set_comment(comment)
            return __()
        return _method

    def do_action(self, __, queryset):
        return self.revision_context_manager.create_revision(manage_manually=False)(self.do_action_func(__))()

site.register(Revision)
site.register(Version)

site.register_modelview(r'^recover/$', RecoverListView, name='%s_%s_recoverlist')
site.register_modelview(r'^recover/([^/]+)/$', RecoverView, name='%s_%s_recover')
site.register_modelview(r'^([^/]+)/revision/$', RevisionListView, name='%s_%s_revisionlist')
site.register_modelview(r'^([^/]+)/revision/([^/]+)/$', RevisionView, name='%s_%s_revision')

site.register_plugin(ReversionPlugin, ListAdminView)
site.register_plugin(ReversionPlugin, ModelFormAdminView)
site.register_plugin(ReversionPlugin, DeleteAdminView)

site.register_plugin(InlineRevisionPlugin, InlineModelAdmin)
site.register_plugin(ActionRevisionPlugin, BaseActionView)


示例#13
0
    def post_response(self, response):
        if isinstance(response, basestring) and response != self.admin_urlname('index'):
            return self._get_url(response)
        return response

    def get_context(self, context):
        if context.has_key('delete_url'):
            context['delete_url'] = self._get_url(context['delete_url'])
        return context

    def block_after_fieldsets(self, context, nodes):
        return self._get_input()

class DeleteRelateDisplayPlugin(BaseRelateDisplayPlugin):

    def post_response(self, response):
        if isinstance(response, basestring) and response != self.admin_urlname('index'):
            return self._get_url(response)
        return response

    def block_form_fields(self, context, nodes):
        return self._get_input()

site.register_plugin(RelateMenuPlugin, ListAdminView)
site.register_plugin(ListRelateDisplayPlugin, ListAdminView)
site.register_plugin(EditRelateDisplayPlugin, CreateAdminView)
site.register_plugin(EditRelateDisplayPlugin, UpdateAdminView)
site.register_plugin(DeleteRelateDisplayPlugin, DeleteAdminView)


示例#14
0
        try:
            layout_pos = UserSettings.objects.get(user=self.user, key=self._portal_key()).value
            layout_cs = layout_pos.split('|')
            for i, c in enumerate(cs):
                c.fields = [fs_map.pop(j) for j in layout_cs[i].split(',') if fs_map.has_key(j)] if len(layout_cs) > i else []
            if fs_map and cs:
                cs[0].fields.extend(fs_map.values())
        except Exception:
            pass

        return helper

    def block_form_top(self, context, node):
        # put portal key and submit url to page
        return "<input type='hidden' id='_portal_key' value='%s' />" % self._portal_key()

class ModelDetailPlugin(ModelFormPlugin):

    def _portal_key(self):
        return '%s_%s_detail_portal' % (self.opts.app_label, self.opts.module_name)

    def block_after_fieldsets(self, context, node):
        # put portal key and submit url to page
        return "<input type='hidden' id='_portal_key' value='%s' />" % self._portal_key()

site.register_plugin(ModelFormPlugin, ModelFormAdminView)
site.register_plugin(ModelDetailPlugin, DetailAdminView)


示例#15
0
            attrs['class'] = attrs['class'] + ' select-search'
        attrs['data-search-url'] = self.admin_view.admin_urlname('%s_%s_changelist' % (to_opts.app_label, to_opts.module_name))
        attrs['data-placeholder'] = _('Search for a %s') % to_opts.verbose_name
        if value:
            attrs['data-label'] = self.label_for_value(value)

        return super(ForeignKeySearchWidget, self).render(name, value, attrs)

    def label_for_value(self, value):
        key = self.rel.get_related_field().name
        try:
            obj = self.rel.to._default_manager.using(self.db).get(**{key: value})
            return '%s' % escape(Truncator(obj).words(14, truncate='...'))
        except (ValueError, self.rel.to.DoesNotExist):
            return ""

class RelateFieldPlugin(BaseAdminPlugin):

    def get_field_style(self, attrs, db_field, style, **kwargs):
        # search able fk field
        if style == 'fk-ajax' and isinstance(db_field, models.ForeignKey):
            if (db_field.rel.to in self.admin_view.admin_site._registry) and \
                self.has_model_perm(db_field.rel.to, 'change'):
                db = kwargs.get('using')
                return dict(attrs or {}, widget=ForeignKeySearchWidget(db_field.rel, self.admin_view, using=db))
        return attrs

site.register_plugin(RelateFieldPlugin, ModelFormAdminView)


示例#16
0
                "admin/blocks/topnav.html", {"search_models": search_models, "search_name": SEARCH_VAR}
            )
        )

    def block_top_nav_btn(self, context, nodes):

        add_models = []

        site_name = self.admin_site.name
        models = self.globe_add_models or self.admin_site._registry.keys()

        for model in models:
            app_label = model._meta.app_label

            if self.has_model_perm(model, "add"):
                info = (app_label, model._meta.module_name)
                try:
                    add_models.append(
                        {
                            "title": _("Add %s") % capfirst(model._meta.verbose_name),
                            "url": reverse("admin:%s_%s_add" % info, current_app=site_name),
                            "model": model,
                        }
                    )
                except NoReverseMatch:
                    pass
        nodes.append(loader.render_to_string("admin/blocks/topnav.html", {"add_models": add_models}))


site.register_plugin(TopNavPlugin, CommAdminView)
示例#17
0
            result['errors'] = JsonErrorDict(form.errors, form).as_json()

        return self.render_response(result)

class AjaxDetailPlugin(BaseAdminPlugin):

    def get_response(self, __):
        if not (self.request.is_ajax() or self.request.GET.get('_ajax')):
            return __()

        if self.request.GET.get('_format') == 'html':
            self.admin_view.detail_template = 'admin/quick_detail.html'
            return __()

        form = self.admin_view.form_obj
        layout = form.helper.layout

        results = []

        for p, f in layout.get_field_names():
            result = self.admin_view.get_field_result(f)
            results.append((result.label, result.val))

        return self.render_response(SortedDict(results))

site.register_plugin(AjaxListPlugin, ListAdminView)
site.register_plugin(AjaxFormPlugin, ModelFormAdminView)
site.register_plugin(AjaxDetailPlugin, DetailAdminView)


示例#18
0
    def get_action(self, action):
        if not issubclass(action, BaseActionView) or not action.has_perm(self.admin_view):
            return None
        return action, getattr(action, "action_name"), getattr(action, "description")

    # View Methods
    def result_header(self, item, field_name, row):
        if item.attr and field_name == "action_checkbox":
            item.classes.append("action-checkbox-column")
        return item

    def result_item(self, item, obj, field_name, row):
        if item.field is None and field_name == u"action_checkbox":
            item.classes.append("action-checkbox")
        return item

    # Media
    def get_media(self, media):
        if self.actions and self.admin_view.result_count:
            media.add_js([self.static("exadmin/js/actions.js")])
        return media

    # Block Views
    def block_results_bottom(self, context, nodes):
        if self.actions and self.admin_view.result_count:
            nodes.append(loader.render_to_string("admin/actions.html", context_instance=context))


site.register_plugin(ActionPlugin, ListAdminView)
示例#19
0
        pk = getattr(self.org_obj, self.org_obj._meta.pk.attname)
        model_fields = [str(pk) + '-' + f.name for f in self.opts.fields]
        fields = [f[len(str(pk)) + 1:] for f in request.POST.keys() if f in model_fields]

        defaults = {
            "form": forms.ModelForm,
            "fields": fields,
            "formfield_callback": self.formfield_for_dbfield,
        }
        form_class = modelform_factory(self.model, **defaults)
        form = form_class(instance=self.org_obj, data=request.POST, files=request.FILES)
        form.prefix = str(pk)

        result = {}
        if form.is_valid():
            form.save(commit=True)
            result['result'] = 'success'
            result['new_data'] = form.cleaned_data
            result['new_html'] = dict([(f, self.get_new_field_html(f)) for f in fields])
        else:
            result['result'] = 'error'
            result['errors'] = JsonErrorDict(form.errors, form).as_json()

        return self.render_response(result)

site.register_plugin(EditablePlugin, ListAdminView)
site.register_modelview(r'^(.+)/patch/$', EditPatchView, name='%s_%s_patch')


示例#20
0
    # Media
    def get_media(self, media):
        if bool(filter(lambda s: isinstance(s, DateFieldListFilter), self.filter_specs)):
            media.add_js([self.static('exadmin/js/date.js')])
            media.add_js([self.static('exadmin/js/daterangepicker.js')])
            media.add_js([self.static('exadmin/js/bootstrap-datepicker.js')])
            media.add_css({'screen': [self.static('exadmin/css/daterangepicker.css')]})
        if bool(filter(lambda s: isinstance(s, RelatedFieldSearchFilter), self.filter_specs)):
            media.add_js([self.static('exadmin/js/select2.js')])
            media.add_js([self.static('exadmin/js/form.js')])
            media.add_css({'screen': [self.static('exadmin/css/select2.css')]})
        media.add_js([self.static('exadmin/js/filters.js')])
        return media

    # Block Views
    def block_nav_menu(self, context, nodes):
        if self.has_filters:
            nodes.append(loader.render_to_string('admin/filters.html', context_instance=context))

    def block_nav_form(self, context, nodes):
        if self.search_fields:
            nodes.append(loader.render_to_string('admin/blocks/search_form.html', \
                {'search_var': SEARCH_VAR, 
                'remove_search_url': self.admin_view.get_query_string(remove=[SEARCH_VAR]),
                'search_form_params': self.admin_view.get_form_params(remove=[SEARCH_VAR])}, \
                context_instance=context))

site.register_plugin(FilterPlugin, ListAdminView)