Skip to Content.
Sympa Menu

idok-commit - [idok-commit] idok commit r50 - trunk/python/pydok/test

idok-commit AT lists.psi.ch

Subject: Commit emails of the iDok project

List archive

[idok-commit] idok commit r50 - trunk/python/pydok/test


Chronological Thread 
  • From: "AFS account Roman Geus" <geus AT savannah.psi.ch>
  • To: idok-commit AT lists.psi.ch
  • Subject: [idok-commit] idok commit r50 - trunk/python/pydok/test
  • Date: Thu, 20 Mar 2008 14:04:09 +0100
  • List-archive: <https://lists.web.psi.ch/pipermail/idok-commit/>
  • List-id: Commit emails of the iDok project <idok-commit.lists.psi.ch>

Author: geus
Date: Thu Mar 20 14:04:08 2008
New Revision: 50

Log:
Implemented "Link to iDok" feature in idok_upload_cgi.py

Modified:
trunk/python/pydok/test/idok_upload_cgi.py

Modified: trunk/python/pydok/test/idok_upload_cgi.py
==============================================================================
--- trunk/python/pydok/test/idok_upload_cgi.py (original)
+++ trunk/python/pydok/test/idok_upload_cgi.py Thu Mar 20 14:04:08 2008
@@ -86,24 +86,55 @@
cli_service.sendCommand(buf.getvalue())
return file_buf.getvalue()

-def idok_get_subdirs(url):
- "Return list of subfolders in iDok folder"
+def idok_get_subdirs_and_files(url):
+ """Return lists of subfolders and files in an iDok folder
+
+ @param url: URL of the iDok folder to get the content for
+ @return: a tuple containing two lists: a list subfolders in URL and a
list
+ of files in URL
+ """
command = "list " + url
output = idok_cli(command)
buf = StringIO.StringIO(output)
- result = []
+ subdirs = []
+ files = []
for line in buf:
line = line.rstrip(" \n\r")
if line[-1] == "/":
- result.append(line[:-1])
- return result
+ subdirs.append(line[:-1])
+ else:
+ files.append(line)
+ return subdirs, files
+
+def generate_idok_url(base_url, repository, folder, entry=None):
+ """Generate URL to iDok folder or file
+
+ @param base_url: Base URL common to all iDok projects
+ @param repository: repository identifier in PROJECT/REPOSITORY format
+ @param folder: iDok folder (does neither start nor end with a slash
+ character)
+ @param entry: Additional path component that will be added to the URL
+ """
+ buf = StringIO.StringIO()
+ buf.write(base_url)
+ if base_url[-1] != "/":
+ buf.write("/")
+ buf.write(urllib.quote(repository))
+ buf.write("/")
+ buf.write(urllib.quote(folder))
+ if entry:
+ if folder != "":
+ buf.write("/")
+ buf.write(urllib.quote(entry))
+ return buf.getvalue()

