示例#1
0
def mkdir(request, url=None):
    "Make a new directory at the current url."

    url = utils.clean_path(url)
    full_path = os.path.join(utils.get_document_root(), url)

    if request.method == 'POST': 
        form = forms.NameForm(full_path, None, request.POST) 

        if form.is_valid(): #Make the directory
            os.mkdir(os.path.join(full_path, form.cleaned_data['name']))

            obj_path = os.path.join(url, form.cleaned_data['name'])
            
            obj, created = models.File.objects.get_or_create(path=obj_path, type=models.File.S_IFDIR) 
            
            utils.log_addition(request, obj)

            return redirect('admin_file_manager_list', url=url)
    else:
        form = forms.NameForm(full_path, None) # An unbound form 

    return render_to_response("admin/file_manager/mkdir.html", 
                              {'form': form, 'url': url,},
                              context_instance=template.RequestContext(request))
示例#2
0
def create(request, url=None):
    "Create a new text file at the url."

    # Create a new text file.
    url = utils.clean_path(url)
    parent = '/'.join(url.split('/')[:-1])
    full_path = os.path.join(utils.get_document_root(), url)

    if request.method == 'POST': 
        form = forms.CreateForm(full_path, None, request.POST) 

        if form.is_valid(): 
            file = codecs.open(os.path.join(full_path, form.cleaned_data['name']), encoding='utf-8', mode='w+')
            
            file.write(form.cleaned_data['content'].replace('\r\n', '\n'))
            file.close()

            obj_path = '/' + os.path.join(url, form.cleaned_data['name'])

            obj, created = models.File.objects.get_or_create(path=obj_path, type=models.File.S_IFREG)

            utils.log_addition(request, obj)

            return redirect('admin_file_manager_list', url=url)
    else:
        # Read the data from file
        form = forms.CreateForm(full_path, None) # An unbound form 

    return render_to_response("admin/file_manager/create.html", 
                              {'form': form, 'url': url,},
                              context_instance=template.RequestContext(request))
示例#3
0
def mkdir(request, url=None):
    "Make a new directory at the current url."

    url = utils.clean_path(url)
    full_path = os.path.join(utils.get_document_root(), url)

    if request.method == 'POST':
        form = forms.NameForm(full_path, None, request.POST)

        if form.is_valid():  #Make the directory
            os.mkdir(os.path.join(full_path, form.cleaned_data['name']))

            obj_path = os.path.join(url, form.cleaned_data['name'])

            obj, created = models.File.objects.get_or_create(
                path=obj_path, type=models.File.S_IFDIR)

            utils.log_addition(request, obj)

            return redirect('admin_file_manager_list', url=url)
    else:
        form = forms.NameForm(full_path, None)  # An unbound form

    return render_to_response(
        "admin/file_manager/mkdir.html", {
            'form': form,
            'url': url,
        },
        context_instance=template.RequestContext(request))
示例#4
0
def upload(request, url=None):
    """
        Upload a new file.
    """
    url = utils.clean_path(url)
    path = os.path.join(utils.get_document_root(), url)

    if request.method == 'POST':
        form = forms.UploadForm(path, data=request.POST, files=request.FILES)

        if form.is_valid():
            file_path = os.path.join(path, form.cleaned_data['file'].name)
            destination = open(file_path, 'wb+')
            for chunk in form.cleaned_data['file'].chunks():
                destination.write(chunk)

            obj_path = '/' + os.path.join(url, form.cleaned_data['file'].name)

            obj, created = models.File.objects.get_or_create(
                path=obj_path, type=models.File.S_IFREG)

            utils.log_addition(request, obj)

            return redirect('admin_file_manager_list', url=url)
    else:
        form = forms.UploadForm(path)

    return render_to_response(
        "admin/file_manager/upload.html", {
            'form': form,
            'url': url,
        },
        context_instance=template.RequestContext(request))
示例#5
0
def rename(request, url=None):
    "Rename an item."

    # Not really happy about the l/rstrips.
    url = utils.clean_path(url)
    parent = '/'.join(url.split('/')[:-1])
    full_parent = os.path.join(utils.get_document_root(), parent).rstrip('/')
    full_path = os.path.join(utils.get_document_root(), url)

    if request.method == 'POST':
        form = forms.NameForm(full_parent, full_path, request.POST)

        if form.is_valid():
            new = os.path.join(full_parent, form.cleaned_data['name'])

            # Rename
            os.rename(full_path, new)

            # FIXME: Log delete.

            return redirect('admin_file_manager_list', url=parent)
    else:
        directory = url.replace(parent, "", 1).lstrip('/')
        data = {'name': directory}
        form = forms.NameForm(full_parent, full_path, initial=data)

    return render_to_response(
        "admin/file_manager/rename.html", {
            'form': form,
            'url': url,
            'directory': os.path.isdir(full_path)
        },
        context_instance=template.RequestContext(request))
