formset = inline.instance_form(extra=0, max_num=0, can_delete=0) formset.detail_page = True if True: replace_field_to_value(formset.helper.layout, inline) 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 = 'nadmin/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(SortedDict(results)) site.register_plugin(AjaxListPlugin, ListAdminView) site.register_plugin(AjaxFormPlugin, ModelFormAdminView) site.register_plugin(AjaxDetailPlugin, DetailAdminView)
nodes.append(loader.render_to_string('nadmin/blocks/comm.top.topnav.html', {'search_models': search_models, 'search_name': SEARCH_VAR})) def block_top_navmenu(self, context, nodes): add_models = [] 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('nadmin:%s_%s_add' % info, current_app=site_name), 'model': model }) except NoReverseMatch: pass nodes.append( loader.render_to_string('nadmin/blocks/comm.top.topnav.html', {'add_models': add_models})) site.register_plugin(TopNavPlugin, CommAdminView)
has_view_perm = self.admin_view.has_model_perm(rel_obj.__class__, 'view') has_change_perm = self.has_model_perm(rel_obj.__class__, 'change') if rel_obj and has_view_perm: opts = rel_obj._meta try: 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('nadmin.plugin.details.js', 'nadmin.form.css') return media site.register_plugin(DetailsPlugin, ListAdminView)
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): if (
@filter_hook @csrf_protect_m @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')
from django.conf import settings from django.template import loader, RequestContext from nadmin.sites import site from nadmin.views import BaseAdminPlugin, CommAdminView class SetLangNavPlugin(BaseAdminPlugin): def block_top_navmenu(self, context, nodes): nodes.append( loader.render_to_string('nadmin/blocks/comm.top.setlang.html', { 'redirect_to': self.request.get_full_path(), }, context_instance=RequestContext(self.request))) if settings.LANGUAGES and 'django.middleware.locale.LocaleMiddleware' in settings.MIDDLEWARE_CLASSES: site.register_plugin(SetLangNavPlugin, CommAdminView) site.register_view(r'^i18n/', lambda site: 'django.conf.urls.i18n', 'i18n')
return active 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('nadmin/blocks/model_list.top_toolbar.layouts.html', context_instance=context)) site.register_plugin(GridLayoutPlugin, ListAdminView)
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(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("nadmin/blocks/model_form.before_fieldsets.wizard.html", context_instance=context) ) def block_submit_line(self, context, nodes): context.update(dict(self.storage.extra_data)) context["wizard"] = {"steps": self.steps} nodes.append( loader.render_to_string("nadmin/blocks/model_form.submit_line.wizard.html", context_instance=context) ) site.register_plugin(WizardFormPlugin, ModelFormAdminView)
model = Version extra = 0 style = 'accordion' class ReversionAdmin(object): 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)
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) site.register_plugin(ChartsPlugin, ListAdminView) site.register_modelview(r'^chart/(.+)/$', ChartsView, name='%s_%s_chart')
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 "" @property def media(self): return vendor('select.js', 'select.css', 'nadmin.widget.select.js') 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, 'view'): 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)
def get_response(self, response, context, *args, **kwargs): file_type = self.request.GET.get('export_type', 'csv') 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.maxint 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)
{'name': _(u"Bootstrap2"), 'description': _(u"Bootstrap 2.x theme"), 'css': self.bootstrap2_theme}] select_css = context.get('site_theme', self.default_theme) if self.user_themes: themes.extend(self.user_themes) if self.use_bootswatch: ex_themes = cache.get(THEME_CACHE_KEY) if ex_themes: themes.extend(json.loads(ex_themes)) else: ex_themes = [] try: watch_themes = json.loads(urllib.urlopen( 'http://api.bootswatch.com/3/').read())['themes'] ex_themes.extend([ {'name': t['name'], 'description': t['description'], 'css': t['cssMin'], 'thumbnail': t['thumbnail']} for t in watch_themes]) except Exception: pass cache.set(THEME_CACHE_KEY, json.dumps(ex_themes), 24 * 3600) themes.extend(ex_themes) nodes.append(loader.render_to_string('nadmin/blocks/comm.top.theme.html', {'themes': themes, 'select_css': select_css})) site.register_plugin(ThemePlugin, BaseAdminView)
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 j in fs_map] 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.model_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)
form.save(**opts) context = super(ResetPasswordSendView, self).get_context() return TemplateResponse(request, self.password_reset_done_template, context, current_app=self.admin_site.name) else: return self.get(request, form=form) site.register_view(r'^nadmin/password_reset/$', ResetPasswordSendView, name='nadmin_password_reset') class ResetLinkPlugin(BaseAdminPlugin): def block_form_bottom(self, context, nodes): reset_link = self.get_admin_url('nadmin_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 = 'nadmin/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, token, template_name=self.password_reset_confirm_template, token_generator=self.password_reset_token_generator,
return item def _get_aggregate_row(self): queryset = self.admin_view.list_queryset._clone() 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): media.add_css({"screen": [self.static("nadmin/css/nadmin.plugin.aggregation.css")]}) return media site.register_plugin(AggregationPlugin, ListAdminView)
def post_response(self, response): if isinstance(response, basestring) 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, basestring) 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)
from nadmin.sites import site from nadmin.views import BaseAdminPlugin, CommAdminView BUILDIN_STYLES = { 'default': 'nadmin/includes/sitemenu_default.html', 'accordion': 'nadmin/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)