Allow creating an EventSeries when created an Event by adding a RecurrenceField to the new Event form and generating an EventSeries if it's filled in. Add a management command to auto-create the next event in a Series if the previously created Event's original start_time has passed. Fixes #40
This commit is contained in:
parent
c63eaa6436
commit
8c43ab394e
5 changed files with 54 additions and 2 deletions
|
@ -8,6 +8,7 @@ from django.contrib.auth.models import User
|
||||||
from .models.locale import Country, SPR, City
|
from .models.locale import Country, SPR, City
|
||||||
from .models.profiles import Team, UserProfile
|
from .models.profiles import Team, UserProfile
|
||||||
from .models.events import Event, EventComment ,CommonEvent, EventSeries, Place, EventPhoto
|
from .models.events import Event, EventComment ,CommonEvent, EventSeries, Place, EventPhoto
|
||||||
|
import recurrence
|
||||||
|
|
||||||
import pytz
|
import pytz
|
||||||
from datetime import time
|
from datetime import time
|
||||||
|
@ -189,9 +190,10 @@ class TeamEventForm(forms.ModelForm):
|
||||||
return cleaned_data
|
return cleaned_data
|
||||||
|
|
||||||
class NewTeamEventForm(forms.ModelForm):
|
class NewTeamEventForm(forms.ModelForm):
|
||||||
|
recurrences = recurrence.forms.RecurrenceField(label="Repeat", required=False)
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Event
|
model = Event
|
||||||
fields = ['name', 'start_time', 'end_time', 'summary']
|
fields = ['name', 'start_time', 'end_time', 'recurrences', 'summary']
|
||||||
widgets = {
|
widgets = {
|
||||||
'start_time': DateTimeWidget,
|
'start_time': DateTimeWidget,
|
||||||
'end_time': DateTimeWidget
|
'end_time': DateTimeWidget
|
||||||
|
|
20
events/management/commands/create_next_in_series.py
Normal file
20
events/management/commands/create_next_in_series.py
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
from django.core.management.base import BaseCommand, CommandError
|
||||||
|
from django.conf import settings
|
||||||
|
from django.contrib.sites.models import Site
|
||||||
|
from django.utils import timezone
|
||||||
|
|
||||||
|
from events.models import Event, EventSeries
|
||||||
|
|
||||||
|
import time
|
||||||
|
import datetime
|
||||||
|
|
||||||
|
class Command(BaseCommand):
|
||||||
|
help = "Generates the next event for any series that needs one"
|
||||||
|
|
||||||
|
def handle(self, *args, **options):
|
||||||
|
needs_update = EventSeries.objects.filter(last_time__lte=timezone.now())
|
||||||
|
|
||||||
|
for series in needs_update:
|
||||||
|
next_event = series.create_next_in_series()
|
||||||
|
if next_event is not None:
|
||||||
|
print("Created new event: %s" % next_event)
|
|
@ -310,8 +310,26 @@ class EventSeries(models.Model):
|
||||||
|
|
||||||
tags = models.CharField(verbose_name=_("Keyword Tags"), blank=True, null=True, max_length=128)
|
tags = models.CharField(verbose_name=_("Keyword Tags"), blank=True, null=True, max_length=128)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_event(klass, event, recurrences):
|
||||||
|
new_series = EventSeries(
|
||||||
|
team=event.team,
|
||||||
|
parent=event.parent,
|
||||||
|
name=event.name,
|
||||||
|
start_time=event.local_start_time.time(),
|
||||||
|
end_time=event.local_end_time.time(),
|
||||||
|
last_time=event.start_time,
|
||||||
|
summary=event.summary,
|
||||||
|
place=event.place,
|
||||||
|
created_by=event.created_by,
|
||||||
|
recurrences=recurrences,
|
||||||
|
)
|
||||||
|
return new_series
|
||||||
|
|
||||||
def create_next_in_series(self):
|
def create_next_in_series(self):
|
||||||
next_date = self.recurrences.after(self.last_time, dtstart=self.last_time)
|
next_date = self.recurrences.after(self.last_time, dtstart=self.last_time)
|
||||||
|
if next_date is None:
|
||||||
|
return None
|
||||||
event_tz = pytz.timezone(self.tz)
|
event_tz = pytz.timezone(self.tz)
|
||||||
|
|
||||||
next_start = pytz.utc.localize(timezone.make_naive(event_tz.localize(datetime.datetime.combine(next_date.date(), self.start_time))))
|
next_start = pytz.utc.localize(timezone.make_naive(event_tz.localize(datetime.datetime.combine(next_date.date(), self.start_time))))
|
||||||
|
|
|
@ -1,7 +1,13 @@
|
||||||
{% extends "get_together/base.html" %}
|
{% extends "get_together/base.html" %}
|
||||||
{% load static %}
|
{% load static %}
|
||||||
|
|
||||||
{% block extra_google_analytics %}
|
{% block meta %}
|
||||||
|
<script type="text/javascript" src="{% static 'recurrence/js/recurrence.js' %}"></script>
|
||||||
|
<script type="text/javascript" src="{% static 'recurrence/js/recurrence-widget.js' %}"></script>
|
||||||
|
<link href="{% static 'recurrence/css/recurrence.css' %}" rel="stylesheet">
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block extra_google_analytics %}
|
||||||
gtag('config', '{{settings.GOOGLE_ANALYTICS_ID}}', {'page_path': '/team/+create-event/'});
|
gtag('config', '{{settings.GOOGLE_ANALYTICS_ID}}', {'page_path': '/team/+create-event/'});
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
|
|
@ -105,6 +105,12 @@ def create_event(request, team_id):
|
||||||
if form.is_valid:
|
if form.is_valid:
|
||||||
new_event = form.save()
|
new_event = form.save()
|
||||||
Attendee.objects.create(event=new_event, user=request.user.profile, role=Attendee.HOST, status=Attendee.YES)
|
Attendee.objects.create(event=new_event, user=request.user.profile, role=Attendee.HOST, status=Attendee.YES)
|
||||||
|
|
||||||
|
if form.cleaned_data.get('recurrences', None):
|
||||||
|
new_series = EventSeries.from_event(new_event, recurrences=form.cleaned_data['recurrences'])
|
||||||
|
new_series.save()
|
||||||
|
new_event.series = new_series
|
||||||
|
new_event.save()
|
||||||
return redirect('add-place', new_event.id)
|
return redirect('add-place', new_event.id)
|
||||||
else:
|
else:
|
||||||
context = {
|
context = {
|
||||||
|
|
Loading…
Reference in a new issue