79 lines
3.5 KiB
Python
79 lines
3.5 KiB
Python
import logging
|
|
|
|
from datetime import timedelta
|
|
|
|
from django.core.exceptions import ValidationError
|
|
from django.utils import timezone
|
|
from django.conf import settings
|
|
|
|
from .email import add_new_speakerproposal_email, add_new_eventproposal_email
|
|
from .models import EventProposal, SpeakerProposal
|
|
from ircbot.models import OutgoingIrcMessage
|
|
logger = logging.getLogger("bornhack.%s" % __name__)
|
|
|
|
|
|
def check_speaker_event_camp_consistency(sender, instance, **kwargs):
|
|
if kwargs['action'] == 'pre_add':
|
|
from program.models import Speaker, Event
|
|
if isinstance(instance, Event):
|
|
# loop over speakers being added to this event
|
|
for pk in kwargs['pk_set']:
|
|
# check if this speaker belongs to a different Camp than the event does
|
|
speaker = Speaker.objects.get(id=pk)
|
|
if speaker.camp != instance.camp:
|
|
raise ValidationError({'speakers': 'The speaker (%s) belongs to a different camp (%s) than the event does (%s)' % (speaker, speaker.camp, instance.camp)})
|
|
elif isinstance(instance, Speaker):
|
|
# loop over events being added to this speaker
|
|
for pk in kwargs['pk_set']:
|
|
# check if this event belongs to a different Camp than the speaker does
|
|
event = Event.objects.get(id=pk)
|
|
if event.camp != instance.camp:
|
|
raise ValidationError({'events': 'The event (%s) belongs to a different camp (%s) than the event does (%s)' % (event, event.camp, instance.camp)})
|
|
|
|
|
|
def check_speaker_camp_change(sender, instance, **kwargs):
|
|
if instance.pk:
|
|
for event in instance.events.all():
|
|
if event.camp != instance.camp:
|
|
raise ValidationError({'camp': 'You cannot change the camp a speaker belongs to if the speaker is associated with one or more events.'})
|
|
|
|
|
|
# pre_save signal that notifies if a proposal changes status from draft to
|
|
# pending i.e. is submitted.
|
|
def notify_proposal_submitted(sender, instance, **kwargs):
|
|
try:
|
|
original = sender.objects.get(pk=instance.pk)
|
|
except sender.DoesNotExist:
|
|
return False
|
|
|
|
target = settings.IRCBOT_CHANNELS['orga'] if 'orga' in settings.IRCBOT_CHANNELS else settings.IRCBOT_CHANNELS['default']
|
|
|
|
if original.proposal_status == 'draft' and instance.proposal_status == 'pending':
|
|
if isinstance(instance, EventProposal):
|
|
if not add_new_eventproposal_email(instance):
|
|
logger.error(
|
|
'Error adding event proposal email to outgoing queue for {}'.format(instance)
|
|
)
|
|
OutgoingIrcMessage.objects.create(
|
|
target=target,
|
|
message="New event proposal: {} - https://bornhack.dk/admin/program/eventproposal/{}/change/".format(
|
|
instance.title,
|
|
instance.uuid
|
|
),
|
|
timeout=timezone.now()+timedelta(minutes=10)
|
|
)
|
|
|
|
if isinstance(instance, SpeakerProposal):
|
|
if not add_new_speakerproposal_email(instance):
|
|
logger.error(
|
|
'Error adding speaker proposal email to outgoing queue for {}'.format(instance)
|
|
)
|
|
OutgoingIrcMessage.objects.create(
|
|
target=target,
|
|
message="New speaker proposal: {} - https://bornhack.dk/admin/program/speakerproposal/{}/change/".format(
|
|
instance.name,
|
|
instance.uuid
|
|
),
|
|
timeout=timezone.now()+timedelta(minutes=10)
|
|
)
|