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, })
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) })
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
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)
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)
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 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
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)