示例#6
0
def rename(request, url=None):
    "Rename an item."

    # Not really happy about the l/rstrips.
    url = utils.clean_path(url)
    parent = '/'.join(url.split('/')[:-1])
    full_parent = os.path.join(utils.get_document_root(), parent).rstrip('/')
    full_path = os.path.join(utils.get_document_root(), url)

    if request.method == 'POST': 
        form = forms.NameForm(full_parent, full_path, request.POST) 

        if form.is_valid(): 
            new = os.path.join(full_parent, form.cleaned_data['name'])

            # Rename 
            os.rename(full_path, new)
                
            # FIXME: Log delete.

            return redirect('admin_file_manager_list', url=parent)
    else:
        directory = url.replace(parent, "", 1).lstrip('/')
        data = {'name':directory}
        form = forms.NameForm(full_parent, full_path, initial=data)

    return render_to_response("admin/file_manager/rename.html", 
                              {'form': form, 'url': url, 
                               'directory': os.path.isdir(full_path)},
                              context_instance=template.RequestContext(request))
示例#7
0
def upload(request, url=None):
    """
        Upload a new file.
    """
    url = utils.clean_path(url)
    path = os.path.join(utils.get_document_root(), url)

    if request.method == 'POST': 
        form = forms.UploadForm(path, data=request.POST, files=request.FILES) 

        if form.is_valid(): 
            file_path = os.path.join(path, form.cleaned_data['file'].name)
            destination = open(file_path, 'wb+')
            for chunk in form.cleaned_data['file'].chunks():
                destination.write(chunk) 

            obj_path = '/'+os.path.join(url, form.cleaned_data['file'].name)
            
            obj, created = models.File.objects.get_or_create(path=obj_path, type=models.File.S_IFREG) 
            
            utils.log_addition(request, obj)

            return redirect('admin_file_manager_list', url=url)
    else:
        form = forms.UploadForm(path)

    return render_to_response("admin/file_manager/upload.html", 
                              {'form': form, 'url': url,},
                              context_instance=template.RequestContext(request))
示例#8
0
def mkln(request, url=None):
    "Make a new link at the current url."

    url = utils.clean_path(url)
    full_path = os.path.join(utils.get_document_root(), url)

    if request.method == 'POST': 
        form = forms.CreateLinkForm(full_path, None, full_path, request.POST) 

        if form.is_valid(): 
            src = os.path.join(full_path, form.cleaned_data['link'])
            dest = os.path.join(full_path, form.cleaned_data['name'])
            
            try:
                relative = os.path.relpath(src, full_path)
            except AttributeError:
                relative = utils.relpath(src, full_path)

            os.symlink(relative, dest)

            obj_path = os.path.join(url, form.cleaned_data['link'])
            
            obj, created = models.File.objects.get_or_create(path=obj_path, type=models.File.S_IFLNK) 
            
            utils.log_addition(request, obj)

            return redirect('admin_file_manager_list', url=url)
    else:
        form = forms.CreateLinkForm(full_path, None, full_path)

    return render_to_response("admin/file_manager/mkln.html", 
                              {'form': form, 'url': url,},
                              context_instance=template.RequestContext(request))
示例#9
0
def move(request, url=None):
    """
        Move file/directory to a new location.
    """

    # Not really happy about the l/rstrips.
    url = utils.clean_path(url)

    parent = '/'.join(url.split('/')[:-1])
    full_parent = os.path.join(utils.get_document_root(), parent).rstrip('/')
    full_path = os.path.join(utils.get_document_root(), url)
    directory = url.replace(parent, "", 1).lstrip('/')

    if request.method == 'POST':
        form = forms.DirectoryForm(directory, full_path, request.POST)

        if form.is_valid():
            new = os.path.join(form.cleaned_data['parent'], directory)

            if os.path.islink(full_path):

                src = os.readlink(full_path)
                if not os.path.isabs(src):
                    src = os.path.join(os.path.dirname(full_path), src)

                try:
                    relative = os.path.relpath(src,
                                               form.cleaned_data['parent'])
                except AttributeError:
                    relative = utils.relpath(src, form.cleaned_data['parent'])

                os.remove(full_path)  # Remove original link.
                os.symlink(relative, new)  # Create new link.

                # FIXME: Log delete.

            else:
                os.rename(full_path, new)  #Rename the directory

                # FIXME: Log delete.

            return redirect('admin_file_manager_list', url=parent)
    else:
        form = forms.DirectoryForm(directory,
                                   full_path,
                                   initial={'parent': full_parent})

    return render_to_response(
        "admin/file_manager/move.html", {
            'form': form,
            'url': url,
            'current': "/%s" % parent,
            'directory': os.path.isdir(full_path)
        },
        context_instance=template.RequestContext(request))
示例#10
0
def copy(request, url=None):
    "Copy file/directory to a new location."

    # Not really happy about the l/rstrips.
    url = utils.clean_path(url)

    parent = '/'.join(url.split('/')[:-1])
    full_parent = os.path.join(utils.get_document_root(), parent).rstrip('/')
    full_path = os.path.join(utils.get_document_root(), url)
    directory = url.replace(parent, "", 1).lstrip('/')

    if request.method == 'POST':
        form = forms.CopyForm(full_path, '', directory, full_path,
                              request.POST)
        if form.is_valid():
            new_path = os.path.join(form.cleaned_data['parent'],
                                    form.cleaned_data['name'])

            if os.path.isdir(full_path):
                shutil.copytree(full_path, new_path)

                obj_path = os.path.join(url, form.cleaned_data['name'])
                file_type = models.File.S_IFDIR
            else:
                shutil.copy(full_path, new_path)

                # Log the copy.
                obj_path = os.path.join(url, form.cleaned_data['name'])
                file_type = models.File.S_IFREG

            obj, created = models.File.objects.get_or_create(path=obj_path,
                                                             type=file_type)

            utils.log_addition(request, obj)

            return redirect('admin_file_manager_list', url=parent)
    else:
        form = forms.CopyForm(full_path,
                              '',
                              directory,
                              full_path,
                              initial={
                                  'parent': full_parent,
                                  'name': directory
                              })

    return render_to_response(
        "admin/file_manager/copy.html", {
            'form': form,
            'url': url,
            'current': "/%s" % parent,
            'directory': os.path.isdir(full_path)
        },
        context_instance=template.RequestContext(request))
