Example #1
0
def chooser(request):
    Image = get_image_model()

    if permission_policy.user_has_permission(request.user, 'add'):
        ImageForm = get_image_form(Image)
        uploadform = ImageForm(user=request.user)
    else:
        uploadform = None

    images = Image.objects.order_by('-created_at')

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

    if ('q' in request.GET or 'p' in request.GET or 'tag' in request.GET
            or 'collection_id' in request.GET):
        # this request is triggered from search, pagination or 'popular tags';
        # we will just render the results.html fragment
        collection_id = request.GET.get('collection_id')
        if collection_id:
            images = images.filter(collection=collection_id)

        searchform = SearchForm(request.GET)
        if searchform.is_valid():
            q = searchform.cleaned_data['q']

            images = images.search(q)
            is_searching = True
        else:
            is_searching = False
            q = None

            tag_name = request.GET.get('tag')
            if tag_name:
                images = images.filter(tags__name=tag_name)

        # Pagination
        paginator, images = paginate(request, images, per_page=12)

        return render(
            request, "wagtailimages/chooser/results.html", {
                'images': images,
                'is_searching': is_searching,
                'query_string': q,
                'will_select_format': request.GET.get('select_format')
            })
    else:
        paginator, images = paginate(request, images, per_page=12)

        context = get_chooser_context(request)
        context.update({
            'images': images,
            'uploadform': uploadform,
        })
        return render_modal_workflow(request,
                                     'wagtailimages/chooser/chooser.html',
                                     'wagtailimages/chooser/chooser.js',
                                     context)
Example #2
0
def edit(request, folder_id):
    response = dict()

    if not permission_policy.user_has_permission(request.user, 'change'):
        response['message'] = "User does not have permission"
        return JsonResponse(response, status=403)

    try:
        folder = ImageFolder.objects.get(id=folder_id)
    except ObjectDoesNotExist:
        response['message'] = "Invalid ID"
        return JsonResponse(response, status=404)

    parent_folder = None
    parent_id = request.POST.get('parent_id')
    if parent_id:
        try:
            parent_folder = ImageFolder.objects.get(id=parent_id)
        except ObjectDoesNotExist:
            response['message'] = "Invalid Parent ID"
            return JsonResponse(response, status=404)

    title = request.POST.get('title', folder.title)
    folder.title = title
    if parent_folder:
        folder.folder = parent_folder
    count = 0  # Indicates the number of times the folder name clashed
    while True:
        try:
            # Check if the folder is present in the DB or physically present in the OS
            folder.validate_folder()
        except ValidationError as e:
            count += 1
            if e.code == 'db':
                folder.title = folder.title + str(count)
            else:
                # When a folder with a clashing name exists in the OS,
                # Add the entry to the DB and notify the user.
                # Abort the current move operation
                new_folder = create_db_entries(title, request.user,
                                               parent_folder)
                folders_list = get_folders_list([new_folder])
                response[
                    'message'] = "Operation Failed! Found new entry in the OS. Loading the folder..."
                response['data'] = folders_list[0]
                # Return a 202 as the intended action was not completed
                return JsonResponse(response, status=202)
        else:
            if count:
                # If there were attempts made to resolve conflict
                response[
                    'message'] = "Folder with the same name exists! Renaming to avoid conflict."
            else:
                response['message'] = "Success"
            break

    folder.save()
    response['data'] = get_folders_list([folder])[0]
    return JsonResponse(response)
