Skip to content

Commit

Permalink
Merge pull request #30 from MerlinB/events
Browse files Browse the repository at this point in the history
Events
  • Loading branch information
Merlin authored and GitHub committed Jun 1, 2019
2 parents 9975f22 + b34f7dd commit 8c8704c
Show file tree
Hide file tree
Showing 27 changed files with 758 additions and 19 deletions.
20 changes: 20 additions & 0 deletions mpicms/base/models.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import json
from django.apps import apps
from django.db import models
from django.utils.translation import gettext as _
Expand All @@ -13,6 +14,7 @@
from wagtail.snippets.edit_handlers import SnippetChooserPanel

from mpicms.news.mixins import NewsMixin
from mpicms.events.models import Event


Page.show_in_menus_default = True
Expand Down Expand Up @@ -51,6 +53,24 @@ class HomePage(NewsMixin, Page):

content_panels = Page.content_panels

def get_context(self, request, *args, **kwargs):
context = super().get_context(request, *args, **kwargs)

# Events
events = []
for event in Event.objects.live():
events.append({
'title': event.title,
'start': event.start.isoformat(),
'end': event.end.isoformat(),
'url': event.get_url(request=request),
'color': '#006c66'
})

context["events"] = json.dumps(events)

return context

class Meta: # noqa
verbose_name = _("homepage")
verbose_name_plural = _("homepages")
Expand Down
Empty file added mpicms/events/__init__.py
Empty file.
6 changes: 6 additions & 0 deletions mpicms/events/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from django.apps import AppConfig


class EventAppConfig(AppConfig):
name = "mpicms.events"
verbose_name = "Events"
28 changes: 28 additions & 0 deletions mpicms/events/managers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
from wagtail.core.models import PageManager


class DatedEventManager(PageManager):
@staticmethod
def _get_min_time(dt):
"""
Makes clock to 00:00:00
:param dt: datetime
:return: datetime
"""
return dt.replace(hour=0, minute=0, second=0)

def in_date_range(self, start, end):
"""
Get event dates that appear between the start and end dates
:return: Filtered django model queryset
"""
start = self._get_min_time(start)
end = self._get_min_time(end)
return self.filter(start_date__gte=start, start_date__lte=end)

def live(self):
"""
Get event dates associated with live event series
:return: Filtered django model queryset
"""
return self.filter(live=True)
45 changes: 45 additions & 0 deletions mpicms/events/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# Generated by Django 2.2.1 on 2019-06-01 11:08

from django.db import migrations, models
import django.db.models.deletion
import wagtail.core.fields


class Migration(migrations.Migration):

initial = True

dependencies = [
('wagtailcore', '0041_group_collection_permissions_verbose_name_plural'),
]

