def values(self):
     """
     Returns a list of values for this field for this instance. It's a list
     so we can accomodate many-to-many fields.
     """
     # This import is deliberately inside the function because it causes
     # some settings to be imported, and we don't want to do that at the
     # module level.
     if self.field.rel:
         if isinstance(self.field.rel, models.ManyToOneRel):
             objs = getattr(self.instance.instance, self.field.name)
         elif isinstance(self.field.rel, models.ManyToManyRel): # ManyToManyRel
             return list(getattr(self.instance.instance, self.field.name).all())
     elif self.field.choices:
         objs = dict(self.field.choices).get(self.raw_value, EMPTY_VALUE)
     elif isinstance(self.field, models.DateField) or isinstance(self.field, models.TimeField):
         if self.raw_value:
             if isinstance(self.field, models.DateTimeField):
                 objs = capfirst(formats.date_format(self.raw_value, 'DATETIME_FORMAT'))
             elif isinstance(self.field, models.TimeField):
                 objs = capfirst(formats.time_format(self.raw_value, 'TIME_FORMAT'))
             else:
                 objs = capfirst(formats.date_format(self.raw_value, 'DATE_FORMAT'))
         else:
             objs = EMPTY_VALUE
     elif isinstance(self.field, models.BooleanField) or isinstance(self.field, models.NullBooleanField):
         objs = {True: 'Yes', False: 'No', None: 'Unknown'}[self.raw_value]
     else:
         objs = self.raw_value
     return [objs]
Exemplo n.º 2
0
    def unique_error_message(self, model_class, unique_check):
        opts = model_class._meta
        model_name = capfirst(opts.verbose_name)

        # A unique field
        if len(unique_check) == 1:
            field_name = unique_check[0]
            field = opts.get_field(field_name)
            field_label = capfirst(field.verbose_name)
            # Insert the error into the error dict, very sneaky
            return field.error_messages['unique'] % {
                'model_name': unicode(model_name),
                'field_label': unicode(field_label)
            }
        # unique_together
        else:
            field_labels = map(
                lambda f: capfirst(opts.get_field(f).verbose_name),
                unique_check)
            field_labels = get_text_list(field_labels, _('and'))
            return _(
                u"%(model_name)s with this %(field_label)s already exists."
            ) % {
                'model_name': unicode(model_name),
                'field_label': unicode(field_labels)
            }
    def app_index(self, request, app_label, extra_context=None):
        user = request.user
        has_module_perms = user.has_module_perms(app_label)
        app_dict = {}
        for model, model_admin in self._registry.items():
            if app_label == model._meta.app_label:
                if has_module_perms:
                    perms = model_admin.get_model_perms(request)

                    # Check whether user has any perm for this module.
                    # If so, add the module to the model_list.
                    if True in perms.values():
                        info = (app_label, model._meta.module_name)
                        model_dict = {
                            'name': capfirst(model._meta.verbose_name_plural),
                            'perms': perms,
                        }
                        if perms.get('change', False):
                            try:
                                model_dict['admin_url'] = reverse(
                                    'admin:%s_%s_changelist' % info,
                                    current_app=self.name)
                            except NoReverseMatch:
                                pass
                        if perms.get('add', False):
                            try:
                                model_dict['add_url'] = reverse(
                                    'admin:%s_%s_add' % info,
                                    current_app=self.name)
                            except NoReverseMatch:
                                pass
                        if app_dict:
                            app_dict['models'].append(model_dict),
                        else:
                            # First time around, now that we know there's
                            # something to display, add in the necessary meta
                            # information.
                            app_dict = {
                                'name': app_label.title(),
                                'app_url': '',
                                'has_module_perms': has_module_perms,
                                'models': [model_dict],
                            }
        if not app_dict:
            raise Http404('The requested admin page does not exist.')
        # Sort the models alphabetically within each app.
        app_dict['models'].sort(key=lambda x: x['name'])
        context = {
            'title': _('%s administration') % capfirst(app_label),
            'app_list': [app_dict],
        }
        context.update(extra_context or {})

        return TemplateResponse(
            request,
            self.app_index_template
            or ['admin/%s/app_index.html' % app_label, 'admin/app_index.html'],
            context,
            current_app=self.name)
Exemplo n.º 4
0
 def date_error_message(self, lookup_type, field, unique_for):
     opts = self._meta
     return _(
         u"%(field_name)s must be unique for %(date_field)s %(lookup)s."
     ) % {
         'field_name':
         unicode(capfirst(opts.get_field(field).verbose_name)),
         'date_field':
         unicode(capfirst(opts.get_field(unique_for).verbose_name)),
         'lookup':
         lookup_type,
     }