示例#11
0
def permission(request, url=None):

    url = utils.clean_path(url)
    parent = '/'.join(url.split('/')[:-1])
    full_path = os.path.join(utils.get_document_root(), url)
    
    form = None

    return render_to_response("admin/file_manager/history.html", 
                              {'form': form, 'url': url,
                               'current': "/%s" % parent,
                               'directory': os.path.isdir(full_path)},
                              context_instance=template.RequestContext(request))
示例#12
0
def move(request, url=None):
    """
        Move file/directory to a new location.
    """

    # Not really happy about the l/rstrips.
    url = utils.clean_path(url)

    parent = '/'.join(url.split('/')[:-1])
    full_parent = os.path.join(utils.get_document_root(), parent).rstrip('/')
    full_path = os.path.join(utils.get_document_root(), url)
    directory = url.replace(parent, "", 1).lstrip('/')

    if request.method == 'POST': 
        form = forms.DirectoryForm(directory, full_path, request.POST) 

        if form.is_valid(): 
            new = os.path.join(form.cleaned_data['parent'], directory)

            if os.path.islink(full_path):

                src = os.readlink(full_path)
                if not os.path.isabs(src):
                    src = os.path.join(os.path.dirname(full_path), src)

                try:
                    relative = os.path.relpath(src, form.cleaned_data['parent'])
                except AttributeError:
                    relative = utils.relpath(src, form.cleaned_data['parent'])

                os.remove(full_path) # Remove original link.
                os.symlink(relative, new) # Create new link.
        
                # FIXME: Log delete.

            else:
                os.rename(full_path, new) #Rename the directory
                
                # FIXME: Log delete.

            return redirect('admin_file_manager_list', url=parent)
    else:
        form = forms.DirectoryForm(directory, full_path, initial={'parent':full_parent}) 

    return render_to_response("admin/file_manager/move.html", 
                              {'form': form, 'url': url,
                               'current': "/%s" % parent,
                               'directory': os.path.isdir(full_path)},
                              context_instance=template.RequestContext(request))
示例#13
0
def permission(request, url=None):

    url = utils.clean_path(url)
    parent = '/'.join(url.split('/')[:-1])
    full_path = os.path.join(utils.get_document_root(), url)

    form = None

    return render_to_response(
        "admin/file_manager/history.html", {
            'form': form,
            'url': url,
            'current': "/%s" % parent,
            'directory': os.path.isdir(full_path)
        },
        context_instance=template.RequestContext(request))
示例#14
0
def copy(request, url=None):
    "Copy file/directory to a new location."

    # Not really happy about the l/rstrips.
    url = utils.clean_path(url)

    parent = '/'.join(url.split('/')[:-1])
    full_parent = os.path.join(utils.get_document_root(), parent).rstrip('/')
    full_path = os.path.join(utils.get_document_root(), url)
    directory = url.replace(parent, "", 1).lstrip('/')

    if request.method == 'POST': 
        form = forms.CopyForm(full_path, '', directory, full_path, request.POST) 
        if form.is_valid(): 
            new_path = os.path.join(form.cleaned_data['parent'],
                                    form.cleaned_data['name'])
            
            if os.path.isdir(full_path):
                shutil.copytree(full_path, new_path)

                obj_path = os.path.join(url, form.cleaned_data['name'])
                file_type = models.File.S_IFDIR
            else:
                shutil.copy(full_path, new_path) 
                
                # Log the copy.
                obj_path = os.path.join(url, form.cleaned_data['name'])
                file_type = models.File.S_IFREG 
                
            obj, created = models.File.objects.get_or_create(path=obj_path, type=file_type) 

            utils.log_addition(request, obj)

            return redirect('admin_file_manager_list', url=parent)
    else:
        form = forms.CopyForm(full_path, '', directory, full_path, initial={'parent':full_parent, 'name': directory}) 

    return render_to_response("admin/file_manager/copy.html", 
                              {'form': form, 'url': url,
                               'current': "/%s" % parent,
                               'directory': os.path.isdir(full_path)},
                              context_instance=template.RequestContext(request))
示例#15
0
def detail(request, url=None):

    url = utils.clean_path(url)
    parent = '/'.join(url.split('/')[:-1])
    full_path = os.path.join(utils.get_document_root(), url)

    # Get the details from the file system.

    # Pull the database handle for this item and its history 
    try:
        file = models.File.objects.get(path=url)
    except models.File.DoesNotExist:
        pass

    return render_to_response("admin/file_manager/detail.html", 
                              {'url': url,
                               'current': "/%s" % parent,
                               'directory': os.path.isdir(full_path)},

                              context_instance=template.RequestContext(request))
