Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,24 @@ Then set the `WAGTAILMEDIA_MEDIA_MODEL` setting to point to it:
WAGTAILMEDIA_MEDIA_MODEL = 'mymedia.CustomMedia'
```

### Hooks

#### `construct_media_chooser_queryset`

Called when rendering the media chooser view, to allow the media listing QuerySet to be customised.
The callable passed into the hook will receive the current media QuerySet and the request object, and must return a Media QuerySet (either the original one, or a new one).

```python
from wagtail.core import hooks

@hooks.register('construct_media_chooser_queryset')
def show_my_uploaded_media_only(media, request):
# Only show uploaded media
media = media.filter(uploaded_by_user=request.user)

return media
```

## How to use

### As a regular Django field
Expand Down
44 changes: 43 additions & 1 deletion wagtailmedia/tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -468,7 +468,7 @@ def test_usage_link(self):

class TestMediaChooserView(TestCase, WagtailTestUtils):
def setUp(self):
self.login()
self.user = self.login()

def test_simple(self):
response = self.client.get(reverse('wagtailmedia:chooser'))
Expand Down Expand Up @@ -537,6 +537,48 @@ def test_pagination_out_of_range(self):
# Check that we got the last page
self.assertEqual(response.context['media_files'].number, response.context['media_files'].paginator.num_pages)

def test_construct_queryset_hook_browse(self):
media = models.Media.objects.create(
title="Test media shown",
duration=100,
type='audio',
uploaded_by_user=self.user,
)
models.Media.objects.create(
title="Test media not shown",
duration=100,
type='audio',
)

def filter_media(media, request):
return media.filter(uploaded_by_user=self.user)

with self.register_hook('construct_media_chooser_queryset', filter_media):
response = self.client.get(reverse('wagtailmedia:chooser'))
self.assertEqual(len(response.context['media_files']), 1)
self.assertEqual(response.context['media_files'][0], media)

def test_construct_queryset_hook_search(self):
media = models.Media.objects.create(
title="Test media shown",
duration=100,
type='audio',
uploaded_by_user=self.user,
)
models.Media.objects.create(
title="Test media not shown",
duration=100,
type='audio',
)

def filter_media(media, request):
return media.filter(uploaded_by_user=self.user)

with self.register_hook('construct_media_chooser_queryset', filter_media):
response = self.client.get(reverse('wagtailmedia:chooser'), {'q': 'Test'})
self.assertEqual(len(response.context['media_files']), 1)
self.assertEqual(response.context['media_files'][0], media)


class TestMediaChooserChosenView(TestCase, WagtailTestUtils):
def setUp(self):
Expand Down
11 changes: 7 additions & 4 deletions wagtailmedia/views/chooser.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from wagtail import VERSION as WAGTAIL_VERSION
from wagtail.admin.modal_workflow import render_modal_workflow
from wagtail.admin.utils import PermissionPolicyChecker
from wagtail.core import hooks
from wagtail.core.models import Collection
from wagtail.utils.pagination import paginate

Expand Down Expand Up @@ -34,13 +35,15 @@ def get_media_json(media):
def chooser(request):
Media = get_media_model()

media_files = []
media_files = Media.objects.all()

# allow hooks to modify the queryset
for hook in hooks.get_hooks('construct_media_chooser_queryset'):
media_files = hook(media_files, request)

q = None
is_searching = False
if 'q' in request.GET or 'p' in request.GET or 'collection_id' in request.GET:
media_files = Media.objects.all()

collection_id = request.GET.get('collection_id')
if collection_id:
media_files = media_files.filter(collection=collection_id)
Expand Down Expand Up @@ -70,7 +73,7 @@ def chooser(request):
if len(collections) < 2:
collections = None

media_files = Media.objects.order_by('-created_at')
media_files = media_files.order_by('-created_at')
paginator, media_files = paginate(request, media_files, per_page=10)

return render_modal_workflow(request, 'wagtailmedia/chooser/chooser.html', None, {
Expand Down