示例#1
0
    def get(self, request):
        self.image_model = get_image_model()

        images = permission_policy.instances_user_has_any_permission_for(
            request.user, ["choose"]).order_by("-created_at")

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

        collection_id = request.GET.get("collection_id")
        if collection_id:
            images = images.filter(collection=collection_id)

        self.is_searching = False
        self.q = None

        if "q" in request.GET:
            self.search_form = SearchForm(request.GET)
            if self.search_form.is_valid():
                self.q = self.search_form.cleaned_data["q"]
                self.is_searching = True
                images = images.search(self.q)
        else:
            self.search_form = SearchForm()

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

        # Pagination
        paginator = Paginator(images, per_page=CHOOSER_PAGE_SIZE)
        self.images = paginator.get_page(request.GET.get("p"))
        return self.render_to_response()
示例#2
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 = Paginator(images, per_page=20)
    images = paginator.get_page(request.GET.get('p'))

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

    # 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'),
        })
示例#3
0
 def get_context(self):
     images = permission_policy.instances_user_has_any_permission_for(
         self.request.user, ['change', 'delete'])
     return {
         #'total_images': get_image_model().objects.count(),
         #'total_images': get_image_model().objects.filter(uploaded_by_user=self.request.user).count(),
         'total_images': images.count(),
     }
示例#4
0
文件: chooser.py 项目: tnir/wagtail
 def get_object_list(self):
     return (
         permission_policy.instances_user_has_any_permission_for(
             self.request.user, ["choose"]
         )
         .select_related("collection")
         .prefetch_renditions("max-165x165")
     )
示例#5
0
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

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

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

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

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

        # Filter by tag
        self.current_tag = self.request.GET.get("tag")
        if self.current_tag:
            try:
                images = images.filter(tags__name=self.current_tag)
            except (AttributeError):
                self.current_tag = None

        paginator = Paginator(images, per_page=INDEX_PAGE_SIZE)
        images = paginator.get_page(self.request.GET.get("p"))

        next_url = reverse("wagtailimages:index")
        request_query_string = self.request.META.get("QUERY_STRING")
        if request_query_string:
            next_url += "?" + request_query_string

        context.update({
            "images": images,
            "query_string": query_string,
            "is_searching": bool(query_string),
            "next": next_url,
        })

        return context
示例#6
0
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

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

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

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

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

        # Filter by tag
        self.current_tag = self.request.GET.get('tag')
        if self.current_tag:
            try:
                images = images.filter(tags__name=self.current_tag)
            except (AttributeError):
                self.current_tag = None

        paginator = Paginator(images, per_page=INDEX_PAGE_SIZE)
        images = paginator.get_page(self.request.GET.get('p'))

        context.update({
            'images': images,
            'query_string': query_string,
            'is_searching': bool(query_string),
            'next': self.request.get_full_path(),
        })

        return context
    def import_as_image_model(name, content, owner, title=None):
        if not title:
            title = name
        Image = get_image_model()
        image = Image(title=title, uploaded_by_user=owner)
        image.file = ContentFile(content, name=name)
        # Set image file size
        image.file_size = image.file.size

        # Set image file hash
        image.file.seek(0)
        image._set_file_hash(image.file.read())
        image.file.seek(0)

        # Before we save the image, let's check if there are any choosable images with the same hash
        # so we can avoid importing a duplicate

        from wagtail.images.permissions import permission_policy

        if USER_NEEDS_IMAGE_CHOOSE_PERMISSION:
            existing_images = permission_policy.instances_user_has_any_permission_for(
                owner, ['choose'])
        else:
            existing_images = Image.objects.all()

        existing_images = existing_images.filter(
            file_hash=image.file_hash).iterator(chunk_size=1)
        for potential_duplicate in existing_images:
            if not getattr(
                    settings,
                    "WAGTAILCONTENTIMPORT_CHECK_DUPLICATE_IMAGE_CONTENT",
                    False):
                # We don't need to check the file content
                return potential_duplicate
            # Check the file contents actually match - hash collisions are extremely unlikely by default
            # hence the chunk_size=1, but could happen if someone is using a custom image model with
            # some other hashing scheme
            if potential_duplicate.file.size == image.file.size and all(
                    a == b for a, b in zip(potential_duplicate.file.chunks(),
                                           image.file.chunks())):
                # We've found an existing image in the library
                # so let's not save our new image, and return this one instead
                return potential_duplicate

        image.save()
        return image
示例#8
0
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        # Get ordering
        ordering = self.get_ordering()

        # Get images (filtered by user permission and ordered by `ordering`)
        images = (
            permission_policy.instances_user_has_any_permission_for(
                self.request.user, ["change", "delete"]
            )
            .order_by(ordering)
            .select_related("collection")
            .prefetch_renditions("max-165x165")
        )

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

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

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

        # Filter by tag
        self.current_tag = self.request.GET.get("tag")
        if self.current_tag:
            try:
                images = images.filter(tags__name=self.current_tag)
            except (AttributeError):
                self.current_tag = None

        entries_per_page = self.get_num_entries_per_page()
        paginator = Paginator(images, per_page=entries_per_page)
        images = paginator.get_page(self.request.GET.get("p"))

        next_url = reverse("wagtailimages:index")
        request_query_string = self.request.META.get("QUERY_STRING")
        if request_query_string:
            next_url += "?" + request_query_string

        context.update(
            {
                "images": images,
                "query_string": query_string,
                "is_searching": bool(query_string),
                "next": next_url,
                "entries_per_page": entries_per_page,
                "ENTRIES_PER_PAGE_CHOICES": self.ENTRIES_PER_PAGE_CHOICES,
                "current_ordering": ordering,
                "ORDERING_OPTIONS": self.ORDERING_OPTIONS,
            }
        )

        return context
示例#9
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,
                               prefix='image-chooser-upload')
    else:
        uploadform = None

    images = permission_policy.instances_user_has_any_permission_for(
        request.user, ['choose']).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 = Paginator(images, per_page=CHOOSER_PAGE_SIZE)
        images = paginator.get_page(request.GET.get('p'))

        return TemplateResponse(
            request, "wagtailimages/chooser/results.html", {
                'images': images,
                'is_searching': is_searching,
                'query_string': q,
                'will_select_format': request.GET.get('select_format')
            })
    else:
        paginator = Paginator(images, per_page=CHOOSER_PAGE_SIZE)
        images = paginator.get_page(request.GET.get('p'))

        context = get_chooser_context(request)
        context.update({
            'images': images,
            'uploadform': uploadform,
        })
        return render_modal_workflow(request,
                                     'wagtailimages/chooser/chooser.html',
                                     None,
                                     context,
                                     json_data=get_chooser_js_data())