示例#16
0
def detail(request, url=None):

    url = utils.clean_path(url)
    parent = '/'.join(url.split('/')[:-1])
    full_path = os.path.join(utils.get_document_root(), url)

    # Get the details from the file system.

    # Pull the database handle for this item and its history
    try:
        file = models.File.objects.get(path=url)
    except models.File.DoesNotExist:
        pass

    return render_to_response(
        "admin/file_manager/detail.html", {
            'url': url,
            'current': "/%s" % parent,
            'directory': os.path.isdir(full_path)
        },
        context_instance=template.RequestContext(request))
示例#17
0
def create(request, url=None):
    "Create a new text file at the url."

    # Create a new text file.
    url = utils.clean_path(url)
    parent = '/'.join(url.split('/')[:-1])
    full_path = os.path.join(utils.get_document_root(), url)

    if request.method == 'POST':
        form = forms.CreateForm(full_path, None, request.POST)

        if form.is_valid():
            file = codecs.open(os.path.join(full_path,
                                            form.cleaned_data['name']),
                               encoding='utf-8',
                               mode='w+')

            file.write(form.cleaned_data['content'].replace('\r\n', '\n'))
            file.close()

            obj_path = '/' + os.path.join(url, form.cleaned_data['name'])

            obj, created = models.File.objects.get_or_create(
                path=obj_path, type=models.File.S_IFREG)

            utils.log_addition(request, obj)

            return redirect('admin_file_manager_list', url=url)
    else:
        # Read the data from file
        form = forms.CreateForm(full_path, None)  # An unbound form

    return render_to_response(
        "admin/file_manager/create.html", {
            'form': form,
            'url': url,
        },
        context_instance=template.RequestContext(request))
示例#18
0
def mkln(request, url=None):
    "Make a new link at the current url."

    url = utils.clean_path(url)
    full_path = os.path.join(utils.get_document_root(), url)

    if request.method == 'POST':
        form = forms.CreateLinkForm(full_path, None, full_path, request.POST)

        if form.is_valid():
            src = os.path.join(full_path, form.cleaned_data['link'])
            dest = os.path.join(full_path, form.cleaned_data['name'])

            try:
                relative = os.path.relpath(src, full_path)
            except AttributeError:
                relative = utils.relpath(src, full_path)

            os.symlink(relative, dest)

            obj_path = os.path.join(url, form.cleaned_data['link'])

            obj, created = models.File.objects.get_or_create(
                path=obj_path, type=models.File.S_IFLNK)

            utils.log_addition(request, obj)

            return redirect('admin_file_manager_list', url=url)
    else:
        form = forms.CreateLinkForm(full_path, None, full_path)

    return render_to_response(
        "admin/file_manager/mkln.html", {
            'form': form,
            'url': url,
        },
        context_instance=template.RequestContext(request))
示例#19
0
def index(request, url=None):
    "Show list of files in a url inside of the document root."

    if request.method == 'POST': 
        if request.POST.get('action') == 'delete_selected':
            response = delete_selected(request, url)
            if response:
                return response

    # Stuff the files in here.
    files = []
    directory = {}
    perms = [ '---', '--x', '-w-', '-wx', 'r--', 'r-x', 'rw-', 'rwx' ]

    ignore = utils.get_ignore_list()
    url = utils.clean_path(url)
    full_path = os.path.join(utils.get_document_root(), url)

    try:
        listing = os.listdir(full_path)
    except OSError:
        raise http.Http404

    directory['url'] = url
    directory['parent'] = '/'.join(url.split('/')[:-1])

    if os.access(full_path, os.R_OK):
        directory['can_read'] = True
    else:
        directory['can_read'] = False 
    
    if os.access(full_path, os.W_OK):
        directory['can_write'] = True
    else:
        directory['can_write'] = False

    for file in listing:
        if file in ignore: 
            continue

        item = {}
        dperms = '-'
        
        item['filename'] = file
        item['filepath'] = os.path.join(full_path, file)
        item['fileurl'] = os.path.join(url, file)

        # type (direcory/file/link)
        item['directory'] = os.path.isdir(item['filepath'])
        item['link'] = os.path.islink(item['filepath'])

        if item['link']:
            item['link_src'] = os.path.normpath(os.path.join(url, os.readlink(item['filepath'])))

        # Catch broken links.
        try: 
            itemstat = os.stat(item['filepath'])
            item['user'] = getpwuid(itemstat.st_uid)[0]
            item['group'] = getgrgid(itemstat.st_gid)[0]

            # size (in bytes ) for use with |filesizeformat
            item['size'] = itemstat.st_size

            # ctime, mtime
            item['ctime'] = datetime.fromtimestamp(itemstat.st_ctime)
            item['mtime'] = datetime.fromtimestamp(itemstat.st_mtime)

            # permissions (numeric)
            octs = "%04d" % int(oct(itemstat.st_mode & 0777))
            item['perms_numeric'] = octs
            item['perms'] = "%s%s%s%s" % (dperms, perms[int(octs[1])], 
                                            perms[int(octs[2])], 
                                            perms[int(octs[3])])

        except:
            # Blank out because of broken link.
            item['user'] = item['group'] = ''
            item['perms_numeric'] = item['perms'] = ''
            item['size'] = item['ctime'] = item['mtime'] = None
            item['broken_link'] = True

        mime = mimetypes.guess_type(item['filepath'], False)[0]
  
        # Assume we can't edit anything except text and unknown.
        if not mime:
            item['can_edit'] = True
        elif 'javascript' in mime:
            item['can_edit'] = True
        elif 'text' in mime:
            item['can_edit'] = True
        else:
            item['can_edit'] = False

        if item['directory']:
            item['can_edit'] = False
            dperms = 'd'
     
        if os.access(item['filepath'], os.R_OK):
            item['can_read'] = True
        else:
            item['can_read'] = False

        if os.access(item['filepath'], os.W_OK):
            item['can_write'] = True
        else:
            item['can_write'] = False

        files.append(item)
    
    return render_to_response("admin/file_manager/index.html", 
                              {'directory': directory, 'files': files,},
                              context_instance=template.RequestContext(request))
