wagtail_hooks.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. import mimetypes
  2. from django.contrib.contenttypes.models import ContentType
  3. from django.templatetags.static import static
  4. from django.http.response import HttpResponse
  5. from django.urls import reverse
  6. from django.utils.html import format_html, mark_safe
  7. from django.utils.translation import gettext_lazy as _
  8. from wagtail.core import hooks
  9. from wagtail.core.models import UserPagePermissionsProxy, get_page_models
  10. from wagtailcache.cache import clear_cache
  11. from coderedcms.wagtail_flexible_forms.wagtail_hooks import FormAdmin, SubmissionAdmin
  12. @hooks.register('insert_global_admin_css')
  13. def global_admin_css():
  14. return format_html(
  15. '<link rel="stylesheet" type="text/css" href="{}">',
  16. static('coderedcms/css/codered-admin.css')
  17. )
  18. @hooks.register('insert_editor_css')
  19. def editor_css():
  20. return format_html(
  21. '<link rel="stylesheet" type="text/css" href="{}">',
  22. static('coderedcms/css/codered-editor.css')
  23. )
  24. @hooks.register('insert_editor_js')
  25. def collapsible_js():
  26. return format_html('<script src="{}"></script>', static('coderedcms/js/codered-editor.js'))
  27. @hooks.register('after_create_page')
  28. @hooks.register('after_edit_page')
  29. def clear_wagtailcache(request, page):
  30. if page.live:
  31. clear_cache()
  32. @hooks.register('filter_form_submissions_for_user')
  33. def codered_forms(user, editable_forms):
  34. from coderedcms.models import CoderedFormMixin
  35. """
  36. Add our own CoderedFormPage to editable_forms, since wagtail is unaware
  37. of its existence. Essentially this is a fork of wagtail.contrib.forms.get_forms_for_user()
  38. and wagtail.contrib.forms.get_form_types()
  39. """
  40. form_models = [
  41. model for model in get_page_models()
  42. if issubclass(model, CoderedFormMixin)
  43. ]
  44. form_types = list(
  45. ContentType.objects.get_for_models(*form_models).values()
  46. )
  47. editable_forms = UserPagePermissionsProxy(user).editable_pages()
  48. editable_forms = editable_forms.filter(content_type__in=form_types)
  49. return editable_forms
  50. @hooks.register('before_serve_document')
  51. def serve_document_directly(document, request):
  52. """
  53. This hook prevents documents from being downloaded unless
  54. specified by an <a> tag with the download attribute.
  55. """
  56. content_type, content_encoding = mimetypes.guess_type(document.filename)
  57. response = HttpResponse(document.file.read(), content_type=content_type)
  58. response['Content-Disposition'] = 'inline;filename="{0}"'.format(document.filename)
  59. response['Content-Encoding'] = content_encoding
  60. return response
  61. class CoderedSubmissionAdmin(SubmissionAdmin):
  62. def __init__(self, parent=None):
  63. from coderedcms.models import CoderedSessionFormSubmission
  64. self.model = CoderedSessionFormSubmission
  65. super().__init__(parent=parent)
  66. class CoderedFormAdmin(FormAdmin):
  67. list_display = ('title', 'action_links')
  68. def all_submissions_link(self, obj, label=_('See all submissions'),
  69. url_suffix=''):
  70. return '<a href="%s?page_id=%s%s">%s</a>' % (
  71. reverse(CoderedSubmissionAdmin().url_helper.get_action_url_name('index')),
  72. obj.pk, url_suffix, label)
  73. all_submissions_link.short_description = ''
  74. all_submissions_link.allow_tags = True
  75. def action_links(self, obj):
  76. from coderedcms.models import CoderedFormPage, CoderedStreamFormPage
  77. actions = []
  78. if issubclass(type(obj.specific), CoderedFormPage):
  79. actions.append(
  80. '<a href="{0}">{1}</a>'.format(reverse(
  81. 'wagtailforms:list_submissions',
  82. args=(obj.pk,)),
  83. _('See all Submissions')
  84. )
  85. )
  86. actions.append(
  87. '<a href="{0}">{1}</a>'.format(
  88. reverse("wagtailadmin_pages:edit", args=(obj.pk,)), _("Edit this form page")
  89. )
  90. )
  91. elif issubclass(type(obj.specific), CoderedStreamFormPage):
  92. actions.append(self.unprocessed_submissions_link(obj))
  93. actions.append(self.all_submissions_link(obj))
  94. actions.append(self.edit_link(obj))
  95. return mark_safe("<br />".join(actions))
  96. # modeladmin_register(CoderedFormAdmin)
  97. # modeladmin_register(CoderedSubmissionAdmin)