102 lines
3.1 KiB
Python
102 lines
3.1 KiB
Python
from django import forms
|
|
from django.core.validators import RegexValidator
|
|
from django.db import models
|
|
from grapple.helpers import register_query_field, register_singular_query_field
|
|
from grapple.models import GraphQLImage, GraphQLRichText, GraphQLStreamfield, GraphQLString
|
|
from wagtail.admin.panels import (
|
|
FieldPanel,
|
|
TitleFieldPanel,
|
|
)
|
|
from wagtail.fields import RichTextField, StreamField
|
|
from wagtail.models import Page
|
|
from wagtail.search import index
|
|
from wagtail.snippets.models import register_snippet
|
|
|
|
from contacts.blocks import ContactSectionBlock
|
|
from dnscms.blocks import BASE_BLOCKS
|
|
|
|
PHONE_REGEX_VALIDATOR = RegexValidator(
|
|
regex=r"^\+?1?\d{9,15}$",
|
|
message="Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed.",
|
|
)
|
|
|
|
|
|
@register_singular_query_field("contactIndex")
|
|
class ContactIndex(Page):
|
|
max_count = 1
|
|
subpage_types = []
|
|
|
|
lead = RichTextField(features=["bold", "italic", "link"], blank=True)
|
|
body = StreamField(
|
|
BASE_BLOCKS + [("contact_section", ContactSectionBlock(label="Kontaktseksjon"))]
|
|
)
|
|
|
|
content_panels = Page.content_panels + [
|
|
FieldPanel("lead", heading="Ingress"),
|
|
FieldPanel("body", heading="Innhold"),
|
|
]
|
|
|
|
graphql_fields = [GraphQLRichText("lead"), GraphQLStreamfield("body")]
|
|
|
|
search_fields = Page.search_fields + [index.SearchField("body")]
|
|
|
|
|
|
@register_snippet
|
|
@register_query_field("contactEntity", "contactEntities")
|
|
class ContactEntity(models.Model):
|
|
CONTACT_TYPE_CHOICES = [
|
|
("person", "Person"),
|
|
]
|
|
|
|
name = models.CharField(
|
|
max_length=128,
|
|
null=False,
|
|
blank=False,
|
|
)
|
|
contact_type = models.CharField(
|
|
max_length=128, choices=CONTACT_TYPE_CHOICES, default="person", blank=False
|
|
)
|
|
title = models.CharField(
|
|
max_length=128,
|
|
null=False,
|
|
blank=True,
|
|
)
|
|
email = models.EmailField(blank=True)
|
|
phone_number = models.CharField(validators=[PHONE_REGEX_VALIDATOR], max_length=17, blank=True)
|
|
|
|
image = models.ForeignKey(
|
|
"images.CustomImage",
|
|
null=True,
|
|
blank=True,
|
|
on_delete=models.SET_NULL,
|
|
related_name="+",
|
|
)
|
|
|
|
title_widget = forms.TextInput(attrs={"placeholder": "Navn*"})
|
|
|
|
panels = [
|
|
TitleFieldPanel("name", heading="Navn", widget=title_widget),
|
|
FieldPanel("contact_type", heading="Kontakttype"),
|
|
FieldPanel("title", heading="Tittel/stilling"),
|
|
FieldPanel("email", heading="E-post"),
|
|
FieldPanel("phone_number", heading="Telefonnummer"),
|
|
FieldPanel("image", heading="Bilde"),
|
|
]
|
|
|
|
graphql_fields = [
|
|
GraphQLString("name", required=True),
|
|
GraphQLString("contact_type", required=True),
|
|
GraphQLString("title", required=False),
|
|
GraphQLString("email", required=False),
|
|
GraphQLString("phone_number", required=False),
|
|
GraphQLImage("image", required=False),
|
|
]
|
|
|
|
class Meta:
|
|
verbose_name = "Contact point"
|
|
verbose_name_plural = "Contact points"
|
|
ordering = ["name"]
|
|
|
|
def __str__(self):
|
|
return self.name
|