def chooser(request): Image = get_image_model() if permission_policy.user_has_permission(request.user, 'add'): ImageForm = get_image_form(Image) uploadform = ImageForm(user=request.user) else: uploadform = None images = Image.objects.order_by('-created_at') # allow hooks to modify the queryset for hook in hooks.get_hooks('construct_image_chooser_queryset'): images = hook(images, request) if ('q' in request.GET or 'p' in request.GET or 'tag' in request.GET or 'collection_id' in request.GET): # this request is triggered from search, pagination or 'popular tags'; # we will just render the results.html fragment collection_id = request.GET.get('collection_id') if collection_id: images = images.filter(collection=collection_id) searchform = SearchForm(request.GET) if searchform.is_valid(): q = searchform.cleaned_data['q'] images = images.search(q) is_searching = True else: is_searching = False q = None tag_name = request.GET.get('tag') if tag_name: images = images.filter(tags__name=tag_name) # Pagination paginator, images = paginate(request, images, per_page=12) return render( request, "wagtailimages/chooser/results.html", { 'images': images, 'is_searching': is_searching, 'query_string': q, 'will_select_format': request.GET.get('select_format') }) else: paginator, images = paginate(request, images, per_page=12) context = get_chooser_context(request) context.update({ 'images': images, 'uploadform': uploadform, }) return render_modal_workflow(request, 'wagtailimages/chooser/chooser.html', 'wagtailimages/chooser/chooser.js', context)
def edit(request, folder_id): response = dict() if not permission_policy.user_has_permission(request.user, 'change'): response['message'] = "User does not have permission" return JsonResponse(response, status=403) try: folder = ImageFolder.objects.get(id=folder_id) except ObjectDoesNotExist: response['message'] = "Invalid ID" return JsonResponse(response, status=404) parent_folder = None parent_id = request.POST.get('parent_id') if parent_id: try: parent_folder = ImageFolder.objects.get(id=parent_id) except ObjectDoesNotExist: response['message'] = "Invalid Parent ID" return JsonResponse(response, status=404) title = request.POST.get('title', folder.title) folder.title = title if parent_folder: folder.folder = parent_folder count = 0 # Indicates the number of times the folder name clashed while True: try: # Check if the folder is present in the DB or physically present in the OS folder.validate_folder() except ValidationError as e: count += 1 if e.code == 'db': folder.title = folder.title + str(count) else: # When a folder with a clashing name exists in the OS, # Add the entry to the DB and notify the user. # Abort the current move operation new_folder = create_db_entries(title, request.user, parent_folder) folders_list = get_folders_list([new_folder]) response[ 'message'] = "Operation Failed! Found new entry in the OS. Loading the folder..." response['data'] = folders_list[0] # Return a 202 as the intended action was not completed return JsonResponse(response, status=202) else: if count: # If there were attempts made to resolve conflict response[ 'message'] = "Folder with the same name exists! Renaming to avoid conflict." else: response['message'] = "Success" break folder.save() response['data'] = get_folders_list([folder])[0] return JsonResponse(response)
def index(request): Image = get_image_model() # Get images (filtered by user permission) images = permission_policy.instances_user_has_any_permission_for(request.user, ["change", "delete"]).order_by( "-created_at" ) # Search query_string = None if "q" in request.GET: form = SearchForm(request.GET, placeholder=_("Search images")) if form.is_valid(): query_string = form.cleaned_data["q"] images = images.search(query_string) else: form = SearchForm(placeholder=_("Search images")) # Filter by collection current_collection = None collection_id = request.GET.get("collection_id") if collection_id: try: current_collection = Collection.objects.get(id=collection_id) images = images.filter(collection=current_collection) except (ValueError, Collection.DoesNotExist): pass paginator, images = paginate(request, images) collections = permission_policy.collections_user_has_any_permission_for(request.user, ["add", "change"]) if len(collections) < 2: collections = None # Create response if request.is_ajax(): return render( request, "wagtailimages/images/results.html", {"images": images, "query_string": query_string, "is_searching": bool(query_string)}, ) else: return render( request, "wagtailimages/images/index.html", { "images": images, "query_string": query_string, "is_searching": bool(query_string), "search_form": form, "popular_tags": Image.popular_tags(), "collections": collections, "current_collection": current_collection, "user_can_add": permission_policy.user_has_permission(request.user, "add"), }, )
def add(request): response = dict() if not permission_policy.user_has_permission(request.user, 'change'): response['message'] = "User does not have permission" return JsonResponse(response, status=403) file = request.FILES.get('files[]') title = os.path.splitext(file.name)[0] if not title or not file: response['message'] = "Title or file missing" return JsonResponse(response, status=400) extension = os.path.splitext(file.name)[1] extension = extension[1:] # Remove the '.' from the extension if extension not in ALLOWED_EXTENSIONS: response['message'] = "Invalid file type" return JsonResponse(response, status=400) folder = None folder_id = request.POST.get('folder_id') if folder_id and int(folder_id) != -1: try: folder = ImageFolder.objects.get(id=folder_id) except ObjectDoesNotExist: response['message'] = "Invalid Folder ID" return JsonResponse(response, status=404) # Build a form for validation form = ImageForm({ 'title': title, 'collection': '1', # Hard coding the root collection as default }, { 'file': file }, user=request.user) if form.is_valid(): # Save it image = form.save(commit=False) image.uploaded_by_user = request.user image.file_size = image.file.size image.folder = folder image.save() # Reindex the image to make sure all tags are indexed search_index.insert_or_update_object(image) response['data'] = get_image_dict(image) response['message'] = "Success" else: response['message'] = "Error creating image" # ToDo send a valid respone based on the error response['data'] = None return JsonResponse(response)
def index(request): Image = get_image_model() # Get images (filtered by user permission) images = permission_policy.instances_user_has_any_permission_for( request.user, ['change', 'delete'] ).order_by('-created_at') # Search query_string = None if 'q' in request.GET: form = SearchForm(request.GET, placeholder=_("Search images")) if form.is_valid(): query_string = form.cleaned_data['q'] images = images.search(query_string) else: form = SearchForm(placeholder=_("Search images")) # Filter by collection current_collection = None collection_id = request.GET.get('collection_id') if collection_id: try: current_collection = Collection.objects.get(id=collection_id) images = images.filter(collection=current_collection) except (ValueError, Collection.DoesNotExist): pass paginator, images = paginate(request, images) collections = permission_policy.collections_user_has_any_permission_for( request.user, ['add', 'change'] ) if len(collections) < 2: collections = None # Create response if request.is_ajax(): return render(request, 'wagtailimages/images/results.html', { 'images': images, 'query_string': query_string, 'is_searching': bool(query_string), }) else: return render(request, 'wagtailimages/images/index.html', { 'images': images, 'query_string': query_string, 'is_searching': bool(query_string), 'search_form': form, 'popular_tags': Image.popular_tags(), 'collections': collections, 'current_collection': current_collection, 'user_can_add': permission_policy.user_has_permission(request.user, 'add'), })
def chooser(request): Image = get_image_model() if permission_policy.user_has_permission(request.user, 'add'): ImageForm = get_image_form(Image) uploadform = ImageForm() else: uploadform = None images = Image.objects.order_by('-created_at') q = None if 'q' in request.GET or 'p' in request.GET or 'tag' in request.GET: # this request is triggered from search, pagination or 'popular tags'; # we will just render the results.html fragment searchform = SearchForm(request.GET) if searchform.is_valid(): q = searchform.cleaned_data['q'] images = images.search(q) is_searching = True else: is_searching = False tag_name = request.GET.get('tag') if tag_name: images = images.filter(tags__name=tag_name) # Pagination paginator, images = paginate(request, images, per_page=12) return render( request, "wagtailimages/chooser/results.html", { 'images': images, 'is_searching': is_searching, 'query_string': q, 'will_select_format': request.GET.get('select_format') }) else: searchform = SearchForm() paginator, images = paginate(request, images, per_page=12) return render_modal_workflow( request, 'wagtailimages/chooser/chooser.html', 'wagtailimages/chooser/chooser.js', { 'images': images, 'uploadform': uploadform, 'searchform': searchform, 'is_searching': False, 'query_string': q, 'will_select_format': request.GET.get('select_format'), 'popular_tags': Image.popular_tags(), })
def chooser(request): Image = get_image_model() if permission_policy.user_has_permission(request.user, 'add'): ImageForm = get_image_form(Image) uploadform = ImageForm() else: uploadform = None images = Image.objects.order_by('-created_at') q = None if 'q' in request.GET or 'p' in request.GET or 'tag' in request.GET: # this request is triggered from search, pagination or 'popular tags'; # we will just render the results.html fragment searchform = SearchForm(request.GET) if searchform.is_valid(): q = searchform.cleaned_data['q'] images = images.search(q) is_searching = True else: is_searching = False tag_name = request.GET.get('tag') if tag_name: images = images.filter(tags__name=tag_name) # Pagination paginator, images = paginate(request, images, per_page=12) return render(request, "wagtailimages/chooser/results.html", { 'images': images, 'is_searching': is_searching, 'query_string': q, 'will_select_format': request.GET.get('select_format') }) else: searchform = SearchForm() paginator, images = paginate(request, images, per_page=12) return render_modal_workflow(request, 'wagtailimages/chooser/chooser.html', 'wagtailimages/chooser/chooser.js', { 'images': images, 'uploadform': uploadform, 'searchform': searchform, 'is_searching': False, 'query_string': q, 'will_select_format': request.GET.get('select_format'), 'popular_tags': Image.popular_tags(), })
def add(request, parent_id=None): response = dict() if not permission_policy.user_has_permission(request.user, 'add'): response['message'] = "User does not have permission" return JsonResponse(response, status=403) title = request.POST.get('title') if not title: response['message'] = "Title not passed" return JsonResponse(response, status=400) parent_folder = None if parent_id and int(parent_id) != -1: try: parent_folder = ImageFolder.objects.get(id=parent_id) except ObjectDoesNotExist: response['message'] = "Invalid Parent ID" return JsonResponse(response, status=404) # Save folder folder = ImageFolder(title=title) if parent_folder: folder.folder = parent_folder try: # Check if the folder is present in the DB or physically present in the OS folder.validate_folder() except ValidationError as e: if e.code == 'os': # If present in the OS, then create the folder entry and it's # content's entries in the DB folder = create_db_entries(title, request.user, parent_folder) folders_list = get_folders_list([folder]) response[ 'message'] = "Found new entry in the OS! Loading the folder..." response['data'] = folders_list[0] return JsonResponse(response, status=202) else: response['message'] = "Folder already exists" return JsonResponse(response, status=403) else: # Save folder folder.save() response['message'] = "Success" response['data'] = get_folders_list([folder])[0] return JsonResponse(response)
def delete(request, image_id): response = dict() if not permission_policy.user_has_permission(request.user, 'change'): response['message'] = "User does not have permission" return JsonResponse(response, status=403) try: image = Image.objects.get(id=image_id) except ObjectDoesNotExist: response['message'] = "Invalid ID" return JsonResponse(response, status=404) image.delete() response['message'] = "Success" return JsonResponse(response)
def index(request): Image = get_image_model() # Get images (filtered by user permission) images = permission_policy.instances_user_has_any_permission_for( request.user, ['change', 'delete'] ).order_by('-created_at') # Search query_string = None if 'q' in request.GET: form = SearchForm(request.GET, placeholder=_("Search images")) if form.is_valid(): query_string = form.cleaned_data['q'] images = images.search(query_string) else: form = SearchForm(placeholder=_("Search images")) paginator, images = paginate(request, images) # Create response if request.is_ajax(): return render(request, 'wagtailimages/images/results.html', { 'images': images, 'query_string': query_string, 'is_searching': bool(query_string), }) else: return render(request, 'wagtailimages/images/index.html', { 'images': images, 'query_string': query_string, 'is_searching': bool(query_string), 'search_form': form, 'popular_tags': Image.popular_tags(), 'user_can_add': permission_policy.user_has_permission(request.user, 'add'), })
def edit(request, image_id): response = dict() if not permission_policy.user_has_permission(request.user, 'change'): response['message'] = "User does not have permission" return JsonResponse(response, status=403) try: image = Image.objects.get(id=image_id) except ObjectDoesNotExist: response['message'] = "Invalid ID" return JsonResponse(response, status=404) title = request.POST.get('title') if title: image.title = title image.save() search_index.insert_or_update_object(image) response['message'] = "Success" response['data'] = get_image_dict(image) return JsonResponse(response) else: response['message'] = "Title not passed" return JsonResponse(response, status=400)
def index(request): Image = get_image_model() # Get images (filtered by user permission) images = permission_policy.instances_user_has_any_permission_for( request.user, ['change', 'delete']).order_by('-created_at') # Search query_string = None if 'q' in request.GET: form = SearchForm(request.GET, placeholder=_("Search images")) if form.is_valid(): query_string = form.cleaned_data['q'] images = images.search(query_string) else: form = SearchForm(placeholder=_("Search images")) # Filter by collection current_collection = None collection_id = request.GET.get('collection_id') if collection_id: try: current_collection = Collection.objects.get(id=collection_id) images = images.filter(collection=current_collection) except (ValueError, Collection.DoesNotExist): pass paginator, images = paginate(request, images) collections = permission_policy.collections_user_has_any_permission_for( request.user, ['add', 'change']) if len(collections) < 2: collections = None # Create response if request.is_ajax(): return render( request, 'wagtailimages/images/results.html', { 'images': images, 'query_string': query_string, 'is_searching': bool(query_string), }) else: return render( request, 'wagtailimages/images/index.html', { 'images': images, 'query_string': query_string, 'is_searching': bool(query_string), 'search_form': form, 'popular_tags': popular_tags_for_model(Image), 'collections': collections, 'current_collection': current_collection, 'user_can_add': permission_policy.user_has_permission(request.user, 'add'), })
def chooser(request): Image = get_image_model() if permission_policy.user_has_permission(request.user, 'add'): ImageForm = get_image_form(Image) uploadform = ImageForm(user=request.user) else: uploadform = None images = Image.objects.order_by('-created_at') # allow hooks to modify the queryset for hook in hooks.get_hooks('construct_image_chooser_queryset'): images = hook(images, request) q = None if ( 'q' in request.GET or 'p' in request.GET or 'tag' in request.GET or 'collection_id' in request.GET ): # this request is triggered from search, pagination or 'popular tags'; # we will just render the results.html fragment collection_id = request.GET.get('collection_id') if collection_id: images = images.filter(collection=collection_id) searchform = SearchForm(request.GET) if searchform.is_valid(): q = searchform.cleaned_data['q'] images = images.search(q) is_searching = True else: is_searching = False tag_name = request.GET.get('tag') if tag_name: images = images.filter(tags__name=tag_name) # Pagination paginator, images = paginate(request, images, per_page=12) return render(request, "wagtailimages/chooser/results.html", { 'images': images, 'is_searching': is_searching, 'query_string': q, 'will_select_format': request.GET.get('select_format') }) else: searchform = SearchForm() collections = Collection.objects.all() if len(collections) < 2: collections = None paginator, images = paginate(request, images, per_page=12) return render_modal_workflow(request, 'wagtailimages/chooser/chooser.html', 'wagtailimages/chooser/chooser.js', { 'images': images, 'uploadform': uploadform, 'searchform': searchform, 'is_searching': False, 'query_string': q, 'will_select_format': request.GET.get('select_format'), 'popular_tags': popular_tags_for_model(Image), 'collections': collections, })
def chooser(request): Image = get_image_model() if permission_policy.user_has_permission(request.user, "add"): ImageForm = get_image_form(Image) uploadform = ImageForm(user=request.user) else: uploadform = None images = Image.objects.order_by("-created_at") q = None if "q" in request.GET or "p" in request.GET or "tag" in request.GET or "collection_id" in request.GET: # this request is triggered from search, pagination or 'popular tags'; # we will just render the results.html fragment collection_id = request.GET.get("collection_id") if collection_id: images = images.filter(collection=collection_id) searchform = SearchForm(request.GET) if searchform.is_valid(): q = searchform.cleaned_data["q"] images = images.search(q) is_searching = True else: is_searching = False tag_name = request.GET.get("tag") if tag_name: images = images.filter(tags__name=tag_name) # Pagination paginator, images = paginate(request, images, per_page=12) return render( request, "wagtailimages/chooser/results.html", { "images": images, "is_searching": is_searching, "query_string": q, "will_select_format": request.GET.get("select_format"), }, ) else: searchform = SearchForm() collections = Collection.objects.all() if len(collections) < 2: collections = None paginator, images = paginate(request, images, per_page=12) return render_modal_workflow( request, "wagtailimages/chooser/chooser.html", "wagtailimages/chooser/chooser.js", { "images": images, "uploadform": uploadform, "searchform": searchform, "is_searching": False, "query_string": q, "will_select_format": request.GET.get("select_format"), "popular_tags": Image.popular_tags(), "collections": collections, }, )
def move(request): response = dict() if not permission_policy.user_has_permission(request.user, 'change'): response['message'] = "User does not have permission" return JsonResponse(response, status=403) source_id = request.POST.get('source_id') target_id = request.POST.get('target_id') source_type = request.POST.get('source_type') count = 0 # Indicates number of attempts to rename a file/folder if not source_id or not target_id or not source_type: response['message'] = "Image or folder ID missing" return JsonResponse(response, status=400) if int(target_id) == -1: target_folder = None # Root folder target_absolute_path = os.path.join(settings.MEDIA_ROOT, IMAGES_FOLDER_NAME) target_relative_path = IMAGES_FOLDER_NAME else: try: target_folder = ImageFolder.objects.get(id=target_id) except ObjectDoesNotExist: response['message'] = "Invalid target ID" return JsonResponse(response, status=404) else: target_absolute_path = target_folder.get_complete_path() target_relative_path = target_folder.path if source_type == 'image': try: image = Image.objects.get(id=source_id) except ObjectDoesNotExist: response['message'] = "Invalid source ID" return JsonResponse(response, status=404) image.folder = target_folder # Change the folder # Move the file to the updated location # When moving a file to a new location, check if a file # with the same name exists. # If yes, then append a number to the filename and save initial_path = image.file.path complete_file_name = image.filename file_name = os.path.splitext(image.filename)[0] # get the filename extension = os.path.splitext(image.filename)[1] # get the extension new_path = os.path.join(target_absolute_path, complete_file_name) while True: # Keeping renaming until there are no more filename clashes if os.path.exists(new_path): count += 1 complete_file_name = file_name + str(count) + extension new_path = os.path.join(target_absolute_path, complete_file_name) else: os.rename(initial_path, new_path) if count: # If there were attempts made to resolve conflict, # change the image's title # Append the count to the title image.title = image.title + str(count) response[ 'message'] = "File with the same name exists! Renaming to avoid conflict." else: response['message'] = "Success" break image.file.name = os.path.join(target_relative_path, complete_file_name) image.save() search_index.insert_or_update_object(image) response['data'] = get_image_dict(image) elif source_type == 'folder': if source_id == target_id: response[ 'message'] = "Source and target forlder ID cannot be the same." return JsonResponse(response, status=400) try: source_folder = ImageFolder.objects.get(id=source_id) except ObjectDoesNotExist: response['message'] = "Invalid Folder ID" return JsonResponse(response, status=404) source_folder.folder = target_folder while True: try: # Check if the folder is present in the DB or physically present in the OS source_folder.validate_folder() except ValidationError as e: count += 1 if e.code == 'db': source_folder.title = source_folder.title + str(count) else: # When a folder with a clashing name exists in the OS, # Add the entry to the DB and notify the user. # Abort the current move operation new_folder = create_db_entries(source_folder.title, request.user, target_folder) folders_list = get_folders_list([new_folder]) response[ 'message'] = "Operation Failed! Found new entry in the OS. Loading the folder..." response['data'] = folders_list[0] # Return a 202 as the intended action was not completed return JsonResponse(response, status=202) else: if count: # If there were attempts made to resolve conflict response[ 'message'] = "Folder with the same name exists! Renaming to avoid conflict." else: response['message'] = "Success" break source_folder.save() response['data'] = get_folders_list([source_folder])[0] else: response['message'] = "Invalid source type" return JsonResponse(response, status=400) return JsonResponse(response)
def multichooser(request): collection_id = request.GET.get('collection_id', None) if not collection_id: album_title = request.GET.get('album_title') page_id = request.GET.get('page_id', None) parent_page_id = request.GET.get('parent_page_id', None) collection = get_or_create_collection(album_title, page_id, parent_page_id) else: collection = Collection.objects.get(id=collection_id) Image = get_image_model() if permission_policy.user_has_permission(request.user, 'add'): ImageForm = get_image_form(Image) uploadform = ImageForm(user=request.user) else: uploadform = None images = Image.objects.filter( collection=collection).order_by('-created_at') # allow hooks to modify the queryset for hook in hooks.get_hooks('construct_image_chooser_queryset'): images = hook(images, request) q = None if ('q' in request.GET or 'p' in request.GET or 'tag' in request.GET): # this request is triggered from search, pagination or 'popular tags'; # we will just render the results.html fragment searchform = SearchForm(request.GET) if searchform.is_valid(): q = searchform.cleaned_data['q'] images = images.search(q) is_searching = True else: is_searching = False tag_name = request.GET.get('tag') if tag_name: images = images.filter(tags__name=tag_name) # Pagination paginator, images = paginate(request, images, per_page=20) return render( request, "fotoalben/multichooser/results.html", { 'images': images, 'is_searching': is_searching, 'query_string': q, 'will_select_format': request.GET.get('select_format') }) else: searchform = SearchForm() # this_site = Site.find_for_request( request ) # collections = Collection.objects.all() # if len(collections) < 2: # collections = None paginator, images = paginate(request, images, per_page=20) return render_modal_workflow( request, 'fotoalben/multichooser/multichooser.html', 'fotoalben/multichooser/multichooser.js', { 'images': images, 'uploadform': uploadform, 'searchform': searchform, 'is_searching': False, 'query_string': q, 'will_select_format': request.GET.get('select_format'), 'popular_tags': popular_tags_for_model(Image), 'collections': [collection], 'collection': collection, 'page_id': page_id, 'album_title': album_title, 'parent_page_id': parent_page_id })
def chooser(request): Image = get_image_model() ImageFolder = get_folder_model() if permission_policy.user_has_permission(request.user, 'add'): ImageForm = get_image_form(Image) uploadform = ImageForm(user=request.user) ImageFolderForm = get_folder_form(ImageFolder) else: uploadform = None # Get images (filtered by user permission) images = permission_policy.instances_user_has_any_permission_for( request.user, ['change', 'delete'] ).order_by('-created_at') # Check if folders_only folders_only = request.GET.get('folders_only') if folders_only: folders_only = True else: folders_only = False # Filter by folder folders = ImageFolder.objects.filter(folder__isnull = True) current_folder = None folder_id = request.GET.get('folder') if folder_id: try: current_folder = ImageFolder.objects.get(id=folder_id) images = Image.objects.filter(folder=current_folder) except (ValueError, ImageFolder.DoesNotExist): pass q = None if ( 'q' in request.GET or 'p' in request.GET or 'tag' in request.GET or 'collection_id' in request.GET or 'folder' in request.GET ): # this request is triggered from search, pagination or 'popular tags'; # we will just render the results.html fragment collection_id = request.GET.get('collection_id') if collection_id: images = images.filter(collection=collection_id) searchform = SearchForm(request.GET) if searchform.is_valid(): q = searchform.cleaned_data['q'] images = images.search(q) is_searching = True else: is_searching = False tag_name = request.GET.get('tag') if tag_name: images = images.filter(tags__name=tag_name) # Pagination paginator, images = paginate(request, images, per_page=12) if not folders_only: return render(request, "wagtailimages/chooser/results.html", { 'images': images, 'folders' : folders, 'current_folder' : current_folder, 'is_searching': is_searching, 'query_string': q, 'will_select_format': request.GET.get('select_format') }) else: return render(request, "wagtailimages/chooser/folders.html", { 'images': images, 'folders': folders, 'current_folder': current_folder, 'is_searching': is_searching, 'query_string': q, 'will_select_format': request.GET.get('select_format') }) else: searchform = SearchForm() collections = Collection.objects.all() if len(collections) < 2: collections = None paginator, images = paginate(request, images, per_page=12) return render_modal_workflow(request, 'wagtailimages/chooser/chooser.html', 'wagtailimages/chooser/chooser.js', { 'images': images, 'folders' : folders, 'current_folder' : current_folder, 'uploadform': uploadform, 'searchform': searchform, 'is_searching': False, 'query_string': q, 'will_select_format': request.GET.get('select_format'), 'popular_tags': popular_tags_for_model(Image), 'collections': collections, })