--- cdli/cdli_files.py 2006/10/04 07:18:23 1.45 +++ cdli/cdli_files.py 2006/12/22 20:35:33 1.55 @@ -1,11 +1,13 @@ """CDLI extensions of the filearchive""" -from Products.versionedFile.versionedFile import * +from Products.versionedFile.extVersionedFile import * from Products.ZCatalog.CatalogPathAwareness import CatalogAware from tempfile import mkstemp,mkdtemp import os.path import os from types import * import urlparse +import urllib +import cgi from OFS.OrderedFolder import OrderedFolder from OFS.SimpleItem import SimpleItem import time @@ -19,7 +21,77 @@ from ZPublisher.HTTPRequest import HTTPR from ZPublisher.HTTPResponse import HTTPResponse from ZPublisher.BaseRequest import RequestContainer import threading - +from BTrees.OOBTree import OOBTree + +def unique(s): + """Return a list of the elements in s, but without duplicates. + + For example, unique([1,2,3,1,2,3]) is some permutation of [1,2,3], + unique("abcabc") some permutation of ["a", "b", "c"], and + unique(([1, 2], [2, 3], [1, 2])) some permutation of + [[2, 3], [1, 2]]. + + For best speed, all sequence elements should be hashable. Then + unique() will usually work in linear time. + + If not possible, the sequence elements should enjoy a total + ordering, and if list(s).sort() doesn't raise TypeError it's + assumed that they do enjoy a total ordering. Then unique() will + usually work in O(N*log2(N)) time. + + If that's not possible either, the sequence elements must support + equality-testing. Then unique() will usually work in quadratic + time. + (from the python cookbook) + """ + + n = len(s) + if n == 0: + return [] + + # Try using a dict first, as that's the fastest and will usually + # work. If it doesn't work, it will usually fail quickly, so it + # usually doesn't cost much to *try* it. It requires that all the + # sequence elements be hashable, and support equality comparison. + u = {} + try: + for x in s: + u[x] = 1 + except TypeError: + del u # move on to the next method + else: + return u.keys() + + # We can't hash all the elements. Second fastest is to sort, + # which brings the equal elements together; then duplicates are + # easy to weed out in a single pass. + # NOTE: Python's list.sort() was designed to be efficient in the + # presence of many duplicate elements. This isn't true of all + # sort functions in all languages or libraries, so this approach + # is more effective in Python than it may be elsewhere. + try: + t = list(s) + t.sort() + except TypeError: + del t # move on to the next method + else: + assert n > 0 + last = t[0] + lasti = i = 1 + while i < n: + if t[i] != last: + t[lasti] = last = t[i] + lasti += 1 + i += 1 + return t[:lasti] + + # Brute force is all that's left. + u = [] + for x in s: + if x not in u: + u.append(x) + return u + class BasketContent(SimpleItem): """classe fuer den Inhalt eines Baskets""" @@ -98,7 +170,8 @@ class uploadATFfinallyThread(Thread): conn.close() #set flag for end of this method self.end=True - return True + print "ended" + return True def __del__(self): """delete""" @@ -141,7 +214,7 @@ class uploadATFfinallyThread(Thread): if len(founds)>0: SESSION['author']=str(username) self.result+="
Changing : %s"%fn - founds[0].getObject().manage_addCDLIFileObject('',comment,SESSION['author'],file=file(os.path.join(SESSION['tmpdir'],fn))) + founds[0].getObject().manage_addCDLIFileObject('',comment,SESSION['author'],file=os.path.join(SESSION['tmpdir'],fn),from_tmp=True) #now add the new files @@ -239,10 +312,10 @@ class uploadATFThread(Thread): #ctx.cdliRoot.cdli_main.tmpStore2[self.getName()[0:]]=self.returnValue get_transaction().commit() - + while self.continueVar: pass - + conn.close() @@ -310,28 +383,29 @@ class uploadATFThread(Thread): founds=ctx2.CDLICatalog.search({'title':fn}) #if not than add filename to the list of newfiles - - data=file(os.path.join(dir,fn)).read() - status,msg=checkFile(fn,data,dir) - - if not status: # error - errors.append((fn,msg)) - else: - if len(founds)==0: - newPs.append(fn) + + data=file(os.path.join(dir,fn)).read() + #status,msg=checkFile(fn,data,dir) + status=True + msg="" + if not status: # error + errors.append((fn,msg)) + else: + if len(founds)==0: + newPs.append(fn) - #if p file alread at the server - for found in founds: - #analyse the differences to the actual file - obj=found.getObject() - - if (not (str(obj.lockedBy))=='') and (not (str(obj.lockedBy)==str(self.username))): - lockerrors.append(fn) - else: - - diffs=obj.diff(data) - if diffs[0]>0: - changed.append((obj,diffs)) #hochladen + #if p file alread at the server + for found in founds: + #analyse the differences to the actual file + obj=found.getObject() + + if (not (str(obj.lockedBy))=='') and (not (str(obj.lockedBy)==str(self.username))): + lockerrors.append(fn) + else: + + diffs=obj.diff(data) + if diffs[0]>0: + changed.append((obj,diffs)) #hochladen #ready, set the returnValues self.result+="