def event_request(request, duplicate_id=None): """Event request page: create new events to be published.""" if (request.user.has_perm('main.add_event_scheduled') or request.user.has_perm('main.change_event_others')): form_class = forms.EventExperiencedRequestForm else: form_class = forms.EventRequestForm initial = {} event_initial = None curated_groups = [] if duplicate_id: # Use a blank event, but fill in the initial data from duplication_id event_initial = Event.objects.get(id=duplicate_id) try: discussion = Discussion.objects.get(event=event_initial) except Discussion.DoesNotExist: discussion = None curated_groups = CuratedGroup.objects.filter(event=event_initial) if discussion: # We need to extend the current form class with one more # boolean field. from django import forms as django_forms class _Form(form_class): enable_discussion = django_forms.BooleanField( help_text=( '"%s" had discussion enabled. ' 'Duplicate that configuration?' % event_initial.title ) ) form_class = _Form # We copy the initial data from a form generated on the origin event # to retain initial data processing, e.g., on EnvironmentField. event_initial_form = form_class(instance=event_initial) for field in event_initial_form.fields: if field == 'start_time': if event_initial.location: initial['start_time'] = event_initial.location_time else: initial['start_time'] = event_initial.start_time # safer to do this here initial['start_time'] = ( initial['start_time'].replace(tzinfo=None) ) else: if field in event_initial_form.initial: # Usual initial form data initial[field] = event_initial_form.initial[field] else: # Populated by form __init__ (e.g., approvals) initial[field] = event_initial_form.fields[field].initial # Excluded fields in an event copy blank_fields = ('slug',) for field in blank_fields: initial[field] = '' if request.method == 'POST': event = Event() if request.POST.get('picture'): event.picture = Picture.objects.get(id=request.POST['picture']) if ( duplicate_id and 'placeholder_img' not in request.FILES and not request.POST.get('picture') ): # If this is a duplicate event action and a placeholder_img # was not provided, copy it from the duplication source. event.placeholder_img = event_initial.placeholder_img form = form_class(request.POST, request.FILES, instance=event) if form.is_valid(): event = form.save(commit=False) _event_process(request, form, event) event.save() form.save_m2m() if form.cleaned_data.get('enable_discussion'): dup_discussion = Discussion.objects.create( event=event, enabled=True, closed=False, moderate_all=discussion.moderate_all, notify_all=discussion.notify_all ) for moderator in discussion.moderators.all(): dup_discussion.moderators.add(moderator) messages.success(request, 'Event "%s" created.' % event.title) return redirect('manage:events') else: if duplicate_id and discussion: initial['enable_discussion'] = True if duplicate_id and curated_groups: initial['curated_groups'] = ', '.join( x.name for x in curated_groups ) form = form_class(initial=initial) context = { 'form': form, 'duplicate_event': event_initial, } return render(request, 'manage/event_request.html', context)