Exemplo n.º 5
0
 def formfield(self, form_class=forms.CharField, **kwargs):
     """
     Returns a my_django.forms.Field instance for this database Field.
     """
     defaults = {'required': not self.blank,
                 'label': capfirst(self.verbose_name),
                 'help_text': self.help_text}
     if self.has_default():
         if callable(self.default):
             defaults['initial'] = self.default
             defaults['show_hidden_initial'] = True
         else:
             defaults['initial'] = self.get_default()
     if self.choices:
         # Fields with choices get special treatment.
         include_blank = (self.blank or
                          not (self.has_default() or 'initial' in kwargs))
         defaults['choices'] = self.get_choices(include_blank=include_blank)
         defaults['coerce'] = self.to_python
         if self.null:
             defaults['empty_value'] = None
         form_class = forms.TypedChoiceField
         # Many of the subclass-specific formfield arguments (min_value,
         # max_value) don't apply for choice fields, so be sure to only pass
         # the values that TypedChoiceField will understand.
         for k in kwargs.keys():
             if k not in ('coerce', 'empty_value', 'choices', 'required',
                          'widget', 'label', 'initial', 'help_text',
                          'error_messages', 'show_hidden_initial'):
                 del kwargs[k]
     defaults.update(kwargs)
     return form_class(**defaults)
    def add_fields(self, form, index):
        super(BaseInlineFormSet, self).add_fields(form, index)
        if self._pk_field == self.fk:
            name = self._pk_field.name
            kwargs = {'pk_field': True}
        else:
            # The foreign key field might not be on the form, so we poke at the
            # Model field to get the label, since we need that for error messages.
            name = self.fk.name
            kwargs = {
                'label':
                getattr(form.fields.get(name), 'label',
                        capfirst(self.fk.verbose_name))
            }
            if self.fk.rel.field_name != self.fk.rel.to._meta.pk.name:
                kwargs['to_field'] = self.fk.rel.field_name

        form.fields[name] = InlineForeignKeyField(self.instance, **kwargs)

        # Add the generated field to form._meta.fields if it's defined to make
        # sure validation isn't skipped on that field.
        if form._meta.fields:
            if isinstance(form._meta.fields, tuple):
                form._meta.fields = list(form._meta.fields)
            form._meta.fields.append(self.fk.name)
Exemplo n.º 7
0
 def formfield(self, **kwargs):
     defaults = {
         'form_class': forms.NullBooleanField,
         'required': not self.blank,
         'label': capfirst(self.verbose_name),
         'help_text': self.help_text}
     defaults.update(kwargs)
     return super(NullBooleanField, self).formfield(**defaults)
    def format_callback(obj):
        has_admin = obj.__class__ in admin_site._registry
        opts = obj._meta

        if has_admin:
            admin_url = reverse(
                '%s:%s_%s_change' %
                (admin_site.name, opts.app_label, opts.object_name.lower()),
                None, (quote(obj._get_pk_val()), ))
            p = '%s.%s' % (opts.app_label, opts.get_delete_permission())
            if not user.has_perm(p):
                perms_needed.add(opts.verbose_name)
            # Display a link to the admin page.
            return mark_safe(
                u'%s: <a href="%s">%s</a>' %
                (escape(capfirst(opts.verbose_name)), admin_url, escape(obj)))
        else:
            # Don't display link to edit, because it either has no
            # admin or is edited inline.
            return u'%s: %s' % (capfirst(
                opts.verbose_name), force_unicode(obj))