Example #3
0
def index(request):
    Image = get_image_model()

    # Get images (filtered by user permission)
    images = permission_policy.instances_user_has_any_permission_for(request.user, ["change", "delete"]).order_by(
        "-created_at"
    )

    # Search
    query_string = None
    if "q" in request.GET:
        form = SearchForm(request.GET, placeholder=_("Search images"))
        if form.is_valid():
            query_string = form.cleaned_data["q"]

            images = images.search(query_string)
    else:
        form = SearchForm(placeholder=_("Search images"))

    # Filter by collection
    current_collection = None
    collection_id = request.GET.get("collection_id")
    if collection_id:
        try:
            current_collection = Collection.objects.get(id=collection_id)
            images = images.filter(collection=current_collection)
        except (ValueError, Collection.DoesNotExist):
            pass

    paginator, images = paginate(request, images)

    collections = permission_policy.collections_user_has_any_permission_for(request.user, ["add", "change"])
    if len(collections) < 2:
        collections = None

    # Create response
    if request.is_ajax():
        return render(
            request,
            "wagtailimages/images/results.html",
            {"images": images, "query_string": query_string, "is_searching": bool(query_string)},
        )
    else:
        return render(
            request,
            "wagtailimages/images/index.html",
            {
                "images": images,
                "query_string": query_string,
                "is_searching": bool(query_string),
                "search_form": form,
                "popular_tags": Image.popular_tags(),
                "collections": collections,
                "current_collection": current_collection,
                "user_can_add": permission_policy.user_has_permission(request.user, "add"),
            },
        )
Example #4
0
def add(request):
    response = dict()

    if not permission_policy.user_has_permission(request.user, 'change'):
        response['message'] = "User does not have permission"
        return JsonResponse(response, status=403)

    file = request.FILES.get('files[]')
    title = os.path.splitext(file.name)[0]

    if not title or not file:
        response['message'] = "Title or file missing"
        return JsonResponse(response, status=400)

    extension = os.path.splitext(file.name)[1]
    extension = extension[1:]   # Remove the '.' from the extension

    if extension not in ALLOWED_EXTENSIONS:
        response['message'] = "Invalid file type"
        return JsonResponse(response, status=400)

    folder = None
    folder_id = request.POST.get('folder_id')
    if folder_id and int(folder_id) != -1:
        try:
            folder = ImageFolder.objects.get(id=folder_id)
        except ObjectDoesNotExist:
            response['message'] = "Invalid Folder ID"
            return JsonResponse(response, status=404)

    # Build a form for validation
    form = ImageForm({
        'title': title,
        'collection': '1',  # Hard coding the root collection as default
    }, {
        'file': file
    }, user=request.user)

    if form.is_valid():
        # Save it
        image = form.save(commit=False)
        image.uploaded_by_user = request.user
        image.file_size = image.file.size
        image.folder = folder
        image.save()

        # Reindex the image to make sure all tags are indexed
        search_index.insert_or_update_object(image)

        response['data'] = get_image_dict(image)
        response['message'] = "Success"
    else:
        response['message'] = "Error creating image"
        # ToDo send a valid respone based on the error
        response['data'] = None
    return JsonResponse(response)
Example #5
0
def index(request):
    Image = get_image_model()

    # Get images (filtered by user permission)
    images = permission_policy.instances_user_has_any_permission_for(
        request.user, ['change', 'delete']
    ).order_by('-created_at')

    # Search
    query_string = None
    if 'q' in request.GET:
        form = SearchForm(request.GET, placeholder=_("Search images"))
        if form.is_valid():
            query_string = form.cleaned_data['q']

            images = images.search(query_string)
    else:
        form = SearchForm(placeholder=_("Search images"))

    # Filter by collection
    current_collection = None
    collection_id = request.GET.get('collection_id')
    if collection_id:
        try:
            current_collection = Collection.objects.get(id=collection_id)
            images = images.filter(collection=current_collection)
        except (ValueError, Collection.DoesNotExist):
            pass

    paginator, images = paginate(request, images)

    collections = permission_policy.collections_user_has_any_permission_for(
        request.user, ['add', 'change']
    )
    if len(collections) < 2:
        collections = None

    # Create response
    if request.is_ajax():
        return render(request, 'wagtailimages/images/results.html', {
            'images': images,
            'query_string': query_string,
            'is_searching': bool(query_string),
        })
    else:
        return render(request, 'wagtailimages/images/index.html', {
            'images': images,
            'query_string': query_string,
            'is_searching': bool(query_string),

            'search_form': form,
            'popular_tags': Image.popular_tags(),
            'collections': collections,
            'current_collection': current_collection,
            'user_can_add': permission_policy.user_has_permission(request.user, 'add'),
        })
