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 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, }
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 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 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, })
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, })
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)
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, })