metadata_blocks.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. """
  2. JSON and meta-data blocks, primarily used for SEO purposes.
  3. """
  4. import json
  5. from django import forms
  6. from django.utils.translation import gettext_lazy as _
  7. from wagtail.core import blocks
  8. from coderedcms import schema
  9. from .base_blocks import MultiSelectBlock
  10. class OpenHoursValue(blocks.StructValue):
  11. """
  12. Renders selected days as a json list.
  13. """
  14. @property
  15. def days_json(self):
  16. """
  17. Custom property to return days as json list instead of default python list.
  18. """
  19. return json.dumps(self['days'])
  20. class OpenHoursBlock(blocks.StructBlock):
  21. """
  22. Holds day and time combination for business open hours.
  23. """
  24. days = MultiSelectBlock(
  25. required=True,
  26. verbose_name=_('Days'),
  27. help_text=_('For late night hours past 23:59, define each day in a separate block.'),
  28. widget=forms.CheckboxSelectMultiple,
  29. choices=(
  30. ('Monday', _('Monday')),
  31. ('Tuesday', _('Tuesday')),
  32. ('Wednesday', _('Wednesday')),
  33. ('Thursday', _('Thursday')),
  34. ('Friday', _('Friday')),
  35. ('Saturday', _('Saturday')),
  36. ('Sunday', _('Sunday')),
  37. ))
  38. start_time = blocks.TimeBlock(verbose_name=_('Opening time'))
  39. end_time = blocks.TimeBlock(verbose_name=_('Closing time'))
  40. class Meta:
  41. template = 'coderedcms/blocks/struct_data_hours.json'
  42. label = _('Open Hours')
  43. value_class = OpenHoursValue
  44. class StructuredDataActionBlock(blocks.StructBlock):
  45. """
  46. Action object from schema.org
  47. """
  48. action_type = blocks.ChoiceBlock(
  49. verbose_name=_('Action Type'),
  50. required=True,
  51. choices=schema.SCHEMA_ACTION_CHOICES
  52. )
  53. target = blocks.URLBlock(verbose_name=_('Target URL'))
  54. language = blocks.CharBlock(
  55. verbose_name=_('Language'),
  56. help_text=_(
  57. 'If the action is offered in multiple languages, create separate actions for each language.'), # noqa
  58. default='en-US'
  59. )
  60. result_type = blocks.ChoiceBlock(
  61. required=False,
  62. verbose_name=_('Result Type'),
  63. help_text=_('Leave blank for OrderAction'),
  64. choices=schema.SCHEMA_RESULT_CHOICES
  65. )
  66. result_name = blocks.CharBlock(
  67. required=False,
  68. verbose_name=_('Result Name'),
  69. help_text=_('Example: "Reserve a table", "Book an appointment", etc.')
  70. )
  71. extra_json = blocks.RawHTMLBlock(
  72. required=False,
  73. verbose_name=_('Additional action markup'),
  74. classname='monospace',
  75. help_text=_(
  76. "Additional JSON-LD inserted into the Action dictionary. Must be properties of https://schema.org/Action." # noqa
  77. )
  78. )
  79. class Meta:
  80. template = 'coderedcms/blocks/struct_data_action.json'
  81. label = _('Action')