示例#20
0
def update(request, url=None):
    """
        Update
    """
    url = utils.clean_path(url)
    parent = '/'.join(url.split('/')[:-1])
    full_path = os.path.join(utils.get_document_root(), url)

    if request.method == 'POST': 
        form = forms.ContentForm(request.POST) 

        if form.is_valid(): 

            try:
                original = open(full_path, 'U')
                content = original.read() # To get newlines populated.
                
            except (IOError, OSError):
                raise http.Http404
 
            file = codecs.open(full_path, encoding='utf-8', mode='w+')

            if original.newlines and '\r\n' in original.newlines:
                file.write(form.cleaned_data['content'])
            else:
                file.write(form.cleaned_data['content'].replace('\r\n', '\n'))

            file.close() 
            
            # FIXME: Log delete.
            
            if request.POST.has_key("_continue"):
                msg = _('The %(name)s "%(obj)s" was updated successfully. %(rest)s') % {'name': 'file', 'obj': url, 'rest': _("You may edit it again below.") }

                return render_to_response("admin/file_manager/update.html", 
                              {'form': form, 'url': url, 'messages': [msg]},
                              context_instance=template.RequestContext(request))
            
            return redirect('admin_file_manager_list', url=parent)
    else: 

        # Validate that the file can be edited
        can_edit = False
        mime = mimetypes.guess_type(full_path, False)[0]
  
        # Check mime, directory, and writable
        if not mime:
            can_edit = True
        elif 'javascript' in mime:
            can_edit = True
        elif 'text' in mime:
            can_edit = True 

        if can_edit:
            if not os.access(full_path, os.W_OK):
                can_edit = False

        if not can_edit:
            raise http.Http404

        # Read the data from file
        try:
            content = open(full_path).read()
        except (IOError, OSError):
            raise http.Http404
 
        data = {'content':content}
        form = forms.ContentForm(initial=data) # An unbound form 

    return render_to_response("admin/file_manager/update.html", 
                              {'form': form, 'url': url,},
                              context_instance=template.RequestContext(request))
示例#21
0
def delete_selected(request, url=None):
    "Delete selected files and directories. (Called from index)"

    # Files to remove.
    selected = request.POST.getlist('_selected_action')

    url = utils.clean_path(url)
    parent = '/'.join(url.split('/')[:-1])
    document_root = utils.get_document_root()
    full_path = os.path.join(document_root, url)
    full_parent = os.path.join(document_root, parent).rstrip('/')

    if request.method == 'POST' and request.POST.get('post') == 'yes':
        # Files selected to remove.

        for item in selected:
            full_path = os.path.join(full_parent, item)

            # If this is a directory, do the walk
            if os.path.isdir(full_path) and not os.path.islink(full_path):
                for root, dirs, files in os.walk(full_path, topdown=False):
                    for name in files:
                        os.remove(os.path.join(root, name))

                        try:
                            obj_path = os.path.join(root, name)
                            obj_path = obj_path.replace(document_root, '', 1)
                            obj = models.File.objects.get(path=obj_path)
                            utils.log_deletion(request, obj, obj.path)
                            obj.delete()
                        except models.File.DoesNotExist:
                            pass

                    for name in dirs:
                        os.rmdir(os.path.join(root, name))

                        try:
                            obj_path = os.path.join(root, name)
                            obj_path = obj_path.replace(document_root, '', 1)
                            obj = models.File.objects.get(path=obj_path)
                            utils.log_deletion(request, obj, obj.path)
                            obj.delete()
                        except models.File.DoesNotExist:
                            pass

                os.rmdir(full_path)

                try:
                    obj_path = os.path.join(url, item)
                    obj = models.File.objects.get(path=obj_path)
                    utils.log_deletion(request, obj, obj.path)
                    obj.delete()
                except models.File.DoesNotExist:
                    pass

            else:
                os.remove(full_path)

                try:
                    obj_path = os.path.join(url, item)
                    obj = models.File.objects.get(path=obj_path)
                    utils.log_deletion(request, obj, obj.path)
                    obj.delete()
                except models.File.DoesNotExist:
                    pass

        return None

    filelist = []
    errorlist = []

    for item in selected:
        full_path = os.path.join(full_parent, item)

        # If this is a directory, generate the list of files to be removed.
        if os.path.isdir(full_path) and not os.path.islink(full_path):
            filelist.append("/%s" % item)
            for root, dirs, files, in os.walk(full_path):
                for name in files:
                    f = os.path.join(root, name).replace(full_parent, '', 1)
                    if not os.access(os.path.join(root), os.W_OK):
                        errorlist.append(f)
                    filelist.append(f)

                for name in dirs:
                    d = os.path.join(root, name).replace(full_parent, '', 1)
                    if not os.access(os.path.join(root), os.W_OK):
                        errorlist.append(d)
                    filelist.append(d)
        else:
            if not os.access(full_path, os.W_OK):
                errorlist.append("/%s" % item)

            filelist.append("/%s" % item)

    # Because python 2.3 is ... painful.
    filelist.sort()
    errorlist.sort()

    return render_to_response(
        "admin/file_manager/delete_selected.html", {
            'files': filelist,
            'errorlist': errorlist,
            'selected': selected,
            'directory': '',
        },
        context_instance=template.RequestContext(request))