Example #6
0
def chooser(request):
    Image = get_image_model()

    if permission_policy.user_has_permission(request.user, 'add'):
        ImageForm = get_image_form(Image)
        uploadform = ImageForm()
    else:
        uploadform = None

    images = Image.objects.order_by('-created_at')

    q = None
    if 'q' in request.GET or 'p' in request.GET or 'tag' in request.GET:
        # this request is triggered from search, pagination or 'popular tags';
        # we will just render the results.html fragment

        searchform = SearchForm(request.GET)
        if searchform.is_valid():
            q = searchform.cleaned_data['q']

            images = images.search(q)
            is_searching = True
        else:
            is_searching = False

            tag_name = request.GET.get('tag')
            if tag_name:
                images = images.filter(tags__name=tag_name)

        # Pagination
        paginator, images = paginate(request, images, per_page=12)

        return render(
            request, "wagtailimages/chooser/results.html", {
                'images': images,
                'is_searching': is_searching,
                'query_string': q,
                'will_select_format': request.GET.get('select_format')
            })
    else:
        searchform = SearchForm()

        paginator, images = paginate(request, images, per_page=12)

    return render_modal_workflow(
        request, 'wagtailimages/chooser/chooser.html',
        'wagtailimages/chooser/chooser.js', {
            'images': images,
            'uploadform': uploadform,
            'searchform': searchform,
            'is_searching': False,
            'query_string': q,
            'will_select_format': request.GET.get('select_format'),
            'popular_tags': Image.popular_tags(),
        })
Example #7
0
def chooser(request):
    Image = get_image_model()

    if permission_policy.user_has_permission(request.user, 'add'):
        ImageForm = get_image_form(Image)
        uploadform = ImageForm()
    else:
        uploadform = None

    images = Image.objects.order_by('-created_at')

    q = None
    if 'q' in request.GET or 'p' in request.GET or 'tag' in request.GET:
        # this request is triggered from search, pagination or 'popular tags';
        # we will just render the results.html fragment

        searchform = SearchForm(request.GET)
        if searchform.is_valid():
            q = searchform.cleaned_data['q']

            images = images.search(q)
            is_searching = True
        else:
            is_searching = False

            tag_name = request.GET.get('tag')
            if tag_name:
                images = images.filter(tags__name=tag_name)

        # Pagination
        paginator, images = paginate(request, images, per_page=12)

        return render(request, "wagtailimages/chooser/results.html", {
            'images': images,
            'is_searching': is_searching,
            'query_string': q,
            'will_select_format': request.GET.get('select_format')
        })
    else:
        searchform = SearchForm()

        paginator, images = paginate(request, images, per_page=12)

    return render_modal_workflow(request, 'wagtailimages/chooser/chooser.html', 'wagtailimages/chooser/chooser.js', {
        'images': images,
        'uploadform': uploadform,
        'searchform': searchform,
        'is_searching': False,
        'query_string': q,
        'will_select_format': request.GET.get('select_format'),
        'popular_tags': Image.popular_tags(),
    })
Example #8
0
def add(request, parent_id=None):
    response = dict()

    if not permission_policy.user_has_permission(request.user, 'add'):
        response['message'] = "User does not have permission"
        return JsonResponse(response, status=403)

    title = request.POST.get('title')

    if not title:
        response['message'] = "Title not passed"
        return JsonResponse(response, status=400)

    parent_folder = None
    if parent_id and int(parent_id) != -1:
        try:
            parent_folder = ImageFolder.objects.get(id=parent_id)
        except ObjectDoesNotExist:
            response['message'] = "Invalid Parent ID"
            return JsonResponse(response, status=404)

    # Save folder
    folder = ImageFolder(title=title)
    if parent_folder:
        folder.folder = parent_folder
    try:
        # Check if the folder is present in the DB or physically present in the OS
        folder.validate_folder()
    except ValidationError as e:
        if e.code == 'os':
            # If present in the OS, then create the folder entry and it's
            # content's entries in the DB
            folder = create_db_entries(title, request.user, parent_folder)
            folders_list = get_folders_list([folder])
            response[
                'message'] = "Found new entry in the OS! Loading the folder..."
            response['data'] = folders_list[0]
            return JsonResponse(response, status=202)
        else:
            response['message'] = "Folder already exists"
            return JsonResponse(response, status=403)
    else:
        # Save folder
        folder.save()
        response['message'] = "Success"
        response['data'] = get_folders_list([folder])[0]
        return JsonResponse(response)
