Changeset 8641 for mauRepo


Ignore:
Timestamp:
18/10/12 17:34:48 (7 years ago)
Author:
mnagni
Message:

Incomplete - # 22576: Filtering on Files in a particular Result returns all Files rather than a subset.
 http://team.ceda.ac.uk/trac/ceda/ticket/22576
Some small code cleaning

File:
1 edited

Legend:

Unmodified
Added
Removed
  • mauRepo/HPFos/trunk/hpfos/HPFos/osImpl/myimpl.py

    r8640 r8641  
    3131@author: Maurizio Nagni 
    3232''' 
    33 from datetime import datetime, date 
     33from datetime import datetime 
    3434from hpfos.libs.postgisutil import create_st_setSRID 
    3535from ceda_markup.opensearch.osquery import OSQuery 
     
    3939from ceda_markup.dc.dc import createDate 
    4040from ceda_markup.gml.gml import createBeginPosition, createEndPosition, \ 
    41     createTimePeriod, createValidTime, createEnvelope, createLowerCorner, \ 
    42     createUpperCorner, createPosList, createLinearRing, createExterior, \ 
    43     createPolygon, GML_NAMESPACE 
    44 from ceda_markup.georss.georss import createWhere 
     41    createTimePeriod, createValidTime, GML_NAMESPACE 
    4542from ceda_markup.atom.link import REL_SEARCH, REL_ALTERNATE, createLink 
    4643from ceda_markup.opensearch import filter_results, COUNT_DEFAULT, \ 
     
    5047from ceda_markup.opensearch.template.html import OSHTMLResponse 
    5148from sqlalchemy.orm.collections import InstrumentedList 
    52 from ea_model.iso_19108_2006_temporal_schema.temporal_objects.tm_instant \ 
    53     import TM_Instant 
    5449from ceda_markup.georss import create_where_from_postgis 
    5550from ea_model.ceda_metadatamodel.ceda_observationcollection.ceda_observationcollection \ 
     
    5752from ea_model.ceda_metadatamodel.ceda_observation.ceda_observation \ 
    5853    import CEDA_Observation 
    59 from ea_model.ceda_metadatamodel.ceda_result.ceda_result import CEDA_Result 
    6054from ceda_markup.opensearch.os_param import OSParam 
    6155from hpfos import __version__, __revision__ 
    6256from ceda_markup.atom.atom import ATOM_NAMESPACE 
    6357from hpfos.HPFos.osImpl.commons import get_document, get_xml_document, \ 
    64     from_pt_to_string, tm_InstantToDatetime, string_to_datetime 
     58    from_pt_to_string, string_to_datetime 
    6559from ceda_markup.opensearch.os_request import OS_NAMESPACE 
    6660from xml.etree.ElementTree import _ElementInterface 
     
    9286HPFOS_TITLE = 'Discovery feed for Search Services %s' % (HPFOS_ID) 
    9387 
    94  
     88def _append_valid_time(subresult, entry, atomroot,  
     89                       beginPosition, endPosition): 
     90    #xmlentry = entry.buildElement() 
     91    if beginPosition is not None: 
     92        beginPosition = createBeginPosition(root = atomroot,  
     93                                            body = subresult.beginPosition) 
     94    if endPosition is not None:                 
     95        endPosition = createEndPosition(root = atomroot,  
     96                                        body = subresult.endPosition)                 
     97    timePeriod = createTimePeriod(root = atomroot,  
     98                                  begin = beginPosition, end = endPosition)        
     99    validTime = createValidTime(root = atomroot, body = timePeriod) 
     100    if beginPosition is not None or endPosition is not None: 
     101        entry.append(validTime)  
     102 
     103def _extractTitle(cedaObj): 
     104    if hasattr(cedaObj, 'identifier'): 
     105        for ident in cedaObj.identifier: 
     106            if ident.authority.title == CEDA_TITLE: 
     107                return ident.code   
     108 
     109def generate_url_id(url, id = None): 
     110    if id is None: 
     111        return "%s/search" % (url) 
     112     
     113    return "%s/search/%s" % (url, id) 
     114 
     115def _new_extract_geographic_extent(result):         
     116    if not hasattr(result, 'geographicExtent') \ 
     117        or result.geographicExtent is None \ 
     118        or len(result.geographicExtent) == 0: 
     119        return None 
     120     
     121    ge = result.geographicExtent[0] 
     122    if not isinstance(ge, EX_GeographicBoundingBox): 
     123        return 
     124 
     125    return _create_box2d('%s %s' % (ge.southBoundLatitude, ge.westBoundLongitude),  
     126                         '%s %s' % (ge.northBoundLatitude, ge.eastBoundLongitude)) 
    95127 
    96128class MyOSAtomResponse(OSAtomResponse): 
     
    100132 
    101133    def __init__(self): 
    102         #query_params = {"q": "searchTerms", "pw":"startPage"} 
    103134        super(MyOSAtomResponse, self).__init__() 
    104          
    105         ''' 
    106         Constructor 
    107         ''' 
    108135     
    109136    def _digest_fatcat_atom_(self, context, results): 
     
    194221                      subresult = subresults, title=HPFOS_TITLE)   
    195222        '''       
    196          
    197     def _check_text_filter(self, text, title, description): 
    198         words = text.split() 
    199         for word in words: 
    200             if word in title \ 
    201                 or word in description: 
    202                     return True 
    203         return False 
    204  
    205     def _check_start_filter(self, startTime, phenomenonTime): 
    206         pt = phenomenonTime 
    207         if isinstance(phenomenonTime, list): 
    208             if len(phenomenonTime) == 0: 
    209                 return True 
    210             pt = phenomenonTime[0] 
    211            
    212         if isinstance(pt, TM_Instant): 
    213             pt = tm_InstantToDatetime(pt)     
    214         elif hasattr(pt, 'begin'): 
    215             pt = tm_InstantToDatetime(pt.begin) 
    216              
    217         if isinstance(pt, datetime) and isinstance(startTime, date): 
    218             return pt.date() > startTime 
    219         if isinstance(pt, date) and isinstance(startTime, datetime): 
    220             return pt > startTime.date()    
    221         return pt > startTime      
    222          
    223     def _check_end_filter(self, endTime, phenomenonTime):  
    224         pt = phenomenonTime 
    225         if isinstance(phenomenonTime, list): 
    226             if len(phenomenonTime) == 0: 
    227                 return True 
    228             pt = phenomenonTime[0] 
    229  
    230         if isinstance(pt, TM_Instant): 
    231             pt = tm_InstantToDatetime(pt)     
    232         elif hasattr(pt, 'end'): 
    233             pt = tm_InstantToDatetime(pt.end) 
    234          
    235         if isinstance(pt, datetime) and isinstance(endTime, date): 
    236             return endTime < pt.date() 
    237         if isinstance(pt, date) and isinstance(endTime, datetime): 
    238             return endTime.date() < pt              
    239         return endTime < pt 
    240223 
    241224    def apply_query_params(self, context, results): 
     
    251234            if result_guid is None: 
    252235                continue 
    253             ititle = self._extractTitle(result) 
     236            ititle = _extractTitle(result) 
    254237 
    255238            kwargs = {} 
     
    263246             
    264247            #------------------------ 
    265             kwargs['geometry'] = self._new_extract_geographic_extent(result) 
     248            kwargs['geometry'] = _new_extract_geographic_extent(result) 
    266249            #------------------------                 
    267250 
     
    306289            instances = results.member 
    307290        elif type(results) == tuple: 
    308             ids = [id[0] for id in results[1]]  
     291            ids = [iid[0] for iid in results[1]]  
    309292            instances = context['moles3EPB'].get_instance_by_ids(ids) 
    310293            try: 
     
    328311        return Result(count, start_index, start_page, tot_results, \ 
    329312                      subresult = subresults, title=HPFOS_TITLE) 
    330  
    331     def _new_extract_geographic_extent(self, result):         
    332         if not hasattr(result, 'geographicExtent') \ 
    333             or result.geographicExtent is None \ 
    334             or len(result.geographicExtent) == 0: 
    335             return None 
    336          
    337         ge = result.geographicExtent[0] 
    338         if not isinstance(ge, EX_GeographicBoundingBox): 
    339             return 
    340  
    341         return _create_box2d('%s %s' % (ge.southBoundLatitude, ge.westBoundLongitude),  
    342                              '%s %s' % (ge.northBoundLatitude, ge.eastBoundLongitude)) 
    343                                      
    344  
    345  
    346  
    347     def _extract_geographic_extent(self, result):         
    348         if not hasattr(result, 'geographicExtent') \ 
    349             or result.geographicExtent is None \ 
    350             or len(result.geographicExtent) == 0: 
    351             return None, None 
    352          
    353         ge = result.geographicExtent[0] 
    354         if not isinstance(ge, EX_GeographicBoundingBox): 
    355             return 
    356          
    357         #returns lowerCorner, upperCorner 
    358         return [ge.southBoundLatitude, ge.westBoundLongitude], \ 
    359                                 [ge.northBoundLatitude, ge.eastBoundLongitude] 
    360          
    361313         
    362314    def generateEntryLinks(self, entry, atomroot, path, params_model, context): 
     
    371323                                           rel = REL_SEARCH))                 
    372324 
    373     def _generate_url_id(self, url, id = None): 
    374         if id is None: 
    375             return "%s/search" % (url) 
    376          
    377         return "%s/search/%s" % (url, id) 
    378  
    379325    def generate_url(self, osHostURL, context): 
    380         return self._generate_url_id(osHostURL, context.get('guid'))   
     326        return generate_url_id(osHostURL, context.get('guid'))   
    381327 
    382328    def generate_entries(self, atomroot, subresults, path, params_model, context): 
     
    392338        for subresult in subresults:  
    393339            #Here could loop over results 
    394             entry_path = self._generate_url_id(path, subresult.id) 
     340            entry_path = generate_url_id(path, subresult.id) 
    395341            atomID = createID(entry_path + '/' + self.extension, root = atomroot) 
    396342            ititle = createTitle(root = atomroot,  
     
    416362            if hasattr(subresult, 'endPosition') and subresult.endPosition is not None:                 
    417363                endPosition = subresult.endPosition  
    418             self._append_valid_time(subresult, entry, atomroot, beginPosition, endPosition)             
     364            _append_valid_time(subresult, entry, atomroot, beginPosition, endPosition)             
    419365             
    420366            idate = createDate(root = atomroot,  
     
    444390            atomroot.append(entry)  
    445391 
    446     def _append_where(self, geometry, entry, atomroot): 
    447         if geometry.startswith('BOX2D('): 
    448             lc, uc = geometry[6:-1].split(',') 
    449             lowerCorner = createLowerCorner(atomroot, values = lc) 
    450             upperCorner = createUpperCorner(atomroot, values = uc) 
    451             where_body = createEnvelope(lowerCorner, upperCorner, atomroot) 
    452         elif geometry.startswith('POLYGON(('): 
    453             posList = createPosList(root = atomroot,  
    454                                         values = [float(val) for val  
    455                                                   in geometry[9:-2]. 
    456                                                   replace(',', ' ').split()],  
    457                                         srsDimension = '2') 
    458             linearRing = createLinearRing(root = atomroot, body = posList) 
    459             exterior = createExterior(root = atomroot, body = linearRing) 
    460             where_body = createPolygon(root = atomroot, exterior = exterior) 
    461         where = createWhere(root = atomroot, body = where_body) 
    462         entry.append(where) 
    463  
    464     def _append_valid_time(self, subresult, entry, atomroot,  
    465                            beginPosition, endPosition): 
    466         #xmlentry = entry.buildElement() 
    467         if beginPosition is not None: 
    468             beginPosition = createBeginPosition(root = atomroot,  
    469                                                 body = subresult.beginPosition) 
    470         if endPosition is not None:                 
    471             endPosition = createEndPosition(root = atomroot,  
    472                                             body = subresult.endPosition)                 
    473         timePeriod = createTimePeriod(root = atomroot,  
    474                                       begin = beginPosition, end = endPosition)        
    475         validTime = createValidTime(root = atomroot, body = timePeriod) 
    476         if beginPosition is not None or endPosition is not None: 
    477             entry.append(validTime)  
    478  
    479392    def _importCountAndPage(self, context):         
    480393        count = COUNT_DEFAULT 
     
    498411         
    499412        return count, start_index, start_page 
    500  
    501     def _extractTitle(self, cedaObj): 
    502         if hasattr(cedaObj, 'identifier'): 
    503             for ident in cedaObj.identifier: 
    504                 if ident.authority.title == CEDA_TITLE: 
    505                     return ident.code   
    506413 
    507414class MyOSHTMLResponse(OSHTMLResponse): 
Note: See TracChangeset for help on using the changeset viewer.