from django.contrib.auth.models import Group from django.forms import CheckboxSelectMultiple from wagtail.admin.panels import FieldPanel from wagtail.fields import RichTextField from wagtail.models import Page from wagtail.models.copying import ParentalManyToManyField class HomePage(Page): body = RichTextField(blank=True) content_panels = Page.content_panels + ["body"] class CoursePage(Page): body = RichTextField(blank=True) allowed_groups = ParentalManyToManyField( Group, related_name="course_pages", help_text="Select a group to restrict access to this course. Non-members will be prompted to purchase the course to view modules.", ) def _user_has_access(self, user): if not user.is_authenticated: return False user_group_ids = user.groups.values_list("id", flat=True) return self.allowed_groups.filter(id__in=user_group_ids).exists() def get_context(self, request): context = super().get_context(request) context["user_has_access"] = self._user_has_access(request.user) return context content_panels = Page.content_panels + [ FieldPanel("body"), FieldPanel("allowed_groups", widget=CheckboxSelectMultiple), ] class CourseModulePage(Page): body = RichTextField(blank=True) @property def course(self): if hasattr(self, "get_parent"): parent = self.get_parent() if parent and hasattr(parent, "specific"): return parent.specific return None @property def full_title(self): course = self.course if course: return f"{course.title} - {self.title}" return self.title content_panels = Page.content_panels + ["body"]