Example #9
0
def delete(request, image_id):
    response = dict()

    if not permission_policy.user_has_permission(request.user, 'change'):
        response['message'] = "User does not have permission"
        return JsonResponse(response, status=403)

    try:
        image = Image.objects.get(id=image_id)
    except ObjectDoesNotExist:
        response['message'] = "Invalid ID"
        return JsonResponse(response, status=404)

    image.delete()

    response['message'] = "Success"
    return JsonResponse(response)
Example #10
0
def index(request):
    Image = get_image_model()

    # Get images (filtered by user permission)
    images = permission_policy.instances_user_has_any_permission_for(
        request.user, ['change', 'delete']
    ).order_by('-created_at')

    # Search
    query_string = None
    if 'q' in request.GET:
        form = SearchForm(request.GET, placeholder=_("Search images"))
        if form.is_valid():
            query_string = form.cleaned_data['q']

            images = images.search(query_string)
    else:
        form = SearchForm(placeholder=_("Search images"))

    paginator, images = paginate(request, images)

    # Create response
    if request.is_ajax():
        return render(request, 'wagtailimages/images/results.html', {
            'images': images,
            'query_string': query_string,
            'is_searching': bool(query_string),
        })
    else:
        return render(request, 'wagtailimages/images/index.html', {
            'images': images,
            'query_string': query_string,
            'is_searching': bool(query_string),

            'search_form': form,
            'popular_tags': Image.popular_tags(),
            'user_can_add': permission_policy.user_has_permission(request.user, 'add'),
        })
Example #11
0
def edit(request, image_id):
    response = dict()

    if not permission_policy.user_has_permission(request.user, 'change'):
        response['message'] = "User does not have permission"
        return JsonResponse(response, status=403)

    try:
        image = Image.objects.get(id=image_id)
    except ObjectDoesNotExist:
        response['message'] = "Invalid ID"
        return JsonResponse(response, status=404)

    title = request.POST.get('title')
    if title:
        image.title = title
        image.save()
        search_index.insert_or_update_object(image)
        response['message'] = "Success"
        response['data'] = get_image_dict(image)
        return JsonResponse(response)
    else:
        response['message'] = "Title not passed"
        return JsonResponse(response, status=400)
Example #12
0
def index(request):
    Image = get_image_model()

    # Get images (filtered by user permission)
    images = permission_policy.instances_user_has_any_permission_for(
        request.user, ['change', 'delete']).order_by('-created_at')

    # Search
    query_string = None
    if 'q' in request.GET:
        form = SearchForm(request.GET, placeholder=_("Search images"))
        if form.is_valid():
            query_string = form.cleaned_data['q']

            images = images.search(query_string)
    else:
        form = SearchForm(placeholder=_("Search images"))

    # Filter by collection
    current_collection = None
    collection_id = request.GET.get('collection_id')
    if collection_id:
        try:
            current_collection = Collection.objects.get(id=collection_id)
            images = images.filter(collection=current_collection)
        except (ValueError, Collection.DoesNotExist):
            pass

    paginator, images = paginate(request, images)

    collections = permission_policy.collections_user_has_any_permission_for(
        request.user, ['add', 'change'])
    if len(collections) < 2:
        collections = None

    # Create response
    if request.is_ajax():
        return render(
            request, 'wagtailimages/images/results.html', {
                'images': images,
                'query_string': query_string,
                'is_searching': bool(query_string),
            })
    else:
        return render(
            request, 'wagtailimages/images/index.html', {
                'images':
                images,
                'query_string':
                query_string,
                'is_searching':
                bool(query_string),
                'search_form':
                form,
                'popular_tags':
                popular_tags_for_model(Image),
                'collections':
                collections,
                'current_collection':
                current_collection,
                'user_can_add':
                permission_policy.user_has_permission(request.user, 'add'),
            })
