2
0

models.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. from django.db import models
  2. from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
  3. from wagtail.wagtailadmin.edit_handlers import FieldPanel, StreamFieldPanel
  4. from wagtail.wagtailcore.fields import StreamField
  5. from wagtail.wagtailcore.models import Page
  6. from wagtail.wagtailsearch import index
  7. from wagtail.wagtailsnippets.models import register_snippet
  8. from bakerydemo.base.blocks import BaseStreamBlock
  9. from bakerydemo.base.models import BasePageFieldsMixin
  10. @register_snippet
  11. class Country(models.Model):
  12. """
  13. Standard Django model to store set of countries of origin.
  14. Exposed in the Wagtail admin via Snippets.
  15. """
  16. title = models.CharField(max_length=100)
  17. def __str__(self):
  18. return self.title
  19. class Meta:
  20. verbose_name_plural = "Countries of Origin"
  21. @register_snippet
  22. class BreadType(models.Model):
  23. """
  24. Standard Django model used as a Snippet in the BreadPage model.
  25. """
  26. title = models.CharField(max_length=255)
  27. panels = [
  28. FieldPanel('title'),
  29. ]
  30. def __str__(self):
  31. return self.title
  32. class Meta:
  33. verbose_name_plural = "Bread types"
  34. class BreadPage(BasePageFieldsMixin, Page):
  35. """
  36. Detail view for a specific bread
  37. """
  38. origin = models.ForeignKey(
  39. Country,
  40. on_delete=models.SET_NULL,
  41. null=True,
  42. blank=True,
  43. )
  44. body = StreamField(
  45. BaseStreamBlock(), verbose_name="Describe the bread", blank=True
  46. )
  47. bread_type = models.ForeignKey(
  48. 'breads.BreadType',
  49. null=True,
  50. blank=True,
  51. on_delete=models.SET_NULL,
  52. related_name='+'
  53. )
  54. content_panels = BasePageFieldsMixin.content_panels + [
  55. StreamFieldPanel('body'),
  56. FieldPanel('origin'),
  57. FieldPanel('bread_type'),
  58. ]
  59. search_fields = Page.search_fields + [
  60. index.SearchField('title'),
  61. index.SearchField('body'),
  62. ]
  63. parent_page_types = ['BreadsIndexPage']
  64. api_fields = ['title', 'bread_type', 'origin', 'image']
  65. class BreadsIndexPage(BasePageFieldsMixin, Page):
  66. """
  67. Index page for breads. We don't have any fields within our model but we need
  68. to alter the page model's context to return the child page objects - the
  69. BreadPage - so that it works as an index page
  70. """
  71. subpage_types = ['BreadPage']
  72. @property
  73. def breads(self):
  74. return BreadPage.objects.live().descendant_of(
  75. self).order_by('-first_published_at')
  76. def paginate(self, request, *args):
  77. page = request.GET.get('page')
  78. paginator = Paginator(self.breads, 12)
  79. try:
  80. pages = paginator.page(page)
  81. except PageNotAnInteger:
  82. pages = paginator.page(1)
  83. except EmptyPage:
  84. pages = paginator.page(paginator.num_pages)
  85. return pages
  86. def get_context(self, request):
  87. context = super(BreadsIndexPage, self).get_context(request)
  88. breads = self.paginate(request, self.breads)
  89. context['breads'] = breads
  90. return context