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
Example #2
0
    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
Example #4
0
 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
Example #6
0
 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
Example #7
0
    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))
Example #8
0
    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),
        )