Changeset 5785 for MILK


Ignore:
Timestamp:
01/10/09 11:35:36 (10 years ago)
Author:
sdonegan
Message:

Additions to make default search all and generate sensible list of orderby fields

Location:
MILK/trunk/milk_server/milk_server/controllers/browse
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • MILK/trunk/milk_server/milk_server/controllers/browse/browserconstants.py

    r5489 r5785  
    77''' 
    88DISCOVERY_HOME_TITLE = "Discovery service search (Beta release)" 
     9DISCOVERY_HELP_EMAIL = "ceda@stfc.ac.uk" 
     10OAI_PROVIDER_PAGE = "http://ndg3beta.badc.rl.ac.uk/oai-info-editor/home" 
     11 
     12'''#ORDERBY_SENSIBLE_NAMES = {'textRelevance':'Text matches', 
     13                          'datasetOrder':'Dataset name', 
     14                          'dataCentre':'Data centre name', 
     15                          'datasetStartDate':'Dataset start date', 
     16                          'datasetEndDate':'Dataset end date',                           
     17                          'datasetLinkedPopularity':'Popularity of dataset by links followed', 
     18                          'datasetResultsetPopularity':'Number of times dataset included in other results', 
     19                          'proximity':'Proximity to centre of spatial search', 
     20                          'proximityNearMiss':'Results not in but within 10% of original AOI', 
     21                          'datasetUpdateOrder':'Date of most recent change to metadata', 
     22                          'discoveryIngestDate':'Date of ingest into DDS catalogue' 
     23                         }''' 
     24 
     25ORDERBY_SENSIBLE_NAMES = {'A.    Text matches':'textRelevance', 
     26                          'B.    Dataset name':'datasetOrder', 
     27                          'C.    Data centre name':'dataCentre', 
     28                          'D.    Dataset start date':'datasetStartDate', 
     29                          'E.    Dataset end date':'datasetEndDate',                           
     30                          'F.    Popularity of dataset by links followed':'datasetLinkedPopularity', 
     31                          'G.    Number of times dataset included in other results':'datasetResultsetPopularity', 
     32                          'H.    Proximity to centre of spatial search':'proximity', 
     33                          'I.    Results not in but within 10% of original AOI':'proximityNearMiss', 
     34                          'J.    Date of most recent change to metadata':'datasetUpdateOrder', 
     35                          'K.    Date of ingest into DDS catalogue':'discoveryIngestDate' 
     36                          } 
     37 
    938 
    1039# various error messages 
  • MILK/trunk/milk_server/milk_server/controllers/browse/discovery.py

    r5730 r5785  
    77from ndg.common.src.clients.xmldb.eXist.searchclient import SearchClient 
    88from ndg.common.src.clients.http.vocabserverclient import VocabServerClient as VS 
    9 from ndg.common.src.models.vocabtermdata import VocabTermData as VTD, VocabTermItem as VTI 
     9from ndg.common.src.models.vocabtermdata import VocabTermData as VTD 
    1010from ndg.common.src.models.ndgObject import ndgObject 
    1111from ndg.common.src.models.DIF import DIF 
    1212from ndg.common.src.lib.mailer import mailHandler 
    13 import ndg.common.src.lib.htmlUtilities as utils 
    1413from milk_server.lib.base import * 
    1514from milk_server.lib.Date import * 
     
    2928        '''  
    3029        Common setup for controller methods  
    31  
    32         ''' 
    33          
     30        ''' 
    3431        self.cf=request.environ['ndgConfig'] 
    3532        self.inputs=dict(parse_querystring(request.environ)) 
     
    3936         
    4037        c.discoveryUrl = h.url_for('discovery') 
     38                        
    4139     
    4240    def index(self): 
     
    4442        Main entry point for doing discovery searches 
    4543        ''' 
    46          
    4744        self.__setup() 
    4845         
     
    5148        # to what milk mode is set (i.e. editor/browse) 
    5249        if not self.inputs or 'ClearForm' in self.inputs: 
    53              
    5450            if g.discoveryEnabled: 
    5551                return self.__advancedPrompt() 
     
    6056        self.__getInputs() 
    6157 
     58         
    6259        if 'orderBy' not in self.inputs: 
    63            self.inputs['orderBy'] = 'title' 
    64             
    65         c.orderByList = h.options_for_select(g.orderByList, self.inputs['orderBy']) 
    66          
     60            self.inputs['orderBy'] = g.orderByList[0] 
     61             
     62             
     63        #get list of human readable values for orderbylist - uses webHelpers, so use dict in browserConstants.py to do this matching vals from getLists call. 
     64        #nb. webhelpers suck so no wuse own construct of option vals based on bc.ORDERBY_SENSIBLE_NAMES 
     65        orderSensibleNames = bc.ORDERBY_SENSIBLE_NAMES 
     66         
     67        orderSensibleNamesSorted = {} 
     68                
     69        sortedKeys = orderSensibleNames.keys() 
     70        sortedKeys.sort() 
     71        optionList=[] # do it myself. who needs webHelpers anyway. 
     72 
     73             
     74        for orderSel in sortedKeys: 
     75             
     76            if orderSensibleNames[orderSel] in g.orderByList: 
     77                
     78                #remember in webHelpers key is value to list, value is option value.. therefore need to swap 
     79                if self.inputs['orderBy'] == orderSensibleNames[orderSel]: 
     80                    optionList.append("<option selected=\"selected\" value=\"" + orderSensibleNames[orderSel] + "\">" + orderSel + "</option>") 
     81                else:            
     82                    optionList.append("<option value=\"" + orderSensibleNames[orderSel] + "\">" + orderSel + "</option>") 
     83                 
     84                 
     85                #python is useless when it comes to handling dictionaries - arbritrary sorting!  this sucks.  use java.  grrr. 
     86                orderSensibleNamesSorted[orderSel] = orderSensibleNames[orderSel] 
     87                 
     88            else: 
     89                 
     90                optionList.append("<option value=\"" + orderSel + "\">" + orderSel + "</option>")               
     91                orderSensibleNamesSorted[orderSel] = orderSel 
     92         
     93         
     94        
     95        #c.orderByList = h.options_for_select(g.orderByList, self.inputs['orderBy']) 
     96        #c.orderByList = h.options_for_select(kkk, self.inputs['orderBy'])         
     97        c.orderByList = optionList # see above comment on how much python sucks when it comes to dictionaries!  If you don't believe me uncomment above lines. 
     98 
    6799        if 'orderDirection' not in self.inputs: 
    68100            self.inputs['orderDirection'] = constants.ORDER_BY_DIRECTION[0] 
     101             
    69102        c.orderDirection = h.options_for_select(constants.ORDER_BY_DIRECTION, 
    70103                                                self.inputs['orderDirection'])  
     
    75108 
    76109        searchString = self.inputs['searchString'] 
    77                     
    78         if 'vocabTerm' in self.inputs: 
     110        if 'vocabTerm' in self.inputs and self.inputs['vocabTerm']: 
    79111            searchString += " %s" %self.inputs['vocabTerm'] 
    80112             
     
    88120        # ok, now go do the search 
    89121        try: 
    90  
    91122            return self.__runSearch(searchString, self.inputs['textTarget'], 
    92123                                    self.inputs['start'], self.inputs['howmany'],  
     
    193224                    c.inputErrors[bc.INVALID_BBOX_MESSAGE] = [] 
    194225                c.inputErrors[bc.INVALID_BBOX_MESSAGE].extend(errors) 
    195  
     226                 
    196227        #self.bbox = None 
    197          
    198                  
     228         
     229         
    199230        missingInputs = self.__checkform(['startDate', 'endDate']) 
    200231        self.dateRange = None 
     
    296327        # http://proj.badc.rl.ac.uk/ndg/ticket/984 
    297328        try: 
    298              
    299             publicOnly = not g.atomEditorEnabled 
    300              
    301329            searchClient.search(searchString, 
    302330                                start = start, 
     
    308336                                geoSearchType = geoSearch, 
    309337                                orderBy = orderBy, 
    310                                 publicOnly = publicOnly) 
    311                                  
     338                                orderDirection = orderDirection) 
    312339        except socket.error, e: 
    313340            logging.error("Socket error for discovery service search: %s" % e) 
     
    338365        @param ds: DiscoveryState object with info on the search 
    339366        ''' 
    340          
    341367        if searchClient.error: 
    342368            logging.error("Error encountered whilst running search: %s" %searchClient.error) 
     
    346372            c.xml = m 
    347373            return render('error') 
     374        
     375         
    348376         
    349377        hits = searchClient.hits 
     
    356384        errors = [] 
    357385 
    358         logging.debug ("atom target %s" % SearchClient.ATOM_TARGET) 
    359         ds.constraintsInstance['textTarget'] = 'Atom' 
    360         logging.debug ("atom target %s" % ds.constraintsInstance) 
    361          
    362386        if hits == 0 and ds.constraintsInstance['textTarget'] != SearchClient.ATOM_TARGET: 
    363387            outMessage = 'No records found for "%s"[constraints: %s]' \ 
     
    373397     
    374398                # now actually retrieve the search records 
     399                 
    375400                results = searchClient.getLabelledDocs(format='DIF') 
    376      
     401                                
     402                 
    377403                if not results: 
    378404                    c.xml='<p>No results for "%s"!</p>'%ds.searchString 
     405                    
    379406                else: 
    380                     for result in results:  
     407                    for result in results: 
     408                         
    381409                        obj=ndgObject(result[0], config = self.cf) 
    382410                        try: 
     411                             
    383412                            difs.append(DIF(result[1],ndgObj=obj)) 
     413                             
    384414                        except ValueError,e: 
     415                             
    385416                            errors.append((result[0], str(e))) 
    386417         
     
    446477        #defaults 
    447478        c.title = bc.DISCOVERY_HOME_TITLE 
     479        c.helpEmail = bc.DISCOVERY_HELP_EMAIL 
     480        c.oaiPage = bc.OAI_PROVIDER_PAGE 
    448481        c.bbox='90.0','-180.0','180.0','-90.0' 
    449         #c.bbox='','','','' 
     482        #c.bbox='','','','' 
    450483        c.startDate = '' 
    451484        c.endDate = '' 
     
    474507        # to add this explicitly here 
    475508        if 'source' not in self.inputs: 
    476             self.inputs['source'] = 'NERC_DDC' 
     509            self.inputs['source'] = 'All' 
    477510         
    478511        return self.savePageAndRender("browse/discovery_search", **self.inputs) 
     
    484517        @return: list of errors 
    485518        ''' 
    486          
    487519        errors = [] 
    488520         
     
    525557      
    526558        return None 
     559     
     560    def __sortedDictValues(self, dictionary): 
     561        ''' 
     562        Sort dictionary of values for ordering 
     563        ''' 
     564        keys = dictionary.keys() 
     565        keys.sort() 
     566         
     567        return [dictionary.get, keys] 
    527568 
    528569         
     
    604645        return toList 
    605646     
    606  
    607      
    608647    def __displayBrowseSearchResults(self, searchClient): 
    609648        '''  
     
    611650        @param searchClient: search client adhering to the ndg.common.clients.interfacesearchclient 
    612651        interface - which has just ran a search 
    613         '''      
     652        ''' 
    614653        c.results = searchClient.results 
    615654        c.searchTarget = self.inputs['searchTarget'] 
    616          
    617655        textTarget = self.inputs['textTarget'] 
    618656 
    619657        # check if we've done a search against atoms - NB, this should be the 
    620658        # default eventually - so we can remove all the alternative options 
    621         isAtom = True 
    622  
    623 #        if textTarget == SearchClient.ATOM_TARGET: 
    624 #           isAtom = True 
     659        isAtom = False 
     660        if textTarget == SearchClient.ATOM_TARGET: 
     661            isAtom = True 
    625662         
    626663        for r in c.results: 
    627  
    628664            id = r.id 
    629665                # cope with atom docs 
     
    636672        # filter atom docs according to publication state 
    637673        if isAtom: 
    638             c.searchTerm = " - for search term, '%s'" % self.inputs['searchString'] 
    639             c.searchString = self.inputs['searchString'] 
    640                      
     674            c.searchTerm = " - for search term, '%s'" %self.inputs['searchString'] 
    641675            if not g.atomEditorEnabled: 
    642676                c.results = self.__filterAtomResults(c.results) 
     
    660694        @param results: list of results as returned by SearchClient 
    661695        @return filteredResults: list of results with only published data included 
    662         '''              
     696        ''' 
    663697        logging.debug("Filtering results to remove non-published data") 
    664698        filteredResults = [] 
    665699        for result in results: 
    666700            if result.collection.find('ublished') == -1: 
    667                 logging.debug("- found non-published doc - ignoring id: %s" % result.id) 
     701                logging.debug("- found non-published doc - ignoring") 
    668702                continue 
    669703            filteredResults.append(result) 
Note: See TracChangeset for help on using the changeset viewer.