示例#22
0
def delete(request, url=None):
    "Delete a file/directory"

    url = utils.clean_path(url)
    parent = '/'.join(url.split('/')[:-1])
    document_root = utils.get_document_root()
    full_path = os.path.join(document_root, url)
    full_parent = os.path.join(document_root, parent).rstrip('/')

    if request.method == 'POST':

        # If this is a directory, do the walk
        if os.path.isdir(full_path) and not os.path.islink(full_path):
            for root, dirs, files in os.walk(full_path, topdown=False):
                for name in files:
                    os.remove(os.path.join(root, name))

                    try:
                        obj_path = os.path.join(root, name)
                        obj_path = obj_path.replace(document_root, '', 1)
                        obj = models.File.objects.get(path=obj_path)
                        utils.log_deletion(request, obj, obj.path)
                        obj.delete()
                    except models.File.DoesNotExist:
                        pass

                for name in dirs:
                    os.rmdir(os.path.join(root, name))

                    try:
                        obj_path = os.path.join(root, name)
                        obj_path = obj_path.replace(document_root, '', 1)
                        obj = models.File.objects.get(path=obj_path)
                        utils.log_deletion(request, obj, obj.path)
                        obj.delete()
                    except models.File.DoesNotExist:
                        pass

            os.rmdir(full_path)

            try:
                obj_path = full_path.replace(document_root, '', 1)
                obj = models.File.objects.get(path=obj_path)
                utils.log_deletion(request, obj, obj.path)
                obj.delete()
            except models.File.DoesNotExist:
                pass

        else:
            os.remove(full_path)

            try:
                obj_path = full_path.replace(document_root, '', 1)
                print obj_path
                obj = models.File.objects.get(path=obj_path)
                utils.log_deletion(request, obj, obj.path)
                obj.delete()
            except models.File.DoesNotExist:
                pass

        return redirect('admin_file_manager_list', url=parent)

    filelist = []
    errorlist = []

    # If this is a directory, generate the list of files to be removed.
    if os.path.isdir(full_path) and not os.path.islink(full_path):
        filelist.append("/%s" % url)
        for root, dirs, files, in os.walk(full_path):
            for name in files:
                f = os.path.join(root, name).replace(full_parent, '', 1)
                if not os.access(os.path.join(root), os.W_OK):
                    errorlist.append(f)
                filelist.append(f)

            for name in dirs:
                d = os.path.join(root, name).replace(full_parent, '', 1)
                if not os.access(os.path.join(root), os.W_OK):
                    errorlist.append(d)
                filelist.append(d)
    else:
        check_path = full_path

        if os.path.islink(full_path):
            check_path = full_parent

        if not os.access(check_path, os.W_OK):
            errorlist.append("/%s" % url)

        filelist.append("/%s" % url)

    # Because python 2.3 is ... painful.
    filelist.sort()
    errorlist.sort()

    return render_to_response(
        "admin/file_manager/delete.html",
        # {'url': url, 'files': sorted(filelist),
        #  'errorlist':sorted(errorlist),
        {
            'url': url,
            'files': filelist,
            'errorlist': errorlist,
            'directory': '',
        },
        context_instance=template.RequestContext(request))
示例#23
0
def update(request, url=None):
    """
        Update
    """
    url = utils.clean_path(url)
    parent = '/'.join(url.split('/')[:-1])
    full_path = os.path.join(utils.get_document_root(), url)

    if request.method == 'POST':
        form = forms.ContentForm(request.POST)

        if form.is_valid():

            try:
                original = open(full_path, 'U')
                content = original.read()  # To get newlines populated.

            except (IOError, OSError):
                raise http.Http404

            file = codecs.open(full_path, encoding='utf-8', mode='w+')

            if original.newlines and '\r\n' in original.newlines:
                file.write(form.cleaned_data['content'])
            else:
                file.write(form.cleaned_data['content'].replace('\r\n', '\n'))

            file.close()

            # FIXME: Log delete.

            if request.POST.has_key("_continue"):
                msg = _(
                    'The %(name)s "%(obj)s" was updated successfully. %(rest)s'
                ) % {
                    'name': 'file',
                    'obj': url,
                    'rest': _("You may edit it again below.")
                }

                return render_to_response(
                    "admin/file_manager/update.html", {
                        'form': form,
                        'url': url,
                        'messages': [msg]
                    },
                    context_instance=template.RequestContext(request))

            return redirect('admin_file_manager_list', url=parent)
    else:

        # Validate that the file can be edited
        can_edit = False
        mime = mimetypes.guess_type(full_path, False)[0]

        # Check mime, directory, and writable
        if not mime:
            can_edit = True
        elif 'javascript' in mime:
            can_edit = True
        elif 'text' in mime:
            can_edit = True

        if can_edit:
            if not os.access(full_path, os.W_OK):
                can_edit = False

        if not can_edit:
            raise http.Http404

        # Read the data from file
        try:
            content = open(full_path).read()
        except (IOError, OSError):
            raise http.Http404

        data = {'content': content}
        form = forms.ContentForm(initial=data)  # An unbound form

    return render_to_response(
        "admin/file_manager/update.html", {
            'form': form,
            'url': url,
        },
        context_instance=template.RequestContext(request))
