|
@@ -48,7 +48,7 @@ from wagtail.core.utils import resolve_model_string
|
|
from wagtail.contrib.forms.edit_handlers import FormSubmissionsPanel
|
|
from wagtail.contrib.forms.edit_handlers import FormSubmissionsPanel
|
|
from wagtail.contrib.forms.forms import WagtailAdminFormPageForm
|
|
from wagtail.contrib.forms.forms import WagtailAdminFormPageForm
|
|
from wagtail.images.edit_handlers import ImageChooserPanel
|
|
from wagtail.images.edit_handlers import ImageChooserPanel
|
|
-from wagtail.contrib.forms.models import AbstractFormSubmission, FormSubmission
|
|
|
|
|
|
+from wagtail.contrib.forms.models import FormSubmission
|
|
from wagtail.search import index
|
|
from wagtail.search import index
|
|
from wagtailcache.cache import WagtailCacheMixin
|
|
from wagtailcache.cache import WagtailCacheMixin
|
|
|
|
|
|
@@ -59,14 +59,20 @@ from coderedcms.blocks import (
|
|
STREAMFORM_BLOCKS,
|
|
STREAMFORM_BLOCKS,
|
|
ContentWallBlock,
|
|
ContentWallBlock,
|
|
OpenHoursBlock,
|
|
OpenHoursBlock,
|
|
- StructuredDataActionBlock,
|
|
|
|
- CoderedStreamFormStepBlock)
|
|
|
|
|
|
+ StructuredDataActionBlock)
|
|
from coderedcms.fields import ColorField
|
|
from coderedcms.fields import ColorField
|
|
from coderedcms.forms import CoderedFormBuilder, CoderedSubmissionsListView
|
|
from coderedcms.forms import CoderedFormBuilder, CoderedSubmissionsListView
|
|
from coderedcms.models.snippet_models import ClassifierTerm
|
|
from coderedcms.models.snippet_models import ClassifierTerm
|
|
from coderedcms.models.wagtailsettings_models import GeneralSettings, LayoutSettings, SeoSettings, GoogleApiSettings
|
|
from coderedcms.models.wagtailsettings_models import GeneralSettings, LayoutSettings, SeoSettings, GoogleApiSettings
|
|
from coderedcms.wagtail_flexible_forms.blocks import FormFieldBlock, FormStepBlock
|
|
from coderedcms.wagtail_flexible_forms.blocks import FormFieldBlock, FormStepBlock
|
|
-from coderedcms.wagtail_flexible_forms.models import Step, Steps, StreamFormMixin, StreamFormJSONEncoder, SessionFormSubmission, SubmissionRevision
|
|
|
|
|
|
+from coderedcms.wagtail_flexible_forms.models import (
|
|
|
|
+ Step,
|
|
|
|
+ Steps,
|
|
|
|
+ StreamFormMixin,
|
|
|
|
+ StreamFormJSONEncoder,
|
|
|
|
+ SessionFormSubmission,
|
|
|
|
+ SubmissionRevision
|
|
|
|
+)
|
|
from coderedcms.settings import cr_settings
|
|
from coderedcms.settings import cr_settings
|
|
from coderedcms.widgets import ClassifierSelectWidget
|
|
from coderedcms.widgets import ClassifierSelectWidget
|
|
|
|
|
|
@@ -76,6 +82,7 @@ logger = logging.getLogger('coderedcms')
|
|
|
|
|
|
CODERED_PAGE_MODELS = []
|
|
CODERED_PAGE_MODELS = []
|
|
|
|
|
|
|
|
+
|
|
def get_page_models():
|
|
def get_page_models():
|
|
return CODERED_PAGE_MODELS
|
|
return CODERED_PAGE_MODELS
|
|
|
|
|
|
@@ -100,11 +107,13 @@ class CoderedPageMeta(PageBase):
|
|
if not cls._meta.abstract:
|
|
if not cls._meta.abstract:
|
|
CODERED_PAGE_MODELS.append(cls)
|
|
CODERED_PAGE_MODELS.append(cls)
|
|
|
|
|
|
|
|
+
|
|
class CoderedTag(TaggedItemBase):
|
|
class CoderedTag(TaggedItemBase):
|
|
class Meta:
|
|
class Meta:
|
|
verbose_name = _('CodeRed Tag')
|
|
verbose_name = _('CodeRed Tag')
|
|
content_object = ParentalKey('coderedcms.CoderedPage', related_name='tagged_items')
|
|
content_object = ParentalKey('coderedcms.CoderedPage', related_name='tagged_items')
|
|
|
|
|
|
|
|
+
|
|
class CoderedPage(WagtailCacheMixin, Page, metaclass=CoderedPageMeta):
|
|
class CoderedPage(WagtailCacheMixin, Page, metaclass=CoderedPageMeta):
|
|
"""
|
|
"""
|
|
General use page with caching, templating, and SEO functionality.
|
|
General use page with caching, templating, and SEO functionality.
|
|
@@ -124,7 +133,6 @@ class CoderedPage(WagtailCacheMixin, Page, metaclass=CoderedPageMeta):
|
|
# ajax_template = ''
|
|
# ajax_template = ''
|
|
# search_template = ''
|
|
# search_template = ''
|
|
|
|
|
|
-
|
|
|
|
###############
|
|
###############
|
|
# Content fields
|
|
# Content fields
|
|
###############
|
|
###############
|
|
@@ -138,7 +146,6 @@ class CoderedPage(WagtailCacheMixin, Page, metaclass=CoderedPageMeta):
|
|
verbose_name=_('Cover image'),
|
|
verbose_name=_('Cover image'),
|
|
)
|
|
)
|
|
|
|
|
|
-
|
|
|
|
###############
|
|
###############
|
|
# Index fields
|
|
# Index fields
|
|
###############
|
|
###############
|
|
@@ -184,7 +191,6 @@ class CoderedPage(WagtailCacheMixin, Page, metaclass=CoderedPageMeta):
|
|
help_text=_('Enable filtering child pages by these classifiers.'),
|
|
help_text=_('Enable filtering child pages by these classifiers.'),
|
|
)
|
|
)
|
|
|
|
|
|
-
|
|
|
|
###############
|
|
###############
|
|
# Layout fields
|
|
# Layout fields
|
|
###############
|
|
###############
|
|
@@ -196,7 +202,6 @@ class CoderedPage(WagtailCacheMixin, Page, metaclass=CoderedPageMeta):
|
|
verbose_name=_('Template')
|
|
verbose_name=_('Template')
|
|
)
|
|
)
|
|
|
|
|
|
-
|
|
|
|
###############
|
|
###############
|
|
# SEO fields
|
|
# SEO fields
|
|
###############
|
|
###############
|
|
@@ -208,7 +213,12 @@ class CoderedPage(WagtailCacheMixin, Page, metaclass=CoderedPageMeta):
|
|
on_delete=models.SET_NULL,
|
|
on_delete=models.SET_NULL,
|
|
related_name='+',
|
|
related_name='+',
|
|
verbose_name=_('Open Graph preview image'),
|
|
verbose_name=_('Open Graph preview image'),
|
|
- help_text=_('The image shown when linking to this page on social media. If blank, defaults to article cover image, or logo in Settings > Layout > Logo')
|
|
|
|
|
|
+ help_text=_(
|
|
|
|
+ '''
|
|
|
|
+ The image shown when linking to this page on social media.
|
|
|
|
+ If blank, defaults to article cover image, or logo in Settings > Layout > Logo
|
|
|
|
+ '''
|
|
|
|
+ )
|
|
)
|
|
)
|
|
struct_org_type = models.CharField(
|
|
struct_org_type = models.CharField(
|
|
default='',
|
|
default='',
|
|
@@ -241,7 +251,12 @@ class CoderedPage(WagtailCacheMixin, Page, metaclass=CoderedPageMeta):
|
|
on_delete=models.SET_NULL,
|
|
on_delete=models.SET_NULL,
|
|
related_name='+',
|
|
related_name='+',
|
|
verbose_name=_('Photo of Organization'),
|
|
verbose_name=_('Photo of Organization'),
|
|
- help_text=_('A photo of the facility. This photo will be cropped to 1:1, 4:3, and 16:9 aspect ratios automatically.')
|
|
|
|
|
|
+ help_text=_(
|
|
|
|
+ '''
|
|
|
|
+ A photo of the facility. This photo will be cropped to 1:1,
|
|
|
|
+ 4:3, and 16:9 aspect ratios automatically.
|
|
|
|
+ '''
|
|
|
|
+ )
|
|
)
|
|
)
|
|
struct_org_phone = models.CharField(
|
|
struct_org_phone = models.CharField(
|
|
blank=True,
|
|
blank=True,
|
|
@@ -277,7 +292,12 @@ class CoderedPage(WagtailCacheMixin, Page, metaclass=CoderedPageMeta):
|
|
blank=True,
|
|
blank=True,
|
|
max_length=255,
|
|
max_length=255,
|
|
verbose_name=_('Country'),
|
|
verbose_name=_('Country'),
|
|
- help_text=_('For example, USA. Two-letter ISO 3166-1 alpha-2 country code is also acceptible https://en.wikipedia.org/wiki/ISO_3166-1')
|
|
|
|
|
|
+ help_text=_(
|
|
|
|
+ '''
|
|
|
|
+ For example, USA. Two-letter ISO 3166-1 alpha-2 country
|
|
|
|
+ code is also acceptible https://en.wikipedia.org/wiki/ISO_3166-1
|
|
|
|
+ '''
|
|
|
|
+ )
|
|
)
|
|
)
|
|
struct_org_geo_lat = models.DecimalField(
|
|
struct_org_geo_lat = models.DecimalField(
|
|
blank=True,
|
|
blank=True,
|
|
@@ -310,10 +330,14 @@ class CoderedPage(WagtailCacheMixin, Page, metaclass=CoderedPageMeta):
|
|
struct_org_extra_json = models.TextField(
|
|
struct_org_extra_json = models.TextField(
|
|
blank=True,
|
|
blank=True,
|
|
verbose_name=_('Additional Organization markup'),
|
|
verbose_name=_('Additional Organization markup'),
|
|
- help_text=_('Additional JSON-LD inserted into the Organization dictionary. Must be properties of https://schema.org/Organization or the selected organization type.')
|
|
|
|
|
|
+ help_text=_(
|
|
|
|
+ '''
|
|
|
|
+ Additional JSON-LD inserted into the Organization dictionary.
|
|
|
|
+ Must be properties of https://schema.org/Organization or the selected organization type.
|
|
|
|
+ '''
|
|
|
|
+ )
|
|
)
|
|
)
|
|
|
|
|
|
-
|
|
|
|
###############
|
|
###############
|
|
# Classify
|
|
# Classify
|
|
###############
|
|
###############
|
|
@@ -322,7 +346,12 @@ class CoderedPage(WagtailCacheMixin, Page, metaclass=CoderedPageMeta):
|
|
'coderedcms.ClassifierTerm',
|
|
'coderedcms.ClassifierTerm',
|
|
blank=True,
|
|
blank=True,
|
|
verbose_name=_('Classifiers'),
|
|
verbose_name=_('Classifiers'),
|
|
- help_text=_('Categorize and group pages together with classifiers. Used to organize and filter pages across the site.'),
|
|
|
|
|
|
+ help_text=_(
|
|
|
|
+ '''
|
|
|
|
+ Categorize and group pages together with classifiers.
|
|
|
|
+ Used to organize and filter pages across the site.
|
|
|
|
+ '''
|
|
|
|
+ ),
|
|
)
|
|
)
|
|
tags = ClusterTaggableManager(
|
|
tags = ClusterTaggableManager(
|
|
through=CoderedTag,
|
|
through=CoderedTag,
|
|
@@ -331,7 +360,6 @@ class CoderedPage(WagtailCacheMixin, Page, metaclass=CoderedPageMeta):
|
|
help_text=_('Used to organize pages across the site.'),
|
|
help_text=_('Used to organize pages across the site.'),
|
|
)
|
|
)
|
|
|
|
|
|
-
|
|
|
|
###############
|
|
###############
|
|
# Settings
|
|
# Settings
|
|
###############
|
|
###############
|
|
@@ -344,7 +372,6 @@ class CoderedPage(WagtailCacheMixin, Page, metaclass=CoderedPageMeta):
|
|
verbose_name=_('Content Walls')
|
|
verbose_name=_('Content Walls')
|
|
)
|
|
)
|
|
|
|
|
|
-
|
|
|
|
###############
|
|
###############
|
|
# Search
|
|
# Search
|
|
###############
|
|
###############
|
|
@@ -370,7 +397,6 @@ class CoderedPage(WagtailCacheMixin, Page, metaclass=CoderedPageMeta):
|
|
index.FilterField('classifier_terms'),
|
|
index.FilterField('classifier_terms'),
|
|
]
|
|
]
|
|
|
|
|
|
-
|
|
|
|
###############
|
|
###############
|
|
# Panels
|
|
# Panels
|
|
###############
|
|
###############
|
|
@@ -460,8 +486,7 @@ class CoderedPage(WagtailCacheMixin, Page, metaclass=CoderedPageMeta):
|
|
super().__init__(*args, **kwargs)
|
|
super().__init__(*args, **kwargs)
|
|
klassname = self.__class__.__name__.lower()
|
|
klassname = self.__class__.__name__.lower()
|
|
template_choices = cr_settings['FRONTEND_TEMPLATES_PAGES'].get('*', ()) + \
|
|
template_choices = cr_settings['FRONTEND_TEMPLATES_PAGES'].get('*', ()) + \
|
|
- cr_settings['FRONTEND_TEMPLATES_PAGES'].get(klassname, ())
|
|
|
|
-
|
|
|
|
|
|
+ cr_settings['FRONTEND_TEMPLATES_PAGES'].get(klassname, ())
|
|
|
|
|
|
self._meta.get_field('index_order_by').choices = self.index_order_by_choices
|
|
self._meta.get_field('index_order_by').choices = self.index_order_by_choices
|
|
self._meta.get_field('custom_template').choices = template_choices
|
|
self._meta.get_field('custom_template').choices = template_choices
|
|
@@ -469,14 +494,16 @@ class CoderedPage(WagtailCacheMixin, Page, metaclass=CoderedPageMeta):
|
|
self.index_order_by = self.index_order_by_default
|
|
self.index_order_by = self.index_order_by_default
|
|
self.index_show_subpages = self.index_show_subpages_default
|
|
self.index_show_subpages = self.index_show_subpages_default
|
|
|
|
|
|
-
|
|
|
|
@classmethod
|
|
@classmethod
|
|
def get_edit_handler(cls):
|
|
def get_edit_handler(cls):
|
|
"""
|
|
"""
|
|
Override to "lazy load" the panels overriden by subclasses.
|
|
Override to "lazy load" the panels overriden by subclasses.
|
|
"""
|
|
"""
|
|
panels = [
|
|
panels = [
|
|
- ObjectList(cls.content_panels + cls.body_content_panels + cls.bottom_content_panels, heading=_('Content')),
|
|
|
|
|
|
+ ObjectList(
|
|
|
|
+ cls.content_panels + cls.body_content_panels + cls.bottom_content_panels,
|
|
|
|
+ heading=_('Content')
|
|
|
|
+ ),
|
|
ObjectList(cls.classify_panels, heading=_('Classify')),
|
|
ObjectList(cls.classify_panels, heading=_('Classify')),
|
|
ObjectList(cls.layout_panels, heading=_('Layout')),
|
|
ObjectList(cls.layout_panels, heading=_('Layout')),
|
|
ObjectList(cls.promote_panels, heading=_('SEO'), classname="seo"),
|
|
ObjectList(cls.promote_panels, heading=_('SEO'), classname="seo"),
|
|
@@ -484,7 +511,11 @@ class CoderedPage(WagtailCacheMixin, Page, metaclass=CoderedPageMeta):
|
|
]
|
|
]
|
|
|
|
|
|
if cls.integration_panels:
|
|
if cls.integration_panels:
|
|
- panels.append(ObjectList(cls.integration_panels, heading='Integrations', classname='integrations'))
|
|
|
|
|
|
+ panels.append(ObjectList(
|
|
|
|
+ cls.integration_panels,
|
|
|
|
+ heading='Integrations',
|
|
|
|
+ classname='integrations'
|
|
|
|
+ ))
|
|
|
|
|
|
return TabbedInterface(panels).bind_to_model(cls)
|
|
return TabbedInterface(panels).bind_to_model(cls)
|
|
|
|
|
|
@@ -581,7 +612,15 @@ class CoderedPage(WagtailCacheMixin, Page, metaclass=CoderedPageMeta):
|
|
for term in selected_terms:
|
|
for term in selected_terms:
|
|
all_children = all_children.filter(classifier_terms=term)
|
|
all_children = all_children.filter(classifier_terms=term)
|
|
except:
|
|
except:
|
|
- logger.warning("Tried to filter by ClassifierTerm, but <%s.%s ('%s')>.get_index_children() did not return a queryset or is not a queryset of CoderedPage models.", self._meta.app_label, self.__class__.__name__, self.title)
|
|
|
|
|
|
+ logger.warning(
|
|
|
|
+ '''
|
|
|
|
+ Tried to filter by ClassifierTerm, but <%s.%s ('%s')>.get_index_children() did
|
|
|
|
+ not return a queryset or is not a queryset of CoderedPage models.
|
|
|
|
+ ''',
|
|
|
|
+ self._meta.app_label,
|
|
|
|
+ self.__class__.__name__,
|
|
|
|
+ self.title
|
|
|
|
+ )
|
|
paginator = Paginator(all_children, self.index_num_per_page)
|
|
paginator = Paginator(all_children, self.index_num_per_page)
|
|
pagenum = request.GET.get('p', 1)
|
|
pagenum = request.GET.get('p', 1)
|
|
try:
|
|
try:
|
|
@@ -594,9 +633,6 @@ class CoderedPage(WagtailCacheMixin, Page, metaclass=CoderedPageMeta):
|
|
context['content_walls'] = self.get_content_walls(check_child_setting=False)
|
|
context['content_walls'] = self.get_content_walls(check_child_setting=False)
|
|
return context
|
|
return context
|
|
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
###############################################################################
|
|
###############################################################################
|
|
# Abstract pages providing pre-built common website functionality, suitable for subclassing.
|
|
# Abstract pages providing pre-built common website functionality, suitable for subclassing.
|
|
# These are abstract so subclasses can override fields if desired.
|
|
# These are abstract so subclasses can override fields if desired.
|
|
@@ -841,7 +877,7 @@ class CoderedEventPage(CoderedWebPage, BaseEvent):
|
|
for occurrence in self.occurrences.all():
|
|
for occurrence in self.occurrences.all():
|
|
aoc += [instance for instance in occurrence.all_occurrences()]
|
|
aoc += [instance for instance in occurrence.all_occurrences()]
|
|
if len(aoc) > 0:
|
|
if len(aoc) > 0:
|
|
- return aoc[-1] # last one in the list
|
|
|
|
|
|
+ return aoc[-1] # last one in the list
|
|
|
|
|
|
except AttributeError:
|
|
except AttributeError:
|
|
# Triggers when a preview is initiated on an EventPage because it uses a FakeQuerySet object.
|
|
# Triggers when a preview is initiated on an EventPage because it uses a FakeQuerySet object.
|
|
@@ -862,8 +898,11 @@ class CoderedEventPage(CoderedWebPage, BaseEvent):
|
|
}
|
|
}
|
|
|
|
|
|
if 'limit' in kwargs:
|
|
if 'limit' in kwargs:
|
|
- if kwargs['limit'] != None:
|
|
|
|
- # Limit the number of event instances that will be generated per occurrence rule to 10, if not otherwise specified.
|
|
|
|
|
|
+ if kwargs['limit'] is not None:
|
|
|
|
+ '''
|
|
|
|
+ Limit the number of event instances that will be
|
|
|
|
+ generated per occurrence rule to 10, if not otherwise specified.
|
|
|
|
+ '''
|
|
occurrence_kwargs['limit'] = kwargs.get('limit', 10)
|
|
occurrence_kwargs['limit'] = kwargs.get('limit', 10)
|
|
|
|
|
|
# For each occurrence rule in all of the occurrence rules for this event.
|
|
# For each occurrence rule in all of the occurrence rules for this event.
|
|
@@ -916,6 +955,7 @@ class CoderedEventPage(CoderedWebPage, BaseEvent):
|
|
events.append(self.convert_to_ical_format(occurrence=occurrence))
|
|
events.append(self.convert_to_ical_format(occurrence=occurrence))
|
|
return events
|
|
return events
|
|
|
|
|
|
|
|
+
|
|
class DefaultCalendarViewChoices():
|
|
class DefaultCalendarViewChoices():
|
|
MONTH = 'month'
|
|
MONTH = 'month'
|
|
AGENDA_WEEK = 'agendaWeek'
|
|
AGENDA_WEEK = 'agendaWeek'
|
|
@@ -930,6 +970,7 @@ class DefaultCalendarViewChoices():
|
|
(LIST_MONTH, _('Calendar List View')),
|
|
(LIST_MONTH, _('Calendar List View')),
|
|
)
|
|
)
|
|
|
|
|
|
|
|
+
|
|
class CoderedEventIndexPage(CoderedWebPage):
|
|
class CoderedEventIndexPage(CoderedWebPage):
|
|
"""
|
|
"""
|
|
Shows a list of event sub-pages.
|
|
Shows a list of event sub-pages.
|
|
@@ -984,7 +1025,7 @@ class CoderedEventIndexPage(CoderedWebPage):
|
|
event_data = {
|
|
event_data = {
|
|
'title': event.title,
|
|
'title': event.title,
|
|
'start': occurrence[0].strftime('%Y-%m-%dT%H:%M:%S'),
|
|
'start': occurrence[0].strftime('%Y-%m-%dT%H:%M:%S'),
|
|
- 'end' : occurrence[1].strftime('%Y-%m-%dT%H:%M:%S') if occurrence[1] else "",
|
|
|
|
|
|
+ 'end': occurrence[1].strftime('%Y-%m-%dT%H:%M:%S') if occurrence[1] else "",
|
|
'description': "",
|
|
'description': "",
|
|
}
|
|
}
|
|
if event.url:
|
|
if event.url:
|
|
@@ -1002,25 +1043,33 @@ class CoderedEventOccurrence(Orderable, BaseOccurrence):
|
|
|
|
|
|
|
|
|
|
class CoderedFormMixin(models.Model):
|
|
class CoderedFormMixin(models.Model):
|
|
-
|
|
|
|
class Meta:
|
|
class Meta:
|
|
- abstract=True
|
|
|
|
|
|
+ abstract = True
|
|
|
|
|
|
submissions_list_view_class = CoderedSubmissionsListView
|
|
submissions_list_view_class = CoderedSubmissionsListView
|
|
encoder = DjangoJSONEncoder
|
|
encoder = DjangoJSONEncoder
|
|
|
|
|
|
- ### Custom codered fields
|
|
|
|
|
|
+ # Custom codered fields
|
|
to_address = models.CharField(
|
|
to_address = models.CharField(
|
|
max_length=255,
|
|
max_length=255,
|
|
blank=True,
|
|
blank=True,
|
|
verbose_name=_('Email form submissions to'),
|
|
verbose_name=_('Email form submissions to'),
|
|
- help_text=_('Optional - email form submissions to this address. Separate multiple addresses by comma.')
|
|
|
|
|
|
+ help_text=_(
|
|
|
|
+ '''
|
|
|
|
+ Optional - email form submissions to this address. Separate multiple addresses by comma.
|
|
|
|
+ '''
|
|
|
|
+ )
|
|
)
|
|
)
|
|
reply_address = models.CharField(
|
|
reply_address = models.CharField(
|
|
max_length=255,
|
|
max_length=255,
|
|
blank=True,
|
|
blank=True,
|
|
verbose_name=_('Reply-to address'),
|
|
verbose_name=_('Reply-to address'),
|
|
- help_text=_('Optional - to reply to the submitter, specify the email field here. For example, if a form field above is labeled "Your Email", enter: {{ your_email }}')
|
|
|
|
|
|
+ help_text=_(
|
|
|
|
+ '''
|
|
|
|
+ Optional - to reply to the submitter, specify the email field here.
|
|
|
|
+ For example, if a form field above is labeled "Your Email", enter: {{ your_email }}'
|
|
|
|
+ '''
|
|
|
|
+ )
|
|
)
|
|
)
|
|
subject = models.CharField(
|
|
subject = models.CharField(
|
|
max_length=255,
|
|
max_length=255,
|
|
@@ -1091,7 +1140,6 @@ class CoderedFormMixin(models.Model):
|
|
help_text=_('Date and time when the FORM will no longer be available on the page.'),
|
|
help_text=_('Date and time when the FORM will no longer be available on the page.'),
|
|
)
|
|
)
|
|
|
|
|
|
-
|
|
|
|
body_content_panels = [
|
|
body_content_panels = [
|
|
MultiFieldPanel(
|
|
MultiFieldPanel(
|
|
[
|
|
[
|
|
@@ -1131,7 +1179,6 @@ class CoderedFormMixin(models.Model):
|
|
)
|
|
)
|
|
]
|
|
]
|
|
|
|
|
|
-
|
|
|
|
@property
|
|
@property
|
|
def form_live(self):
|
|
def form_live(self):
|
|
"""
|
|
"""
|
|
@@ -1327,6 +1374,7 @@ class CoderedFormMixin(models.Model):
|
|
view = self.submissions_list_view_class.as_view()
|
|
view = self.submissions_list_view_class.as_view()
|
|
return view(request, form_page=self, *args, **kwargs)
|
|
return view(request, form_page=self, *args, **kwargs)
|
|
|
|
|
|
|
|
+
|
|
class CoderedFormPage(CoderedFormMixin, CoderedWebPage):
|
|
class CoderedFormPage(CoderedFormMixin, CoderedWebPage):
|
|
"""
|
|
"""
|
|
This is basically a clone of wagtail.contrib.forms.models.AbstractForm
|
|
This is basically a clone of wagtail.contrib.forms.models.AbstractForm
|
|
@@ -1435,6 +1483,7 @@ class CoderedFormPage(CoderedFormMixin, CoderedWebPage):
|
|
)
|
|
)
|
|
return response
|
|
return response
|
|
|
|
|
|
|
|
+
|
|
class CoderedSubmissionRevision(SubmissionRevision, models.Model):
|
|
class CoderedSubmissionRevision(SubmissionRevision, models.Model):
|
|
pass
|
|
pass
|
|
|
|
|
|
@@ -1476,11 +1525,9 @@ class CoderedSessionFormSubmission(SessionFormSubmission):
|
|
def render_link(self, value):
|
|
def render_link(self, value):
|
|
return "{0}{1}".format(cr_settings['PROTECTED_MEDIA_URL'], value)
|
|
return "{0}{1}".format(cr_settings['PROTECTED_MEDIA_URL'], value)
|
|
|
|
|
|
-
|
|
|
|
def render_image(self, value):
|
|
def render_image(self, value):
|
|
return "{0}{1}".format(cr_settings['PROTECTED_MEDIA_URL'], value)
|
|
return "{0}{1}".format(cr_settings['PROTECTED_MEDIA_URL'], value)
|
|
|
|
|
|
-
|
|
|
|
def render_file(self, value):
|
|
def render_file(self, value):
|
|
return "{0}{1}".format(cr_settings['PROTECTED_MEDIA_URL'], value)
|
|
return "{0}{1}".format(cr_settings['PROTECTED_MEDIA_URL'], value)
|
|
|
|
|
|
@@ -1492,8 +1539,7 @@ def create_submission_changed_revision(sender, **kwargs):
|
|
submission = kwargs['instance']
|
|
submission = kwargs['instance']
|
|
created = kwargs['created']
|
|
created = kwargs['created']
|
|
CoderedSubmissionRevision.create_from_submission(
|
|
CoderedSubmissionRevision.create_from_submission(
|
|
- submission, (CoderedSubmissionRevision.CREATED if created
|
|
|
|
- else CoderedSubmissionRevision.CHANGED))
|
|
|
|
|
|
+ submission, (CoderedSubmissionRevision.CREATED if created else CoderedSubmissionRevision.CHANGED))
|
|
|
|
|
|
|
|
|
|
@receiver(post_delete)
|
|
@receiver(post_delete)
|
|
@@ -1502,7 +1548,7 @@ def create_submission_deleted_revision(sender, **kwargs):
|
|
return
|
|
return
|
|
submission = kwargs['instance']
|
|
submission = kwargs['instance']
|
|
CoderedSubmissionRevision.create_from_submission(submission,
|
|
CoderedSubmissionRevision.create_from_submission(submission,
|
|
- SubmissionRevision.DELETED)
|
|
|
|
|
|
+ SubmissionRevision.DELETED)
|
|
|
|
|
|
|
|
|
|
class CoderedStep(Step):
|
|
class CoderedStep(Step):
|
|
@@ -1537,7 +1583,7 @@ class CoderedSteps(Steps):
|
|
|
|
|
|
class CoderedStreamFormMixin(StreamFormMixin):
|
|
class CoderedStreamFormMixin(StreamFormMixin):
|
|
class Meta:
|
|
class Meta:
|
|
- abstract=True
|
|
|
|
|
|
+ abstract = True
|
|
|
|
|
|
def get_steps(self, request=None):
|
|
def get_steps(self, request=None):
|
|
if not hasattr(self, 'steps'):
|
|
if not hasattr(self, 'steps'):
|
|
@@ -1591,9 +1637,9 @@ class CoderedStreamFormPage(CoderedStreamFormMixin, CoderedFormMixin, CoderedWeb
|
|
body_content_panels = [
|
|
body_content_panels = [
|
|
StreamFieldPanel('form_fields')
|
|
StreamFieldPanel('form_fields')
|
|
] + \
|
|
] + \
|
|
- CoderedFormMixin.body_content_panels + [
|
|
|
|
- InlinePanel('confirmation_emails', label=_('Confirmation Emails'))
|
|
|
|
- ]
|
|
|
|
|
|
+ CoderedFormMixin.body_content_panels + [
|
|
|
|
+ InlinePanel('confirmation_emails', label=_('Confirmation Emails'))
|
|
|
|
+ ]
|
|
|
|
|
|
def serve(self, request, *args, **kwargs):
|
|
def serve(self, request, *args, **kwargs):
|
|
context = self.get_context(request)
|
|
context = self.get_context(request)
|
|
@@ -1619,6 +1665,7 @@ class CoderedStreamFormPage(CoderedStreamFormMixin, CoderedFormMixin, CoderedWeb
|
|
base_url=cr_settings['PROTECTED_MEDIA_URL']
|
|
base_url=cr_settings['PROTECTED_MEDIA_URL']
|
|
)
|
|
)
|
|
|
|
|
|
|
|
+
|
|
class CoderedLocationPage(CoderedWebPage):
|
|
class CoderedLocationPage(CoderedWebPage):
|
|
"""
|
|
"""
|
|
Location, suitable for store locations or help centers.
|
|
Location, suitable for store locations or help centers.
|
|
@@ -1729,20 +1776,24 @@ class CoderedLocationPage(CoderedWebPage):
|
|
def to_geojson(self):
|
|
def to_geojson(self):
|
|
return {
|
|
return {
|
|
"type": "Feature",
|
|
"type": "Feature",
|
|
- "geometry":{
|
|
|
|
|
|
+ "geometry": {
|
|
"type": "Point",
|
|
"type": "Point",
|
|
"coordinates": [self.longitude, self.latitude]
|
|
"coordinates": [self.longitude, self.latitude]
|
|
},
|
|
},
|
|
- "properties":{
|
|
|
|
|
|
+ "properties": {
|
|
"list_description": self.render_list_description,
|
|
"list_description": self.render_list_description,
|
|
"pin_description": self.render_pin_description
|
|
"pin_description": self.render_pin_description
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
def save(self, *args, **kwargs):
|
|
def save(self, *args, **kwargs):
|
|
- if self.auto_update_latlng and GoogleApiSettings.for_site(Site.objects.get(is_default_site=True)).google_maps_api_key:
|
|
|
|
|
|
+ if self.auto_update_latlng and GoogleApiSettings.for_site(
|
|
|
|
+ Site.objects.get(is_default_site=True)
|
|
|
|
+ ).google_maps_api_key:
|
|
try:
|
|
try:
|
|
- g = geocoder.google(self.address, key=GoogleApiSettings.for_site(Site.objects.get(is_default_site=True)).google_maps_api_key)
|
|
|
|
|
|
+ g = geocoder.google(self.address, key=GoogleApiSettings.for_site(
|
|
|
|
+ Site.objects.get(is_default_site=True)
|
|
|
|
+ ).google_maps_api_key)
|
|
self.latitude = g.latlng[0]
|
|
self.latitude = g.latlng[0]
|
|
self.longitude = g.latlng[1]
|
|
self.longitude = g.latlng[1]
|
|
except TypeError:
|
|
except TypeError:
|
|
@@ -1751,10 +1802,11 @@ class CoderedLocationPage(CoderedWebPage):
|
|
|
|
|
|
return super(CoderedLocationPage, self).save(*args, **kwargs)
|
|
return super(CoderedLocationPage, self).save(*args, **kwargs)
|
|
|
|
|
|
-
|
|
|
|
def get_context(self, request, *args, **kwargs):
|
|
def get_context(self, request, *args, **kwargs):
|
|
context = super().get_context(request)
|
|
context = super().get_context(request)
|
|
- context['google_api_key'] = GoogleApiSettings.for_site(Site.objects.get(is_default_site=True)).google_maps_api_key
|
|
|
|
|
|
+ context['google_api_key'] = GoogleApiSettings.for_site(
|
|
|
|
+ Site.objects.get(is_default_site=True)
|
|
|
|
+ ).google_maps_api_key
|
|
return context
|
|
return context
|
|
|
|
|
|
|
|
|
|
@@ -1788,7 +1840,12 @@ class CoderedLocationIndexPage(CoderedWebPage):
|
|
MaxValueValidator(20),
|
|
MaxValueValidator(20),
|
|
MinValueValidator(1),
|
|
MinValueValidator(1),
|
|
],
|
|
],
|
|
- help_text=_('Requires API key to use zoom. 1: World, 5: Landmass/continent, 10: City, 15: Streets, 20: Buildings')
|
|
|
|
|
|
+ help_text=_(
|
|
|
|
+ '''
|
|
|
|
+ Requires API key to use zoom. 1: World, 5: Landmass/continent,
|
|
|
|
+ 10: City, 15: Streets, 20: Buildings
|
|
|
|
+ '''
|
|
|
|
+ )
|
|
)
|
|
)
|
|
|
|
|
|
layout_panels = CoderedWebPage.layout_panels + [
|
|
layout_panels = CoderedWebPage.layout_panels + [
|
|
@@ -1820,7 +1877,12 @@ class CoderedLocationIndexPage(CoderedWebPage):
|
|
southwest = [float(x) for x in southwest.split(',')]
|
|
southwest = [float(x) for x in southwest.split(',')]
|
|
northeast = [float(x) for x in northeast.split(',')]
|
|
northeast = [float(x) for x in northeast.split(',')]
|
|
|
|
|
|
- qs = qs.filter(latitude__gte=southwest[0], latitude__lte=northeast[0], longitude__gte=southwest[1], longitude__lte=northeast[1])
|
|
|
|
|
|
+ qs = qs.filter(
|
|
|
|
+ latitude__gte=southwest[0],
|
|
|
|
+ latitude__lte=northeast[0],
|
|
|
|
+ longitude__gte=southwest[1],
|
|
|
|
+ longitude__lte=northeast[1]
|
|
|
|
+ )
|
|
|
|
|
|
return {
|
|
return {
|
|
"type": "FeatureCollection",
|
|
"type": "FeatureCollection",
|
|
@@ -1841,5 +1903,7 @@ class CoderedLocationIndexPage(CoderedWebPage):
|
|
|
|
|
|
def get_context(self, request, *args, **kwargs):
|
|
def get_context(self, request, *args, **kwargs):
|
|
context = super().get_context(request)
|
|
context = super().get_context(request)
|
|
- context['google_api_key'] = GoogleApiSettings.for_site(Site.objects.get(is_default_site=True)).google_maps_api_key
|
|
|
|
|
|
+ context['google_api_key'] = GoogleApiSettings.for_site(
|
|
|
|
+ Site.objects.get(is_default_site=True)
|
|
|
|
+ ).google_maps_api_key
|
|
return context
|
|
return context
|