You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

views.py 4.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. from django.contrib import messages
  2. from django.core.exceptions import ValidationError
  3. from django.core.urlresolvers import reverse
  4. from django.db.models.loading import get_model
  5. from django.http import HttpResponseRedirect
  6. from oscar.core.utils import slugify
  7. from django.template.loader import render_to_string
  8. from django.utils.translation import ugettext_lazy as _
  9. from django.views import generic
  10. from django.views.generic import ListView
  11. from oscar.core.validators import URLDoesNotExistValidator
  12. from oscar.apps.dashboard.pages import forms
  13. FlatPage = get_model('flatpages', 'FlatPage')
  14. Site = get_model('sites', 'Site')
  15. class PageListView(ListView):
  16. """
  17. View for listing all existing flatpages.
  18. """
  19. template_name = 'dashboard/pages/index.html'
  20. current_view = 'dashboard:pages-index'
  21. model = FlatPage
  22. form_class = forms.PageSearchForm
  23. paginate_by = 25
  24. desc_template = u'%(main_filter)s %(title_filter)s'
  25. def get_queryset(self):
  26. """
  27. Get queryset of all flatpages to be displayed. If a
  28. search term is specified in the search form, it will be used
  29. to filter the queryset.
  30. """
  31. self.desc_ctx = {
  32. 'main_filter': _('All pages'),
  33. 'title_filter': '',
  34. }
  35. queryset = self.model.objects.all().order_by('title')
  36. self.form = self.form_class(self.request.GET)
  37. if not self.form.is_valid():
  38. return queryset
  39. data = self.form.cleaned_data
  40. if data['title']:
  41. queryset = queryset.filter(title__icontains=data['title'])
  42. self.desc_ctx['title_filter'] = _(" with title containing '%s'") % data['title']
  43. return queryset
  44. def get_context_data(self, **kwargs):
  45. """
  46. Get context data with *form* and *queryset_description* data
  47. added to it.
  48. """
  49. context = super(PageListView, self).get_context_data(**kwargs)
  50. context['form'] = self.form
  51. context['queryset_description'] = self.desc_template % self.desc_ctx
  52. return context
  53. class PageCreateView(generic.CreateView):
  54. template_name = 'dashboard/pages/update.html'
  55. model = FlatPage
  56. form_class = forms.PageUpdateForm
  57. context_object_name = 'page'
  58. def get_context_data(self, **kwargs):
  59. ctx = super(PageCreateView, self).get_context_data(**kwargs)
  60. ctx['title'] = _('Create New Page')
  61. return ctx
  62. def form_valid(self, form):
  63. """
  64. Store new flatpage from form data. Checks wether a site
  65. is specified for the flatpage or sets the current site by
  66. default. Additionally, if URL is left blank, a slugified
  67. version of the title will be used as URL after checking
  68. if it is valid.
  69. """
  70. # if no URL is specified, generate from title
  71. page = form.save(commit=False)
  72. if not page.url:
  73. page.url = '/%s/' % slugify(page.title)
  74. try:
  75. URLDoesNotExistValidator()(page.url)
  76. except ValidationError:
  77. pass
  78. else:
  79. # use current site as default for new page
  80. page.save()
  81. page.sites.add(Site.objects.get_current())
  82. return HttpResponseRedirect(self.get_success_url(page))
  83. ctx = self.get_context_data()
  84. ctx['form'] = form
  85. return self.render_to_response(ctx)
  86. def get_success_url(self, page):
  87. msg = render_to_string('oscar/dashboard/pages/messages/saved.html',
  88. {'page': page})
  89. messages.success(self.request, msg, extra_tags='safe noicon')
  90. return reverse('dashboard:page-list')
  91. class PageUpdateView(generic.UpdateView):
  92. """
  93. View for updating flatpages from the dashboard.
  94. """
  95. template_name = 'dashboard/pages/update.html'
  96. model = FlatPage
  97. form_class = forms.PageUpdateForm
  98. context_object_name = 'page'
  99. def get_context_data(self, **kwargs):
  100. ctx = super(PageUpdateView, self).get_context_data(**kwargs)
  101. ctx['title'] = self.object.title
  102. return ctx
  103. def form_valid(self, form):
  104. # Ensure saved page is added to the current site
  105. page = form.save(commit=False)
  106. if not page.sites.count():
  107. page.sites.add(Site.objects.get_current())
  108. page.save()
  109. return HttpResponseRedirect(self.get_success_url())
  110. def get_success_url(self):
  111. msg = render_to_string('oscar/dashboard/pages/messages/saved.html',
  112. {'page': self.object})
  113. messages.success(self.request, msg, extra_tags='safe noicon')
  114. return reverse('dashboard:page-list')
  115. class PageDeleteView(generic.DeleteView):
  116. template_name = 'dashboard/pages/delete.html'
  117. model = FlatPage
  118. def get_success_url(self):
  119. messages.success(
  120. self.request, _("Deleted page '%s'") % self.object.title)
  121. return reverse('dashboard:page-list')