示例#24
0
def delete(request, url=None):
    "Delete a file/directory"
    
    url = utils.clean_path(url)
    parent = '/'.join(url.split('/')[:-1])
    document_root = utils.get_document_root()
    full_path = os.path.join(document_root, url)
    full_parent = os.path.join(document_root, parent).rstrip('/')

    if request.method == 'POST': 
        
        # If this is a directory, do the walk
        if os.path.isdir(full_path) and not os.path.islink(full_path):
            for root, dirs, files in os.walk(full_path, topdown=False):
                for name in files:
                    os.remove(os.path.join(root, name))
                    
                    try: 
                        obj_path = os.path.join(root, name)
                        obj_path = obj_path.replace(document_root, '', 1)
                        obj = models.File.objects.get(path=obj_path) 
                        utils.log_deletion(request, obj, obj.path)
                        obj.delete()
                    except models.File.DoesNotExist:
                        pass

                for name in dirs:
                    os.rmdir(os.path.join(root, name))
                    
                    try: 
                        obj_path = os.path.join(root, name)
                        obj_path = obj_path.replace(document_root, '', 1)
                        obj = models.File.objects.get(path=obj_path) 
                        utils.log_deletion(request, obj, obj.path) 
                        obj.delete()
                    except models.File.DoesNotExist:
                        pass

            os.rmdir(full_path)

            try: 
                obj_path = full_path.replace(document_root, '', 1)
                obj = models.File.objects.get(path=obj_path) 
                utils.log_deletion(request, obj, obj.path)
                obj.delete()
            except models.File.DoesNotExist:
                pass

        else:
            os.remove(full_path)
            
            try: 
                obj_path = full_path.replace(document_root, '', 1)
                print obj_path
                obj = models.File.objects.get(path=obj_path) 
                utils.log_deletion(request, obj, obj.path)
                obj.delete()
            except models.File.DoesNotExist:
                pass

        return redirect('admin_file_manager_list', url=parent)

    filelist = []
    errorlist = []

    # If this is a directory, generate the list of files to be removed.
    if os.path.isdir(full_path) and not os.path.islink(full_path):
        filelist.append("/%s" % url)
        for root, dirs, files, in os.walk(full_path):
            for name in files: 
                f = os.path.join(root, name).replace(full_parent, '', 1)
                if not os.access(os.path.join(root), os.W_OK):
                    errorlist.append(f)
                filelist.append(f)

            for name in dirs:
                d = os.path.join(root, name).replace(full_parent, '', 1)
                if not os.access(os.path.join(root), os.W_OK):
                    errorlist.append(d)
                filelist.append(d)
    else:
        check_path = full_path

        if os.path.islink(full_path):
            check_path = full_parent
        
        if not os.access(check_path, os.W_OK):
            errorlist.append("/%s" % url)

        filelist.append("/%s" % url)

    # Because python 2.3 is ... painful.
    filelist.sort()
    errorlist.sort()
    
    return render_to_response("admin/file_manager/delete.html", 
                             # {'url': url, 'files': sorted(filelist),
                             #  'errorlist':sorted(errorlist),
                              {'url': url, 'files': filelist,
                               'errorlist': errorlist,
                               'directory': '',},
                              context_instance=template.RequestContext(request))
