Пример #1
0
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
    })
Пример #2
0
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})
Пример #3
0
    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)
Пример #4
0
    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)
Пример #5
0
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)