/example/models.py

http://github.com/feincms/feincms · Python · 103 lines · 90 code · 10 blank · 3 comment · 0 complexity · 968d2710907c0be8c1e35e8ef6fcbf9f MD5 · raw file

  1. from django import forms
  2. from django.db import models
  3. from django.utils.text import capfirst
  4. from django.utils.translation import ugettext_lazy as _
  5. from feincms.module.blog.models import Entry, EntryAdmin
  6. from feincms.module.page.models import Page
  7. from feincms.content.raw.models import RawContent
  8. from feincms.content.image.models import ImageContent
  9. from feincms.content.medialibrary.models import MediaFileContent
  10. from feincms.content.application.models import ApplicationContent
  11. from feincms.module.page.extensions.navigation import NavigationExtension, PagePretender
  12. from feincms.content.application.models import reverse
  13. import mptt
  14. Page.register_templates({
  15. 'key': 'base',
  16. 'title': 'Base Template',
  17. 'path': 'base.html',
  18. 'regions': (
  19. ('main', 'Main region'),
  20. ('sidebar', 'Sidebar', 'inherited'),
  21. ),
  22. })
  23. Page.create_content_type(RawContent)
  24. MediaFileContent.default_create_content_type(Page)
  25. Page.create_content_type(ImageContent, POSITION_CHOICES=(
  26. ('default', 'Default position'),
  27. ))
  28. def get_admin_fields(form, *args, **kwargs):
  29. return {
  30. 'exclusive_subpages': forms.BooleanField(
  31. label=capfirst(_('exclusive subpages')),
  32. required=False,
  33. initial=form.instance.parameters.get('exclusive_subpages', False),
  34. help_text=_('Exclude everything other than the application\'s content when rendering subpages.'),
  35. ),
  36. }
  37. Page.create_content_type(ApplicationContent, APPLICATIONS=(
  38. ('blog_urls', 'Blog', {'admin_fields': get_admin_fields}),
  39. ))
  40. Entry.register_regions(
  41. ('main', 'Main region'),
  42. )
  43. Entry.create_content_type(RawContent)
  44. Entry.create_content_type(ImageContent, POSITION_CHOICES=(
  45. ('default', 'Default position'),
  46. ))
  47. class BlogEntriesNavigationExtension(NavigationExtension):
  48. """
  49. Extended navigation for blog entries.
  50. It would be added to 'Blog' page properties in admin.
  51. """
  52. name = _('all blog entries')
  53. def children(self, page, **kwargs):
  54. for entry in Entry.objects.all():
  55. yield PagePretender(
  56. title=entry.title,
  57. url=reverse('blog_urls/blog_entry_details', kwargs={'object_id': entry.id}),
  58. )
  59. Page.register_extensions('navigation')
  60. Page.register_extensions('sites')
  61. try:
  62. from mptt.models import MPTTModel as base
  63. mptt_register = False
  64. except ImportError:
  65. base = models.Model
  66. mptt_register = True
  67. class Category(base):
  68. name = models.CharField(max_length=20)
  69. slug = models.SlugField()
  70. parent = models.ForeignKey('self', blank=True, null=True, related_name='children')
  71. class Meta:
  72. ordering = ['tree_id', 'lft']
  73. verbose_name = 'category'
  74. verbose_name_plural = 'categories'
  75. def __unicode__(self):
  76. return self.name
  77. if mptt_register:
  78. mptt.register(Category)
  79. # add m2m field to entry so it shows up in entry admin
  80. Entry.add_to_class('categories', models.ManyToManyField(Category, blank=True, null=True))
  81. EntryAdmin.list_filter += ('categories',)