def generate_dest_url(base_url, pathname):
"""Generate the destination URL of the uploaded file

- base_url: URL referring to the destination iDok folder
- pathname: the path of uploaded file valid on the client. Depending on
the
- client, it may be a foreign path (e.g. Windows or Mac OS).
+ @param base_url: URL referring to the destination iDok folder
+ @param pathname: the path of uploaded file valid on the client.
Depending on
+ the client, it may be a foreign path (e.g. Windows or
+ Mac OS).
"""
idx = pathname.rfind("/")
if idx == -1:
@@ -118,13 +149,13 @@
def generate_self_url(output_mode, page, repository, folder):
"Return url to the idok_upload_cgi.py with GET parameters"
return
"idok_upload_cgi.py?output_mode=%s&page=%s&folder=%s&repository=%s" % \
- (urllib.quote_plus(output_mode),
- urllib.quote_plus(page),
- urllib.quote_plus(folder),
+ (urllib.quote_plus(output_mode),
+ urllib.quote_plus(page),
+ urllib.quote_plus(folder),
urllib.quote_plus(repository))

-def validate_params(repository=None, folder=None, output_mode=None,
- callback=None, new_folder=None, page=None):
+def validate_params(repository=None, folder=None, output_mode=None,
+ callback=None, page=None, dir_entry=None):
"Validate CGI parameters"
if folder is not None:
if not
re.match(r"$|(?:[^./][^/]*|\.[^./][^/]*|\.\.[^/]+)(?:/[^./][^/]*|/\.[^./][^/]*|/\.\.[^/]+)*$",
folder):
@@ -137,31 +168,31 @@
if callback is not None:
if not re.match(r"[a-zA-Z]\w*$", repository):
raise ValueError("callback=%s" % callback)
- if new_folder is not None:
- if not re.match(r"(?:[^./][^/]*|\.[^./][^/]*|\.\.[^/]+)$",
new_folder):
- raise ValueError("new_folder=%s" % new_folder)
- if page not in [None, "folder", "upload"]:
+ if page not in [None, "folder", "upload", "link_file"]:
raise ValueError("page=%s" % page)
+ if dir_entry is not None:
+ if not re.match(r"(?:[^./][^/]*|\.[^./][^/]*|\.\.[^/]+)$",
dir_entry):
+ raise ValueError("dir_entry=%s" % dir_entry)

def page_choose_folder(form):
"Handle page for choosing or creating the destination folder"
output_mode = form.getfirst("output_mode", "standalone")
repository = form.getfirst("repository", DEFAULT_REPOSITORY)
folder = form.getfirst("folder", "")
- new_folder = form.getfirst("new_folder")
+ new_folder = form.getfirst("dir_entry")
validate_params(output_mode=output_mode,
repository=repository,
folder=folder,
- new_folder=new_folder)
- url = BASE_URL + urllib.pathname2url(repository) + "/" +
urllib.pathname2url(folder)
+ dir_entry=new_folder)
+ folder_url = generate_idok_url(BASE_URL, repository, folder)
# Create new folder if requested
if new_folder:
- new_url = url + "/" + urllib.quote(new_folder)
- idok_cli(["mkdir", "-m", "Created by idok_upload_cgi.py", new_url])
+ new_folder_url = generate_idok_url(BASE_URL, repository, folder,
new_folder)
+ idok_cli(["mkdir", "-m", "Created by idok_upload_cgi.py",
new_folder_url])
fo = StringIO.StringIO()
- fo.write('<h1>Upload to iDok</h1>')
- fo.write('<h2>Step 1 - Choose destination folder</h2>')
- fo.write('<p>Current location: %s</p>' % url)
+ fo.write('<h1>Upload or link file to iDok</h1>')
+ fo.write('<h2>Step 1 - Choose upload destination folder or file to
link</h2>')
+ fo.write('<p>Current location: %s</p>' % folder_url)
# Link to parent folder
if folder != "":
idx = folder.rfind("/")
@@ -173,28 +204,39 @@
generate_self_url(output_mode, "folder", repository,
parent_folder))
# Create new folder form
fo.write('<form action="idok_upload_cgi.py" method="post">')
- fo.write('<p>Create new subfolder: <input name="new_folder" type="text"
size="30" maxlength="30"><input type="submit" value=" Create "></p>')
+ fo.write('<p>Create new subfolder: <input name="dir_entry" type="text"
size="30" maxlength="30"><input type="submit" value=" Create "></p>')
fo.write('<input type="hidden" name="output_mode" value=%s>' %
quoteattr(output_mode))
fo.write('<input type="hidden" name="page" value="folder">')
fo.write('<input type="hidden" name="repository" value=%s>' %
quoteattr(repository))
fo.write('<input type="hidden" name="folder" value=%s>' %
quoteattr(folder))
fo.write('</form>')
- # Link to sub folders
- dir_entries = idok_get_subdirs(url)
- if dir_entries:
+ # Link to sub folders and files
+ subdirs, files = idok_get_subdirs_and_files(folder_url)
+ if subdirs:
fo.write('Descend to subfolder:')
fo.write('<ul>')
- for entry in dir_entries:
+ for entry in subdirs:
if folder == "":
- subfolder = entry
+ repository_path = entry
+ else:
+ repository_path = folder + "/" + entry
+ sub_url = generate_self_url(output_mode, "folder", repository,
repository_path)
+ fo.write('<li><a href="%s">%s</a></li>' % (sub_url,
escape(entry)))
+ fo.write('</ul>')
+ if files:
+ fo.write('Link to file:')
+ fo.write('<ul>')
+ for entry in files:
+ if output_mode == "iframe":
+ sub_url = generate_self_url(output_mode, "link_file",
repository, folder) \
+ + "&dir_entry=" + urllib.quote_plus(entry)
else:
- subfolder = folder + "/" + entry
- subfolder_url = generate_self_url(output_mode, "folder",
repository, subfolder)
- fo.write('<li><a href="%s">%s</a></li>' % (subfolder_url,
escape(entry)))
+ sub_url = generate_idok_url(BASE_URL, repository, folder,
entry)
+ fo.write('<li><a href="%s">%s</a></li>' % (sub_url,
escape(entry)))
fo.write('</ul>')
# Continue button
fo.write('<form action="idok_upload_cgi.py" method="post">')
- fo.write('<p><input type="submit" value="Continue"></p>')
+ fo.write('<p><input type="submit" value="Continue to Upload"></p>')
fo.write('<input type="hidden" name="output_mode" value=%s>' %
quoteattr(output_mode))
fo.write('<input type="hidden" name="page" value="upload">')
fo.write('<input type="hidden" name="repository" value=%s>' %
quoteattr(repository))
@@ -220,9 +262,9 @@
callback=callback,
repository=repository,
folder=folder)
- dest_folder_url = BASE_URL + urllib.pathname2url(repository) + "/" +
urllib.pathname2url(folder)
+ dest_folder_url = generate_idok_url(BASE_URL, repository, folder)
fo = StringIO.StringIO()
- fo.write("<h1>Upload to iDok</h1>")
+ fo.write("<h1>Upload or link file to iDok</h1>")
fo.write('<h2>Step 2 - Choose file to upload</h2>')
fo.write('<p>Files will be uploaded to <a href="%s"
target="_blank">%s</a></p>' %
(dest_folder_url, escape(dest_folder_url)))
@@ -258,7 +300,7 @@

file_size = os.stat(temp_file_name).st_size
try:
- output = idok_cli(["put", "-m", "Imported by
idok_upload_cgi.py",
+ output = idok_cli(["put", "-m", "Imported by
idok_upload_cgi.py",
temp_file_name, dest_url])
fo.write("<h2>iDok CLI service output</h2>")
fo.write("<pre>%s</pre>" % escape(output))
@@ -284,11 +326,11 @@
import json
print "Content-Type: application/x-javascript; charset=utf-8"
print
- print "%s(%s)" % (callback,
+ print "%s(%s)" % (callback,
json.write({"#search": fo.getvalue()}))
elif output_mode == "location":
import json
- params = { "dest_url": dest_url,
+ params = { "dest_url": dest_url,
"repository": repository,
"folder": folder }
query = json.write(params)
@@ -304,7 +346,25 @@
print """</body>
</html>
"""
+def page_link_file(form):
+ """Complete the "link file" operation by sending a "Location" header
+
+ @param form: CGI form parameters"""
+ import json

+ repository = form.getfirst("repository", DEFAULT_REPOSITORY)
+ folder = form.getfirst("folder", "")
+ dir_entry = form.getfirst("dir_entry", "")
+ validate_params(repository=repository,
+ folder=folder)
+ dest_url = generate_idok_url(BASE_URL, repository, folder, dir_entry)
+ params = { "dest_url": dest_url,
+ "repository": repository,
+ "folder": folder }
+ query = json.write(params)
+ print "Location: %s?%s" % (TWIKI_LOCATION_URL, urllib.quote(query))
+ print
+
def main():
"Main CGI function"
form = MyFieldStorage()
@@ -312,6 +372,8 @@
validate_params(page=page)
if page == "upload":
page_upload(form)
+ elif page == "link_file":
+ page_link_file(form)
else:
page_choose_folder(form)




  • [idok-commit] idok commit r50 - trunk/python/pydok/test, AFS account Roman Geus, 03/20/2008

Archive powered by MHonArc 2.6.19.

Top of Page