Example #13
0
def chooser(request):
    Image = get_image_model()

    if permission_policy.user_has_permission(request.user, 'add'):
        ImageForm = get_image_form(Image)
        uploadform = ImageForm(user=request.user)
    else:
        uploadform = None

    images = Image.objects.order_by('-created_at')

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

    q = None
    if (
        'q' in request.GET or 'p' in request.GET or 'tag' in request.GET or
        'collection_id' in request.GET
    ):
        # this request is triggered from search, pagination or 'popular tags';
        # we will just render the results.html fragment
        collection_id = request.GET.get('collection_id')
        if collection_id:
            images = images.filter(collection=collection_id)

        searchform = SearchForm(request.GET)
        if searchform.is_valid():
            q = searchform.cleaned_data['q']

            images = images.search(q)
            is_searching = True
        else:
            is_searching = False

            tag_name = request.GET.get('tag')
            if tag_name:
                images = images.filter(tags__name=tag_name)

        # Pagination
        paginator, images = paginate(request, images, per_page=12)

        return render(request, "wagtailimages/chooser/results.html", {
            'images': images,
            'is_searching': is_searching,
            'query_string': q,
            'will_select_format': request.GET.get('select_format')
        })
    else:
        searchform = SearchForm()

        collections = Collection.objects.all()
        if len(collections) < 2:
            collections = None

        paginator, images = paginate(request, images, per_page=12)

        return render_modal_workflow(request, 'wagtailimages/chooser/chooser.html', 'wagtailimages/chooser/chooser.js', {
            'images': images,
            'uploadform': uploadform,
            'searchform': searchform,
            'is_searching': False,
            'query_string': q,
            'will_select_format': request.GET.get('select_format'),
            'popular_tags': popular_tags_for_model(Image),
            'collections': collections,
        })
Example #14
0
def chooser(request):
    Image = get_image_model()

    if permission_policy.user_has_permission(request.user, "add"):
        ImageForm = get_image_form(Image)
        uploadform = ImageForm(user=request.user)
    else:
        uploadform = None

    images = Image.objects.order_by("-created_at")

    q = None
    if "q" in request.GET or "p" in request.GET or "tag" in request.GET or "collection_id" in request.GET:
        # this request is triggered from search, pagination or 'popular tags';
        # we will just render the results.html fragment
        collection_id = request.GET.get("collection_id")
        if collection_id:
            images = images.filter(collection=collection_id)

        searchform = SearchForm(request.GET)
        if searchform.is_valid():
            q = searchform.cleaned_data["q"]

            images = images.search(q)
            is_searching = True
        else:
            is_searching = False

            tag_name = request.GET.get("tag")
            if tag_name:
                images = images.filter(tags__name=tag_name)

        # Pagination
        paginator, images = paginate(request, images, per_page=12)

        return render(
            request,
            "wagtailimages/chooser/results.html",
            {
                "images": images,
                "is_searching": is_searching,
                "query_string": q,
                "will_select_format": request.GET.get("select_format"),
            },
        )
    else:
        searchform = SearchForm()

        collections = Collection.objects.all()
        if len(collections) < 2:
            collections = None

        paginator, images = paginate(request, images, per_page=12)

    return render_modal_workflow(
        request,
        "wagtailimages/chooser/chooser.html",
        "wagtailimages/chooser/chooser.js",
        {
            "images": images,
            "uploadform": uploadform,
            "searchform": searchform,
            "is_searching": False,
            "query_string": q,
            "will_select_format": request.GET.get("select_format"),
            "popular_tags": Image.popular_tags(),
            "collections": collections,
        },
    )
