Example #1
0
    def move_to_clipboard(self, request, files_queryset, folders_queryset):
        """
        Action which moves the selected files and files in selected folders to clipboard.
        """

        if not self.has_change_permission(request):
            raise PermissionDenied

        if request.method != "POST":
            return None

        clipboard = tools.get_user_clipboard(request.user)

        check_files_edit_permissions(request, files_queryset)
        check_folder_edit_permissions(request, folders_queryset)

        # TODO: Display a confirmation page if moving more than X files to clipboard?

        files_count = [0]  # We define it like that so that we can modify it inside the move_files function

        def move_files(files):
            files_count[0] += tools.move_file_to_clipboard(files, clipboard)

        def move_folders(folders):
            for f in folders:
                move_files(f.files)
                move_folders(f.children.all())

        move_files(files_queryset)
        move_folders(folders_queryset)

        self.message_user(request, _("Successfully moved %(count)d files to clipboard.") % {"count": files_count[0]})

        return None
 def move_file_to_clipboard(self, request):
     #print "move file"
     if request.method == 'POST':
         file_id = request.POST.get("file_id", None)
         clipboard = tools.get_user_clipboard(request.user)
         if file_id:
             file = File.objects.get(id=file_id)
             if file.has_edit_permission(request):
                 tools.move_file_to_clipboard([file], clipboard)
             else:
                 raise PermissionDenied
     return HttpResponseRedirect( '%s%s' % (request.POST.get('redirect_to', ''), popup_param(request) ) )
Example #3
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 folder_id == None:
            folder = FolderRoot()
        else:
            try:
                folder = Folder.objects.get(id=folder_id)
            except Folder.DoesNotExist:
                raise Http404

        # 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 = urllib.unquote_plus(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)

        # Make sure page request is an int. If not, deliver first page.
        try:
            page = int(request.GET.get("page", "1"))
        except ValueError:
            page = 1

        # 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(page)
        except (EmptyPage, InvalidPage):
            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": urllib.quote_plus(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 #4
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 folder_id == None:
         folder = FolderRoot()
     else:
         try:
             folder = Folder.objects.get(id=folder_id)
         except Folder.DoesNotExist:
             raise Http404
         
     # 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(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 = q.split(" ")
     else:
         search_terms = []
     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):
                 #print "%s has read permission for %s" % (request.user, f)
                 folder_children.append(f)
             else:
                 pass#print "%s has NO read permission for %s" % (request.user, f)
         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):
                 #print "%s has read permission for %s" % (request.user, f)
                 folder_files.append(f)
             else:
                 pass#print "%s has NO read permission for %s" % (request.user, f)
         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_children = folder_children.sort(cmp=lambda x,y: cmp(x.name.lower(), y.name.lower()))
     folder_files.sort(cmp=lambda x, y: cmp(x.label.lower(), y.label.lower()))
     return render_to_response('admin/filer/folder/directory_listing.html', {
             'folder':folder,
             'folder_children':folder_children,
             'folder_files':folder_files,
             '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),
             'show_result_count': show_result_count,
             'limit_search_to_folder': limit_search_to_folder,
             'is_popup': popup_status(request),
             'select_folder': selectfolder_status(request),
             'root_path': "/%s" % admin.site.root_path, # needed in the admin/base.html template for logout links and stuff 
         }, 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 folder_id == None:
            folder = FolderRoot()
        else:
            try:
                folder = Folder.objects.get(id=folder_id)
            except Folder.DoesNotExist:
                raise Http404

        # 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)

        # Make sure page request is an int. If not, deliver first page.
        try:
            page = int(request.GET.get('page', '1'))
        except ValueError:
            page = 1

        # 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(page)
        except (EmptyPage, InvalidPage):
            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))