~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to www/apps/fileservice/listing.py

  • Committer: mattgiuca
  • Date: 2008-01-10 05:28:20 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:162
fileservice: Modified the listing output. Now there is an extra object
    layer around the listing object.
    There are now two top-level objects: "listing" and "clipboard".
    fileservice sends the full contents of the clipboard, if present in the
    browser session. (Details documented in comments).

Show diffs side-by-side

added added

removed removed

Lines of Context:
34
34
# will include the header "X-IVLE-Return: Dir".
35
35
#
36
36
# The JSON structure is as follows:
37
 
# * The top-level value is an object, with one member for each file in the
 
37
# * The top-level value is an object. It always contains the key "listing",
 
38
# whose value is the primary listing object. It may also contain a key
 
39
# "clipboard" which contains the clipboard object.
 
40
# * The value for "listing" is an object, with one member for each file in the
38
41
#   directory, plus an additional member (key ".") for the directory itself.
39
42
# * Each member's key is the filename. Its value is an object, which has
40
43
#   various members describing the file.
75
78
# member does NOT have a "svnstatus" key, or "svnstatus" is "unversioned",
76
79
# then the directory is not under revision control (and no other files will
77
80
# have "svnstatus" either).
 
81
#
 
82
# The top-level object MAY contain a "clipboard" key, which specifies the
 
83
# files copied to the clipboard. This can be used by the client to show the
 
84
# user what files will be pasted. At the very least, the client should take
 
85
# the presence or absence of a "clipboard" key as whether to grey out the
 
86
# "paste" button.
 
87
#
 
88
# The "clipboard" object has three members:
 
89
#   * mode: String. Either "copy" or "cut".
 
90
#   * base: String. Path relative to the user's root. The common path between
 
91
#   the files.
 
92
#   * files: Array of Strings. Each element is a filename relative to base.
 
93
#   Base and files exactly correspond to the listing path and argument paths
 
94
#   which were supplied during the last copy or cut request.
78
95
 
79
96
import os
80
97
import shutil
118
135
        # It's a directory. Return the directory listing.
119
136
        req.content_type = mime_dirlisting
120
137
        req.headers_out['X-IVLE-Return'] = 'Dir'
121
 
        req.write(cjson.encode(get_dirlisting(svnclient, path)))
 
138
        req.write(cjson.encode(get_dirlisting(req, svnclient, path)))
122
139
    else:
123
140
        # It's a file. Return the file contents.
124
141
        # First get the mime type of this file
131
148
 
132
149
        req.sendfile(path)
133
150
 
134
 
def get_dirlisting(svnclient, path):
 
151
def get_dirlisting(req, svnclient, path):
135
152
    """Given a local absolute path, creates a directory listing object
136
 
    ready to be JSONized and sent to the client."""
 
153
    ready to be JSONized and sent to the client.
 
154
 
 
155
    req: Request object. Will not be mutated; just reads the session.
 
156
    svnclient: Svn client object.
 
157
    path: String. Absolute path on the local file system. Not checked,
 
158
        must already be guaranteed safe.
 
159
    """
137
160
    # Start by trying to do an SVN status, so we can report file version
138
161
    # status
139
162
    listing = {}
153
176
        # unversioned.
154
177
        listing["."] = {"isdir" : True,
155
178
            "mtime" : time.ctime(os.path.getmtime(path))}
 
179
 
 
180
    # Listing is a nested object inside the top-level JSON.
 
181
    listing = {"listing" : listing}
 
182
 
 
183
    # The other object is the clipboard, if present in the browser session.
 
184
    # This can go straight from the session to JSON.
 
185
    session = req.get_session()
 
186
    try:
 
187
        listing['clipboard'] = session['clipboard']
 
188
    except KeyError:
 
189
        pass
 
190
    
156
191
    return listing
157
192
 
158
193
def file_to_fileinfo(path, filename):