Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeWidgets/OWDatabasesUpdate.py

    r10979 r11437  
    1 from __future__ import with_statement  
    2 import sys, os 
    3 import orngServerFiles 
    4 import orngEnviron 
    5 import threading 
     1from __future__ import with_statement 
     2 
     3import os 
     4import sys 
     5 
     6from datetime import datetime 
     7 
     8import Orange 
     9 
     10from Orange.utils import serverfiles, environ 
     11from Orange.utils.serverfiles import sizeformat as sizeof_fmt 
     12 
    613from OWWidget import * 
    7 from functools import partial 
    8 from datetime import datetime 
    9  
    10 import gzip, sys 
    11  
    12 def sizeof_fmt(num): 
    13     for x in ['bytes','KB','MB','GB','TB']: 
    14         if num < 1024.0: 
    15             return "%3.1f %s" % (num, x) if x <> 'bytes' else "%1.0f %s" % (num, x) 
    16         num /= 1024.0 
    17  
    18         
     14from OWConcurrent import * 
     15 
     16import OWGUIEx 
     17 
     18 
    1919class ItemProgressBar(QProgressBar): 
     20    """Progress Bar with and `advance()` slot. 
     21    """ 
    2022    @pyqtSignature("advance()") 
    2123    def advance(self): 
    2224        self.setValue(self.value() + 1) 
    23     
    24          
     25 
     26 
    2527class ProgressBarRedirect(QObject): 
    2628    def __init__(self, parent, redirect): 
     
    2830        self.redirect = redirect 
    2931        self._delay = False 
    30          
     32 
    3133    @pyqtSignature("advance()") 
    3234    def advance(self): 
    33         # delay OWBaseWidget.progressBarSet call, because it calls qApp.processEvents 
    34         #which can result in 'event queue climbing' and max. recursion error if GUI thread 
    35         #gets another advance signal before it finishes with this one 
     35        # delay OWBaseWidget.progressBarSet call, because it calls 
     36        # qApp.processEvents which can result in 'event queue climbing' 
     37        # and max. recursion error if GUI thread gets another advance 
     38        # signal before it finishes with this one 
    3639        if not self._delay: 
    3740            try: 
     
    4346            QTimer.singleShot(10, self.advance) 
    4447 
    45          
    46 from OWConcurrent import * 
    47          
     48_icons_dir = os.path.join(environ.canvas_install_dir, "icons") 
     49 
     50 
     51def icon(name): 
     52    return QIcon(os.path.join(_icons_dir, name)) 
     53 
     54 
    4855class UpdateOptionsWidget(QWidget): 
     56    """ 
     57    A Widget with download/update/remove options. 
     58    """ 
    4959    def __init__(self, updateCallback, removeCallback, state, *args): 
    5060        QWidget.__init__(self, *args) 
     
    5565        layout.setContentsMargins(1, 1, 1, 1) 
    5666        self.updateButton = QToolButton(self) 
    57         self.updateButton.setIcon(QIcon(os.path.join(orngEnviron.canvasDir, "icons", "update.png"))) 
     67        self.updateButton.setIcon(icon("update.png")) 
    5868        self.updateButton.setToolTip("Download") 
    59 #        self.updateButton.setIconSize(QSize(10, 10)) 
     69 
    6070        self.removeButton = QToolButton(self) 
    61         self.removeButton.setIcon(QIcon(os.path.join(orngEnviron.canvasDir, "icons", "delete.png"))) 
     71        self.removeButton.setIcon(icon("delete.png")) 
    6272        self.removeButton.setToolTip("Remove from system") 
    63 #        self.removeButton.setIconSize(QSize(10, 10)) 
    64         self.connect(self.updateButton, SIGNAL("released()"), self.updateCallback) 
    65         self.connect(self.removeButton, SIGNAL("released()"), self.removeCallback) 
     73 
     74        self.connect(self.updateButton, SIGNAL("released()"), 
     75                     self.updateCallback) 
     76        self.connect(self.removeButton, SIGNAL("released()"), 
     77                     self.removeCallback) 
     78 
    6679        self.setMaximumHeight(30) 
    6780        layout.addWidget(self.updateButton) 
     
    7386        self.state = state 
    7487        if state == 0: 
    75             self.updateButton.setIcon(QIcon(os.path.join(orngEnviron.canvasDir, "icons", "update1.png"))) 
     88            self.updateButton.setIcon(icon("update1.png")) 
    7689            self.updateButton.setToolTip("Update") 
    7790            self.updateButton.setEnabled(False) 
    7891            self.removeButton.setEnabled(True) 
    7992        elif state == 1: 
    80             self.updateButton.setIcon(QIcon(os.path.join(orngEnviron.canvasDir, "icons", "update1.png"))) 
     93            self.updateButton.setIcon(icon("update1.png")) 
    8194            self.updateButton.setToolTip("Update") 
    8295            self.updateButton.setEnabled(True) 
    8396            self.removeButton.setEnabled(True) 
    8497        elif state == 2: 
    85             self.updateButton.setIcon(QIcon(os.path.join(orngEnviron.canvasDir, "icons", "update.png"))) 
     98            self.updateButton.setIcon(icon("update.png")) 
    8699            self.updateButton.setToolTip("Download") 
    87100            self.updateButton.setEnabled(True) 
    88101            self.removeButton.setEnabled(False) 
    89102        elif state == 3: 
    90             self.updateButton.setIcon(QIcon(os.path.join(orngEnviron.canvasDir, "icons", "update.png"))) 
     103            self.updateButton.setIcon(icon("update.png")) 
    91104            self.updateButton.setToolTip("") 
    92105            self.updateButton.setEnabled(False) 
    93106            self.removeButton.setEnabled(True) 
     107        else: 
     108            raise ValueError("Invalid state %r" % state) 
    94109 
    95110 
    96111class UpdateTreeWidgetItem(QTreeWidgetItem): 
    97     stateDict = {0:"up-to-date", 1:"new version available", 2:"not downloaded", 3:"obsolete"} 
    98     def __init__(self, master, treeWidget, domain, filename, infoLocal, infoServer, *args): 
     112    stateDict = {0: "up-to-date", 
     113                 1: "new version available", 
     114                 2: "not downloaded", 
     115                 3: "obsolete"} 
     116 
     117    def __init__(self, master, treeWidget, domain, filename, infoLocal, 
     118                 infoServer, *args): 
     119        dateServer = dateLocal = None 
     120        if infoServer: 
     121            dateServer = datetime.strptime( 
     122                infoServer["datetime"].split(".")[0], "%Y-%m-%d %H:%M:%S" 
     123            ) 
     124        if infoLocal: 
     125            dateLocal = datetime.strptime( 
     126                infoLocal["datetime"].split(".")[0], "%Y-%m-%d %H:%M:%S" 
     127            ) 
    99128        if not infoLocal: 
    100129            self.state = 2 
     
    102131            self.state = 3 
    103132        else: 
    104             dateServer = datetime.strptime(infoServer["datetime"].split(".")[0], "%Y-%m-%d %H:%M:%S") 
    105             dateLocal = datetime.strptime(infoLocal["datetime"].split(".")[0], "%Y-%m-%d %H:%M:%S") 
    106133            self.state = 0 if dateLocal >= dateServer else 1 
     134 
    107135        title = infoServer["title"] if infoServer else (infoLocal["title"]) 
    108136        tags = infoServer["tags"] if infoServer else infoLocal["tags"] 
    109         specialTags = dict([tuple(tag.split(":")) for tag in tags if tag.startswith("#") and ":" in tag]) 
     137        specialTags = dict([tuple(tag.split(":")) 
     138                            for tag in tags 
     139                            if tag.startswith("#") and ":" in tag]) 
    110140        tags = ", ".join(tag for tag in tags if not tag.startswith("#")) 
    111141        self.size = infoServer["size"] if infoServer else infoLocal["size"] 
    112 #        if self.state == 2 or self.state == 1: 
    113 #            size = sizeof_fmt(float(self.size)) + (" (%s uncompressed)" % sizeof_fmt(float(specialTags["#uncompressed"])) if "#uncompressed" in specialTags else "") 
    114 #        else: 
    115 #            size = sizeof_fmt(float(specialTags.get("#uncompressed", self.size))) 
     142 
    116143        size = sizeof_fmt(float(self.size)) 
    117         state = self.stateDict[self.state] + (dateServer.strftime(" (%Y, %b, %d)") if self.state == 1 else "") 
     144        state = self.stateDict[self.state] 
     145        if self.state == 1: 
     146            state += dateServer.strftime(" (%Y, %b, %d)") 
     147 
    118148        QTreeWidgetItem.__init__(self, treeWidget, ["", title, size]) 
    119         self.updateWidget = UpdateOptionsWidget(self.StartDownload, self.Remove, self.state, treeWidget) 
     149        if dateServer is not None: 
     150            self.setData(3, Qt.DisplayRole, 
     151                         dateServer.date().isoformat()) 
     152 
     153        self.updateWidget = UpdateOptionsWidget( 
     154            self.StartDownload, self.Remove, self.state, treeWidget 
     155        ) 
     156 
    120157        self.treeWidget().setItemWidget(self, 0, self.updateWidget) 
    121158        self.updateWidget.show() 
     
    126163        self.domain = domain 
    127164        self.filename = filename 
    128 ##        for i in range(1, 5): 
    129 ##            self.setSizeHint(i, QSize(self.sizeHint(i).width(), self.sizeHint(0).height())) 
    130165        self.UpdateToolTip() 
    131166 
    132167    def UpdateToolTip(self): 
    133         state = {0:"local, updated", 1:"local, needs update", 2:"on server, download for local use", 3:"obsolete"} 
    134         tooltip = "State: %s\nTags: %s" % (state[self.state], ", ".join(self.tags)) 
     168        state = {0: "local, updated", 
     169                 1: "local, needs update", 
     170                 2: "on server, download for local use", 
     171                 3: "obsolete"} 
     172        tooltip = "State: %s\nTags: %s" % (state[self.state], 
     173                                           ", ".join(self.tags)) 
    135174        if self.state != 2: 
    136             tooltip += "\nFile: %s" % orngServerFiles.localpath(self.domain, self.filename) 
     175            tooltip += ("\nFile: %s" % 
     176                        serverfiles.localpath(self.domain, self.filename)) 
    137177        for i in range(1, 5): 
    138178            self.setToolTip(i, tooltip) 
    139          
     179 
    140180    def StartDownload(self): 
    141181        self.updateWidget.removeButton.setEnabled(False) 
    142182        self.updateWidget.updateButton.setEnabled(False) 
    143183        self.setData(2, Qt.DisplayRole, QVariant("")) 
    144         serverFiles = orngServerFiles.ServerFiles(access_code=self.master.accessCode if self.master.accessCode else None)  
    145          
     184        serverFiles = serverfiles.ServerFiles( 
     185            access_code=self.master.accessCode if self.master.accessCode 
     186            else None 
     187        ) 
     188 
    146189        pb = ItemProgressBar(self.treeWidget()) 
    147190        pb.setRange(0, 100) 
    148191        pb.setTextVisible(False) 
    149          
     192 
    150193        self.task = AsyncCall(threadPool=QThreadPool.globalInstance()) 
    151          
     194 
    152195        if not getattr(self.master, "_sum_progressBar", None): 
    153             self.master._sum_progressBar = OWGUI.ProgressBar(self.master,0) 
     196            self.master._sum_progressBar = OWGUI.ProgressBar(self.master, 0) 
    154197            self.master._sum_progressBar.in_progress = 0 
    155198        master_pb = self.master._sum_progressBar 
    156199        master_pb.iter += 100 
    157200        master_pb.in_progress += 1 
    158         self._progressBarRedirect = ProgressBarRedirect(QThread.currentThread(), master_pb) 
    159 #        QObject.connect(self.thread, SIGNAL("advance()"), lambda :(pb.setValue(pb.value()+1), master_pb.advance())) 
    160         QObject.connect(self.task, SIGNAL("advance()"), pb.advance, Qt.QueuedConnection) 
    161         QObject.connect(self.task, SIGNAL("advance()"), self._progressBarRedirect.advance, Qt.QueuedConnection) 
    162         QObject.connect(self.task, SIGNAL("finished(QString)"), self.EndDownload, Qt.QueuedConnection) 
     201        self._progressBarRedirect = \ 
     202            ProgressBarRedirect(QThread.currentThread(), master_pb) 
     203        QObject.connect(self.task, 
     204                        SIGNAL("advance()"), 
     205                        pb.advance, 
     206                        Qt.QueuedConnection) 
     207        QObject.connect(self.task, 
     208                        SIGNAL("advance()"), 
     209                        self._progressBarRedirect.advance, 
     210                        Qt.QueuedConnection) 
     211        QObject.connect(self.task, 
     212                        SIGNAL("finished(QString)"), 
     213                        self.EndDownload, 
     214                        Qt.QueuedConnection) 
    163215        self.treeWidget().setItemWidget(self, 2, pb) 
    164216        pb.show() 
    165          
    166         self.task.apply_async(orngServerFiles.download, args=(self.domain, self.filename, serverFiles), kwargs=dict(callback=self.task.emitAdvance)) 
     217 
     218        self.task.apply_async(serverfiles.download, 
     219                              args=(self.domain, self.filename, serverFiles), 
     220                              kwargs=dict(callback=self.task.emitAdvance)) 
    167221 
    168222    def EndDownload(self, exitCode=0): 
     
    171225            self.state = 0 
    172226            self.updateWidget.SetState(self.state) 
    173             self.setData(2, Qt.DisplayRole, QVariant(sizeof_fmt(float(self.size)))) 
     227            self.setData(2, Qt.DisplayRole, 
     228                         QVariant(sizeof_fmt(float(self.size)))) 
    174229            self.master.UpdateInfoLabel() 
    175230            self.UpdateToolTip() 
    176231        else: 
    177232            self.updateWidget.SetState(1) 
    178             self.setData(2, Qt.DisplayRole, QVariant("Error occured while downloading:" + str(exitCode))) 
    179              
     233            self.setData(2, Qt.DisplayRole, 
     234                         QVariant("Error occurred while downloading:" + 
     235                                  str(exitCode))) 
     236 
    180237        master_pb = self.master._sum_progressBar 
    181 #        print master_pb.in_progress 
     238 
    182239        if master_pb and master_pb.in_progress == 1: 
    183240            master_pb.finish() 
     
    185242        elif master_pb: 
    186243            master_pb.in_progress -= 1 
    187          
    188 #        self.thread, self._runnable = None, None 
    189              
     244 
    190245    def Remove(self): 
    191         orngServerFiles.remove(self.domain, self.filename) 
     246        serverfiles.remove(self.domain, self.filename) 
    192247        self.state = 2 
    193248        self.updateWidget.SetState(self.state) 
     
    196251 
    197252    def __contains__(self, item): 
    198         return any(item.lower() in tag.lower() for tag in self.tags + [self.title]) 
    199      
     253        return any(item.lower() in tag.lower() 
     254                   for tag in self.tags + [self.title]) 
     255 
    200256    def __lt__(self, other): 
    201         return getattr(self, "title", "") < getattr(other, "title", "")  
     257        return getattr(self, "title", "") < getattr(other, "title", "") 
     258 
    202259 
    203260class UpdateItemDelegate(QItemDelegate): 
     
    208265        widget = parent.itemWidget(item, 0) 
    209266        if widget: 
    210             size = QSize(size.width(), widget.sizeHint().height()/2) 
     267            size = QSize(size.width(), widget.sizeHint().height() / 2) 
    211268        return size 
    212      
     269 
     270 
    213271def retrieveFilesList(serverFiles, domains=None, advance=lambda: None): 
     272    """ 
     273    Retrieve and return serverfiles.allinfo for all domains. 
     274    """ 
    214275    domains = serverFiles.listdomains() if domains is None else domains 
    215276    advance() 
     
    217278    advance() 
    218279    return serverInfo 
    219      
     280 
     281 
    220282class OWDatabasesUpdate(OWWidget): 
    221     def __init__(self, parent=None, signalManager=None, name="Databases update", wantCloseButton=False, searchString="", showAll=True, domains=None, accessCode=""): 
     283    def __init__(self, parent=None, signalManager=None, 
     284                 name="Databases update", wantCloseButton=False, 
     285                 searchString="", showAll=True, domains=None, 
     286                 accessCode=""): 
    222287        OWWidget.__init__(self, parent, signalManager, name) 
    223288        self.searchString = searchString 
     
    225290        self.showAll = showAll 
    226291        self.domains = domains 
    227         self.serverFiles = orngServerFiles.ServerFiles() 
     292        self.serverFiles = serverfiles.ServerFiles() 
    228293        box = OWGUI.widgetBox(self.mainArea, orientation="horizontal") 
    229         import OWGUIEx 
    230         self.lineEditFilter = OWGUIEx.lineEditHint(box, self, "searchString", "Filter", caseSensitive=False, delimiters=" ", matchAnywhere=True, listUpdateCallback=self.SearchUpdate, callbackOnType=True, callback=self.SearchUpdate) 
     294 
     295        self.lineEditFilter = \ 
     296            OWGUIEx.lineEditHint(box, self, "searchString", "Filter", 
     297                                 caseSensitive=False, 
     298                                 delimiters=" ", 
     299                                 matchAnywhere=True, 
     300                                 listUpdateCallback=self.SearchUpdate, 
     301                                 callbackOnType=True, 
     302                                 callback=self.SearchUpdate) 
    231303 
    232304        box = OWGUI.widgetBox(self.mainArea, "Files") 
    233305        self.filesView = QTreeWidget(self) 
    234         self.filesView.setHeaderLabels(["Options", "Title", "Size"]) 
     306        self.filesView.setHeaderLabels(["Options", "Title", "Size", 
     307                                        "Last Updated"]) 
    235308        self.filesView.setRootIsDecorated(False) 
    236309        self.filesView.setSelectionMode(QAbstractItemView.NoSelection) 
    237310        self.filesView.setSortingEnabled(True) 
    238311        self.filesView.setItemDelegate(UpdateItemDelegate(self.filesView)) 
    239         self.connect(self.filesView.model(), SIGNAL("layoutChanged()"), self.SearchUpdate) 
     312        self.connect(self.filesView.model(), 
     313                     SIGNAL("layoutChanged()"), 
     314                     self.SearchUpdate) 
    240315        box.layout().addWidget(self.filesView) 
    241316 
    242317        box = OWGUI.widgetBox(self.mainArea, orientation="horizontal") 
    243         OWGUI.button(box, self, "Update all local files", callback=self.UpdateAll, tooltip="Update all updatable files") 
    244         OWGUI.button(box, self, "Download filtered", callback=self.DownloadFiltered, tooltip="Download all filtered files shown") 
     318        OWGUI.button(box, self, "Update all local files", 
     319                     callback=self.UpdateAll, 
     320                     tooltip="Update all updatable files") 
     321        OWGUI.button(box, self, "Download filtered", 
     322                     callback=self.DownloadFiltered, 
     323                     tooltip="Download all filtered files shown") 
    245324        OWGUI.rubber(box) 
    246         OWGUI.lineEdit(box, self, "accessCode", "Access Code", orientation="horizontal", callback=self.RetrieveFilesList) 
    247         self.retryButton = OWGUI.button(box, self, "Retry", callback=self.RetrieveFilesList) 
     325        OWGUI.lineEdit(box, self, "accessCode", "Access Code", 
     326                       orientation="horizontal", 
     327                       callback=self.RetrieveFilesList) 
     328        self.retryButton = OWGUI.button(box, self, "Retry", 
     329                                        callback=self.RetrieveFilesList) 
    248330        self.retryButton.hide() 
    249331        box = OWGUI.widgetBox(self.mainArea, orientation="horizontal") 
    250332        OWGUI.rubber(box) 
    251333        if wantCloseButton: 
    252             OWGUI.button(box, self, "Close", callback=self.accept, tooltip="Close") 
    253  
    254 ##        statusBar = QStatusBar() 
     334            OWGUI.button(box, self, "Close", 
     335                         callback=self.accept, 
     336                         tooltip="Close") 
     337 
    255338        self.infoLabel = QLabel() 
    256339        self.infoLabel.setAlignment(Qt.AlignCenter) 
    257 ##        statusBar.addWidget(self.infoLabel) 
    258 ##        self.mainArea.layout().addWidget(statusBar) 
     340 
    259341        self.mainArea.layout().addWidget(self.infoLabel) 
    260342        self.infoLabel.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) 
     
    262344        self.updateItems = [] 
    263345        self.allTags = [] 
    264          
     346 
    265347        self.resize(800, 600) 
    266          
    267 #        QTimer.singleShot(50, self.UpdateFilesList) 
     348 
    268349        QTimer.singleShot(50, self.RetrieveFilesList) 
    269          
     350 
    270351    def RetrieveFilesList(self): 
    271         self.serverFiles = orngServerFiles.ServerFiles(access_code=self.accessCode) 
     352        self.serverFiles = serverfiles.ServerFiles(access_code=self.accessCode) 
    272353        self.pb = ProgressBar(self, 3) 
    273         self.async_retrieve = createTask(retrieveFilesList, (self.serverFiles, self.domains, self.pb.advance), onResult=self.SetFilesList, onError=self.HandleError) 
    274          
     354        self.async_retrieve = createTask(retrieveFilesList, 
     355                                         (self.serverFiles, self.domains, 
     356                                          self.pb.advance), 
     357                                         onResult=self.SetFilesList, 
     358                                         onError=self.HandleError) 
     359 
    275360        self.setEnabled(False) 
    276          
    277          
     361 
    278362    def SetFilesList(self, serverInfo): 
    279363        self.setEnabled(True) 
    280         domains = serverInfo.keys() or orngServerFiles.listdomains() 
    281         localInfo = dict([(dom, orngServerFiles.allinfo(dom)) for dom in domains]) 
     364        domains = serverInfo.keys() or serverfiles.listdomains() 
     365        localInfo = dict([(dom, serverfiles.allinfo(dom)) 
     366                          for dom in domains]) 
    282367        items = [] 
    283          
     368 
    284369        self.allTags = set() 
    285370        allTitles = set() 
    286371        self.updateItems = [] 
    287          
    288         for i, domain in enumerate(set(domains) - set(["test", "demo"])): 
    289             local = localInfo.get(domain, {})  
    290             server =  serverInfo.get(domain, {}) 
     372 
     373        for domain in set(domains) - set(["test", "demo"]): 
     374            local = localInfo.get(domain, {}) 
     375            server = serverInfo.get(domain, {}) 
    291376            files = sorted(set(server.keys() + local.keys())) 
    292             for j, file in enumerate(files): 
    293                 infoServer = server.get(file, None) 
    294                 infoLocal = local.get(file, None) 
    295                  
    296                 items.append((self.filesView, domain, file, infoLocal, infoServer)) 
    297                  
     377            for filename in files: 
     378                infoServer = server.get(filename, None) 
     379                infoLocal = local.get(filename, None) 
     380 
     381                items.append((self.filesView, domain, filename, infoLocal, 
     382                              infoServer)) 
     383 
    298384                displayInfo = infoServer if infoServer else infoLocal 
    299385                self.allTags.update(displayInfo["tags"]) 
    300386                allTitles.update(displayInfo["title"].split()) 
    301          
    302         for i, item in enumerate(items): 
     387 
     388        for item in items: 
    303389            self.updateItems.append(UpdateTreeWidgetItem(self, *item)) 
    304390        self.pb.advance() 
    305         self.filesView.resizeColumnToContents(0) 
    306         self.filesView.resizeColumnToContents(1) 
    307         self.filesView.resizeColumnToContents(2) 
    308         self.lineEditFilter.setItems([hint for hint in sorted(self.allTags) if not hint.startswith("#")]) 
     391        for column in range(4): 
     392            whint = self.filesView.sizeHintForColumn(column) 
     393            width = min(whint, 400) 
     394            self.filesView.setColumnWidth(column, width) 
     395 
     396        self.lineEditFilter.setItems([hint for hint in sorted(self.allTags) 
     397                                      if not hint.startswith("#")]) 
    309398        self.SearchUpdate() 
    310399        self.UpdateInfoLabel() 
    311400        self.pb.finish() 
    312          
     401 
    313402    def HandleError(self, (exc_type, exc_value, tb)): 
    314403        if exc_type >= IOError: 
    315             self.error(0, "Could not connect to server! Press the Retry button to try again.") 
     404            self.error(0, 
     405                       "Could not connect to server! Press the Retry " 
     406                       "button to try again.") 
    316407            self.SetFilesList({}) 
    317408        else: 
     
    319410            self.pb.finish() 
    320411            self.setEnabled(True) 
    321              
    322          
    323 #    def UpdateFilesList(self): 
    324 #        self.retryButton.hide() 
    325 ##        self.progressBarInit() 
    326 #        pb = OWGUI.ProgressBar(self, 3) 
    327 #        self.filesView.clear() 
    328 ##        self.tagsWidget.clear() 
    329 #        self.allTags = set() 
    330 #        allTitles = set() 
    331 #        self.updateItems = [] 
    332 #        if self.accessCode: 
    333 #            self.serverFiles = orngServerFiles.ServerFiles(access_code=self.accessCode) 
    334 #             
    335 #        self.error(0)     
    336 #        try: 
    337 #            domains = self.serverFiles.listdomains() if self.domains is None else self.domains 
    338 #            pb.advance() 
    339 #            serverInfo = dict([(dom, self.serverFiles.allinfo(dom)) for dom in domains]) 
    340 #            pb.advance() 
    341 #        except IOError, ex: 
    342 #            self.error(0, "Could not connect to server! Press the Retry button to try again.") 
    343 #            self.retryButton.show() 
    344 #            domains =orngServerFiles.listdomains() if self.domains is None else self.domains 
    345 #            pb.advance() 
    346 #            serverInfo = {} 
    347 #            pb.advance() 
    348 #             
    349 #        localInfo = dict([(dom, orngServerFiles.allinfo(dom)) for dom in domains]) 
    350 #        items = [] 
    351 #         
    352 #        for i, domain in enumerate(set(domains) - set(["test", "demo"])): 
    353 #            local = localInfo.get(domain, {}) #orngServerFiles.listfiles(domain) or [] 
    354 ##                files = self.serverFiles.listfiles(domain) 
    355 #            server =  serverInfo.get(domain, {}) #self.serverFiles.allinfo(domain) 
    356 #            files = sorted(set(server.keys() + local.keys())) 
    357 #            for j, file in enumerate(files): 
    358 #                infoServer = server.get(file, None) 
    359 #                infoLocal = local.get(file, None) 
    360 #                 
    361 #                items.append((self.filesView, domain, file, infoLocal, infoServer)) 
    362 #                 
    363 #                displayInfo = infoServer if infoServer else infoLocal 
    364 #                self.allTags.update(displayInfo["tags"]) 
    365 #                allTitles.update(displayInfo["title"].split()) 
    366 # 
    367 ##                    self.progressBarSet(100.0 * i / len(domains) + 100.0 * j / (len(files) * len(domains))) 
    368 #         
    369 #        for i, item in enumerate(items): 
    370 #            self.updateItems.append(UpdateTreeWidgetItem(self, *item)) 
    371 #        pb.advance() 
    372 #        self.filesView.resizeColumnToContents(0) 
    373 #        self.filesView.resizeColumnToContents(1) 
    374 #        self.filesView.resizeColumnToContents(2) 
    375 #        self.lineEditFilter.setItems([hint for hint in sorted(self.allTags) if not hint.startswith("#")]) 
    376 #        self.SearchUpdate() 
    377 #        self.UpdateInfoLabel() 
    378 # 
    379 #        self.progressBarFinished() 
    380412 
    381413    def UpdateInfoLabel(self): 
    382414        local = [item for item in self.updateItems if item.state != 2] 
    383415        onServer = [item for item in self.updateItems] 
     416        size = sum(float(item.specialTags.get("#uncompressed", item.size)) 
     417                   for item in local) 
     418        sizeOnServer = sum(float(item.size) for item in self.updateItems) 
     419 
    384420        if self.showAll: 
    385             self.infoLabel.setText("%i items, %s (data on server: %i items, %s)" % (len(local), sizeof_fmt(sum(float(item.specialTags.get("#uncompressed", item.size)) for item in local)), 
    386                                                                             len(onServer), sizeof_fmt(sum(float(item.size) for item in self.updateItems)))) 
    387         else: 
    388             self.infoLabel.setText("%i items, %s" % (len(local), sizeof_fmt(sum(float(item.specialTags.get("#uncompressed", item.size)) for item in local)))) 
    389          
     421 
     422            text = ("%i items, %s (data on server: %i items, %s)" % 
     423                    (len(local), 
     424                     sizeof_fmt(size), 
     425                     len(onServer), 
     426                     sizeof_fmt(sizeOnServer))) 
     427        else: 
     428            text = "%i items, %s" % (len(local), sizeof_fmt(size)) 
     429 
     430        self.infoLabel.setText(text) 
     431 
    390432    def UpdateAll(self): 
    391433        for item in self.updateItems: 
    392434            if item.state == 1: 
    393435                item.StartDownload() 
    394                  
     436 
    395437    def DownloadFiltered(self): 
    396438        for item in self.updateItems: 
     
    399441 
    400442    def SearchUpdate(self, searchString=None): 
    401         strings = unicode(self.lineEditFilter.text()).split() #self.searchString.split() if searchString is None else unicode(searchString).split() 
     443        strings = unicode(self.lineEditFilter.text()).split() 
    402444        tags = set() 
    403445        for item in self.updateItems: 
     
    406448            if not hide: 
    407449                tags.update(item.tags) 
    408 #        self.lineEditFilter.setItems(sorted(tags, key=lambda tag: chr(1) + tag.lower() if strings and tag.lower().startswith(strings[-1].lower()) else tag.lower())) 
    409 #        self.tagsWidget.setText(", ".join(sorted(tags, key=lambda tag: chr(1) + tag.lower() if strings and tag.lower().startswith(strings[-1].lower()) else tag.lower()))) 
    410          
     450 
     451 
    411452if __name__ == "__main__": 
    412453    app = QApplication(sys.argv) 
Note: See TracChangeset for help on using the changeset viewer.