operations = [
migrations.CreateModel(
name='Event',
fields=[
('page_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='wagtailcore.Page')),
('start_date', models.DateTimeField()),
('end_date', models.DateTimeField(blank=True, null=True)),
('description', models.TextField(blank=True, max_length=400)),
('description_en', models.TextField(blank=True, max_length=400, null=True)),
('description_de', models.TextField(blank=True, max_length=400, null=True)),
('body', wagtail.core.fields.RichTextField(blank=True, verbose_name='content')),
('body_en', wagtail.core.fields.RichTextField(blank=True, null=True, verbose_name='content')),
('body_de', wagtail.core.fields.RichTextField(blank=True, null=True, verbose_name='content')),
],
options={
'ordering': ['start_date'],
},
bases=('wagtailcore.page',),
),
migrations.CreateModel(
name='EventIndex',
fields=[
('page_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='wagtailcore.Page')),
],
options={
'abstract': False,
},
bases=('wagtailcore.page',),
),
]
33 changes: 33 additions & 0 deletions mpicms/events/migrations/0002_auto_20190601_1604.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Generated by Django 2.2.1 on 2019-06-01 14:04

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('events', '0001_initial'),
]

operations = [
migrations.AddField(
model_name='event',
name='end_time',
field=models.TimeField(blank=True, null=True),
),
migrations.AddField(
model_name='event',
name='start_time',
field=models.TimeField(blank=True, null=True),
),
migrations.AlterField(
model_name='event',
name='end_date',
field=models.DateField(blank=True, null=True),
),
migrations.AlterField(
model_name='event',
name='start_date',
field=models.DateField(),
),
]
Empty file.
134 changes: 134 additions & 0 deletions mpicms/events/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
import json
from datetime import datetime

from django.db import models
from django.core.exceptions import ValidationError
# from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
# from django.db import models
# from django.utils import timezone
from django.utils.translation import gettext as _

from wagtail.admin.edit_handlers import FieldPanel, MultiFieldPanel
from wagtail.core.models import Page
# from wagtail.images.blocks import ImageChooserBlock
# from wagtail.images.edit_handlers import ImageChooserPanel
from wagtail.core.fields import RichTextField

# from .date_filters import get_range
# from .managers import DatedEventManager
# from .utils import date_to_datetime


class Event(Page):
start_date = models.DateField()
end_date = models.DateField(blank=True, null=True)
start_time = models.TimeField(blank=True, null=True)
end_time = models.TimeField(blank=True, null=True)
# objects = DatedEventManager()
description = models.TextField(max_length=400, null=False, blank=True)
body = RichTextField(_("content"), blank=True)

parent_page_types = ['events.EventIndex']
subpage_types = []

content_panels = Page.content_panels + [
FieldPanel('description'),
MultiFieldPanel(
[
FieldPanel('start_date'),
FieldPanel('start_time'),
FieldPanel('end_date'),
FieldPanel('end_time'),
],
heading="Event Start / End Dates"
),
FieldPanel('body', classname="full"),
]

@property
def start(self):
if self.start_time:
return datetime.combine(self.start_date, self.start_time)
return self.start_date

@property
def end(self):
if self.end_time:
return datetime.combine(self.end_date, self.end_time)
return self.end_date

def clean(self):
"""Clean the model fields, if end_date is before start_date raise a ValidationError."""
super().clean()

if self.end_date and self.end_date < self.start_date:
raise ValidationError({'end_date': 'The end date cannot be before the start date.'})

class Meta(object): # noqa
ordering = ['start_date']


class EventIndex(Page):
parent_page_types = ['base.HomePage']
subpage_types = ['events.Event']

# PAGINATE_BY = 3

# search_fields = Page.search_fields + [
# index.SearchField('body'),
# index.FilterField('date'),
# ]

content_panels = Page.content_panels
# promote_panels = [
# MultiFieldPanel(Page.promote_panels, "Common page configuration"),
# ]

def get_context(self, request, *args, **kwargs):
context = super().get_context(request, *args, **kwargs)

events = []
for child in self.get_children().type(Event).live().specific():
events.append({
'title': child.title,
'start': child.start.isoformat(),
'end': child.end.isoformat(),
'url': child.get_url(request=request),
'color': '#006c66'
})

context["events"] = json.dumps(events)

return context


# def get_context(self, request, *args, **kwargs):
# """
# Adds child pages to the context and paginates them.
# """
# context = super().get_context(request, *args, **kwargs)
# children = self.get_children().type(Event)

# # Period
# period = request.GET.get('scope', None)
# start_date = request.GET.get('start_date', '')
# if period:
# self.get_start_end(period, start_date)
# children.filter(start_date__gte=start_date).filter(end_date__lte=end_date)

# # Pagination
# paginator = Paginator(queryset, PAGINATE_BY)
# page_num = request.GET.get('page', 1) or 1

# try:
# queryset = paginator.page(page_num)
# except PageNotAnInteger:
# queryset = paginator.page(1)
# except EmptyPage:
# queryset = paginator.page(paginator.num_pages)

# context.update(
# children=queryset,
# paginator=paginator
# )
# return context
Empty file.
64 changes: 64 additions & 0 deletions mpicms/events/templatetags/wagtail_events_tags.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
from urllib.parse import urlencode

from django import template


register = template.Library()


@register.simple_tag(takes_context=True)
def querystring(context, *args, **kwargs):
"""
Display all GET values (except page) encoded as url params
:param context: template context
:return: string|encoded params as urlstring
"""
try:
params = context['request'].GET.dict()
except (KeyError, AttributeError):
params = {}
else:
for value in args:
params.pop(value, None)
for key, value in kwargs.items():
params[key] = value
return urlencode(params)


def _patch(context, key, data):
"""
Patch the GET value
:param context: template context dict
:param key: item name
:param data: item value
:return: patched url params
"""
getvars = dict(context['request'].GET)
getvars[key] = [data]
return '?{0}'.format(urlencode(getvars, doseq=True))


@register.simple_tag(takes_context=True)
def patch_scope(context, scope):
"""
Prepare scope for agenda
:param context:
:param scope:
:return:
"""
return _patch(context, 'scope', scope)


@register.simple_tag(takes_context=True)
def patch_start_date(context, date):
"""
Prepare `start_date` url for agenda
:param context: template context dict
:param date: start_date
:return:
"""
return _patch(context, 'start_date', date.strftime('%Y.%m.%d'))
17 changes: 17 additions & 0 deletions mpicms/events/translation.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from modeltranslation.translator import TranslationOptions
from modeltranslation.decorators import register

from .models import Event, EventIndex


@register(Event)
class EventPageTR(TranslationOptions):
fields = (
'description',
'body'
)


@register(EventIndex)
class EventIndexPageTR(TranslationOptions):
pass
Loading

0 comments on commit 8c8704c

Please sign in to comment.