Example #15
0
def move(request):
    response = dict()
    if not permission_policy.user_has_permission(request.user, 'change'):
        response['message'] = "User does not have permission"
        return JsonResponse(response, status=403)

    source_id = request.POST.get('source_id')
    target_id = request.POST.get('target_id')
    source_type = request.POST.get('source_type')
    count = 0  # Indicates number of attempts to rename a file/folder

    if not source_id or not target_id or not source_type:
        response['message'] = "Image or folder ID missing"
        return JsonResponse(response, status=400)

    if int(target_id) == -1:
        target_folder = None  # Root folder
        target_absolute_path = os.path.join(settings.MEDIA_ROOT,
                                            IMAGES_FOLDER_NAME)
        target_relative_path = IMAGES_FOLDER_NAME
    else:
        try:
            target_folder = ImageFolder.objects.get(id=target_id)
        except ObjectDoesNotExist:
            response['message'] = "Invalid target ID"
            return JsonResponse(response, status=404)
        else:
            target_absolute_path = target_folder.get_complete_path()
            target_relative_path = target_folder.path

    if source_type == 'image':
        try:
            image = Image.objects.get(id=source_id)
        except ObjectDoesNotExist:
            response['message'] = "Invalid source ID"
            return JsonResponse(response, status=404)

        image.folder = target_folder  # Change the folder

        # Move the file to the updated location
        # When moving a file to a new location, check if a file
        # with the same name exists.
        # If yes, then append a number to the filename and save
        initial_path = image.file.path
        complete_file_name = image.filename
        file_name = os.path.splitext(image.filename)[0]  # get the filename
        extension = os.path.splitext(image.filename)[1]  # get the extension
        new_path = os.path.join(target_absolute_path, complete_file_name)
        while True:
            # Keeping renaming until there are no more filename clashes
            if os.path.exists(new_path):
                count += 1
                complete_file_name = file_name + str(count) + extension
                new_path = os.path.join(target_absolute_path,
                                        complete_file_name)
            else:
                os.rename(initial_path, new_path)
                if count:
                    # If there were attempts made to resolve conflict,
                    # change the image's title
                    # Append the count to the title
                    image.title = image.title + str(count)
                    response[
                        'message'] = "File with the same name exists! Renaming to avoid conflict."
                else:
                    response['message'] = "Success"
                break

        image.file.name = os.path.join(target_relative_path,
                                       complete_file_name)
        image.save()
        search_index.insert_or_update_object(image)
        response['data'] = get_image_dict(image)

    elif source_type == 'folder':

        if source_id == target_id:
            response[
                'message'] = "Source and target forlder ID cannot be the same."
            return JsonResponse(response, status=400)

        try:
            source_folder = ImageFolder.objects.get(id=source_id)
        except ObjectDoesNotExist:
            response['message'] = "Invalid Folder ID"
            return JsonResponse(response, status=404)

        source_folder.folder = target_folder
        while True:
            try:
                # Check if the folder is present in the DB or physically present in the OS
                source_folder.validate_folder()
            except ValidationError as e:
                count += 1
                if e.code == 'db':
                    source_folder.title = source_folder.title + str(count)
                else:
                    # When a folder with a clashing name exists in the OS,
                    # Add the entry to the DB and notify the user.
                    # Abort the current move operation
                    new_folder = create_db_entries(source_folder.title,
                                                   request.user, target_folder)
                    folders_list = get_folders_list([new_folder])
                    response[
                        'message'] = "Operation Failed! Found new entry in the OS. Loading the folder..."
                    response['data'] = folders_list[0]
                    # Return a 202 as the intended action was not completed
                    return JsonResponse(response, status=202)
            else:
                if count:
                    # If there were attempts made to resolve conflict
                    response[
                        'message'] = "Folder with the same name exists! Renaming to avoid conflict."
                else:
                    response['message'] = "Success"
                break
        source_folder.save()
        response['data'] = get_folders_list([source_folder])[0]
    else:
        response['message'] = "Invalid source type"
        return JsonResponse(response, status=400)
    return JsonResponse(response)
