123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263 |
- # -*- coding: utf-8 -*-
- from django.db import models
- from django.contrib import admin
- from django.core.mail import EmailMessage
- class Section(models.Model):
- """
- A simple section that links to articles, to test linking to related items
- in admin views.
- """
- name = models.CharField(max_length=100)
- class Article(models.Model):
- """
- A simple article to test admin views. Test backwards compatibility.
- """
- title = models.CharField(max_length=100)
- content = models.TextField()
- date = models.DateTimeField()
- section = models.ForeignKey(Section)
- def __unicode__(self):
- return self.title
- def model_year(self):
- return self.date.year
- model_year.admin_order_field = 'date'
- class Book(models.Model):
- """
- A simple book that has chapters.
- """
- name = models.CharField(max_length=100, verbose_name=u'¿Name?')
- def __unicode__(self):
- return self.name
- class Promo(models.Model):
- name = models.CharField(max_length=100, verbose_name=u'¿Name?')
- book = models.ForeignKey(Book)
- def __unicode__(self):
- return self.name
- class Chapter(models.Model):
- title = models.CharField(max_length=100, verbose_name=u'¿Title?')
- content = models.TextField()
- book = models.ForeignKey(Book)
- def __unicode__(self):
- return self.title
- class Meta:
- verbose_name = u'¿Chapter?'
- class ChapterXtra1(models.Model):
- chap = models.OneToOneField(Chapter, verbose_name=u'¿Chap?')
- xtra = models.CharField(max_length=100, verbose_name=u'¿Xtra?')
- def __unicode__(self):
- return u'¿Xtra1: %s' % self.xtra
- class ChapterXtra2(models.Model):
- chap = models.OneToOneField(Chapter, verbose_name=u'¿Chap?')
- xtra = models.CharField(max_length=100, verbose_name=u'¿Xtra?')
- def __unicode__(self):
- return u'¿Xtra2: %s' % self.xtra
- def callable_year(dt_value):
- return dt_value.year
- callable_year.admin_order_field = 'date'
- class ArticleInline(admin.TabularInline):
- model = Article
- class ChapterInline(admin.TabularInline):
- model = Chapter
- class ArticleAdmin(admin.ModelAdmin):
- list_display = ('content', 'date', callable_year, 'model_year', 'modeladmin_year')
- list_filter = ('date',)
- def changelist_view(self, request):
- "Test that extra_context works"
- return super(ArticleAdmin, self).changelist_view(
- request, extra_context={
- 'extra_var': 'Hello!'
- }
- )
- def modeladmin_year(self, obj):
- return obj.date.year
- modeladmin_year.admin_order_field = 'date'
- class CustomArticle(models.Model):
- content = models.TextField()
- date = models.DateTimeField()
- class CustomArticleAdmin(admin.ModelAdmin):
- """
- Tests various hooks for using custom templates and contexts.
- """
- change_list_template = 'custom_admin/change_list.html'
- change_form_template = 'custom_admin/change_form.html'
- object_history_template = 'custom_admin/object_history.html'
- delete_confirmation_template = 'custom_admin/delete_confirmation.html'
- def changelist_view(self, request):
- "Test that extra_context works"
- return super(CustomArticleAdmin, self).changelist_view(
- request, extra_context={
- 'extra_var': 'Hello!'
- }
- )
- class ModelWithStringPrimaryKey(models.Model):
- id = models.CharField(max_length=255, primary_key=True)
- def __unicode__(self):
- return self.id
- class Color(models.Model):
- value = models.CharField(max_length=10)
- warm = models.BooleanField()
- def __unicode__(self):
- return self.value
- class Thing(models.Model):
- title = models.CharField(max_length=20)
- color = models.ForeignKey(Color, limit_choices_to={'warm': True})
- def __unicode__(self):
- return self.title
- class ThingAdmin(admin.ModelAdmin):
- list_filter = ('color',)
- class Person(models.Model):
- GENDER_CHOICES = (
- (1, "Male"),
- (2, "Female"),
- )
- name = models.CharField(max_length=100)
- gender = models.IntegerField(choices=GENDER_CHOICES)
- alive = models.BooleanField()
-
- def __unicode__(self):
- return self.name
-
- class Meta:
- ordering = ["id"]
- class PersonAdmin(admin.ModelAdmin):
- list_display = ('name', 'gender', 'alive')
- list_editable = ('gender', 'alive')
- list_filter = ('gender',)
- search_fields = ('name',)
- ordering = ["id"]
- class Persona(models.Model):
- """
- A simple persona associated with accounts, to test inlining of related
- accounts which inherit from a common accounts class.
- """
- name = models.CharField(blank=False, max_length=80)
- def __unicode__(self):
- return self.name
- class Account(models.Model):
- """
- A simple, generic account encapsulating the information shared by all
- types of accounts.
- """
- username = models.CharField(blank=False, max_length=80)
- persona = models.ForeignKey(Persona, related_name="accounts")
- servicename = u'generic service'
- def __unicode__(self):
- return "%s: %s" % (self.servicename, self.username)
- class FooAccount(Account):
- """A service-specific account of type Foo."""
- servicename = u'foo'
- class BarAccount(Account):
- """A service-specific account of type Bar."""
- servicename = u'bar'
- class FooAccountAdmin(admin.StackedInline):
- model = FooAccount
- extra = 1
- class BarAccountAdmin(admin.StackedInline):
- model = BarAccount
- extra = 1
- class PersonaAdmin(admin.ModelAdmin):
- inlines = (
- FooAccountAdmin,
- BarAccountAdmin
- )
- class Subscriber(models.Model):
- name = models.CharField(blank=False, max_length=80)
- email = models.EmailField(blank=False, max_length=175)
- def __unicode__(self):
- return "%s (%s)" % (self.name, self.email)
- class SubscriberAdmin(admin.ModelAdmin):
- actions = ['delete_selected', 'mail_admin']
- def mail_admin(self, request, selected):
- EmailMessage(
- 'Greetings from a ModelAdmin action',
- 'This is the test email from a admin action',
- 'from@example.com',
- ['to@example.com']
- ).send()
- class ExternalSubscriber(Subscriber):
- pass
- def external_mail(request, selected):
- EmailMessage(
- 'Greetings from a function action',
- 'This is the test email from a function action',
- 'from@example.com',
- ['to@example.com']
- ).send()
- def redirect_to(request, selected):
- from django.http import HttpResponseRedirect
- return HttpResponseRedirect('/some-where-else/')
- class ExternalSubscriberAdmin(admin.ModelAdmin):
- actions = [external_mail, redirect_to]
- admin.site.register(Article, ArticleAdmin)
- admin.site.register(CustomArticle, CustomArticleAdmin)
- admin.site.register(Section, inlines=[ArticleInline])
- admin.site.register(ModelWithStringPrimaryKey)
- admin.site.register(Color)
- admin.site.register(Thing, ThingAdmin)
- admin.site.register(Person, PersonAdmin)
- admin.site.register(Persona, PersonaAdmin)
- admin.site.register(Subscriber, SubscriberAdmin)
- admin.site.register(ExternalSubscriber, ExternalSubscriberAdmin)
- # We intentionally register Promo and ChapterXtra1 but not Chapter nor ChapterXtra2.
- # That way we cover all four cases:
- # related ForeignKey object registered in admin
- # related ForeignKey object not registered in admin
- # related OneToOne object registered in admin
- # related OneToOne object not registered in admin
- # when deleting Book so as exercise all four troublesome (w.r.t escaping
- # and calling force_unicode to avoid problems on Python 2.3) paths through
- # contrib.admin.util's get_deleted_objects function.
- admin.site.register(Book, inlines=[ChapterInline])
- admin.site.register(Promo)
- admin.site.register(ChapterXtra1)
|