diff --git a/project/chapters/forms.py b/project/chapters/forms.py new file mode 100644 index 0000000..3dfe719 --- /dev/null +++ b/project/chapters/forms.py @@ -0,0 +1,9 @@ +from django import forms + + +class GroupMembershipForm(forms.Form): + MEMBERSHIP_ACTION_CHOICES = [("join", "Join"), ("leave", "Leave")] + + membership_action = forms.ChoiceField( + label="Membership action", choices=MEMBERSHIP_ACTION_CHOICES + ) diff --git a/project/chapters/migrations/0005_chapter_members.py b/project/chapters/migrations/0005_chapter_members.py new file mode 100644 index 0000000..94c2351 --- /dev/null +++ b/project/chapters/migrations/0005_chapter_members.py @@ -0,0 +1,20 @@ +# Generated by Django 3.2.6 on 2021-10-28 08:06 + +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('chapters', '0004_rename_description_chapter_introduction'), + ] + + operations = [ + migrations.AddField( + model_name='chapter', + name='members', + field=models.ManyToManyField(blank=True, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/project/chapters/models.py b/project/chapters/models.py index 6b3c41c..7db3757 100644 --- a/project/chapters/models.py +++ b/project/chapters/models.py @@ -1,13 +1,21 @@ from django.db import models from django.utils.translation import gettext_lazy as _ +from django.shortcuts import redirect from wagtail.admin.edit_handlers import FieldPanel -from wagtail.core.fields import RichTextField +from wagtail.core.fields import RichTextField, StreamField from wagtail.core.models import Page +from wagtail.core.blocks import RichTextBlock, TextBlock +from wagtail.admin.edit_handlers import StreamFieldPanel + +from accounts.models import User +from .forms import GroupMembershipForm # Create your models here. -class ChaptersIndexPage(Page): + + +class GroupsIndexPage(Page): introduction = RichTextField() content_panels = Page.content_panels + [ @@ -17,22 +25,73 @@ class ChaptersIndexPage(Page): parent_page_types = [ "home.HomePage", ] - subpage_types = [ - "chapters.Chapter" - ] + + subpage_types = [] max_count = 1 + additional_context = "groups" + context_order = ("title",) + + class Meta: + abstract = True + def get_context(self, request): """ - return a Queryset of Chapters + return a Queryset of Groups """ context = super().get_context(request) - context['chapters'] = Chapter.objects.child_of(self).live() + context[self.additional_context] = ( + self.allowed_subpage_models()[0] + .objects.child_of(self) + .live() + .order_by(*self.context_order) + ) + return context + + +class ChaptersIndexPage(GroupsIndexPage): + subpage_types = ["chapters.Chapter"] + additional_context = "chapters" + context_order = ("region", "title") + + +class Group(Page): + introduction = RichTextField() + + content_panels = Page.content_panels + [ + FieldPanel("introduction", classname="full"), + ] + + members = models.ManyToManyField(User, blank=True) + + class Meta: + abstract = True + + def get_context(self, request, *args, **kwargs): + context = super().get_context(request, *args, **kwargs) + + # Check whether request user is a member of current group + context["member"] = request.user in self.members.all() + return context + def serve(self, request, *args, **kwargs): + if request.method == "POST": + # create a form instance and populate it with data from the request: + form = GroupMembershipForm(request.POST) + + if form.is_valid(): + membership_action = form.cleaned_data.get("membership_action") + if membership_action == "join": + self.members.add(request.user) + elif membership_action == "leave": + self.members.remove(request.user) + + return super().serve(request, *args, **kwargs) + -class Chapter(Page): +class Chapter(Group): class RegionChoices(models.TextChoices): AFRICA = "Africa", _("Africa") ANTARCTICA = "Antarctica", _("Antarctica") @@ -42,7 +101,6 @@ class RegionChoices(models.TextChoices): NORTH_AMERICA = "North America", _("North America") SOUTH_AMERICA = "South America", _("South America") - introduction = RichTextField() region = models.CharField( max_length=32, choices=RegionChoices.choices, @@ -50,12 +108,11 @@ class RegionChoices(models.TextChoices): blank=True, ) - content_panels = Page.content_panels + [ - FieldPanel("introduction", classname="full"), + content_panels = Group.content_panels + [ FieldPanel("region"), ] parent_page_types = [ "chapters.ChaptersIndexPage", ] - subpage_types = [] \ No newline at end of file + subpage_types = [] diff --git a/project/chapters/templates/chapters/chapter.html b/project/chapters/templates/chapters/chapter.html index 649d654..e435eed 100644 --- a/project/chapters/templates/chapters/chapter.html +++ b/project/chapters/templates/chapters/chapter.html @@ -1,4 +1,5 @@ {% extends "base.html" %} +{% load i18n %} {% block title %}{{ page.title }}{% endblock title %} @@ -8,4 +9,16 @@
Return to {{ page.get_parent.title }} Page
-{% endblock content %} \ No newline at end of file +{% endblock content %} diff --git a/project/home/migrations/0004_homepage_content.py b/project/home/migrations/0004_homepage_content.py new file mode 100644 index 0000000..8bcfc47 --- /dev/null +++ b/project/home/migrations/0004_homepage_content.py @@ -0,0 +1,21 @@ +# Generated by Django 3.2.6 on 2021-10-28 04:20 + +from django.db import migrations +import wagtail.core.blocks +import wagtail.core.fields +import wagtail.images.blocks + + +class Migration(migrations.Migration): + + dependencies = [ + ('home', '0003_homepage_intro'), + ] + + operations = [ + migrations.AddField( + model_name='homepage', + name='content', + field=wagtail.core.fields.StreamField([('heading', wagtail.core.blocks.CharBlock(form_classname='full title')), ('paragraph', wagtail.core.blocks.RichTextBlock()), ('image', wagtail.images.blocks.ImageChooserBlock())], blank=True), + ), + ] diff --git a/project/home/models.py b/project/home/models.py index cad3591..d3b0b46 100644 --- a/project/home/models.py +++ b/project/home/models.py @@ -6,26 +6,31 @@ from wagtail.admin.edit_handlers import FieldPanel, StreamFieldPanel from wagtail.images.blocks import ImageChooserBlock from invites.models import InviteFriendsPage +from chapters.models import ChaptersIndexPage from django.utils.translation import gettext class HomePage(Page): intro = models.CharField(max_length=250, default="Introduction Line") - content = StreamField([ - ('heading', blocks.CharBlock(form_classname="full title")), - ('paragraph', blocks.RichTextBlock()), - ('image', ImageChooserBlock()), - ]) + content = StreamField( + [ + ("heading", blocks.CharBlock(form_classname="full title")), + ("paragraph", blocks.RichTextBlock()), + ("image", ImageChooserBlock()), + ], + blank=True, + ) max_count = 1 content_panels = Page.content_panels + [ - FieldPanel('intro', classname="full"), - StreamFieldPanel('content'), + FieldPanel("intro", classname="full"), + StreamFieldPanel("content"), ] def get_context(self, request): context = super().get_context(request) - context['invite_friends_page'] = InviteFriendsPage.objects.get() - print(context) + # Get Respective page objects in context for redirection and links + context["invite_friends_page"] = InviteFriendsPage.objects.get() + context["chapters_index_page"] = ChaptersIndexPage.objects.get() return context diff --git a/project/home/templates/home/home_page.html b/project/home/templates/home/home_page.html index 8f66910..28a9e16 100644 --- a/project/home/templates/home/home_page.html +++ b/project/home/templates/home/home_page.html @@ -19,9 +19,15 @@