def get_field_by_path(model, field_path): """ get a Model class or instance and a path to a attribute, returns the field object :param model: :class:`django.db.models.Model` :param field_path: string path to the field :return: :class:`django.db.models.Field` >>> from django.contrib.auth.models import Permission >>> p = Permission(name='perm') >>> get_field_by_path(Permission, 'content_type').name 'content_type' >>> p = Permission(name='perm') >>> get_field_by_path(p, 'content_type.app_label').name 'app_label' """ parts = field_path.split('.') target = parts[0] if target in get_all_field_names(model): field_object, model, direct, m2m = get_field_by_name(model, target) if isinstance(field_object, models.fields.related.ForeignKey): if parts[1:]: return get_field_by_path(field_object.related_model, '.'.join(parts[1:])) else: return field_object else: return field_object return None
def _clean_fields(self): for name, field in list(self.fields.items()): raw_value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name)) try: if isinstance(field, ff.FileField): initial = self.initial.get(name, field.initial) value = field.clean(raw_value, initial) else: enabler = 'chk_id_%s' % name function = self.data.get('func_id_%s' % name, False) if self.data.get(enabler, False): # field_object, model, direct, m2m = self._meta.model._meta.get_field_by_name(name) field_object, model, direct, m2m = get_field_by_name(self._meta.model, name) value = field.clean(raw_value) if function: func, hasparm, __, __ = OPERATIONS.get_for_field(field_object)[function] if func is None: pass elif hasparm: value = curry(func, value) else: value = func self.cleaned_data[name] = value if hasattr(self, 'clean_%s' % name): value = getattr(self, 'clean_%s' % name)() self.cleaned_data[name] = value except ValidationError as e: self._errors[name] = self.error_class(e.messages) if name in self.cleaned_data: del self.cleaned_data[name]
def get_field_by_path(model, field_path): """ get a Model class or instance and a path to a attribute, returns the field object :param model: :class:`django.db.models.Model` :param field_path: string path to the field :return: :class:`django.db.models.Field` >>> from django.contrib.auth.models import Permission >>> p = Permission(name='perm') >>> f = get_field_by_path(Permission, 'content_type') >>> print f auth.Permission.content_type >>> p = Permission(name='perm') >>> f = get_field_by_path(p, 'content_type.app_label') >>> print f contenttypes.ContentType.app_label """ parts = field_path.split('.') target = parts[0] if target in get_all_field_names(model): field_object, model, direct, m2m = get_field_by_name(model, target) if isinstance(field_object, models.fields.related.ForeignKey): if parts[1:]: return get_field_by_path(field_object.rel.to, '.'.join(parts[1:])) else: return field_object else: return field_object return None
def _clean_fields(self): for name, field in list(self.fields.items()): raw_value = field.widget.value_from_datadict( self.data, self.files, self.add_prefix(name)) try: if isinstance(field, ff.FileField): initial = self.initial.get(name, field.initial) value = field.clean(raw_value, initial) else: enabler = 'chk_id_%s' % name function = self.data.get('func_id_%s' % name, False) if self.data.get(enabler, False): # field_object, model, direct, m2m = self._meta.model._meta.get_field_by_name(name) field_object, model, direct, m2m = get_field_by_name( self._meta.model, name) value = field.clean(raw_value) if function: func, hasparm, __, __ = OPERATIONS.get_for_field( field_object)[function] if func is None: pass elif hasparm: value = curry(func, value) else: value = func self.cleaned_data[name] = value if hasattr(self, 'clean_%s' % name): value = getattr(self, 'clean_%s' % name)() self.cleaned_data[name] = value except ValidationError as e: self._errors[name] = self.error_class(e.messages) if name in self.cleaned_data: del self.cleaned_data[name]
def field_function(model, form_field): model_object, model, direct, m2m = get_field_by_name(model, form_field.name) attrs = {"class": "func_select"} options_attrs = {} choices = [] classes = {True: "param", False: "noparam"} for label, (__, param, enabler, __) in list(OPERATIONS.get_for_field(model_object).items()): options_attrs[label] = {"class": classes[param], "label": label} choices.append((label, label)) return SelectOptionsAttribute(attrs, choices, options_attrs).render("func_id_%s" % form_field.name, "")
def field_function(model, form_field): model_object, model, direct, m2m = get_field_by_name( model, form_field.name) attrs = {'class': 'func_select'} options_attrs = {} choices = [] classes = {True: 'param', False: 'noparam'} for label, (__, param, enabler, __) in list(OPERATIONS.get_for_field(model_object).items()): options_attrs[label] = {'class': classes[param], 'label': label} choices.append((label, label)) return SelectOptionsAttribute(attrs, choices, options_attrs).render( "func_id_%s" % form_field.name, "")
def _get_qs_formats(queryset): formats = {} if hasattr(queryset, 'model'): for i, fieldname in enumerate(fields): try: f, __, __, __, = compat.get_field_by_name(queryset.model, fieldname) fmt = xls_options_default.get(f.name, xls_options_default.get(f.__class__.__name__, 'general')) formats[i] = fmt except FieldDoesNotExist: pass # styles[i] = xlwt.easyxf(num_format_str=xls_options_default.get(col_class, 'general')) # styles[i] = xls_options_default.get(col_class, 'general') return formats
def test_get_verbose_name(): from django.contrib.auth.models import User, Permission user = User() p = Permission() assert six.text_type(get_verbose_name(user, 'username')) == 'username' assert six.text_type(get_verbose_name(User, 'username')) == 'username' assert six.text_type(get_verbose_name(User.objects.all(), 'username')) == 'username' assert six.text_type(get_verbose_name(User.objects, 'username')) == 'username' assert six.text_type(get_verbose_name(User.objects, get_field_by_name(user, 'username')[0])) == 'username' assert six.text_type(get_verbose_name(p, 'content_type.model')) == 'python model class name' with pytest.raises(ValueError): get_verbose_name(object, 'aaa')
def test_get_verbose_name(): from django.contrib.auth.models import Permission, User user = User() p = Permission() assert get_verbose_name(user, 'username') == 'username' assert get_verbose_name(User, 'username') == 'username' assert get_verbose_name(User.objects.all(), 'username') == 'username' assert get_verbose_name(User.objects, 'username') == 'username' assert get_verbose_name(User.objects, get_field_by_name(user, 'username')[0]) == 'username' assert get_verbose_name(p, 'content_type.model') == 'python model class name' with pytest.raises(ValueError): get_verbose_name(object, 'aaa') with pytest.raises(ValueError): get_verbose_name(p, None)
def graph_queryset(modeladmin, request, queryset): # noqa opts = modeladmin.model._meta perm = "{0}.{1}".format(opts.app_label.lower(), get_permission_codename('adminactions_chart', opts)) if not request.user.has_perm(perm): messages.error(request, _('Sorry you do not have rights to execute this action')) return MForm = graph_form_factory(modeladmin.model) graph_type = table = None extra = '{}' try: adminaction_requested.send(sender=modeladmin.model, action='graph_queryset', request=request, queryset=queryset, modeladmin=modeladmin) except ActionInterrupted as e: messages.error(request, str(e)) return if 'apply' in request.POST: form = MForm(request.POST) if form.is_valid(): try: adminaction_start.send(sender=modeladmin.model, action='graph_queryset', request=request, queryset=queryset, modeladmin=modeladmin, form=form) except ActionInterrupted as e: messages.error(request, str(e)) return try: x = form.cleaned_data['axes_x'] # y = form.cleaned_data['axes_y'] graph_type = form.cleaned_data['graph_type'] field, model, direct, m2m = get_field_by_name(modeladmin.model, x) cc = queryset.values_list(x).annotate(Count(x)).order_by() if isinstance(field, ForeignKey): data_labels = [] for value, cnt in cc: data_labels.append(str(field.rel.to.objects.get(pk=value))) elif isinstance(field, BooleanField): data_labels = [str(l) for l, v in cc] elif hasattr(modeladmin.model, 'get_%s_display' % field.name): data_labels = [] for value, cnt in cc: data_labels.append(smart_text(dict(field.flatchoices).get(value, value), strings_only=True)) else: data_labels = [str(l) for l, v in cc] data = [v for l, v in cc] if graph_type == 'BarChart': table = [data] extra = """{seriesDefaults:{renderer:$.jqplot.BarRenderer, rendererOptions: {fillToZero: true, barDirection: 'horizontal'}, shadowAngle: -135, }, series:[%s], axes: {yaxis: {renderer: $.jqplot.CategoryAxisRenderer, ticks: %s}, xaxis: {pad: 1.05, tickOptions: {formatString: '%%d'}} } }""" % (json.dumps(data_labels), json.dumps(data_labels)) elif graph_type == 'PieChart': table = [list(zip(data_labels, data))] extra = """{seriesDefaults: {renderer: jQuery.jqplot.PieRenderer, rendererOptions: {fill: true, showDataLabels: true, sliceMargin: 4, lineWidth: 5}}, legend: {show: true, location: 'e'}}""" except Exception as e: messages.error(request, 'Unable to produce valid data: %s' % str(e)) else: adminaction_end.send(sender=modeladmin.model, action='graph_queryset', request=request, queryset=queryset, modeladmin=modeladmin, form=form) elif request.method == 'POST': # total = queryset.all().count() initial = {helpers.ACTION_CHECKBOX_NAME: request.POST.getlist(helpers.ACTION_CHECKBOX_NAME), 'select_across': request.POST.get('select_across', 0)} form = MForm(initial=initial) else: initial = {helpers.ACTION_CHECKBOX_NAME: request.POST.getlist(helpers.ACTION_CHECKBOX_NAME), 'select_across': request.POST.get('select_across', 0)} form = MForm(initial=initial) adminForm = helpers.AdminForm(form, modeladmin.get_fieldsets(request), {}, [], model_admin=modeladmin) media = modeladmin.media + adminForm.media ctx = {'adminform': adminForm, 'action': 'graph_queryset', 'opts': modeladmin.model._meta, 'action_short_description': graph_queryset.short_description, 'title': u"%s (%s)" % ( graph_queryset.short_description.capitalize(), smart_text(modeladmin.opts.verbose_name_plural), ), 'app_label': queryset.model._meta.app_label, 'media': media, 'extra': extra, 'as_json': json.dumps(table), 'graph_type': graph_type} if django.VERSION[:2] > (1, 7): ctx.update(modeladmin.admin_site.each_context(request)) else: ctx.update(modeladmin.admin_site.each_context()) return render_to_response('adminactions/charts.html', RequestContext(request, ctx))
def graph_queryset(modeladmin, request, queryset): # noqa opts = modeladmin.model._meta perm = "{0}.{1}".format( opts.app_label.lower(), get_permission_codename('adminactions_chart', opts)) if not request.user.has_perm(perm): messages.error( request, _('Sorry you do not have rights to execute this action')) return MForm = graph_form_factory(modeladmin.model) graph_type = table = None extra = '{}' try: adminaction_requested.send(sender=modeladmin.model, action='graph_queryset', request=request, queryset=queryset, modeladmin=modeladmin) except ActionInterrupted as e: messages.error(request, str(e)) return if 'apply' in request.POST: form = MForm(request.POST) if form.is_valid(): try: adminaction_start.send(sender=modeladmin.model, action='graph_queryset', request=request, queryset=queryset, modeladmin=modeladmin, form=form) except ActionInterrupted as e: messages.error(request, str(e)) return try: x = form.cleaned_data['axes_x'] # y = form.cleaned_data['axes_y'] graph_type = form.cleaned_data['graph_type'] field, model, direct, m2m = get_field_by_name( modeladmin.model, x) cc = queryset.values_list(x).annotate(Count(x)).order_by() if isinstance(field, ForeignKey): data_labels = [] for value, cnt in cc: data_labels.append( str(field.rel.to.objects.get(pk=value))) elif isinstance(field, BooleanField): data_labels = [str(l) for l, v in cc] elif hasattr(modeladmin.model, 'get_%s_display' % field.name): data_labels = [] for value, cnt in cc: data_labels.append( smart_text(dict(field.flatchoices).get( value, value), strings_only=True)) else: data_labels = [str(l) for l, v in cc] data = [v for l, v in cc] if graph_type == 'BarChart': table = [data] extra = """{seriesDefaults:{renderer:$.jqplot.BarRenderer, rendererOptions: {fillToZero: true, barDirection: 'horizontal'}, shadowAngle: -135, }, series:[%s], axes: {yaxis: {renderer: $.jqplot.CategoryAxisRenderer, ticks: %s}, xaxis: {pad: 1.05, tickOptions: {formatString: '%%d'}} } }""" % (json.dumps(data_labels), json.dumps(data_labels)) elif graph_type == 'PieChart': table = [list(zip(data_labels, data))] extra = """{seriesDefaults: {renderer: jQuery.jqplot.PieRenderer, rendererOptions: {fill: true, showDataLabels: true, sliceMargin: 4, lineWidth: 5}}, legend: {show: true, location: 'e'}}""" except Exception as e: messages.error(request, 'Unable to produce valid data: %s' % str(e)) else: adminaction_end.send(sender=modeladmin.model, action='graph_queryset', request=request, queryset=queryset, modeladmin=modeladmin, form=form) elif request.method == 'POST': # total = queryset.all().count() initial = { helpers.ACTION_CHECKBOX_NAME: request.POST.getlist(helpers.ACTION_CHECKBOX_NAME), 'select_across': request.POST.get('select_across', 0) } form = MForm(initial=initial) else: initial = { helpers.ACTION_CHECKBOX_NAME: request.POST.getlist(helpers.ACTION_CHECKBOX_NAME), 'select_across': request.POST.get('select_across', 0) } form = MForm(initial=initial) adminForm = helpers.AdminForm(form, modeladmin.get_fieldsets(request), {}, [], model_admin=modeladmin) media = modeladmin.media + adminForm.media ctx = { 'adminform': adminForm, 'action': 'graph_queryset', 'opts': modeladmin.model._meta, 'action_short_description': graph_queryset.short_description, 'title': u"%s (%s)" % ( graph_queryset.short_description.capitalize(), smart_text(modeladmin.opts.verbose_name_plural), ), 'app_label': queryset.model._meta.app_label, 'media': media, 'extra': extra, 'as_json': json.dumps(table), 'graph_type': graph_type } if django.VERSION[:2] > (1, 7): ctx.update(modeladmin.admin_site.each_context(request)) else: ctx.update(modeladmin.admin_site.each_context()) return render_to_response('adminactions/charts.html', RequestContext(request, ctx))