Ejemplo n.º 1
0
def copy(request, app_label, model_name, id):
    # Validate snippet has been registered and title_field is set.
    meta = snippet_copy_registry.get(app_label, model_name)
    if meta is None:
        raise Exception("This snippet isn't registered as copyable")

    try:
        model = apps.get_model(app_label, model_name)
    except LookupError:
        raise Http404

    permission = get_permission_name('change', model)
    if not request.user.has_perm(permission):
        return permission_denied(request)

    snippet = get_object_or_404(model, id=id)

    # Create the form
    form = meta['copy_form_class'](request.POST or None, snippet=snippet, title_field_name=meta['title_field_name'])

    next_url = get_valid_next_url_from_request(request)

    for fn in hooks.get_hooks('before_copy_snippet'):
        result = fn(request, snippet)
        if hasattr(result, 'status_code'):
            return result

    # Check if user is submitting
    if request.method == 'POST':

        if form.is_valid():

            # Copy the snippet
            new_snippet = form.copy()

            # Give a success message back to the user
            messages.success(request, _(f"{snippet.get_snippet_verbose_name()} '{snippet}' has been copied.").format(snippet))

            for fn in hooks.get_hooks('after_copy_snippet'):
                result = fn(request, snippet, new_snippet)
                if hasattr(result, 'status_code'):
                    return result

            if next_url:
                return redirect(next_url)

            if 'wagtail.contrib.modeladmin' in settings.INSTALLED_APPS:
                url_helper = AdminURLHelper(new_snippet)
                return redirect(url_helper.get_action_url('edit', quote(new_snippet.pk)))

            return redirect('wagtailsnippets:edit', app_label, model_name, new_snippet.id)

    return render(request, 'wagtailsnippetscopy/copy.html', {
        'snippet': snippet,
        'app_label': app_label,
        'model_name': model_name,
        'form': form,
        'next': next_url,
    })
Ejemplo n.º 2
0
def edit(request, video_id):
    Video = get_video_model()
    VideoForm = get_video_form(Video)
    video = get_object_or_404(Video, id=video_id)

    if request.POST:
        original_file = video.file
        form = VideoForm(request.POST, request.FILES, instance=video)
        if form.is_valid():
            if 'file' in form.changed_data:
                # if providing a new video file, delete the old one and all renditions.
                # NB Doing this via original_file.delete() clears the file field,
                # which definitely isn't what we want...
                original_file.storage.delete(original_file.name)

                # Set new video file size
                video.file_size = video.file.size

            video = form.save()
            video.save()

            # Reindex the video to make sure all tags are indexed
            for backend in get_search_backends():
                backend.add(video)

            messages.success(request, _("Video '{0}' updated.").format(video.title))
        else:
            messages.error(request, _("The video could not be saved due to errors."))
    else:
        form = VideoForm(instance=video)

    if not video._meta.get_field('file').storage.exists(video.file.name):
        # Give error if video file doesn't exist
        messages.error(request, _(
            "The source video file could not be found. Please change the source or delete the video."
        ).format(video.title), buttons=[
            messages.button(reverse('wagtailvideos:delete', args=(video.id,)), _('Delete'))
        ])
    if is_modeladmin_installed():
        url_helper = AdminURLHelper(Video.get_track_listing_model())
        if hasattr(video, 'track_listing'):
            action_url = url_helper.get_action_url('edit', instance_pk=video.track_listing.pk)
        else:
            action_url = url_helper.create_url
    else:
        action_url = ''

    return render(request, "wagtailvideos/videos/edit.html", {
        'video': video,
        'form': form,
        'filesize': video.get_file_size(),
        'can_transcode': ffmpeg.installed(),
        'transcodes': video.transcodes.all(),
        'transcode_form': VideoTranscodeAdminForm(video=video),
        'tracks_action_url': action_url,
        'user_can_delete': permission_policy.user_has_permission_for_instance(request.user, 'delete', video)
    })
Ejemplo n.º 3
0
def get_edit_url(model, object_id):
    """Get admin edit URL to an object of a model registered in ModelAdmin"""

    url_name = AdminURLHelper(model).get_action_url_name('edit')
    try:
        return reverse(url_name, args=[object_id])
    except NoReverseMatch:
        return None
Ejemplo n.º 4
0
def process_pending_tag_cleanups(request):
    action_name = request.POST['action']
    action = TAG_CLEANUP_ACTIONS.get(action_name)
    if not action:
        return HttpResponseBadRequest(
            f'invalid action: {bleach.clean(action_name)}')
    action()
    return HttpResponseRedirect(AdminURLHelper(TagCleanup).index_url)
Ejemplo n.º 5
0
    def __init__(self, model, **kwargs):
        self.target_model = model
        name = self.target_model._meta.verbose_name
        self.choose_one_text = _('Choose %s') % name
        self.choose_another_text = _('Choose another %s') % name
        self.link_to_chosen_text = _('Edit this %s') % name

        self.url_helper = AdminURLHelper(model)

        super(AdminModelChooser, self).__init__(**kwargs)
Ejemplo n.º 6
0
    def setUp(self):
        super().setUp()
        self._setup_local_group_pages()
        self.admin_url_helper = AdminURLHelper(model=LocalGroup)

        site_moderators_group = Group.objects.get(
            name="Overall Site Moderators")
        self.site_moderator = G(get_user_model(), is_staff=True)
        self.site_moderator.groups.set([site_moderators_group])

        local_group_moderators_group = Group.objects.get(
            name=get_auth_group_name(self.local_group.name,
                                     PAGE_MODERATORS_SUFFIX))
        self.local_group_moderator = G(get_user_model(), is_staff=True)
        self.local_group_moderator.groups.set([local_group_moderators_group])

        regional_group_moderators_group = Group.objects.get(
            name=get_auth_group_name(self.regional_group.name,
                                     PAGE_MODERATORS_SUFFIX))
        self.regional_group_moderator = G(get_user_model(), is_staff=True)
        self.regional_group_moderator.groups.set(
            [regional_group_moderators_group])
