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, }
def add(request): ImageModel = get_image_model() ImageForm = get_image_form(ImageModel) if request.method == "POST": image = ImageModel(uploaded_by_user=request.user) form = ImageForm(request.POST, request.FILES, instance=image, user=request.user) if form.is_valid(): form.save() messages.success( request, _("Image '{0}' added.").format(image.title), buttons=[ messages.button( reverse("wagtailimages:edit", args=(image.id,)), _("Edit") ) ], ) return redirect("wagtailimages:index") else: messages.error(request, _("The image could not be created due to errors.")) else: form = ImageForm(user=request.user) return TemplateResponse( request, "wagtailimages/images/add.html", { "form": form, }, )
def add(request): ImageModel = get_image_model() ImageForm = get_image_form(ImageModel) if request.method == 'POST': image = ImageModel(uploaded_by_user=request.user) form = ImageForm(request.POST, request.FILES, instance=image, user=request.user) if form.is_valid(): # 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) form.save() # Reindex the image to make sure all tags are indexed search_index.insert_or_update_object(image) messages.success(request, _("Image '{0}' added.").format(image.title), buttons=[ messages.button(reverse('wagtailimages:edit', args=(image.id,)), _('Edit')) ]) return redirect('wagtailimages:index') else: messages.error(request, _("The image could not be created due to errors.")) else: form = ImageForm(user=request.user) return TemplateResponse(request, "wagtailimages/images/add.html", { 'form': form, })
def chooser_select(request, image_id): Image = get_image_model() ImageForm = get_image_form(Image, hide_file=True) image = get_object_or_404(Image, id=image_id) if not request.is_ajax(): return HttpResponseBadRequest("Cannot POST to this view without AJAX") if not image.is_editable_by_user(request.user): raise PermissionDenied form = ImageForm(request.POST, request.FILES, instance=image, prefix='image-' + image_id, user=request.user) if form.is_valid(): form.save() # Reindex the image to make sure all tags are indexed search_index.insert_or_update_object(image) # several possibilities starting from here, based on the GET params # will_select_format = request.GET.get('select_format') will_select_rendition = request.GET.get('select_rendition') if will_select_format: form = ImageInsertionForm( initial={'alt_text': image.default_alt_text}) return render_modal_workflow( request, 'wagtailimages/chooser/select_format.html', 'wagtailimages/chooser/select_format.js', {'image': image, 'form': form} ) elif will_select_rendition: form = ImageCropperForm(**get_cropper_settings(request, image)) return render_modal_workflow( request, 'wagtailimages/chooser/select_rendition.html', 'wagtailimages/chooser/select_rendition.js', {'image': image, 'form': form} ) else: # not specifying a format; return the image details now return render_modal_workflow( request, None, 'wagtailimages/chooser/image_chosen.js', {'image_json': get_image_json(image)} ) else: # something was wrong with the submitted data # return JsonResponse({ 'success': False, 'image_id': int(image_id), 'form': render_to_string('wagtailimages/chooser/update.html', { 'image': image, 'form': form, 'additional_params': get_cropper_params(request), }, request=request), })
def add(request): ImageModel = get_image_model() ImageForm = get_image_form(ImageModel) if request.method == 'POST': image = ImageModel(uploaded_by_user=request.user) form = ImageForm(request.POST, request.FILES, instance=image, user=request.user) if form.is_valid(): # Set image file size image.file_size = image.file.size form.save() # Reindex the image to make sure all tags are indexed search_index.insert_or_update_object(image) messages.success(request, _("Image '{0}' added.").format(image.title), buttons=[ messages.button(reverse('wagtailimages:edit', args=(image.id,)), _('Edit')) ]) return redirect('wagtailimages:index') else: messages.error(request, _("The image could not be created due to errors.")) else: form = ImageForm(user=request.user) return render(request, "wagtailimages/images/add.html", { 'form': form, })
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', None, context, json_data=get_chooser_js_data())
def chooser_upload(request): Image = get_image_model() ImageForm = get_image_form(Image, hide_file=True) if not request.is_ajax(): return HttpResponseBadRequest("Cannot POST to this view without AJAX") if not request.FILES: return HttpResponseBadRequest("Must upload a file") # Save it image = Image(uploaded_by_user=request.user, title=request.FILES['files[]'].name, file=request.FILES['files[]']) image.save() # Success! Send back an edit form for this image to the user form = ImageForm(instance=image, prefix='image-%d' % image.id, user=request.user) # Keep follow-up settings will_select_format = request.GET.get('select_format') will_select_rendition = request.GET.get('select_rendition') return JsonResponse({ 'success': True, 'image_id': int(image.id), 'form': render_to_string('wagtailimages/chooser/update.html', { 'image': image, 'form': form, 'will_select_format': will_select_format, 'will_select_rendition': will_select_rendition, 'additional_params': get_cropper_params(request), }, request=request), })
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', None, context, json_data=get_chooser_js_data() )
def chooser_upload(request): Image = get_image_model() ImageForm = get_image_form(Image) if request.method == 'POST': image = Image(uploaded_by_user=request.user) form = ImageForm( request.POST, request.FILES, instance=image, user=request.user, prefix='image-chooser-upload' ) if form.is_valid(): # 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) form.save() # Reindex the image to make sure all tags are indexed search_index.insert_or_update_object(image) if request.GET.get('select_format'): form = ImageInsertionForm( initial={'alt_text': image.default_alt_text}, prefix='image-chooser-insertion' ) return render_modal_workflow( request, 'wagtailimages/chooser/select_format.html', None, {'image': image, 'form': form}, json_data={'step': 'select_format'} ) else: # not specifying a format; return the image details now return render_modal_workflow( request, None, None, None, json_data={'step': 'image_chosen', 'result': get_image_result_data(image)} ) else: form = ImageForm(user=request.user, prefix='image-chooser-upload') 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) paginator = Paginator(images, per_page=12) images = paginator.get_page(request.GET.get('p')) context = get_chooser_context(request) context.update({ 'images': images, 'uploadform': form, }) return render_modal_workflow( request, 'wagtailimages/chooser/chooser.html', None, context, json_data=get_chooser_js_data() )
def chooser_upload(request): Image = get_image_model() ImageForm = get_image_form(Image) if request.method == 'POST': image = Image(uploaded_by_user=request.user) form = ImageForm( request.POST, request.FILES, instance=image, user=request.user, prefix='image-chooser-upload' ) if form.is_valid(): # 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) form.save() # Reindex the image to make sure all tags are indexed search_index.insert_or_update_object(image) if request.GET.get('select_format'): form = ImageInsertionForm( initial={'alt_text': image.default_alt_text}, prefix='image-chooser-insertion' ) return render_modal_workflow( request, 'wagtailimages/chooser/select_format.html', None, {'image': image, 'form': form}, json_data={'step': 'select_format'} ) else: # not specifying a format; return the image details now return render_modal_workflow( request, None, None, None, json_data={'step': 'image_chosen', 'result': get_image_result_data(image)} ) else: form = ImageForm(user=request.user, prefix='image-chooser-upload') 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) 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': form, }) return render_modal_workflow( request, 'wagtailimages/chooser/chooser.html', None, context, json_data=get_chooser_js_data() )
def test_get_image_form_widgets(self): form_cls = get_image_form(models.Image) form = form_cls() self.assertIsInstance(form.fields["tags"].widget, widgets.AdminTagWidget) self.assertIsInstance(form.fields["file"].widget, forms.FileInput) self.assertIsInstance(form.fields["focal_point_x"].widget, forms.HiddenInput)
def test_get_overridden_image_form_widgets(self): form_cls = get_image_form(models.Image) form = form_cls() self.assertIsInstance(form.fields["tags"].widget, OverriddenWidget) self.assertIsInstance(form.fields["file"].widget, OverriddenWidget) self.assertIsInstance(form.fields["focal_point_x"].widget, forms.HiddenInput) self.assertIn("form_only_field", form.fields) self.assertIs(form.Meta.widgets["form_only_field"], AdminDateTimeInput)
def test_focal_point_fields(self): form = get_image_form(WagtailImage) self.assertIsInstance(form.base_fields['focal_point_x'], forms.IntegerField) self.assertIsInstance(form.base_fields['focal_point_y'], forms.IntegerField) self.assertIsInstance(form.base_fields['focal_point_width'], forms.IntegerField) self.assertIsInstance(form.base_fields['focal_point_height'], forms.IntegerField) self.assertIsInstance(form.base_fields['focal_point_x'].widget, forms.HiddenInput) self.assertIsInstance(form.base_fields['focal_point_y'].widget, forms.HiddenInput) self.assertIsInstance(form.base_fields['focal_point_width'].widget, forms.HiddenInput) self.assertIsInstance(form.base_fields['focal_point_height'].widget, forms.HiddenInput)
def test_focal_point_fields(self): form = get_image_form(WagtailImage) self.assertIsInstance(form.base_fields['focal_point_x'], forms.IntegerField) self.assertIsInstance(form.base_fields['focal_point_y'], forms.IntegerField) self.assertIsInstance(form.base_fields['focal_point_width'], forms.IntegerField) self.assertIsInstance(form.base_fields['focal_point_height'], forms.IntegerField) self.assertIsInstance(form.base_fields['focal_point_x'].widget, forms.HiddenInput) self.assertIsInstance(form.base_fields['focal_point_y'].widget, forms.HiddenInput) self.assertIsInstance(form.base_fields['focal_point_width'].widget, forms.HiddenInput) self.assertIsInstance(form.base_fields['focal_point_height'].widget, forms.HiddenInput)
def chooser_import_youtube(request): Image = get_image_model() ImageForm = get_image_form(Image, hide_file=True) if not request.is_ajax(): return HttpResponseBadRequest("Cannot POST to this view without AJAX") youtube_url = request.POST.get('youtubeurl') if not youtube_url: return HttpResponseBadRequest("Must specify Youtube URL") parsed = urlparse.urlsplit(youtube_url) if not parsed.query: return HttpResponseBadRequest("Invalid Youtube URL") params = urlparse.parse_qs(parsed.query) vid = params.get('v') if not vid: return HttpResponseBadRequest("Invalid Youtube URL") file = _fetch_youtube_image(vid[0]) # Save it image = Image(uploaded_by_user=request.user, title=file.name, file=file) image.save() # Success! Send back an edit form for this image to the user form = ImageForm(instance=image, prefix='image-%d' % image.id, user=request.user) # Keep follow-up settings will_select_format = request.GET.get('select_format') will_select_rendition = request.GET.get('select_rendition') return JsonResponse({ 'success': True, 'image_id': int(image.id), 'thumbnail': image.get_rendition('forcefit-500x500').url, 'form': render_to_string('wagtailimages/chooser/update.html', { 'image': image, 'form': form, 'will_select_format': will_select_format, 'will_select_rendition': will_select_rendition, 'additional_params': get_cropper_params(request), }, request=request), })
def chooser_upload(request): Image = get_image_model() ImageForm = get_image_form(Image) if request.method == 'POST': image = Image(uploaded_by_user=request.user) form = ImageForm( request.POST, request.FILES, instance=image, user=request.user, prefix='image-chooser-upload' ) if form.is_valid(): # 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) form.save() # Reindex the image to make sure all tags are indexed search_index.insert_or_update_object(image) if request.GET.get('select_format'): form = ImageInsertionForm( initial={'alt_text': image.default_alt_text}, prefix='image-chooser-insertion' ) return render_modal_workflow( request, 'wagtailimages/chooser/select_format.html', None, {'image': image, 'form': form}, json_data={'step': 'select_format'} ) else: # not specifying a format; return the image details now return render_modal_workflow( request, None, None, None, json_data={'step': 'image_chosen', 'result': get_image_result_data(image)} ) else: form = ImageForm(user=request.user, prefix='image-chooser-upload') upload_form_html = render_to_string('wagtailimages/chooser/upload_form.html', { 'form': form, 'will_select_format': request.GET.get('select_format'), }, request) return render_modal_workflow( request, None, None, None, json_data={ 'step': 'reshow_upload_form', 'htmlFragment': upload_form_html } )
def test_fields(self): form = get_image_form(Image) self.assertEqual(list(form.base_fields.keys()), [ 'title', 'file', 'collection', 'tags', 'focal_point_x', 'focal_point_y', 'focal_point_width', 'focal_point_height', ])
def test_fields(self): form = get_image_form(Image) self.assertEqual(list(form.base_fields.keys()), [ 'title', 'file', 'collection', 'tags', 'focal_point_x', 'focal_point_y', 'focal_point_width', 'focal_point_height', ])
def test_admin_form_fields_attribute(self): form = get_image_form(CustomImage) self.assertEqual(list(form.base_fields.keys()), [ 'title', 'file', 'collection', 'tags', 'focal_point_x', 'focal_point_y', 'focal_point_width', 'focal_point_height', 'caption', ])
def test_admin_form_fields_attribute(self): form = get_image_form(CustomImage) self.assertEqual(list(form.base_fields.keys()), [ 'title', 'file', 'collection', 'tags', 'focal_point_x', 'focal_point_y', 'focal_point_width', 'focal_point_height', 'caption', ])
def chooser_upload(request): Image = get_image_model() ImageForm = get_image_form(Image) if request.method == 'POST': image = Image(uploaded_by_user=request.user) form = ImageForm(request.POST, request.FILES, instance=image, user=request.user) if form.is_valid(): form.save() # Reindex the image to make sure all tags are indexed search_index.insert_or_update_object(image) if request.GET.get('select_format'): form = ImageInsertionForm( initial={'alt_text': image.default_alt_text}) return render_modal_workflow( request, 'wagtailimages/chooser/select_format.html', 'wagtailimages/chooser/select_format.js', { 'image': image, 'form': form }) else: # not specifying a format; return the image details now return render_modal_workflow( request, None, 'wagtailimages/chooser/image_chosen.js', {'image_json': get_image_json(image)}) else: form = ImageForm(user=request.user) 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) paginator, images = paginate(request, images, per_page=12) context = get_chooser_context(request) context.update({ 'images': images, 'uploadform': form, }) return render_modal_workflow(request, 'wagtailimages/chooser/chooser.html', 'wagtailimages/chooser/chooser.js', context)
def chooser_import_youtube(request): Image = get_image_model() ImageForm = get_image_form(Image, hide_file=True) if not request.is_ajax(): return HttpResponseBadRequest("Cannot POST to this view without AJAX") youtube_url = request.POST.get('youtubeurl') if not youtube_url: return HttpResponseBadRequest("Must specify Youtube URL") parsed = urlparse.urlsplit(youtube_url) if not parsed.query: return HttpResponseBadRequest("Invalid Youtube URL") params = urlparse.parse_qs(parsed.query) vid = params.get('v') if not vid: return HttpResponseBadRequest("Invalid Youtube URL") file = _fetch_youtube_image(vid[0]) # Save it image = Image(uploaded_by_user=request.user, title=file.name, file=file) image.save() # Success! Send back an edit form for this image to the user form = ImageForm(instance=image, prefix='image-%d' % image.id, user=request.user) # Keep follow-up settings will_select_format = request.GET.get('select_format') will_select_rendition = request.GET.get('select_rendition') return JsonResponse({ 'success': True, 'image_id': int(image.id), 'thumbnail': image.get_rendition('forcefit-500x500').url, 'form': render_to_string('wagtailimages/chooser/update.html', { 'image': image, 'form': form, 'will_select_format': will_select_format, 'will_select_rendition': will_select_rendition, 'additional_params': get_cropper_params(request), }, request=request), })
def get_image_edit_form(ImageModel): ImageForm = get_image_form(ImageModel) # Make a new form with the file and focal point fields excluded class ImageEditForm(ImageForm): class Meta(ImageForm.Meta): model = ImageModel exclude = ( 'file', 'focal_point_x', 'focal_point_y', 'focal_point_width', 'focal_point_height', ) return ImageEditForm
def test_fields(self): form = get_image_form(Image) self.assertEqual( list(form.base_fields.keys()), [ "title", "file", "collection", "tags", "focal_point_x", "focal_point_y", "focal_point_width", "focal_point_height", ], )
def get_image_edit_form(ImageModel): ImageForm = get_image_form(ImageModel) # Make a new form with the file and focal point fields excluded class ImageEditForm(ImageForm): class Meta(ImageForm.Meta): model = ImageModel exclude = ( 'file', 'focal_point_x', 'focal_point_y', 'focal_point_width', 'focal_point_height', ) return ImageEditForm
def chooser_upload(request): Image = get_image_model() ImageForm = get_image_form(Image) searchform = SearchForm() if request.method == 'POST': image = Image(uploaded_by_user=request.user) form = ImageForm(request.POST, request.FILES, instance=image, user=request.user) if form.is_valid(): # 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()) form.save() # Reindex the image to make sure all tags are indexed search_index.insert_or_update_object(image) if request.GET.get('select_format'): form = ImageInsertionForm(initial={'alt_text': image.default_alt_text}) return render_modal_workflow( request, 'wagtailimages/chooser/select_format.html', None, {'image': image, 'form': form}, json_data={'step': 'select_format'} ) else: # not specifying a format; return the image details now return render_modal_workflow( request, None, None, None, json_data={'step': 'image_chosen', 'result': get_image_result_data(image)} ) else: form = ImageForm(user=request.user) images = Image.objects.order_by('-created_at') paginator, images = paginate(request, images, per_page=12) return render_modal_workflow( request, 'wagtailimages/chooser/chooser.html', None, {'images': images, 'uploadform': form, 'searchform': searchform}, json_data=get_chooser_context() )
def chooser_upload(request): Image = get_image_model() ImageForm = get_image_form(Image) searchform = SearchForm() if request.method == 'POST': image = Image(uploaded_by_user=request.user) form = ImageForm(request.POST, request.FILES, instance=image, user=request.user) if form.is_valid(): # 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()) form.save() # Reindex the image to make sure all tags are indexed search_index.insert_or_update_object(image) if request.GET.get('select_format'): form = ImageInsertionForm(initial={'alt_text': image.default_alt_text}) return render_modal_workflow( request, 'wagtailimages/chooser/select_format.html', 'wagtailimages/chooser/select_format.js', {'image': image, 'form': form} ) else: # not specifying a format; return the image details now return render_modal_workflow( request, None, 'wagtailimages/chooser/image_chosen.js', {'image_json': get_image_json(image)} ) else: form = ImageForm(user=request.user) images = Image.objects.order_by('-created_at') paginator, images = paginate(request, images, per_page=12) return render_modal_workflow( request, 'wagtailimages/chooser/chooser.html', 'wagtailimages/chooser/chooser.js', {'images': images, 'uploadform': form, 'searchform': searchform} )
def test_admin_form_fields_attribute(self): form = get_image_form(CustomImage) self.assertEqual( list(form.base_fields.keys()), [ "title", "file", "collection", "tags", "focal_point_x", "focal_point_y", "focal_point_width", "focal_point_height", "caption", "fancy_caption", ], )
def save_image(self, file_path): Image = get_image_model() ImageForm = get_image_form(Image) if self.is_bmp_format(file_path): file_path = self.convert_bmp_image(file_path) f=open(file_path, 'r') myfile = File(f) form = ImageForm({'title': self.title}, {'file': myfile}) #form.is_valid() == True image = form.save(commit=False) if self.user is not None: image.uploaded_by_user = self.user image.save() return image
def chooser_upload(request): Image = get_image_model() ImageForm = get_image_form(Image, hide_file=True) if not request.is_ajax(): return HttpResponseBadRequest("Cannot POST to this view without AJAX") if not request.FILES: return HttpResponseBadRequest("Must upload a file") # Save it image = Image(uploaded_by_user=request.user, title=request.FILES['files[]'].name, file=request.FILES['files[]']) image.save() # Success! Send back an edit form for this image to the user form = ImageForm(instance=image, prefix='image-%d' % image.id, user=request.user) # Keep follow-up settings will_select_format = request.GET.get('select_format') will_select_rendition = request.GET.get('select_rendition') return JsonResponse({ 'success': True, 'image_id': int(image.id), 'form': render_to_string('wagtailimages/chooser/update.html', { 'image': image, 'form': form, 'will_select_format': will_select_format, 'will_select_rendition': will_select_rendition, 'additional_params': get_cropper_params(request), }, request=request), })
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
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
def test_file_field(self): form = get_image_form(WagtailImage) self.assertIsInstance(form.base_fields['file'], WagtailImageField) self.assertIsInstance(form.base_fields['file'].widget, forms.FileInput)
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, })
def test_tags_field(self): form = get_image_form(WagtailImage) self.assertIsInstance(form.base_fields["tags"], TagField) self.assertIsInstance(form.base_fields["tags"].widget, TagWidget)
def test_file_field(self): form = get_image_form(WagtailImage) self.assertIsInstance(form.base_fields["file"], WagtailImageField) self.assertIsInstance(form.base_fields["file"].widget, forms.FileInput)
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 edit(request, image_id): Image = get_image_model() ImageForm = get_image_form(Image) image = get_object_or_404(Image, id=image_id) if not permission_policy.user_has_permission_for_instance( request.user, 'change', image): return permission_denied(request) if request.method == 'POST': original_file = image.file form = ImageForm(request.POST, request.FILES, instance=image, user=request.user) if form.is_valid(): if 'file' in form.changed_data: # Set new image file size image.file_size = image.file.size # Set new image file hash image.file.seek(0) image._set_file_hash(image.file.read()) image.file.seek(0) form.save() if 'file' in form.changed_data: # if providing a new image 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) image.renditions.all().delete() # Reindex the image to make sure all tags are indexed search_index.insert_or_update_object(image) messages.success(request, _("Image '{0}' updated.").format(image.title), buttons=[ messages.button( reverse('wagtailimages:edit', args=(image.id, )), _('Edit again')) ]) return redirect('wagtailimages:index') else: messages.error(request, _("The image could not be saved due to errors.")) else: form = ImageForm(instance=image, user=request.user) # Check if we should enable the frontend url generator try: reverse('wagtailimages_serve', args=('foo', '1', 'bar')) url_generator_enabled = True except NoReverseMatch: url_generator_enabled = False if image.is_stored_locally(): # Give error if image file doesn't exist if not os.path.isfile(image.file.path): messages.error( request, _("The source image file could not be found. Please change the source or delete the image." ).format(image.title), buttons=[ messages.button( reverse('wagtailimages:delete', args=(image.id, )), _('Delete')) ]) try: filesize = image.get_file_size() except SourceImageIOError: filesize = None return render( request, "wagtailimages/images/edit.html", { 'image': image, 'form': form, 'url_generator_enabled': url_generator_enabled, 'filesize': filesize, 'user_can_delete': permission_policy.user_has_permission_for_instance( request.user, 'delete', image), })
def get_upload_form_class(self): return get_image_form(self.model)
def test_tags_field(self): form = get_image_form(WagtailImage) self.assertIsInstance(form.base_fields['tags'], TagField) self.assertIsInstance(form.base_fields['tags'].widget, TagWidget)
def edit(request, image_id): Image = get_image_model() ImageForm = get_image_form(Image) image = get_object_or_404(Image, id=image_id) if not permission_policy.user_has_permission_for_instance( request.user, "change", image): raise PermissionDenied next_url = get_valid_next_url_from_request(request) if request.method == "POST": original_file = image.file form = ImageForm(request.POST, request.FILES, instance=image, user=request.user) if form.is_valid(): if "file" in form.changed_data: # Set new image file size image.file_size = image.file.size # Set new image file hash image.file.seek(0) image._set_file_hash(image.file.read()) image.file.seek(0) form.save() if "file" in form.changed_data: # if providing a new image 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) image.renditions.all().delete() # Reindex the image to make sure all tags are indexed search_index.insert_or_update_object(image) edit_url = reverse("wagtailimages:edit", args=(image.id, )) redirect_url = "wagtailimages:index" if next_url: edit_url = f"{edit_url}?{urlencode({'next': next_url})}" redirect_url = next_url messages.success( request, _("Image '{0}' updated.").format(image.title), buttons=[messages.button(edit_url, _("Edit again"))], ) return redirect(redirect_url) else: messages.error(request, _("The image could not be saved due to errors.")) else: form = ImageForm(instance=image, user=request.user) # Check if we should enable the frontend url generator try: reverse("wagtailimages_serve", args=("foo", "1", "bar")) url_generator_enabled = True except NoReverseMatch: url_generator_enabled = False if image.is_stored_locally(): # Give error if image file doesn't exist if not os.path.isfile(image.file.path): messages.error( request, _("The source image file could not be found. Please change the source or delete the image." ).format(image.title), buttons=[ messages.button( reverse("wagtailimages:delete", args=(image.id, )), _("Delete")) ], ) try: filesize = image.get_file_size() except SourceImageIOError: filesize = None return TemplateResponse( request, "wagtailimages/images/edit.html", { "image": image, "form": form, "url_generator_enabled": url_generator_enabled, "filesize": filesize, "user_can_delete": permission_policy.user_has_permission_for_instance( request.user, "delete", image), "next": next_url, }, )
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 will_select_format = request.GET.get('select_format') will_select_rendition = request.GET.get('select_rendition') images = Image.objects.order_by('-created_at') \ .filter(show_in_catalogue=True) # 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': will_select_format, 'will_select_rendition': will_select_rendition, 'post_processing_spec': request.GET.get('pps'), 'additional_params': get_cropper_params(request), }) 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': will_select_format, 'will_select_rendition': will_select_rendition, 'popular_tags': popular_tags_for_model(Image), 'collections': collections, 'uploadid': uuid.uuid4(), 'post_processing_spec': request.GET.get('pps'), 'additional_params': get_cropper_params(request), 'allowed_extensions': ALLOWED_EXTENSIONS, 'error_max_file_size': uploadform.fields['file'] .error_messages['file_too_large_unknown_size'] if uploadform else None, 'error_accepted_file_types': uploadform.fields['file'].error_messages['invalid_image'] if uploadform else None, })
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, })
def edit(request, image_id): Image = get_image_model() ImageForm = get_image_form(Image) image = get_object_or_404(Image, id=image_id) if not permission_policy.user_has_permission_for_instance(request.user, 'change', image): return permission_denied(request) if request.method == 'POST': original_file = image.file form = ImageForm(request.POST, request.FILES, instance=image, user=request.user) if form.is_valid(): if 'file' in form.changed_data: # Set new image file size image.file_size = image.file.size form.save() if 'file' in form.changed_data: # if providing a new image 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) image.renditions.all().delete() # Reindex the image to make sure all tags are indexed search_index.insert_or_update_object(image) messages.success(request, _("Image '{0}' updated.").format(image.title), buttons=[ messages.button(reverse('wagtailimages:edit', args=(image.id,)), _('Edit again')) ]) return redirect('wagtailimages:index') else: messages.error(request, _("The image could not be saved due to errors.")) else: form = ImageForm(instance=image, user=request.user) # Check if we should enable the frontend url generator try: reverse('wagtailimages_serve', args=('foo', '1', 'bar')) url_generator_enabled = True except NoReverseMatch: url_generator_enabled = False if image.is_stored_locally(): # Give error if image file doesn't exist if not os.path.isfile(image.file.path): messages.error(request, _( "The source image file could not be found. Please change the source or delete the image." ).format(image.title), buttons=[ messages.button(reverse('wagtailimages:delete', args=(image.id,)), _('Delete')) ]) return render(request, "wagtailimages/images/edit.html", { 'image': image, 'form': form, 'url_generator_enabled': url_generator_enabled, 'filesize': image.get_file_size(), 'user_can_delete': permission_policy.user_has_permission_for_instance( request.user, 'delete', image ), })
from django.core.files.storage import default_storage from django.core.files.images import ImageFile from django.db.models.fields.files import FileField, FieldFile, ImageField, ImageFieldFile from wagtail.core.models import Collection from wagtail.documents.forms import get_document_form from wagtail.documents.models import Document from wagtail.images.fields import WagtailImageField from wagtail.images.forms import get_image_form from wagtail.images.models import Image from .core import mediabox DocumentForm = get_document_form(Document) ImageForm = get_image_form(Image) managed_collection = Collection.objects.get_or_create(name="Mediabox")[0] # Wagtail operations here. def image_from_file(file, path='/', collection=managed_collection): # logger.warn(f"Checking path: {path}") # file = mediabox.info(path) logger.warn(f"Processing file {file} as an image.") logger.warn(f"File name: {file.name}") logger.warn(f"File path: {path}") # img = Image(file=ImageFile(file, name=file.name), # title=file.name, collection=collection)
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, })