-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #30 from MerlinB/events
Events
- Loading branch information
Showing
27 changed files
with
758 additions
and
19 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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',), | ||
), | ||
] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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')) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
Oops, something went wrong.