Ejemplo n.º 7
0
    def get_buttons_for_obj(self, campaign, **kwargs):
        url_helper = AdminURLHelper(self.model)

        def button(action_url, label, classnames):
            return {
                'url':
                url_helper.get_action_url(action_url, instance_pk=campaign.id),
                'label':
                label,
                'title':
                label,
                'classname':
                'button button-small ' + classnames
            }

        if campaign.status == CampaignStatus.SENDING:
            return [
                button('preview', 'Preview',
                       'button-secondary icon icon-view'),
            ]

        sent = campaign.status != CampaignStatus.UNSENT

        delete_btn = button('delete', 'Delete', 'no button-secondary')
        copy_btn = button('copy', 'Copy', 'button-secondary')
        if not sent:
            buttons = [
                button('edit', 'Edit', 'bicolor icon icon-edit'), copy_btn,
                button('confirm_send', 'Send', 'bicolor icon icon-mail'),
                button('send_test', 'Send test',
                       'button-secondary icon icon-cog'),
                button('preview', 'Preview',
                       'button-secondary icon icon-view'), delete_btn
            ]
        else:
            buttons = [
                button('inspect', 'View', 'button-secondary icon icon-view'),
                copy_btn,
                delete_btn,
            ]

        return buttons
Ejemplo n.º 8
0
class LocalGroupAdminTest(PagesBaseTest, WebTest):
    def setUp(self):
        super().setUp()
        self._setup_local_group_pages()
        self.admin_url_helper = AdminURLHelper(model=LocalGroup)

        site_moderators_group = Group.objects.get(
            name="Overall Site Moderators")
        self.site_moderator = G(get_user_model(), is_staff=True)
        self.site_moderator.groups.set([site_moderators_group])

        local_group_moderators_group = Group.objects.get(
            name=get_auth_group_name(self.local_group.name,
                                     PAGE_MODERATORS_SUFFIX))
        self.local_group_moderator = G(get_user_model(), is_staff=True)
        self.local_group_moderator.groups.set([local_group_moderators_group])

        regional_group_moderators_group = Group.objects.get(
            name=get_auth_group_name(self.regional_group.name,
                                     PAGE_MODERATORS_SUFFIX))
        self.regional_group_moderator = G(get_user_model(), is_staff=True)
        self.regional_group_moderator.groups.set(
            [regional_group_moderators_group])

    def test_local_group_moderator_can_view_local_group_index(self):
        list_url = self.admin_url_helper.get_action_url("index")

        page = self.app.get(list_url, user=self.local_group_moderator)
        self.assertContains(page, self.local_group.name)
        self.assertContains(page, self.regional_group.name)

    def test_local_group_moderator_can_change_local_group(self):
        list_url = self.admin_url_helper.get_action_url("index")
        edit_url = self.admin_url_helper.get_action_url(
            "edit", self.local_group.pk)

        list_page = self.app.get(list_url, user=self.local_group_moderator)
        page = list_page.click(href=edit_url)

        self.assertContains(page, self.local_group.name)
        self.assertNotContains(page, self.regional_group.name)

        form = page.forms[1]
        form["location"] = "Somewhere between trees and water."
        response = form.submit()

        self.assertRedirects(response, list_url)

        list_page = response.follow()
        self.assertContains(list_page, "Somewhere between trees and water.")

    def test_local_group_moderator_can_not_change_regional_group(self):
        list_url = self.admin_url_helper.get_action_url("index")
        edit_url = self.admin_url_helper.get_action_url(
            "edit", self.regional_group.pk)

        list_page = self.app.get(list_url, user=self.local_group_moderator)
        self.assertNotContains(list_page, edit_url)

        page = self.app.get(edit_url,
                            user=self.local_group_moderator,
                            status=403)
        self.assertEqual(page.status_code, 403)

    def test_regional_group_moderator_can_view_local_group_index(self):
        list_url = self.admin_url_helper.get_action_url("index")

        page = self.app.get(list_url, user=self.regional_group_moderator)
        self.assertContains(page, self.local_group.name)
        self.assertContains(page, self.regional_group.name)

    def test_site_moderator_can_view_local_group_index(self):
        list_url = self.admin_url_helper.get_action_url("index")

        page = self.app.get(list_url, user=self.site_moderator)
        self.assertContains(page, self.local_group.name)
        self.assertContains(page, self.regional_group.name)

    def test_site_moderator_can_change_local_and_regional_group(self):
        list_url = self.admin_url_helper.get_action_url("index")

        list_page = self.app.get(list_url, user=self.site_moderator)

        local_edit_url = self.admin_url_helper.get_action_url(
            "edit", self.local_group.pk)
        local_edit_page = list_page.click(href=local_edit_url)
        self.assertContains(local_edit_page, self.local_group.name)
        self.assertNotContains(local_edit_page, self.regional_group.name)

        regional_edit_url = self.admin_url_helper.get_action_url(
            "edit", self.regional_group.pk)
        regional_edit_page = list_page.click(href=regional_edit_url)
        self.assertContains(regional_edit_page, self.regional_group.name)
        self.assertNotContains(regional_edit_page, self.local_group.name)