def date_hierarchy(cl):
    """
    Displays the date hierarchy for date drill-down functionality.
    """
    if cl.date_hierarchy:
        field_name = cl.date_hierarchy
        year_field = '%s__year' % field_name
        month_field = '%s__month' % field_name
        day_field = '%s__day' % field_name
        field_generic = '%s__' % field_name
        year_lookup = cl.params.get(year_field)
        month_lookup = cl.params.get(month_field)
        day_lookup = cl.params.get(day_field)

        link = lambda d: cl.get_query_string(d, [field_generic])

        if not (year_lookup or month_lookup or day_lookup):
            # select appropriate start level
            date_range = cl.query_set.aggregate(first=models.Min(field_name),
                                                last=models.Max(field_name))
            if date_range['first'] and date_range['last']:
                if date_range['first'].year == date_range['last'].year:
                    year_lookup = date_range['first'].year
                    if date_range['first'].month == date_range['last'].month:
                        month_lookup = date_range['first'].month

        if year_lookup and month_lookup and day_lookup:
            day = datetime.date(int(year_lookup), int(month_lookup),
                                int(day_lookup))
            return {
                'show':
                True,
                'back': {
                    'link':
                    link({
                        year_field: year_lookup,
                        month_field: month_lookup
                    }),
                    'title':
                    capfirst(formats.date_format(day, 'YEAR_MONTH_FORMAT'))
                },
                'choices': [{
                    'title':
                    capfirst(formats.date_format(day, 'MONTH_DAY_FORMAT'))
                }]
            }
        elif year_lookup and month_lookup:
            days = cl.query_set.filter(**{
                year_field: year_lookup,
                month_field: month_lookup
            }).dates(field_name, 'day')
            return {
                'show':
                True,
                'back': {
                    'link': link({year_field: year_lookup}),
                    'title': str(year_lookup)
                },
                'choices': [{
                    'link':
                    link({
                        year_field: year_lookup,
                        month_field: month_lookup,
                        day_field: day.day
                    }),
                    'title':
                    capfirst(formats.date_format(day, 'MONTH_DAY_FORMAT'))
                } for day in days]
            }
        elif year_lookup:
            months = cl.query_set.filter(**{
                year_field: year_lookup
            }).dates(field_name, 'month')
            return {
                'show':
                True,
                'back': {
                    'link': link({}),
                    'title': _('All dates')
                },
                'choices': [{
                    'link':
                    link({
                        year_field: year_lookup,
                        month_field: month.month
                    }),
                    'title':
                    capfirst(formats.date_format(month, 'YEAR_MONTH_FORMAT'))
                } for month in months]
            }
        else:
            years = cl.query_set.dates(field_name, 'year')
            return {
                'show':
                True,
                'choices': [{
                    'link': link({year_field: str(year.year)}),
                    'title': str(year.year),
                } for year in years]
            }
    def index(self, request, extra_context=None):
        """
        Displays the main admin index page, which lists all of the installed
        apps that have been registered in this site.
        """
        app_dict = {}
        user = request.user
        for model, model_admin in self._registry.items():
            app_label = model._meta.app_label
            has_module_perms = user.has_module_perms(app_label)

            if has_module_perms:
                perms = model_admin.get_model_perms(request)

                # Check whether user has any perm for this module.
                # If so, add the module to the model_list.
                if True in perms.values():
                    info = (app_label, model._meta.module_name)
                    model_dict = {
                        'name': capfirst(model._meta.verbose_name_plural),
                        'perms': perms,
                    }
                    if perms.get('change', False):
                        try:
                            model_dict['admin_url'] = reverse(
                                'admin:%s_%s_changelist' % info,
                                current_app=self.name)
                        except NoReverseMatch:
                            pass
                    if perms.get('add', False):
                        try:
                            model_dict['add_url'] = reverse(
                                'admin:%s_%s_add' % info,
                                current_app=self.name)
                        except NoReverseMatch:
                            pass
                    if app_label in app_dict:
                        app_dict[app_label]['models'].append(model_dict)
                    else:
                        app_dict[app_label] = {
                            'name':
                            app_label.title(),
                            'app_url':
                            reverse('admin:app_list',
                                    kwargs={'app_label': app_label},
                                    current_app=self.name),
                            'has_module_perms':
                            has_module_perms,
                            'models': [model_dict],
                        }

        # Sort the apps alphabetically.
        app_list = app_dict.values()
        app_list.sort(key=lambda x: x['name'])

        # Sort the models alphabetically within each app.
        for app in app_list:
            app['models'].sort(key=lambda x: x['name'])

        context = {
            'title': _('Site administration'),
            'app_list': app_list,
        }
        context.update(extra_context or {})
        return TemplateResponse(request, [
            self.index_template or 'admin/index.html',
        ],
                                context,
                                current_app=self.name)
Exemplo n.º 11
0
 def model_index_html(self, request, model, site):
     fields = self.field_dict(model)
     if not fields:
         return u''
     return mark_safe(u'<p class="filter"><strong>View calendar by:</strong> %s</p>' % \
         u', '.join(['<a href="calendars/%s/">%s</a>' % (f.name, force_unicode(capfirst(f.verbose_name))) for f in fields.values()]))