示例#25
0
def delete_selected(request, url=None):
    "Delete selected files and directories. (Called from index)"
   
    # Files to remove.
    selected = request.POST.getlist('_selected_action')
    
    url = utils.clean_path(url)
    parent = '/'.join(url.split('/')[:-1])
    document_root = utils.get_document_root()
    full_path = os.path.join(document_root, url)
    full_parent = os.path.join(document_root, parent).rstrip('/')

    if request.method == 'POST' and request.POST.get('post') == 'yes':
        # Files selected to remove.
       
        for item in selected:
            full_path = os.path.join(full_parent, item)

            # If this is a directory, do the walk
            if os.path.isdir(full_path) and not os.path.islink(full_path):
                for root, dirs, files in os.walk(full_path, topdown=False):
                    for name in files:
                        os.remove(os.path.join(root, name))

                        try: 
                            obj_path = os.path.join(root, name)
                            obj_path = obj_path.replace(document_root, '', 1)
                            obj = models.File.objects.get(path=obj_path) 
                            utils.log_deletion(request, obj, obj.path)
                            obj.delete()
                        except models.File.DoesNotExist:
                            pass

                    for name in dirs:
                        os.rmdir(os.path.join(root, name))

                        try: 
                            obj_path = os.path.join(root, name)
                            obj_path = obj_path.replace(document_root, '', 1)
                            obj = models.File.objects.get(path=obj_path) 
                            utils.log_deletion(request, obj, obj.path)
                            obj.delete()
                        except models.File.DoesNotExist:
                            pass

                os.rmdir(full_path)

                try: 
                    obj_path = os.path.join(url, item)
                    obj = models.File.objects.get(path=obj_path) 
                    utils.log_deletion(request, obj, obj.path)
                    obj.delete()
                except models.File.DoesNotExist:
                    pass

            else:
                os.remove(full_path)

                try: 
                    obj_path = os.path.join(url, item)
                    obj = models.File.objects.get(path=obj_path) 
                    utils.log_deletion(request, obj, obj.path)
                    obj.delete()
                except models.File.DoesNotExist:
                    pass

        return None

    filelist = []
    errorlist = []

    for item in selected:
        full_path = os.path.join(full_parent, item)

        # If this is a directory, generate the list of files to be removed.
        if os.path.isdir(full_path) and not os.path.islink(full_path):
            filelist.append("/%s" % item)
            for root, dirs, files, in os.walk(full_path):
                for name in files: 
                    f = os.path.join(root, name).replace(full_parent, '', 1)
                    if not os.access(os.path.join(root), os.W_OK):
                        errorlist.append(f)
                    filelist.append(f)

                for name in dirs:
                    d = os.path.join(root, name).replace(full_parent, '', 1)
                    if not os.access(os.path.join(root), os.W_OK):
                        errorlist.append(d)
                    filelist.append(d)
        else:
            if not os.access(full_path, os.W_OK):
                errorlist.append("/%s" % item)

            filelist.append("/%s" % item)

    # Because python 2.3 is ... painful.
    filelist.sort()
    errorlist.sort()
    
    return render_to_response("admin/file_manager/delete_selected.html", 
                              {'files': filelist,
                               'errorlist': errorlist,
                               'selected': selected,
                               'directory': '',},
                              context_instance=template.RequestContext(request))
示例#26
0
def index(request, url=None):
    "Show list of files in a url inside of the document root."

    if request.method == 'POST':
        if request.POST.get('action') == 'delete_selected':
            response = delete_selected(request, url)
            if response:
                return response

    # Stuff the files in here.
    files = []
    directory = {}
    perms = ['---', '--x', '-w-', '-wx', 'r--', 'r-x', 'rw-', 'rwx']

    ignore = utils.get_ignore_list()
    url = utils.clean_path(url)
    full_path = os.path.join(utils.get_document_root(), url)

    try:
        listing = os.listdir(full_path)
    except OSError:
        raise http.Http404

    directory['url'] = url
    directory['parent'] = '/'.join(url.split('/')[:-1])

    if os.access(full_path, os.R_OK):
        directory['can_read'] = True
    else:
        directory['can_read'] = False

    if os.access(full_path, os.W_OK):
        directory['can_write'] = True
    else:
        directory['can_write'] = False

    for file in listing:
        if file in ignore:
            continue

        item = {}
        dperms = '-'

        item['filename'] = file
        item['filepath'] = os.path.join(full_path, file)
        item['fileurl'] = os.path.join(url, file)

        # type (direcory/file/link)
        item['directory'] = os.path.isdir(item['filepath'])
        item['link'] = os.path.islink(item['filepath'])

        if item['link']:
            item['link_src'] = os.path.normpath(
                os.path.join(url, os.readlink(item['filepath'])))

        # Catch broken links.
        try:
            itemstat = os.stat(item['filepath'])
            item['user'] = getpwuid(itemstat.st_uid)[0]
            item['group'] = getgrgid(itemstat.st_gid)[0]

            # size (in bytes ) for use with |filesizeformat
            item['size'] = itemstat.st_size

            # ctime, mtime
            item['ctime'] = datetime.fromtimestamp(itemstat.st_ctime)
            item['mtime'] = datetime.fromtimestamp(itemstat.st_mtime)

            # permissions (numeric)
            octs = "%04d" % int(oct(itemstat.st_mode & 0777))
            item['perms_numeric'] = octs
            item['perms'] = "%s%s%s%s" % (dperms, perms[int(
                octs[1])], perms[int(octs[2])], perms[int(octs[3])])

        except:
            # Blank out because of broken link.
            item['user'] = item['group'] = ''
            item['perms_numeric'] = item['perms'] = ''
            item['size'] = item['ctime'] = item['mtime'] = None
            item['broken_link'] = True

        mime = mimetypes.guess_type(item['filepath'], False)[0]

        # Assume we can't edit anything except text and unknown.
        if not mime:
            item['can_edit'] = True
        elif 'javascript' in mime:
            item['can_edit'] = True
        elif 'text' in mime:
            item['can_edit'] = True
        else:
            item['can_edit'] = False

        if item['directory']:
            item['can_edit'] = False
            dperms = 'd'

        if os.access(item['filepath'], os.R_OK):
            item['can_read'] = True
        else:
            item['can_read'] = False

        if os.access(item['filepath'], os.W_OK):
            item['can_write'] = True
        else:
            item['can_write'] = False

        files.append(item)

    return render_to_response(
        "admin/file_manager/index.html", {
            'directory': directory,
            'files': files,
        },
        context_instance=template.RequestContext(request))