def render_extension(self):
            from wagtail.images.permissions import permission_policy
            from wagtail.images.fields import ALLOWED_EXTENSIONS
            from wagtail.images.forms import get_image_form

            Image = get_image_model()
            ImageForm = get_image_form(Image)

            collections_to_choose = None

            collections = permission_policy.collections_user_has_permission_for(
                self.request.user, 'add')
            if len(collections) > 1:
                collections_to_choose = collections
            else:
                # no need to show a collections chooser
                collections_to_choose = None

            form = ImageForm(user=self.request.user)

            return {
                'max_filesize':
                form.fields['file'].max_upload_size,
                'help_text':
                form.fields['file'].help_text,
                'allowed_extensions':
                ALLOWED_EXTENSIONS,
                'error_max_file_size':
                form.fields['file'].
                error_messages['file_too_large_unknown_size'],
                'error_accepted_file_types':
                form.fields['file'].error_messages['invalid_image'],
                'collections':
                collections_to_choose,
            }
Beispiel #2
0
def get_chooser_context(request):
    """Helper function to return common template context variables for the main chooser view"""

    collections = permission_policy.collections_user_has_permission_for(
        request.user, 'choose')
    if len(collections) < 2:
        collections = None

    return {
        'searchform': SearchForm(),
        'is_searching': False,
        'query_string': None,
        'will_select_format': request.GET.get('select_format'),
        'popular_tags': popular_tags_for_model(get_image_model()),
        'collections': collections,
    }
Beispiel #3
0
    def get_context_data(self):
        context = super().get_context_data()

        if permission_policy.user_has_permission(self.request.user, "add"):
            ImageForm = get_image_form(self.image_model)
            uploadform = ImageForm(user=self.request.user,
                                   prefix="image-chooser-upload")
        else:
            uploadform = None

        collections = permission_policy.collections_user_has_permission_for(
            self.request.user, "choose")
        if len(collections) < 2:
            collections = None

        context.update({
            "searchform": self.search_form,
            "popular_tags": popular_tags_for_model(self.image_model),
            "collections": collections,
            "uploadform": uploadform,
        })
        return context
Beispiel #4
0
    def get_context_data(self):
        context = super().get_context_data()

        if permission_policy.user_has_permission(self.request.user, 'add'):
            ImageForm = get_image_form(self.image_model)
            uploadform = ImageForm(user=self.request.user, prefix='image-chooser-upload')
        else:
            uploadform = None

        collections = permission_policy.collections_user_has_permission_for(
            self.request.user, 'choose'
        )
        if len(collections) < 2:
            collections = None

        context.update({
            'searchform': self.search_form,
            'popular_tags': popular_tags_for_model(self.image_model),
            'collections': collections,
            'uploadform': uploadform,
        })
        return context
