# -*- coding: utf-8 -*- #-------------------------------- #$Date$ #$Author$ #$Revision$ #-------------------------------- #Copyright (C) 2007-2008 Alexander Koshelev (daevaorn@gmail.com) import os from django.utils.xmlutils import SimplerXMLGenerator from django import http from django.conf import settings from django import forms class UploadForm( forms.Form ): NewFile = forms.FileField() def apply_schema( fields ): def _wrapper( func ): def _decorator( request, *args ): params = [] for field in fields: params.append( request.GET[ field ] ) return func( request, *( list(args) + params ) ) return _decorator return _wrapper def _list_folder_content( path ): folders = [] files = [] for entry in os.listdir( path ): if os.path.isdir( os.path.join( path, entry ) ): folders.append( entry ) else: files.append( entry ) return folders, files def _folders_to_xml( xml, folders ): xml.startElement( "Folders", {} ) for folder in folders: xml.addQuickElement( "Folder", attrs = { "name" : folder, } ) xml.endElement( "Folders" ) def _files_to_xml( xml, files, base ): xml.startElement( "Files", {} ) for file in files: xml.addQuickElement( "File", attrs = { "name" : file, "size" : str( os.path.getsize( os.path.join( base, file ) ) ) } ) xml.endElement( "Files" ) @apply_schema( [ "Type", "CurrentFolder" ] ) def list_folder( request, xml, type, current ): base = create_current_folder_path( type, current ) folders, files = _list_folder_content( base ) _folders_to_xml( xml, folders ) @apply_schema( [ "Type", "CurrentFolder" ] ) def list_folder_and_files( request, xml, type, current ): base = create_current_folder_path( type, current ) folders, files = _list_folder_content( base ) _folders_to_xml( xml, folders ) _files_to_xml( xml, files,base ) @apply_schema( [ "Type", "CurrentFolder", "NewFolderName" ] ) def create_folder( request, xml, type, current, name ): base = create_current_folder_path( type, current ) file_name = os.path.join( base, name ) try: os.mkdir( file_name ) except OSError: xml.addQuickElement( "Error", attrs = { "number" : "101", "text" : "Folder already exists.", } ) except: xml.addQuickElement( "Error",attrs = { "number" : "110", "text" : "Unknown error creating folder.", } ) xml.addQuickElement( "Error", attrs = { "number" : "0", } ) def _wrap( name ): return "'%s'" % name#name and "'%s'" % name or "" def _make_upload_response( code, url="", name="", message = ""): return """""" % ( code, _wrap( url ), _wrap( name ), _wrap( message ) ) @apply_schema( [ "Type", "CurrentFolder" ] ) def upload_file( request, type, current ): base = create_current_folder_path( type, current ) if request.FILES: form = UploadForm( request.POST, request.FILES ) if form.is_valid(): f = form.cleaned_data[ "NewFile" ] filename = os.path.join( base, f.filename ) i = 0 base_name, ext = os.path.splitext( f.filename ) while os.path.exists( filename ): i += 1 filename = os.path.join( base, "%s(%s)%s" % ( base_name, i, ext ) ) outp = file( filename, "wb" ) outp.write( f.content ) outp.close() if i: return _make_upload_response( 201, name = os.path.basename( filename ) ) else: return _make_upload_response( 0 ) else: return _make_upload_response( 202, message = "invalid file" ) def create_current_folder_path( type, current_folder ): return os.path.join( settings.MEDIA_ROOT, settings.FCKEDITOR_TYPE_MAP.get( type, settings.FCKEDITOR_BASE ).lstrip("/"), current_folder.lstrip("/") ) def create_current_folder_url( type, current_folder ): return os.path.join( settings.MEDIA_URL, settings.FCKEDITOR_TYPE_MAP.get( type, settings.FCKEDITOR_BASE ).lstrip("/"), current_folder.lstrip("/") ) def browser( request ): response = http.HttpResponse( "" ,mimetype= "text/xml", content_type = "text/xml" ) xml = SimplerXMLGenerator( response, settings.DEFAULT_CHARSET) xml.startDocument() xml.startElement( "Connector", {} ) try: command = request.GET[ "Command" ] current_folder = request.GET[ "CurrentFolder" ] command_map = { "GetFolders" : list_folder, "GetFoldersAndFiles" : list_folder_and_files, "CreateFolder" : create_folder, } xml.addQuickElement( "CurrentFolder", attrs = { "path" : current_folder, "url" : create_current_folder_url( type, current_folder ), } ) if command in command_map: command_map[ command ]( request, xml ) elif command == "FileUpload": return http.HttpResponse( upload_file( request ) ) else: xml.addQuickElement( "Error", attrs = { "number" : "1", "text" : "unknown command", } ) except KeyError: xml.addQuickElement( "Error", attrs = { "number" : "1", "text" : "incomplete request", } ) xml.endElement( "Connector" ) xml.endDocument() return response