def delete_view(self, request, object_id, extra_context=None): """ Overrides the default to enable redirecting to the directory view after deletion of a folder. we need to fetch the object and find out who the parent is before super, because super will delete the object and make it impossible to find out the parent folder to redirect to. """ parent_folder = None try: obj = self.queryset(request).get(pk=unquote(object_id)) parent_folder = obj.parent except self.model.DoesNotExist: obj = None r = super(FolderAdmin, self).delete_view( request=request, object_id=object_id, extra_context=extra_context) url = r.get("Location", None) if url in ["../../../../", "../../"] or url == self._get_post_url(obj): if parent_folder: url = reverse('admin:filer-directory_listing', kwargs={'folder_id': parent_folder.id}) else: url = reverse('admin:filer-directory_listing-root') url = "%s%s%s" % (url,popup_param(request), selectfolder_param(request,"&")) return HttpResponseRedirect(url) return r
def delete_view(self, request, object_id, extra_context=None): """ Overrides the default to enable redirecting to the directory view after deletion of a image. we need to fetch the object and find out who the parent is before super, because super will delete the object and make it impossible to find out the parent folder to redirect to. """ parent_folder = None try: obj = self.queryset(request).get(pk=unquote(object_id)) parent_folder = obj.folder except self.model.DoesNotExist: obj = None r = super(FileAdmin, self).delete_view( request=request, object_id=object_id, extra_context=extra_context) url = r.get("Location", None) # Check against filer_file_changelist as file deletion is always made by # the base class if (url in ["../../../../", "../../"] or url == reverse("admin:filer_file_changelist") or url == reverse("admin:filer_image_changelist")): if parent_folder: url = reverse('admin:filer-directory_listing', kwargs={'folder_id': parent_folder.id}) else: url = reverse('admin:filer-directory_listing-unfiled_images') url = "%s%s%s" % (url,popup_param(request), selectfolder_param(request,"&")) return HttpResponseRedirect(url) return r
def delete_view(self, request, object_id, extra_context=None): """ Overrides the default to enable redirecting to the directory view after deletion of a image. we need to fetch the object and find out who the parent is before super, because super will delete the object and make it impossible to find out the parent folder to redirect to. """ parent_folder = None try: obj = self.queryset(request).get(pk=unquote(object_id)) parent_folder = obj.folder except self.model.DoesNotExist: obj = None r = super(FileAdmin, self).delete_view( request=request, object_id=object_id, extra_context=extra_context) url = r.get("Location", None) # Check against filer_file_changelist as file deletion is always made by # the base class if (url in ["../../../../", "../../"] or url == reverse("admin:filer_file_changelist")): if parent_folder: url = reverse('admin:filer-directory_listing', kwargs={'folder_id': parent_folder.id}) else: url = reverse('admin:filer-directory_listing-unfiled_images') url = "%s%s%s" % (url,popup_param(request), selectfolder_param(request,"&")) return HttpResponseRedirect(url) return r
def response_change(self, request, obj): """ Overrides the default to be able to forward to the directory listing instead of the default change_list_view """ r = super(FolderAdmin, self).response_change(request, obj) ## Code borrowed from django ModelAdmin to determine changelist on the fly if r["Location"]: # it was a successful save if r["Location"] in ["../"] or r["Location"] == self._get_post_url(obj): if obj.parent: url = reverse("admin:filer-directory_listing", kwargs={"folder_id": obj.parent.id}) else: url = reverse("admin:filer-directory_listing-root") url = "%s%s%s" % (url, popup_param(request), selectfolder_param(request, "&")) return HttpResponseRedirect(url) else: # this means it probably was a save_and_continue_editing pass return r
def response_change(self, request, obj): """ Overrides the default to be able to forward to the directory listing instead of the default change_list_view """ r = super(FileAdmin, self).response_change(request, obj) if r['Location']: # it was a successful save if (r['Location'] in ['../'] or r['Location'] == self._get_post_url(obj)): # this means it was a save: redirect to the directory view if obj.folder: url = reverse('admin:filer-directory_listing', kwargs={'folder_id': obj.folder.id}) else: url = reverse( 'admin:filer-directory_listing-unfiled_images') url = "%s%s%s" % (url,popup_param(request), selectfolder_param(request,"&")) return HttpResponseRedirect(url) else: # this means it probably was a save_and_continue_editing pass return r
def directory_listing(self, request, folder_id=None, viewtype=None): clipboard = tools.get_user_clipboard(request.user) if viewtype == 'images_with_missing_data': folder = ImagesWithMissingData() elif viewtype == 'unfiled_images': folder = UnfiledImages() elif viewtype == 'last': last_folder_id = request.session.get('filer_last_folder_id') try: Folder.objects.get(id=last_folder_id) except Folder.DoesNotExist: url = reverse('admin:filer-directory_listing-root') else: url = reverse('admin:filer-directory_listing', kwargs={'folder_id': last_folder_id}) url = "%s%s%s" % (url, popup_param(request), selectfolder_param(request,"&")) return HttpResponseRedirect(url) elif folder_id == None: folder = FolderRoot() else: folder = get_object_or_404(Folder, id=folder_id) request.session['filer_last_folder_id'] = folder_id # Check actions to see if any are available on this changelist actions = self.get_actions(request) # Remove action checkboxes if there aren't any actions available. list_display = list(self.list_display) if not actions: try: list_display.remove('action_checkbox') except ValueError: pass # search def filter_folder(qs, terms=[]): for term in terms: qs = qs.filter(Q(name__icontains=term) | \ Q(owner__username__icontains=term) | \ Q(owner__first_name__icontains=term) | \ Q(owner__last_name__icontains=term)) return qs def filter_file(qs, terms=[]): for term in terms: qs = qs.filter(Q(name__icontains=term) | \ Q(description__icontains=term) | \ Q(original_filename__icontains=term) | \ Q(owner__username__icontains=term) | \ Q(owner__first_name__icontains=term) | \ Q(owner__last_name__icontains=term)) return qs q = request.GET.get('q', None) if q: search_terms = unquote(q).split(" ") else: search_terms = [] q = '' limit_search_to_folder = request.GET.get('limit_search_to_folder', False) in (True, 'on') if len(search_terms) > 0: if folder and limit_search_to_folder and not folder.is_root: folder_qs = folder.get_descendants() file_qs = File.objects.filter( folder__in=folder.get_descendants()) else: folder_qs = Folder.objects.all() file_qs = File.objects.all() folder_qs = filter_folder(folder_qs, search_terms) file_qs = filter_file(file_qs, search_terms) show_result_count = True else: folder_qs = folder.children.all() file_qs = folder.files.all() show_result_count = False folder_qs = folder_qs.order_by('name') file_qs = file_qs.order_by('name') folder_children = [] folder_files = [] if folder.is_root: folder_children += folder.virtual_folders for f in folder_qs: f.perms = userperms_for_request(f, request) if hasattr(f, 'has_read_permission'): if f.has_read_permission(request): folder_children.append(f) else: pass else: folder_children.append(f) for f in file_qs: f.perms = userperms_for_request(f, request) if hasattr(f, 'has_read_permission'): if f.has_read_permission(request): folder_files.append(f) else: pass else: folder_files.append(f) try: permissions = { 'has_edit_permission': folder.has_edit_permission(request), 'has_read_permission': folder.has_read_permission(request), 'has_add_children_permission': \ folder.has_add_children_permission(request), } except: permissions = {} folder_files.sort() items = folder_children + folder_files paginator = Paginator(items, FILER_PAGINATE_BY) # Are we moving to clipboard? if request.method == 'POST' and '_save' not in request.POST: for f in folder_files: if "move-to-clipboard-%d" % (f.id,) in request.POST: clipboard = tools.get_user_clipboard(request.user) if f.has_edit_permission(request): tools.move_file_to_clipboard([f], clipboard) return HttpResponseRedirect(request.get_full_path()) else: raise PermissionDenied selected = request.POST.getlist(helpers.ACTION_CHECKBOX_NAME) # Actions with no confirmation if (actions and request.method == 'POST' and 'index' in request.POST and '_save' not in request.POST): if selected: response = self.response_action(request, files_queryset=file_qs, folders_queryset=folder_qs) if response: return response else: msg = _("Items must be selected in order to perform " "actions on them. No items have been changed.") self.message_user(request, msg) # Actions with confirmation if (actions and request.method == 'POST' and helpers.ACTION_CHECKBOX_NAME in request.POST and 'index' not in request.POST and '_save' not in request.POST): if selected: response = self.response_action(request, files_queryset=file_qs, folders_queryset=folder_qs) if response: return response # Build the action form and populate it with available actions. if actions: action_form = self.action_form(auto_id=None) action_form.fields['action'].choices = self.get_action_choices(request) else: action_form = None selection_note_all = ungettext('%(total_count)s selected', 'All %(total_count)s selected', paginator.count) # If page request (9999) is out of range, deliver last page of results. try: paginated_items = paginator.page(request.GET.get('page', 1)) except PageNotAnInteger: paginated_items = paginator.page(1) except EmptyPage: paginated_items = paginator.page(paginator.num_pages) return render_to_response( 'admin/filer/folder/directory_listing.html', { 'folder': folder, 'clipboard_files': File.objects.filter( in_clipboards__clipboarditem__clipboard__user=request.user ).distinct(), 'paginator': paginator, 'paginated_items': paginated_items, 'permissions': permissions, 'permstest': userperms_for_request(folder, request), 'current_url': request.path, 'title': u'Directory listing for %s' % folder.name, 'search_string': ' '.join(search_terms), 'q': urlencode(q), 'show_result_count': show_result_count, 'limit_search_to_folder': limit_search_to_folder, 'is_popup': popup_status(request), 'select_folder': selectfolder_status(request), # needed in the admin/base.html template for logout links 'root_path': reverse('admin:index'), 'action_form': action_form, 'actions_on_top': self.actions_on_top, 'actions_on_bottom': self.actions_on_bottom, 'actions_selection_counter': self.actions_selection_counter, 'selection_note': _('0 of %(cnt)s selected') % {'cnt': len(paginated_items.object_list)}, 'selection_note_all': selection_note_all % {'total_count': paginator.count}, 'media': self.media, 'enable_permissions': settings.FILER_ENABLE_PERMISSIONS }, context_instance=RequestContext(request))
def directory_listing(self, request, folder_id=None, viewtype=None): clipboard = tools.get_user_clipboard(request.user) if viewtype == "images_with_missing_data": folder = ImagesWithMissingData() elif viewtype == "unfiled_images": folder = UnfiledImages() elif viewtype == "last": last_folder_id = request.session.get("filer_last_folder_id") try: Folder.objects.get(id=last_folder_id) except Folder.DoesNotExist: url = reverse("admin:filer-directory_listing-root") url = "%s%s%s" % (url, popup_param(request), selectfolder_param(request, "&")) else: url = reverse("admin:filer-directory_listing", kwargs={"folder_id": last_folder_id}) url = "%s%s%s" % (url, popup_param(request), selectfolder_param(request, "&")) return HttpResponseRedirect(url) elif folder_id == None: folder = FolderRoot() else: folder = get_object_or_404(Folder, id=folder_id) request.session["filer_last_folder_id"] = folder_id # Check actions to see if any are available on this changelist actions = self.get_actions(request) # Remove action checkboxes if there aren't any actions available. list_display = list(self.list_display) if not actions: try: list_display.remove("action_checkbox") except ValueError: pass # search def filter_folder(qs, terms=[]): for term in terms: qs = qs.filter( Q(name__icontains=term) | Q(owner__username__icontains=term) | Q(owner__first_name__icontains=term) | Q(owner__last_name__icontains=term) ) return qs def filter_file(qs, terms=[]): for term in terms: qs = qs.filter( Q(name__icontains=term) | Q(description__icontains=term) | Q(original_filename__icontains=term) | Q(owner__username__icontains=term) | Q(owner__first_name__icontains=term) | Q(owner__last_name__icontains=term) ) return qs q = request.GET.get("q", None) if q: search_terms = unquote(q).split(" ") else: search_terms = [] q = "" limit_search_to_folder = request.GET.get("limit_search_to_folder", False) in (True, "on") if len(search_terms) > 0: if folder and limit_search_to_folder and not folder.is_root: folder_qs = folder.get_descendants() file_qs = File.objects.filter(folder__in=folder.get_descendants()) else: folder_qs = Folder.objects.all() file_qs = File.objects.all() folder_qs = filter_folder(folder_qs, search_terms) file_qs = filter_file(file_qs, search_terms) show_result_count = True else: folder_qs = folder.children.all() file_qs = folder.files.all() show_result_count = False folder_qs = folder_qs.order_by("name") file_qs = file_qs.order_by("name") folder_children = [] folder_files = [] if folder.is_root: folder_children += folder.virtual_folders for f in folder_qs: f.perms = userperms_for_request(f, request) if hasattr(f, "has_read_permission"): if f.has_read_permission(request): folder_children.append(f) else: pass else: folder_children.append(f) for f in file_qs: f.perms = userperms_for_request(f, request) if hasattr(f, "has_read_permission"): if f.has_read_permission(request): folder_files.append(f) else: pass else: folder_files.append(f) try: permissions = { "has_edit_permission": folder.has_edit_permission(request), "has_read_permission": folder.has_read_permission(request), "has_add_children_permission": folder.has_add_children_permission(request), } except: permissions = {} folder_files.sort() items = folder_children + folder_files paginator = Paginator(items, FILER_PAGINATE_BY) # Are we moving to clipboard? if request.method == "POST" and "_save" not in request.POST: for f in folder_files: if "move-to-clipboard-%d" % (f.id,) in request.POST: clipboard = tools.get_user_clipboard(request.user) if f.has_edit_permission(request): tools.move_file_to_clipboard([f], clipboard) return HttpResponseRedirect(request.get_full_path()) else: raise PermissionDenied selected = request.POST.getlist(helpers.ACTION_CHECKBOX_NAME) # Actions with no confirmation if actions and request.method == "POST" and "index" in request.POST and "_save" not in request.POST: if selected: response = self.response_action(request, files_queryset=file_qs, folders_queryset=folder_qs) if response: return response else: msg = _("Items must be selected in order to perform " "actions on them. No items have been changed.") self.message_user(request, msg) # Actions with confirmation if ( actions and request.method == "POST" and helpers.ACTION_CHECKBOX_NAME in request.POST and "index" not in request.POST and "_save" not in request.POST ): if selected: response = self.response_action(request, files_queryset=file_qs, folders_queryset=folder_qs) if response: return response # Build the action form and populate it with available actions. if actions: action_form = self.action_form(auto_id=None) action_form.fields["action"].choices = self.get_action_choices(request) else: action_form = None selection_note_all = ungettext("%(total_count)s selected", "All %(total_count)s selected", paginator.count) # If page request (9999) is out of range, deliver last page of results. try: paginated_items = paginator.page(request.GET.get("page", 1)) except PageNotAnInteger: paginated_items = paginator.page(1) except EmptyPage: paginated_items = paginator.page(paginator.num_pages) return render_to_response( "admin/filer/folder/directory_listing.html", { "folder": folder, "clipboard_files": File.objects.filter( in_clipboards__clipboarditem__clipboard__user=request.user ).distinct(), "paginator": paginator, "paginated_items": paginated_items, "permissions": permissions, "permstest": userperms_for_request(folder, request), "current_url": request.path, "title": u"Directory listing for %s" % folder.name, "search_string": " ".join(search_terms), "q": urlencode(q), "show_result_count": show_result_count, "limit_search_to_folder": limit_search_to_folder, "is_popup": popup_status(request), "select_folder": selectfolder_status(request), # needed in the admin/base.html template for logout links "root_path": reverse("admin:index"), "action_form": action_form, "actions_on_top": self.actions_on_top, "actions_on_bottom": self.actions_on_bottom, "actions_selection_counter": self.actions_selection_counter, "selection_note": _("0 of %(cnt)s selected") % {"cnt": len(paginated_items.object_list)}, "selection_note_all": selection_note_all % {"total_count": paginator.count}, "media": self.media, "enable_permissions": settings.FILER_ENABLE_PERMISSIONS, }, context_instance=RequestContext(request), )