Beispiel #5
0
def add(request):
    Image = get_image_model()
    ImageForm = get_image_form(Image)

    collections = permission_policy.collections_user_has_permission_for(
        request.user, 'add')
    if len(collections) > 1:
        collections_to_choose = collections
    else:
        # no need to show a collections chooser
        collections_to_choose = None

    if request.method == 'POST':
        if not request.is_ajax():
            return HttpResponseBadRequest(
                "Cannot POST to this view without AJAX")

        if not request.FILES:
            return HttpResponseBadRequest("Must upload a file")

        # Build a form for validation
        form = ImageForm(
            {
                'title': request.FILES['files[]'].name,
                'collection': request.POST.get('collection'),
            }, {
                'file': request.FILES['files[]'],
            },
            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.file.seek(0)
            image._set_file_hash(image.file.read())
            image.file.seek(0)
            image.save()

            # Success! Send back an edit form for this image to the user
            return JsonResponse({
                'success':
                True,
                'image_id':
                int(image.id),
                'form':
                render_to_string('wagtailimages/multiple/edit_form.html', {
                    'image':
                    image,
                    'form':
                    get_image_edit_form(Image)(instance=image,
                                               prefix='image-%d' % image.id,
                                               user=request.user),
                },
                                 request=request),
            })
        else:
            # Validation error
            return JsonResponse({
                'success':
                False,

                # https://github.com/django/django/blob/stable/1.6.x/django/forms/util.py#L45
                'error_message':
                '\n'.join([
                    '\n'.join([force_text(i) for i in v])
                    for k, v in form.errors.items()
                ]),
            })
    else:
        form = ImageForm(user=request.user)

    return render(
        request, 'wagtailimages/multiple/add.html', {
            'max_filesize':
            form.fields['file'].max_upload_size,
            'help_text':
            form.fields['file'].help_text,
            'allowed_extensions':
            ALLOWED_EXTENSIONS,
            'error_max_file_size':
            form.fields['file'].error_messages['file_too_large_unknown_size'],
            'error_accepted_file_types':
            form.fields['file'].error_messages['invalid_image'],
            'collections':
            collections_to_choose,
        })
Beispiel #6
0
def add(request):
    Image = get_image_model()
    ImageForm = get_image_form(Image)

    collections = permission_policy.collections_user_has_permission_for(request.user, 'add')
    if len(collections) < 2:
        # no need to show a collections chooser
        collections = None

    if request.method == 'POST':
        if not request.is_ajax():
            return HttpResponseBadRequest("Cannot POST to this view without AJAX")

        if not request.FILES:
            return HttpResponseBadRequest("Must upload a file")

        # Build a form for validation
        form = ImageForm({
            'title': request.FILES['files[]'].name,
            'collection': request.POST.get('collection'),
        }, {
            'file': request.FILES['files[]'],
        }, 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.file.seek(0)
            image._set_file_hash(image.file.read())
            image.file.seek(0)
            image.save()

            # Success! Send back an edit form for this image to the user
            return JsonResponse({
                'success': True,
                'image_id': int(image.id),
                'form': render_to_string('wagtailimages/multiple/edit_form.html', {
                    'image': image,
                    'edit_action': reverse('wagtailimages:edit_multiple', args=(image.id,)),
                    'delete_action': reverse('wagtailimages:delete_multiple', args=(image.id,)),
                    'form': get_image_edit_form(Image)(
                        instance=image, prefix='image-%d' % image.id, user=request.user
                    ),
                }, request=request),
            })
        elif 'file' in form.errors:
            # The uploaded file is invalid; reject it now
            return JsonResponse({
                'success': False,
                'error_message': '\n'.join(form.errors['file']),
            })
        else:
            # Some other field of the image form has failed validation, e.g. a required metadata field
            # on a custom image model. Store the image as an UploadedImage instead and present the
            # edit form so that it will become a proper Image when successfully filled in
            uploaded_image = UploadedImage.objects.create(
                file=request.FILES['files[]'], uploaded_by_user=request.user
            )
            image = Image(title=request.FILES['files[]'].name, collection_id=request.POST.get('collection'))

            return JsonResponse({
                'success': True,
                'uploaded_image_id': uploaded_image.id,
                'form': render_to_string('wagtailimages/multiple/edit_form.html', {
                    'uploaded_image': uploaded_image,
                    'edit_action': reverse('wagtailimages:create_multiple_from_uploaded_image', args=(uploaded_image.id,)),
                    'delete_action': reverse('wagtailimages:delete_upload_multiple', args=(uploaded_image.id,)),
                    'form': get_image_edit_form(Image)(
                        instance=image, prefix='uploaded-image-%d' % uploaded_image.id, user=request.user
                    ),
                }, request=request),
            })
    else:
        # Instantiate a dummy copy of the form that we can retrieve validation messages and media from;
        # actual rendering of forms will happen on AJAX POST rather than here
        form = ImageForm(user=request.user)

        return TemplateResponse(request, 'wagtailimages/multiple/add.html', {
            'max_filesize': form.fields['file'].max_upload_size,
            'help_text': form.fields['file'].help_text,
            'allowed_extensions': ALLOWED_EXTENSIONS,
            'error_max_file_size': form.fields['file'].error_messages['file_too_large_unknown_size'],
            'error_accepted_file_types': form.fields['file'].error_messages['invalid_image_extension'],
            'collections': collections,
            'form_media': form.media,
        })
def add(request):
    Image = get_image_model()
    ImageForm = get_image_form(Image)

    collections = permission_policy.collections_user_has_permission_for(request.user, 'add')
    if len(collections) > 1:
        collections_to_choose = collections
    else:
        # no need to show a collections chooser
        collections_to_choose = None

    if request.method == 'POST':
        if not request.is_ajax():
            return HttpResponseBadRequest("Cannot POST to this view without AJAX")

        if not request.FILES:
            return HttpResponseBadRequest("Must upload a file")

        # Build a form for validation
        form = ImageForm({
            'title': request.FILES['files[]'].name,
            'collection': request.POST.get('collection'),
        }, {
            'file': request.FILES['files[]'],
        }, 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.save()

            # Success! Send back an edit form for this image to the user
            return JsonResponse({
                'success': True,
                'image_id': int(image.id),
                'form': render_to_string('wagtailimages/multiple/edit_form.html', {
                    'image': image,
                    'form': get_image_edit_form(Image)(
                        instance=image, prefix='image-%d' % image.id, user=request.user
                    ),
                }, request=request),
            })
        else:
            # Validation error
            return JsonResponse({
                'success': False,

                # https://github.com/django/django/blob/stable/1.6.x/django/forms/util.py#L45
                'error_message': '\n'.join(['\n'.join([force_text(i) for i in v]) for k, v in form.errors.items()]),
            })
    else:
        form = ImageForm(user=request.user)

    return render(request, 'wagtailimages/multiple/add.html', {
        'max_filesize': form.fields['file'].max_upload_size,
        'help_text': form.fields['file'].help_text,
        'allowed_extensions': ALLOWED_EXTENSIONS,
        'error_max_file_size': form.fields['file'].error_messages['file_too_large_unknown_size'],
        'error_accepted_file_types': form.fields['file'].error_messages['invalid_image'],
        'collections': collections_to_choose,
    })
Beispiel #8
0
def add(request):
    mediaPath = os.path.dirname(
        os.path.dirname(os.path.dirname(
            os.path.dirname(__file__)))) + '/media/original_images'
    Image = get_image_model()
    ImageForm = get_image_form(Image)

    collections = permission_policy.collections_user_has_permission_for(
        request.user, 'add')
    if len(collections) > 1:
        collections_to_choose = Collection.order_for_display(collections)
    else:
        # no need to show a collections chooser
        collections_to_choose = None

    if request.method == 'POST':
        if not request.is_ajax():
            return HttpResponseBadRequest(
                "Cannot POST to this view without AJAX")

        if not request.FILES:
            return HttpResponseBadRequest("Must upload a file")

        # Build a form for validation
        form = ImageForm(
            {
                'title': request.FILES['files[]'].name,
                'collection': request.POST.get('collection'),
            }, {
                'file': request.FILES['files[]'],
            },
            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.file.seek(0)
            image._set_file_hash(image.file.read())
            image.file.seek(0)

            # 在已经上传的txt中寻找与该图像ClothCode相同且最新上传的,否则提示错误
            clothCode = str(request.FILES['files[]'].name)[0:6]
            try:
                doc = Document.objects.get(ClothCode=clothCode)
                image.BatchNum = doc.BatchNum
                image.Specs = doc.Specs
                image.ClothCode = doc.ClothCode
            except ObjectDoesNotExist:
                return JsonResponse({
                    'success': False,

                    # https://github.com/django/django/blob/stable/1.6.x/django/forms/util.py#L45
                    'error_message': "未上传该图片对应说明文档(同名)"
                })
            image.save()

            # Success! Send back an edit form for this image to the user
            return JsonResponse({
                'success':
                True,
                'image_id':
                int(image.id),
                'form':
                render_to_string('wagtailimages/multiple/edit_form.html', {
                    'image':
                    image,
                    'form':
                    get_image_edit_form(Image)(instance=image,
                                               prefix='image-%d' % image.id,
                                               user=request.user),
                },
                                 request=request),
            })
        else:
            # Validation error
            return JsonResponse({
                'success':
                False,

                # https://github.com/django/django/blob/stable/1.6.x/django/forms/util.py#L45
                'error_message':
                '\n'.join([
                    '\n'.join([force_text(i) for i in v])
                    for k, v in form.errors.items()
                ]),
            })
    else:
        form = ImageForm(user=request.user)

    return render(
        request, 'wagtailimages/multiple/add.html', {
            'max_filesize':
            form.fields['file'].max_upload_size,
            'help_text':
            form.fields['file'].help_text,
            'allowed_extensions':
            ALLOWED_EXTENSIONS,
            'error_max_file_size':
            form.fields['file'].error_messages['file_too_large_unknown_size'],
            'error_accepted_file_types':
            form.fields['file'].error_messages['invalid_image'],
            'collections':
            collections_to_choose,
        })
Beispiel #9
0
def import_from_drive(request):
    if not can_import(request.user):
        raise PermissionDenied

    collections = permission_policy.collections_user_has_permission_for(
        request.user, "add")
    collections_to_choose = json.dumps([
        (collection.id, collection.name)
        for collection in Collection.order_for_display(collections)
    ])
    Image = get_image_model()
    ImageForm = get_image_form(Image)

    if request.method == "POST":
        # Build a form for validation
        wagtail_id = request.POST.get("wagtail_id")
        if request.POST["action"] == "replace" and wagtail_id:
            existing_image = get_image_model().objects.get(pk=wagtail_id)
            form = ImageForm(
                {
                    "title": existing_image.title,
                    "collection": existing_image.collection.id,
                },
                {
                    "file": request.FILES["image_file"],
                },
                user=request.user,
                instance=existing_image,
            )
        else:

            form = ImageForm(
                {
                    "title": request.POST.get("name", ""),
                    "collection": request.POST.get("collection"),
                },
                {
                    "file": request.FILES["image_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.file.seek(0)
            image._set_file_hash(image.file.read())
            image.file.seek(0)
            image.save()
            drive_id = request.POST.get("drive_id")
            if drive_id:
                DriveIDMapping.objects.update_or_create(
                    image=image, defaults={"drive_id": drive_id})

            # Success! Send back an edit form for this image to the user
            return JsonResponse({
                "success":
                True,
                "image_id":
                int(image.id),
                "edit_action":
                reverse("wagtail_image_import:edit", args=(image.id, )),
                "delete_action":
                reverse("wagtailimages:delete_multiple", args=(image.id, )),
                "form":
                render_to_string(
                    "wagtail_image_import/edit_form.html",
                    {
                        "image":
                        image,
                        "form":
                        get_image_edit_form(Image)(
                            instance=image,
                            prefix="image-%d" % image.id,
                            user=request.user,
                        ),
                    },
                    request=request,
                ),
            })
        elif "file" in form.errors:
            # The uploaded file is invalid; reject it now
            return JsonResponse({
                "success": False,
                "error": "\n".join(form.errors["file"]),
            })
        else:
            # Some other field of the image form has failed validation, e.g. a required metadata field
            # on a custom image model. Store the image as an UploadedImage instead and present the
            # edit form so that it will become a proper Image when successfully filled in
            uploaded_image = UploadedImage.objects.create(
                file=request.FILES["image_file"],
                uploaded_by_user=request.user)
            image = Image(
                title=request.POST.get("name", ""),
                collection_id=request.POST.get("collection"),
            )

            return JsonResponse({
                "error":
                "The image was uploaded, but needs additional input to be saved. Errors: "
                + "\n".join([
                    field + ": " + error
                    for field, error_list in form.errors.items()
                    for error in error_list
                ]),
                "success":
                True,
                "uploaded_image_id":
                uploaded_image.id,
                "edit_action":
                reverse(
                    "wagtail_image_import:create_from_uploaded_image",
                    args=(uploaded_image.id, ),
                ),
                "delete_action":
                reverse(
                    "wagtailimages:delete_upload_multiple",
                    args=(uploaded_image.id, ),
                ),
                "form":
                render_to_string(
                    "wagtail_image_import/edit_form.html",
                    {
                        "uploaded_image":
                        uploaded_image,
                        "form":
                        get_image_edit_form(Image)(
                            instance=image,
                            prefix="uploaded-image-%d" % uploaded_image.id,
                            user=request.user,
                        ),
                    },
                    request=request,
                ),
            })
    # manually set the Google picker parent folder if a function is provided
    drive_parent_finder = getattr(
        settings, "WAGTAILIMAGEIMPORT_SET_DRIVE_PARENT_FUNCTION", "")
    drive_parent = (import_string(drive_parent_finder)(request)
                    if drive_parent_finder else "root")

    client_secret = json.loads(
        settings.WAGTAILIMAGEIMPORT_GOOGLE_OAUTH_CLIENT_SECRET)
    context = {
        "app_id": client_secret["web"]["project_id"],
        "client_id": client_secret["web"]["client_id"],
        "picker_api_key": settings.WAGTAILIMAGEIMPORT_GOOGLE_PICKER_API_KEY,
        "collections": collections_to_choose,
        "drive_parent": drive_parent,
    }
    return render(request, "wagtail_image_import/import.html", context=context)
Beispiel #10
0
def add(request):
    """Almost the exact same method that Wagtail uses. But with TinyPNG and a callback."""
    Image = get_image_model()
    ImageForm = get_image_form(Image)

    collections = permission_policy.collections_user_has_permission_for(
        request.user, 'add')
    if len(collections) > 1:
        collections_to_choose = collections
    else:
        # no need to show a collections chooser
        collections_to_choose = None

    if request.method == 'POST':
        if not request.is_ajax():
            return HttpResponseBadRequest(
                "Cannot POST to this view without AJAX")

        if not request.FILES:
            return HttpResponseBadRequest("Must upload a file")

        # Build a form for validation
        form = ImageForm(
            {
                'title': request.FILES['files[]'].name,
                'collection': request.POST.get('collection'),
            }, {
                'file': request.FILES['files[]'],
            },
            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.save()

            if not image.tinified:
                try:
                    source = tinify.from_file(image.file.path)
                    resized = source.resize(method="scale", width=2000)
                    resized.to_file(image.file.path)
                    image.tinified = True
                    image.file_size = image.file.size
                    image.height = image.file.height
                    image.width = image.file.width
                    image.save()
                except Exception:
                    # @todo add proper exception handling.
                    # For now just carry as normal.
                    pass

            # Optional callback function, if specified.
            # This will add the wagtail image object as the first param
            # image_tinified is the second parameter to tell you whether
            # the image was compressed or not.
            if hasattr(settings, 'WAGTAIL_COMPRESS_CALLBACK'):
                function_string = settings.WAGTAIL_COMPRESS_CALLBACK
                mod_name, func_name = function_string.rsplit('.', 1)
                mod = importlib.import_module(mod_name)
                func = getattr(mod, func_name)
                func(image=image, image_tinified=image.tinified)

            # Success! Send back an edit form for this image to the user
            return JsonResponse({
                'success':
                True,
                'image_id':
                int(image.id),
                'form':
                render_to_string('wagtailimages/multiple/edit_form.html', {
                    'image':
                    image,
                    'form':
                    get_image_edit_form(Image)(instance=image,
                                               prefix='image-%d' % image.id,
                                               user=request.user),
                },
                                 request=request),
            })
        else:
            # Validation error
            return JsonResponse({
                'success':
                False,

                # https://github.com/django/django/blob/stable/1.6.x/django/forms/util.py#L45
                'error_message':
                '\n'.join([
                    '\n'.join([force_text(i) for i in v])
                    for k, v in form.errors.items()
                ]),
            })
    else:
        form = ImageForm(user=request.user)

    return render(
        request, 'wagtailimages/multiple/add.html', {
            'max_filesize':
            form.fields['file'].max_upload_size,
            'help_text':
            form.fields['file'].help_text,
            'allowed_extensions':
            ALLOWED_EXTENSIONS,
            'error_max_file_size':
            form.fields['file'].error_messages['file_too_large_unknown_size'],
            'error_accepted_file_types':
            form.fields['file'].error_messages['invalid_image'],
            'collections':
            collections_to_choose,
        })