Changeset 5305


Ignore:
Timestamp:
19/05/09 11:23:47 (10 years ago)
Author:
cbyrom
Message:

Improve structure of DiscoveryState? module by adding a new object,
PagerState? to hold the data connected to the results table paging.
Also tidy up code layout and simplify logic. Create new template
method, pagerControl, to represent the results table paging control

  • to allow reuse across the results and short_results templates.
Location:
MILK/trunk/milk_server/milk_server
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • MILK/trunk/milk_server/milk_server/lib/Utilities.py

    r5302 r5305  
    11import urllib, logging 
    2 from milk_server.lib.base import * 
    32from ndg.common.src.clients.xmldb.eXist.atomclient import AtomClient 
    43 
     
    98    logging.info("Setting up eXist client to provider, '%s'" %providerID) 
    109    # firstly check if there is a current connection available 
     10    from milk_server.lib.base import g, request 
    1111    eXistClient = g.eXistDBCons.get(providerID) 
    1212    if eXistClient: 
  • MILK/trunk/milk_server/milk_server/models/DiscoveryState.py

    r5302 r5305  
    22from milk_server.lib.Utilities import getURLConstraints 
    33import cgi,urllib 
     4 
     5     
     6def getURLFormattedConstraints(environ, **kw): 
     7    '''  
     8    Get the constraints in a url friendly string - modified by the keyword arguments  
     9    offset and stride which are to be part of the querystring 
     10    @param environ: wsgi environ object 
     11    @return constraints in a url friendly string  
     12    ''' 
     13    args = dict(parse_querystring(environ)) 
     14 
     15    constrained = kw.get('constrained') 
     16    if not constrained: 
     17        offset, stride = kw.get('offset'), kw.get('stride') 
     18        if offset: 
     19            args['start'] = offset 
     20        if stride: 
     21            args['howmany'] = stride 
     22 
     23    q = '' 
     24    for i in args: 
     25        # NB, the constraints may already be encoded as a hidden variable 
     26        if i != 'constraints': 
     27            q+='%s=%s&'%(i,args[i]) 
     28 
     29    # add constraints last to avoid duplicate params - NB, constraint params 
     30    # can be overridden by direct inputs to the page 
     31    if 'constraints' in args: 
     32        constraints = getURLConstraints(args['constraints']) 
     33        for key, val in constraints.items(): 
     34            if key not in args: 
     35                q+='%s=%s&'%(key, val) 
     36 
     37    return q[0:-1] 
     38 
     39 
     40def getURL(environ, **kw): 
     41    '''  
     42    Get a url from the wsgi environment 
     43    @param environ: wsgi environ object 
     44    @return url with constraints added from wsgi environ 
     45    ''' 
     46    constraints = getURLFormattedConstraints(environ, **kw) 
     47    return urllib.quote(environ.get('SCRIPT_NAME','')) + \ 
     48        urllib.quote(environ.get('PATH_INFO','')) + '?' + constraints 
     49 
    450 
    551class constraints: 
     
    5298 
    5399 
     100class PagerState: 
     101    ''' 
     102    Object to hold the current page state of the displayed results - e.g. which 
     103    page number and how many records, before and after those displayed, are available 
     104    ''' 
     105     
     106    def __init__(self, hits, environ, offset=1, stride=10): 
     107        ''' 
     108        Initialise PagerState object 
     109        @param hits: total number of records available to view 
     110        @param environ: wsgi environ object     
     111        @keyword offset: offset being used in the currently displayed record set 
     112        - i.e. the array number of the topmost record displayed. Default = 1 
     113        @keyword stride: Number of records currently visible.  Default = 10 
     114        ''' 
     115        self.hits = hits 
     116        self.offset = offset 
     117        self.stride = stride 
     118 
     119        self.previousPageURL = None 
     120        self.previousNumber = None 
     121        self.startPageURL = None 
     122        self.nextPageURL = None 
     123        self.nextNumber = None 
     124        self.lastPageURL = None 
     125         
     126        n, p = self.getNext() 
     127        start, end = "", "" 
     128        if p: 
     129            self.previousPageURL = getURL(environ, offset = p[0], stride = p[1]) 
     130            self.previousNumber = p[1] 
     131            self.startPageURL = getURL(environ, offset = 1) 
     132        if n: 
     133            self.nextPageURL = getURL(environ, offset = n[0], stride = n[1]) 
     134            self.nextNumber = n[1] 
     135            off = self.hits - 10 
     136            if off < 0: 
     137                off = 0 
     138            self.lastPageURL = getURL(environ, offset = off) 
     139             
     140        self.upperRange = self.offset + self.stride - 1 
     141        self.lowerRange = self.offset 
     142         
     143     
     144    def getNext(self): 
     145        '''  
     146        Get info on what number of records are available on current page 
     147        @return result - list with format [[offSetForNextPage, numberOfRecordsOnNextPage], 
     148                                           [offSetForLastPage, numberOfRecordsOnLastPage]] 
     149        ''' 
     150        result=[] 
     151        defStride=10 
     152        if self.offset+self.stride < self.hits: 
     153            #there are more to look at 
     154            r = [self.offset+self.stride, self.stride] 
     155            if r[0]+r[1]-1 > self.hits:  
     156                r[1] = self.hits+1-r[0] 
     157            result.append(r) 
     158        else: 
     159            result.append([]) 
     160             
     161        if self.offset > 1: 
     162            #there are previous records 
     163            b = max(self.stride, defStride) 
     164            r = [self.offset-b,b] 
     165            if r[0] < 1:  
     166                r[0] = 1 
     167            if r[1] > self.hits:  
     168                r[1] = self.hits 
     169            result.append(r) 
     170        else:  
     171            result.append([]) 
     172        return result 
     173         
     174     
     175 
    54176class DiscoveryState: 
    55177    ''' This class holds the state associated with a search (including presenting multiple slices 
     
    63185        self.constraintsInstance=constraints 
    64186        self.constraints=str(constraints) # some text to show constraints on search 
    65         self.urlformattedconstraints = self.__getURLFormattedConstraints() 
     187        self.urlformattedconstraints = getURLFormattedConstraints(self.environ) 
    66188        self.sessID=sessionID 
    67189        self.hits=hits 
    68         self.offset=offset 
    69         self.stride=stride 
     190 
    70191        self.searchString=searchString 
    71192        self.alternatives=None 
    72         self.constrainedurl=self.geturl(constrained=1)+'&constrained' 
    73  
    74      
    75     def __getURLFormattedConstraints(self,**kw): 
    76         '''  
    77         Get the constraints in a url friendly string - modified by the keyword arguments  
    78         offset and stride which are to be part of the querystring  
    79         ''' 
    80         args = dict(parse_querystring(self.environ)) 
    81         offset, stride= kw.get('offset'), kw.get('stride') 
    82         if offset is not None: 
    83             args['start']=offset 
    84         if stride is not None: 
    85             args['howmany']=stride 
    86  
    87         constrained=kw.get('constrained') 
    88         if constrained is not None: 
    89             if 'start' in args:  
    90                 del args['start'] 
    91             if 'howmany' in args:  
    92                 del args['howmany'] 
    93  
    94         q = '' 
    95         for i in args: 
    96             # NB, the constraints may already be encoded as a hidden variable 
    97             if i != 'constraints': 
    98                 q+='%s=%s&'%(i,args[i]) 
    99  
    100         # add constraints last to avoid duplicate params - NB, constraint params 
    101         # can be overridden by direct inputs to the page 
    102         if i == 'constraints': 
    103             constraints = getURLConstraints(args[i]) 
    104             for key, val in constraints.items(): 
    105                 if key not in args: 
    106                     q+='%s=%s&'%(key, val) 
    107  
    108         return q[0:-1] 
    109  
    110      
    111     def geturl(self,**kw): 
    112         '''  
    113         Get a url from the wsgi environment 
    114         ''' 
    115         constraints = self.__getURLFormattedConstraints(**kw) 
    116         return urllib.quote(self.environ.get('SCRIPT_NAME','')) + \ 
    117             urllib.quote(self.environ.get('PATH_INFO','')) + '?' + constraints 
    118  
    119      
    120     def getNext(self): 
    121         '''  
    122         Get info on what number of records are available on current page 
    123         @return result - list with format [[offSetForNextPage, numberOfRecordsOnNextPage], 
    124                                            [offSetForLastPage, numberOfRecordsOnLastPage]] 
    125         ''' 
    126         result=[] 
    127         defStride=10 
    128         if self.offset+self.stride < self.hits: 
    129             #there are more to look at 
    130             r = [self.offset+self.stride, self.stride] 
    131             if r[0]+r[1]-1>self.hits:  
    132                 r[1] = self.hits+1-r[0] 
    133             result.append(r) 
    134         else: 
    135             result.append([]) 
    136              
    137         if self.offset > 1: 
    138             #there are previous records 
    139             b=max(self.stride, defStride) 
    140             r=[self.offset-b,b] 
    141             if r[0]<1:  
    142                 r[0]=1 
    143             if r[1]>self.hits:  
    144                 r[1]=self.hits 
    145             result.append(r) 
    146         else:  
    147             result.append([]) 
    148         return result 
     193        self.constrainedurl = getURL(self.environ, constrained=1)+'&constrained' 
     194        self.pager = PagerState(hits, self.environ, offset=offset, stride=stride) 
    149195         
    150196    def __str__(self): 
  • MILK/trunk/milk_server/milk_server/templates/browse/results.kid

    r5303 r5305  
    1818                </div></div> 
    1919            </div> 
    20             <?python 
    21             n,p=c.state.getNext() 
    22             if p: 
    23                 purl=c.state.geturl(offset=p[0],stride=p[1]) 
    24             if n: 
    25                 nurl=c.state.geturl(offset=n[0],stride=n[1]) 
    26             upper=c.state.offset+c.state.stride-1 
    27             ?> 
    28             <div class="resultsBar">  
    29                 <div> 
    30                     <form action="$c.discoveryUrl" name="orderByForm"> 
    31                                 <input type="hidden" name="constraints" value="${c.state.urlformattedconstraints}"/> 
    32                     <a href="${c.state.constrainedurl}"> Refine search</a><span py:replace="helpIcon('refser_help')"/> 
    33                     <span py:if="c.state.hits != 0" py:strip="">  
    34                                 | Order By ${XML(h.select('orderBy',option_tags = c.orderByList, onchange="orderByForm.submit()"))} 
    35                                 ${XML(h.select('orderDirection',option_tags = c.orderDirection, onchange="orderByForm.submit()"))} 
    36                         | Found ${c.state.hits}  
    37                             <span py:if="p!=[]"> | <a href="$purl"> Previous ${p[1]}</a> </span> 
    38                                                 | Showing ${c.state.offset}-$upper  
    39                         <span py:if="n!=[]"> | <a href="$nurl"> Next ${n[1]}</a></span> 
    40                      </span> 
    41                             </form> 
    42                 </div><div id="refser_help" class="hidden"> 
    43                     <div class="helptxt"><p> 
    44                     The refined search option allows you to constrain your search by returning you to the advanced search page, but retaining your current search parameters 
    45                     </p></div> 
    46                 </div> 
    47             </div> 
     20                <div py:replace="pageControl(c.state, c.discoveryUrl)"/> 
    4821            <div py:if="c.state.hits != 0" id="resultsTab"> 
    4922                <table> 
     
    6033                    </tbody>  
    6134                </table> 
    62             </div> 
    63             <div py:if="c.state.hits != 0" class="resultsBar"> 
    64                 <a href="${c.state.constrainedurl}"> Refine search</a>  
    65                 | Order By | 
    66                 | Found ${c.state.hits} | Showing ${c.state.offset}-$upper  
    67                   <span py:if="p!=[]"> | <a href="$purl"> Previous ${p[1]}</a> </span> 
    68                   <span py:if="n!=[]"> | <a href="$nurl"> Next ${n[1]}</a></span> | 
     35                        <div py:replace="pageControl(c.state, None)"/> 
    6936            </div> 
    7037        </div> 
  • MILK/trunk/milk_server/milk_server/templates/browse/short_results.kid

    r4979 r5305  
    1717                ${c.state.hits} results for ${c.state.searchString} (${XML(c.state.constraints)})</div> 
    1818            <div id="SemanticSearchBox"/> 
    19              
    20             <?python 
    21             n,p=c.state.getNext() 
    22             if p!=[]:purl=c.state.geturl(offset=p[0],stride=p[1]) 
    23             if n!=[]:nurl=c.state.geturl(offset=n[0],stride=n[1]) 
    24             upper=c.state.offset+c.state.stride-1 
    25             ?> 
    2619            <div class="resultsBar">  
    2720                 <div class="resultsLeft"> 
     
    3023                    <span py:replace="helpIcon('semser_help')"/> 
    3124                 </div> 
    32                  <div> 
    33                  <a href="${c.state.constrainedurl}"> Refine Search</a><span py:replace="helpIcon('refser_help')"/> 
    34                 | Found ${c.state.hits} | Showing ${c.state.offset}-$upper  
    35                   <span py:if="p!=[]"> | <a href="$purl"> Previous ${p[1]}</a> </span> 
    36                   <span py:if="n!=[]"> | <a href="$nurl"> Next ${n[1]}</a></span> | </div> 
     25                        <div py:replace="pageControl(c.state, c.discoveryUrl)"/> 
    3726                <div id="semser_help" class="hidden"> 
    3827                    <div class="helptxt"><p> 
    3928                    The semantic search option allows you to see how many hits a search using your current parameters would return if you 
    4029                    used a slightly different vocabulary in your search term. 
    41                     </p></div> 
    42                 </div> 
    43                 <div id="refser_help" class="hidden"> 
    44                     <div class="helptxt"><p> 
    45                     The refined search option allows you to constrain your search by returning you to the advanced search page, but retaining your current search parameters 
    4630                    </p></div> 
    4731                </div> 
     
    5640                </table> 
    5741            </div> 
    58             <div class="resultsBar"> 
    59                 <a href="${c.state.constrainedurl}"> Refine search</a>  
    60                 | Found ${c.state.hits} | Showing ${c.state.offset}-$upper  
    61                   <span py:if="p!=[]"> | <a href="$purl"> Previous ${p[1]}</a> </span> 
    62                   <span py:if="n!=[]"> | <a href="$nurl"> Next ${n[1]}</a></span> | 
    63             </div> 
     42                <div py:replace="pageControl(c.state, None)"/> 
    6443        </div> 
    6544        <div py:replace="footer()"/> 
  • MILK/trunk/milk_server/milk_server/templates/ndgPage.kid

    r5116 r5305  
    1919        <div id="logo"><img src="$g.LeftLogo" alt="$g.LeftAlt" /></div> 
    2020    </div> 
     21 
     22    <div py:def="pageControl(state, discoveryURL)" class="resultsBar"> 
     23    <!-- NB, can only have one main page control on the page since it has a form and 
     24    help div associated with it - for the main control, set the discoveryURL to a valid 
     25    value, otherwise set to None 
     26    --> 
     27            <div> 
     28                <?python 
     29                formID = "xyz" 
     30                if discoveryURL: 
     31                        formID = "orderByForm" 
     32                ?> 
     33                <form action="$discoveryURL" name="$formID"> 
     34                <input type="hidden" name="constraints" value="${state.urlformattedconstraints}"/> 
     35                <a href="${state.constrainedurl}"> Refine search</a><span py:replace="helpIcon('refser_help')"/> 
     36                <span py:if="state.hits != 0" py:strip="">  
     37                        <span py:if="discoveryURL" py:strip=""> 
     38                            | Order By ${XML(h.select('orderBy',option_tags = c.orderByList, onchange="orderByForm.submit()"))} 
     39                        ${XML(h.select('orderDirection',option_tags = c.orderDirection, onchange="orderByForm.submit()"))} 
     40                    </span> 
     41                        | Found ${state.hits}  
     42                    <span py:if="state.pager.previousPageURL"> | <a href="$state.pager.startPageURL"> &lt;&lt; </a> 
     43                    | <a href="$state.pager.previousPageURL"> Previous ${state.pager.previousNumber}</a> </span> 
     44                                | Showing ${state.pager.lowerRange}-${state.pager.upperRange}  
     45                    <span py:if="state.pager.nextPageURL"> | <a href="$state.pager.nextPageURL"> Next ${state.pager.nextNumber}</a> 
     46                    | <a href="$state.pager.lastPageURL"> &gt;&gt; </a></span> 
     47                 </span> 
     48                </form> 
     49            </div> 
     50            <div py:if="discoveryURL" id="refser_help" class="hidden"> 
     51                <div class="helptxt"><p> 
     52                The refined search option allows you to constrain your search by returning you to the advanced search page, but retaining your current search parameters 
     53                </p></div> 
     54            </div> 
     55        </div> 
    2156     
    2257    <!-- One line search box for top of many pages follows --> 
    23      
    2458    <div py:def="searchOneLine(targets=0)" class="searchBar"> 
    2559        <table width="100%"><tr><td align="left"> 
Note: See TracChangeset for help on using the changeset viewer.