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 if duplicate_id: # Use a blank event, but fill in the initial data from duplication_id event_initial = Event.objects.get(id=duplicate_id) # 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 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', 'start_time') for field in blank_fields: initial[field] = '' if request.method == 'POST': event = Event() if duplicate_id and 'placeholder_img' not in request.FILES: # 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() messages.success(request, 'Event "%s" created.' % event.title) return redirect('manage:events') else: form = form_class(initial=initial) return render(request, 'manage/event_request.html', { 'form': form, 'duplicate_event': event_initial })
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 if duplicate_id: # Use a blank event, but fill in the initial data from duplication_id event_initial = Event.objects.get(id=duplicate_id) # 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 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', 'start_time') for field in blank_fields: initial[field] = '' if request.method == 'POST': event = Event() if duplicate_id and 'placeholder_img' not in request.FILES: # 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() messages.success(request, 'Event "%s" created.' % event.title) return redirect('manage:events') else: form = form_class(initial=initial) return render(request, 'manage/event_request.html', {'form': form, 'duplicate_event': event_initial})
def handle(self, *args, **options): if options['clear']: for e in Event.objects.all(): e.delete() self._check_video_templates() attachments = {} try: wordpress_xml_dump = args[0] item_parser = etree.iterparse(wordpress_xml_dump, tag='item') except IndexError: raise CommandError('Please provide an XML dump.') except IOError: raise CommandError('The provided file does not exist or is not' ' a valid Wordpress XML dump') try: self.default_thumb_path = args[1] self.default_thumb = open(self.default_thumb_path, 'rb') except IOError: raise CommandError('Please provide a valid default thumbnail.') for _, element in item_parser: fields = { 'title': 'title', 'status': 'wp:status', 'start_time': 'pubDate', 'description': 'content:encoded', 'short_description': 'excerpt:encoded', 'created': 'wp:post_date', 'slug': 'wp:post_name', 'type': 'wp:post_type', 'attachment': 'wp:attachment_url', 'post_id': 'wp:post_id' } item = self.extract_item(element, fields) if Event.objects.filter(slug=item['slug']).exists(): self.stdout.write('Event %s already exists, skipping.\n' % item['slug']) continue if item['type'] == 'attachment': # The item is a thumbnail attachment; save for later attachments[item['post_id']] = item['attachment'] elif item['type'] == 'post': # Create and initiate a new event event = Event() event.title = item['title'] event.slug = item['slug'] try: event.start_time = datetime.datetime.strptime( item['start_time'], '%a, %d %b %Y %H:%M:%S +0000').replace(tzinfo=utc) except ValueError: event.start_time = datetime.datetime.strptime( item['created'], '%Y-%m-%d %H:%M:%S').replace(tzinfo=utc) event.archive_time = (event.start_time + datetime.timedelta(hours=1)) # Set status & public status from WP metadata event.status = Event.STATUS_INITIATED event.public = False if item['status'] == 'publish': event.status = Event.STATUS_SCHEDULED event.public = True elif item['status'] == 'private': event.status = Event.STATUS_SCHEDULED elif item['status'] == 'trash': event.status = Event.STATUS_REMOVED # Parse out the video from the event description event.description = 'n/a' if item['description']: self.parse_description(event, item['description']) event.short_description = item['short_description'] or '' # Add thumbnail and save thumbnail_id = 0 for meta in element.findall('wp:postmeta', namespaces=self.nsmap): meta_key, meta_val = meta.getchildren() if meta_key.text == '_thumbnail_id': thumbnail_id = meta_val.text if thumbnail_id in attachments: self.attach_thumbnail(event, attachments[thumbnail_id]) else: self.attach_thumbnail(event) self.stdout.write( 'No thumb found for %s, used default.\n' % event.slug) event.save() self.stdout.write('Saved event %s\n' % event.slug)
def handle(self, *args, **options): if options['clear']: for e in Event.objects.all(): e.delete() self._check_video_templates() attachments = {} try: wordpress_xml_dump = args[0] item_parser = etree.iterparse(wordpress_xml_dump, tag='item') except IndexError: raise CommandError('Please provide an XML dump.') except IOError: raise CommandError('The provided file does not exist or is not' ' a valid Wordpress XML dump') try: self.default_thumb_path = args[1] self.default_thumb = open(self.default_thumb_path, 'rb') except IOError: raise CommandError('Please provide a valid default thumbnail.') for _, element in item_parser: fields = { 'title': 'title', 'status': 'wp:status', 'start_time': 'pubDate', 'description': 'content:encoded', 'short_description': 'excerpt:encoded', 'created': 'wp:post_date', 'slug': 'wp:post_name', 'type': 'wp:post_type', 'attachment': 'wp:attachment_url', 'post_id': 'wp:post_id' } item = self.extract_item(element, fields) if Event.objects.filter(slug=item['slug']).exists(): self.stdout.write( 'Event %s already exists, skipping.\n' % item['slug'] ) continue if item['type'] == 'attachment': # The item is a thumbnail attachment; save for later attachments[item['post_id']] = item['attachment'] elif item['type'] == 'post': # Create and initiate a new event event = Event() event.title = item['title'] event.slug = item['slug'] try: event.start_time = datetime.datetime.strptime( item['start_time'], '%a, %d %b %Y %H:%M:%S +0000' ).replace(tzinfo=utc) except ValueError: event.start_time = datetime.datetime.strptime( item['created'], '%Y-%m-%d %H:%M:%S' ).replace(tzinfo=utc) event.archive_time = ( event.start_time + datetime.timedelta(hours=1) ) # Set status & public status from WP metadata event.status = Event.STATUS_INITIATED event.public = False if item['status'] == 'publish': event.status = Event.STATUS_SCHEDULED event.public = True elif item['status'] == 'private': event.status = Event.STATUS_SCHEDULED elif item['status'] == 'trash': event.status = Event.STATUS_REMOVED # Parse out the video from the event description event.description = 'n/a' if item['description']: self.parse_description(event, item['description']) event.short_description = item['short_description'] or '' # Add categories and tags event.save() for category in element.findall('category'): domain = category.attrib['domain'] text = category.text if domain == 'category' and not event.category: cat, _ = Category.objects.get_or_create(name=text) event.category = cat else: tag = text.lower().strip() tag_add, _ = Tag.objects.get_or_create(name=tag) event.tags.add(tag_add) # Add thumbnail and save thumbnail_id = 0 for meta in element.findall('wp:postmeta', namespaces=self.nsmap): meta_key, meta_val = meta.getchildren() if meta_key.text == '_thumbnail_id': thumbnail_id = meta_val.text if thumbnail_id in attachments: self.attach_thumbnail(event, attachments[thumbnail_id]) else: self.attach_thumbnail(event) self.stdout.write( 'No thumb found for %s, used default.\n' % event.slug ) event.save() self.stdout.write('Saved event %s\n' % event.slug)
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)