def build_attrs(self, attrs={}, **kwargs): attrs = super(ForeignKeySelectWidget, self).build_attrs(attrs, **kwargs) if "class" not in attrs: attrs['class'] = 'select-preload' else: attrs['class'] = attrs['class'] + ' select-preload' attrs['data-placeholder'] = _( 'Select %s') % self.rel.model._meta.verbose_name return attrs class RelateFieldPlugin(BaseAdminPlugin): def get_field_style(self, attrs, db_field, style, **kwargs): # search able fk field if style in ('fk-ajax', 'fk-select') and isinstance( db_field, models.ForeignKey): if (db_field.remote_field.to in self.admin_view.admin_site._registry) and \ self.has_model_perm(db_field.remote_field.to, 'view'): db = kwargs.get('using') return dict( attrs or {}, widget=(style == 'fk-ajax' and ForeignKeySearchWidget or ForeignKeySelectWidget)(db_field.remote_field, self.admin_view, using=db)) return attrs site.register_plugin(RelateFieldPlugin, ModelFormAdminView)
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')
def result_item(self, item, obj, field_name, row): if self._current_layout == 'thumbnails': if getattr(item.attr, 'is_column', True): item.field_label = label_for_field(field_name, self.model, model_admin=self.admin_view, return_attr=False) if getattr(item.attr, 'thumbnail_img', False): setattr(item, 'thumbnail_hidden', True) row['thumbnail_img'] = item elif item.is_display_link: setattr(item, 'thumbnail_hidden', True) row['thumbnail_label'] = item return item # Block Views def block_top_toolbar(self, context, nodes): if len(self._active_layouts) > 1: context.update({ 'layouts': self._active_layouts, 'current_icon': self._current_icon, }) nodes.append( loader.render_to_string( 'xadmin/blocks/model_list.top_toolbar.layouts.html', context=get_context_dict(context))) site.register_plugin(GridLayoutPlugin, ListAdminView)
the current step will be used to get the index. """ if step is None: step = self.steps.current obj = self.get_form_list().keys() obj = [s for s in obj] return obj.index(step) def block_before_fieldsets(self, context, nodes): context = context.update(dict(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( 'xadmin/blocks/model_form.before_fieldsets.wizard.html', context)) def block_submit_line(self, context, nodes): context = context.update(dict(self.storage.extra_data)) context['wizard'] = { 'steps': self.steps } nodes.append(loader.render_to_string( 'xadmin/blocks/model_form.submit_line.wizard.html', context)) site.register_plugin(WizardFormPlugin, ModelFormAdminView)
#coding:utf-8 from extra_app.xadmin import site from extra_app.xadmin import BaseAdminPlugin, CommAdminView class MobilePlugin(BaseAdminPlugin): def _test_mobile(self): try: return self.request.META['HTTP_USER_AGENT'].find('Android') >= 0 or \ self.request.META['HTTP_USER_AGENT'].find('iPhone') >= 0 except Exception: return False def init_request(self, *args, **kwargs): return self._test_mobile() def get_context(self, context): #context['base_template'] = 'xadmin/base_mobile.html' context['is_mob'] = True return context # Media # def get_media(self, media): # return media + self.vendor('xadmin.mobile.css', ) def block_extrahead(self, context, nodes): nodes.append('<script>window.__admin_ismobile__ = true;</script>') site.register_plugin(MobilePlugin, CommAdminView)
def get_media(self, media): if self.is_list_sortable: media = media + self.vendor('xadmin.plugin.sortablelist.js') return media class SaveOrderView(ModelAdminView): @csrf_protect_m @transaction.atomic def post(self, request): order_objs = request.POST.getlist("order[]") for order_value, pk in enumerate(order_objs, start=1): self.save_order(pk, order_value) return self.render_response({}) def save_order(self, pk, order_value): obj = self.model.objects.get(pk=pk) order_field = self.list_order_field is_order_changed = lambda x: getattr(x, order_field) != order_value if is_order_changed(obj): setattr(obj, order_field, order_value) obj.save() site.register_plugin(SortableListPlugin, ListAdminView) site.register_modelview(r'^save-order/$', SaveOrderView, name='%s_%s_save_order')
}, '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) site.register_plugin(ChartsPlugin, ListAdminView) site.register_modelview(r'^chart/(.+)/$', ChartsView, name='%s_%s_chart')
response = HttpResponse(content_type="%s; charset=UTF-8" % self.export_mimes[file_type]) file_name = self.opts.verbose_name.replace(' ', '_') response['Content-Disposition'] = ( 'attachment; filename=%s.%s' % (file_name, file_type)).encode('utf-8') response.write(getattr(self, 'get_%s_export' % file_type)(context)) return response # View Methods def get_result_list(self, __): if self.request.GET.get('all', 'off') == 'on': self.admin_view.list_per_page = sys.maxsize return __() def result_header(self, item, field_name, row): item.export = not item.attr or field_name == '__str__' or getattr( item.attr, 'allow_export', True) return item def result_item(self, item, obj, field_name, row): item.export = item.field or field_name == '__str__' or getattr( item.attr, 'allow_export', True) return item site.register_plugin(ExportMenuPlugin, ListAdminView) site.register_plugin(ExportPlugin, ListAdminView)
site_name = self.admin_site.name if self.global_add_models == None: models = self.admin_site._registry.keys() else: models = self.global_add_models for model in models: app_label = model._meta.app_label if self.has_model_perm(model, "add"): info = (app_label, model._meta.model_name) try: add_models.append({ 'title': _('Add %s') % capfirst(model._meta.verbose_name), 'url': reverse('xadmin:%s_%s_add' % info, current_app=site_name), 'model': model }) except NoReverseMatch: pass nodes.append( loader.render_to_string('xadmin/blocks/comm.top.topnav.html', {'add_models': add_models})) site.register_plugin(TopNavPlugin, CommAdminView)
return self.get(request, form=form) site.register_view(r'^xadmin/password_reset/$', ResetPasswordSendView, name='xadmin_password_reset') class ResetLinkPlugin(BaseAdminPlugin): def block_form_bottom(self, context, nodes): reset_link = self.get_admin_url('xadmin_password_reset') return '<div class="text-info" style="margin-top:15px;"><a href="%s"><i class="fa fa-question-sign"></i> %s</a></div>' % ( reset_link, _('Forgotten your password or username?')) site.register_plugin(ResetLinkPlugin, LoginView) class ResetPasswordComfirmView(BaseAdminView): need_site_permission = False password_reset_set_form = SetPasswordForm password_reset_confirm_template = 'xadmin/auth/password_reset/confirm.html' password_reset_token_generator = default_token_generator def do_view(self, request, uidb36, token, *args, **kwargs): context = super(ResetPasswordComfirmView, self).get_context() return password_reset_confirm( request, uidb36,
from extra_app.xadmin import site from extra_app.xadmin import BaseAdminPlugin, CommAdminView BUILDIN_STYLES = { 'default': 'xadmin/includes/sitemenu_default.html', 'accordion': 'xadmin/includes/sitemenu_accordion.html', } class SiteMenuStylePlugin(BaseAdminPlugin): menu_style = None def init_request(self, *args, **kwargs): return bool(self.menu_style) and self.menu_style in BUILDIN_STYLES def get_context(self, context): context['menu_template'] = BUILDIN_STYLES[self.menu_style] return context site.register_plugin(SiteMenuStylePlugin, CommAdminView)
from django.conf import settings from django.template import loader from django.views.i18n import set_language from extra_app.xadmin.plugins.utils import get_context_dict from extra_app.xadmin import site from extra_app.xadmin import BaseAdminPlugin, CommAdminView, BaseAdminView class SetLangNavPlugin(BaseAdminPlugin): def block_top_navmenu(self, context, nodes): context = get_context_dict(context) context['redirect_to'] = self.request.get_full_path() nodes.append(loader.render_to_string('xadmin/blocks/comm.top.setlang.html', context=context)) class SetLangView(BaseAdminView): def post(self, request, *args, **kwargs): if 'nav_menu' in request.session: del request.session['nav_menu'] return set_language(request) if settings.LANGUAGES and 'django.middleware.locale.LocaleMiddleware' in settings.MIDDLEWARE: site.register_plugin(SetLangNavPlugin, CommAdminView) site.register_view(r'^i18n/setlang/$', SetLangView, 'set_language')
if isinstance(response, str) and response != self.get_admin_url('index'): return self._get_url(response) return response def get_context(self, context): if 'delete_url' in context: 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, str) and response != self.get_admin_url('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)
media = media + self.vendor('xadmin.plugin.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( 'xadmin/blocks/model_list.top_toolbar.refresh.html', get_context_dict(context))) site.register_plugin(RefreshPlugin, ListAdminView)
resp, content = h.request( "https://bootswatch.com/api/3.json", 'GET', '', headers={ "Accept": "application/json", "User-Agent": self.request.META['HTTP_USER_AGENT'] }) content = content.decode() watch_themes = json.loads(content)['themes'] ex_themes.extend([{ 'name': t['name'], 'description': t['description'], 'css': t['cssMin'], 'thumbnail': t['thumbnail'] } for t in watch_themes]) except Exception as e: print(e) cache.set(THEME_CACHE_KEY, json.dumps(ex_themes), 24 * 3600) themes.extend(ex_themes) nodes.append( loader.render_to_string('xadmin/blocks/comm.top.theme.html', { 'themes': themes, 'select_css': select_css })) site.register_plugin(ThemePlugin, BaseAdminView)
item_res_uri = reverse( '%s:%s_%s_detail' % (self.admin_site.app_name, opts.app_label, opts.model_name), args=(getattr(rel_obj, opts.pk.attname), )) if item_res_uri: if has_change_perm: edit_url = reverse( '%s:%s_%s_change' % (self.admin_site.app_name, opts.app_label, opts.model_name), args=(getattr(rel_obj, opts.pk.attname), )) else: edit_url = '' item.btns.append( '<a data-res-uri="%s" data-edit-uri="%s" class="details-handler" rel="tooltip" title="%s"><i class="fa fa-info-circle"></i></a>' % (item_res_uri, edit_url, _(u'Details of %s') % str(rel_obj))) except NoReverseMatch: pass return item # Media def get_media(self, media): if self.show_all_rel_details or self.show_detail_fields: media = media + self.vendor('xadmin.plugin.details.js', 'xadmin.form.css') return media site.register_plugin(DetailsPlugin, ListAdminView)
@transaction.atomic def post(self, request, object_id): model_fields = [f.name for f in self.opts.fields] fields = [f for f in request.POST.keys() if f in model_fields] defaults = { "form": self.form, "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) 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')
def block_extrabody(self, context, node): if self.include_image: return get_gallery_modal() class ModelListPlugin(BaseAdminPlugin): list_gallery = False def init_request(self, *args, **kwargs): return bool(self.list_gallery) # Media def get_media(self, media): return media + self.vendor('image-gallery.js', 'image-gallery.css') def block_results_top(self, context, node): return '<div id="gallery" data-toggle="modal-gallery" data-target="#modal-gallery">' def block_results_bottom(self, context, node): return "</div>" def block_extrabody(self, context, node): return get_gallery_modal() site.register_plugin(ModelDetailPlugin, DetailAdminView) site.register_plugin(ModelDetailPlugin, ModelFormAdminView) site.register_plugin(ModelListPlugin, ListAdminView)
model = inline.model opts = model._meta fake_admin_class = type( str('%s%sFakeAdmin' % (opts.app_label, opts.model_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 class DetailAdminUtil(DetailAdminView): def init_request(self, obj): self.obj = obj self.org_obj = obj class DetailInlineFormsetPlugin(InlineFormsetPlugin): def get_model_form(self, form, **kwargs): self.formsets = [ self._get_detail_formset_instance(inline) for inline in self.inline_instances ] return form site.register_plugin(InlineFormsetPlugin, ModelFormAdminView) site.register_plugin(DetailInlineFormsetPlugin, DetailAdminView)
if form.is_valid(): result['result'] = 'success' else: result['result'] = 'error' result['errors'] = JsonErrorDict(form.errors, form).as_json() return self.render_response(result) class AjaxDetailPlugin(BaseAjaxPlugin): def get_response(self, __): if self.request.GET.get('_format') == 'html': self.admin_view.detail_template = 'xadmin/views/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(OrderedDict(results)) site.register_plugin(AjaxListPlugin, ListAdminView) site.register_plugin(AjaxFormPlugin, ModelFormAdminView) site.register_plugin(AjaxDetailPlugin, DetailAdminView)
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 'data' in datas: if hasattr(datas['data'], '_mutable') and not datas['data']._mutable: datas['data'] = datas['data'].copy() 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 def get_list_display(self, list_display):
obj = queryset.aggregate(*[ AGGREGATE_METHODS[method](field_name) for field_name, method in self.aggregate_fields.items() if method in AGGREGATE_METHODS ]) row = ResultRow() row['is_display_first'] = False row.cells = [ self._get_field_aggregate(field_name, obj, row) for field_name in self.admin_view.list_display ] row.css_class = 'info aggregate' return row def results(self, rows): if rows: rows.append(self._get_aggregate_row()) return rows # Media def get_media(self, media): return media + Media(css={ 'screen': [ self.static('xadmin/css/xadmin.plugin.aggregation.css'), ] }) site.register_plugin(AggregationPlugin, ListAdminView)
media = media + self.vendor('select.js', 'select.css', 'xadmin.widget.select.js') return media + self.vendor('xadmin.plugin.filters.js') # Block Views def block_nav_menu(self, context, nodes): if self.has_filters: nodes.append( loader.render_to_string( 'xadmin/blocks/model_list.nav_menu.filters.html', context=get_context_dict(context))) def block_nav_form(self, context, nodes): if self.search_fields: context = get_context_dict(context or {}) # no error! context.update({ '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]) }) nodes.append( loader.render_to_string( 'xadmin/blocks/model_list.nav_form.search_form.html', context=context)) site.register_plugin(FilterPlugin, ListAdminView)
return mark_safe(u''.join(output)) def build_attrs(self, extra_attrs=None, **kwargs): "Helper function for building an attribute dictionary." self.attrs = self.widget.build_attrs(extra_attrs=None, **kwargs) return self.attrs def value_from_datadict(self, data, files, name): return self.widget.value_from_datadict(data, files, name) def id_for_label(self, id_): return self.widget.id_for_label(id_) class QuickAddBtnPlugin(BaseAdminPlugin): def formfield_for_dbfield(self, formfield, db_field, **kwargs): if formfield and self.model in self.admin_site._registry and isinstance( db_field, (models.ForeignKey, models.ManyToManyField)): rel_model = get_model_from_relation(db_field) if rel_model in self.admin_site._registry and self.has_model_perm( rel_model, 'add'): add_url = self.get_model_url(rel_model, 'add') formfield.widget = RelatedFieldWidgetWrapper( formfield.widget, db_field.remote_field, add_url, self.get_model_url(self.model, 'add')) return formfield site.register_plugin(QuickFormPlugin, ModelFormAdminView) site.register_plugin(QuickAddBtnPlugin, ModelFormAdminView)
model_icon = 'fa fa-exchange' list_display = ('__str__', 'date_created', 'user', 'comment') list_display_links = ('__str__', ) list_filter = ('date_created', 'user') inlines = [VersionInline] site.register(Revision, ReversionAdmin) 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)