Example #16
0
def multichooser(request):
    collection_id = request.GET.get('collection_id', None)
    if not collection_id:
        album_title = request.GET.get('album_title')
        page_id = request.GET.get('page_id', None)
        parent_page_id = request.GET.get('parent_page_id', None)
        collection = get_or_create_collection(album_title, page_id,
                                              parent_page_id)
    else:
        collection = Collection.objects.get(id=collection_id)

    Image = get_image_model()

    if permission_policy.user_has_permission(request.user, 'add'):
        ImageForm = get_image_form(Image)
        uploadform = ImageForm(user=request.user)
    else:
        uploadform = None

    images = Image.objects.filter(
        collection=collection).order_by('-created_at')

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

    q = None
    if ('q' in request.GET or 'p' in request.GET or 'tag' in request.GET):
        # this request is triggered from search, pagination or 'popular tags';
        # we will just render the results.html fragment

        searchform = SearchForm(request.GET)
        if searchform.is_valid():
            q = searchform.cleaned_data['q']

            images = images.search(q)
            is_searching = True
        else:
            is_searching = False

            tag_name = request.GET.get('tag')
            if tag_name:
                images = images.filter(tags__name=tag_name)

        # Pagination
        paginator, images = paginate(request, images, per_page=20)

        return render(
            request, "fotoalben/multichooser/results.html", {
                'images': images,
                'is_searching': is_searching,
                'query_string': q,
                'will_select_format': request.GET.get('select_format')
            })
    else:
        searchform = SearchForm()
        #        this_site = Site.find_for_request( request )
        #        collections = Collection.objects.all()
        #        if len(collections) < 2:
        #            collections = None

        paginator, images = paginate(request, images, per_page=20)

        return render_modal_workflow(
            request, 'fotoalben/multichooser/multichooser.html',
            'fotoalben/multichooser/multichooser.js', {
                'images': images,
                'uploadform': uploadform,
                'searchform': searchform,
                'is_searching': False,
                'query_string': q,
                'will_select_format': request.GET.get('select_format'),
                'popular_tags': popular_tags_for_model(Image),
                'collections': [collection],
                'collection': collection,
                'page_id': page_id,
                'album_title': album_title,
                'parent_page_id': parent_page_id
            })
def chooser(request):
    Image = get_image_model()
    ImageFolder = get_folder_model()

    if permission_policy.user_has_permission(request.user, 'add'):
        ImageForm = get_image_form(Image)
        uploadform = ImageForm(user=request.user)
        ImageFolderForm = get_folder_form(ImageFolder)
    else:
        uploadform = None

    # Get images (filtered by user permission)
    images = permission_policy.instances_user_has_any_permission_for(
        request.user, ['change', 'delete']
    ).order_by('-created_at')

    # Check if folders_only
    folders_only = request.GET.get('folders_only')
    if folders_only:
        folders_only = True
    else:
        folders_only = False

    # Filter by folder
    folders = ImageFolder.objects.filter(folder__isnull = True)
    current_folder = None
    folder_id = request.GET.get('folder')
    if folder_id:
        try:
            current_folder = ImageFolder.objects.get(id=folder_id)
            images = Image.objects.filter(folder=current_folder)
        except (ValueError, ImageFolder.DoesNotExist):
            pass

    q = None
    if (
        'q' in request.GET or 'p' in request.GET or 'tag' in request.GET or
        'collection_id' in request.GET or
        'folder' in request.GET
    ):
        # this request is triggered from search, pagination or 'popular tags';
        # we will just render the results.html fragment
        collection_id = request.GET.get('collection_id')
        if collection_id:
            images = images.filter(collection=collection_id)

        searchform = SearchForm(request.GET)
        if searchform.is_valid():
            q = searchform.cleaned_data['q']

            images = images.search(q)
            is_searching = True
        else:
            is_searching = False

            tag_name = request.GET.get('tag')
            if tag_name:
                images = images.filter(tags__name=tag_name)

        # Pagination
        paginator, images = paginate(request, images, per_page=12)

        if not folders_only:
            return render(request, "wagtailimages/chooser/results.html", {
                'images': images,
                'folders' : folders,
                'current_folder' : current_folder,
                'is_searching': is_searching,
                'query_string': q,
                'will_select_format': request.GET.get('select_format')
            })
        else:
            return render(request, "wagtailimages/chooser/folders.html", {
                'images': images,
                'folders': folders,
                'current_folder': current_folder,
                'is_searching': is_searching,
                'query_string': q,
                'will_select_format': request.GET.get('select_format')
            })
    else:
        searchform = SearchForm()

        collections = Collection.objects.all()
        if len(collections) < 2:
            collections = None

        paginator, images = paginate(request, images, per_page=12)

    return render_modal_workflow(request, 'wagtailimages/chooser/chooser.html', 'wagtailimages/chooser/chooser.js', {
        'images': images,
        'folders' : folders,
        'current_folder' : current_folder,
        'uploadform': uploadform,
        'searchform': searchform,
        'is_searching': False,
        'query_string': q,
        'will_select_format': request.GET.get('select_format'),
        'popular_tags': popular_tags_for_model(Image),
        'collections': collections,
    })