Ignore:
Timestamp:
25/09/08 15:31:18 (11 years ago)
Author:
cbyrom
Message:

Add 'create atom' page - to create the 'header' info for the input data +
create home page + start a new controller for list/search purposes.
Extend ndgInterface to allow specification of whether cache is used or
not - NB, this causes problems when editing/updating docs since the
original was always being reloaded from the cache.

Location:
TI05-delivery/ows_framework/trunk/ows_server/ows_server
Files:
3 added
5 edited

Legend:

Unmodified
Added
Removed
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/config/routing.py

    r4232 r4237  
    3737    map.connect('editAtom/:uri', controller = 'editatom', action='edit') 
    3838    map.connect('saveAtom', controller = 'editatom', action='saveAtom') 
     39    map.connect('createAtom/:saveData', controller = 'editatom', action='create') 
     40    map.connect('createAtom', controller = 'editatom', action='create') 
     41    map.connect('atomHome', controller = 'listatom', action='atomHome') 
     42    map.connect('listAtom', controller = 'listatom', action='list') 
    3943 
    4044     
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/controllers/editatom.py

    r4232 r4237  
    1  
     1''' 
     2 Class representing pylons controller for the creation and editing of atom 
     3 data  
     4   
     5 @author: C Byrom, Tessella Sep 2008 
     6''' 
    27from ows_server.lib.base import * 
    38from ows_server.models import Utilities 
    49from ndgUtils import ndgObject 
    510from paste.request import parse_querystring 
    6 from ows_server.models import stubB,DIF 
    711from ows_server.lib import mailer 
    812from ows_server.lib.ndgInterface import interface  
     
    1418from genshi import HTML 
    1519import ndgUtils.models.existdbclient as edc 
     20from ndgUtils.models.MolesEntity import MolesEntity as ME 
     21from ndgUtils.vocabtermdata import VocabTermData as VTD 
    1622 
    1723class AtomFormSchema(Schema): 
     
    2430    title = validators.UnicodeString(not_empty=True) 
    2531 
     32class CreateAtomFormSchema(Schema): 
     33    def __init__(self): 
     34        logging.debug("Setting up CreateAtomFormSchema") 
     35         
     36    filter_extra_fields = True 
     37    allow_extra_fields = True 
     38    title = validators.UnicodeString(not_empty=True) 
     39    providerID = validators.UnicodeString(not_empty=True) 
     40    atomTypeID = validators.UnicodeString(not_empty=True) 
     41 
    2642 
    2743class EditatomController(BaseController): 
     
    2945    Provides the pylons controller for editing NDG Atom documents. 
    3046    ''' 
    31     def __setup(self,uri): 
     47    def __setup(self,uri=None): 
    3248        ''' Common setup stuff for all the actions on this controller ''' 
    3349        logging.info("Setting up EditatomController") 
    3450        self.cf=request.environ['ndgConfig'] 
    35         try: 
    36             self.ndgObject = ndgObject(uri, config=self.cf.config) 
    37         except ValueError,e: 
    38             return e 
     51         
     52        if uri: 
     53            try: 
     54                self.ndgObject = ndgObject(uri, config=self.cf.config) 
     55            except ValueError,e: 
     56                return e 
    3957 
    4058        self.inputs=dict(parse_querystring(request.environ)) 
     
    4260        logging.info("EditatomController set up") 
    4361        return 0 
     62     
    4463     
    4564    @validate(schema=AtomFormSchema(), form='saveAtom') 
     
    86105     
    87106    @validate(schema=AtomFormSchema(), form='edit') 
    88     def edit(self,uri,saveData=0, **data): 
     107    def edit(self, uri, saveData=0, **data): 
    89108        '''  
    90109        Edit the specified uri 
     
    92111        logging.info("Setting up atom edit template") 
    93112        c.errors = {} 
    94         status=self.__setup(uri) 
     113        status=self.__setup(uri=uri) 
    95114        if status: 
    96115            c.xml='<p>%s</p>'%status  
     
    99118 
    100119        logging.info("Retrieving document to edit") 
    101         status,x=interface.GetXML(uri) 
     120        # NB, don't use the cache as docs are likely to change 
     121        # quite a lot during editing; ensure you've always got  
     122        # the latest updates loaded 
     123        status,x=interface.GetXML(uri, useCache=False) 
    102124 
    103125        if not status: 
     
    112134        c.title='Editing [%s]'%self.ndgObject 
    113135        inputs = request.params 
    114         logging.info("Input params, '%s'" %inputs) 
     136        logging.debug("Input params, '%s'" %inputs) 
    115137 
    116138        # NB, passing in the inputs will overwrite any original values with the 
     
    118140        c.atom = Atom(xmlString=str(x), ndgObject = self.ndgObject, **dict(inputs)) 
    119141 
    120         c.subTypes = self.__getDropdown(c.atom.subtype, c.atom.getValidSubTypes()) 
     142        c.subTypes = self.__getDropdown(VTD().getValidSubTypes(c.atom.atomTypeID), \ 
     143                                        selected=c.atom.subtype) 
    121144 
    122145        if saveData: 
    123             logging.info("Saving changes to data") 
    124             logging.debug(type(inputs)) 
    125              
    126             self.existHost = self.cf.get('NDG_EXIST', self.ndgObject.repository) 
    127              
    128             self.configFile = self.cf.get('NDG_EXIST','passwordFile') 
    129  
    130             self.eXist = edc.eXistDBClient(eXistDBHostname = self.existHost, \ 
    131                                            configFile = self.configFile) 
    132              
    133              
    134             self.eXist.createAtomInExist(c.atom) 
    135             logging.info("Changes successfully saved to eXist") 
     146            self.saveAtomToExist(c.atom) 
     147                         
    136148            #form = AtomFormSchema() 
    137149            #validData = form.to_python(data) 
     
    140152            #if validData: 
    141153            #    link = Atom(**validData) 
     154             
     155            # if we're dealing with an expandable text input, re-render this now 
     156            if int(saveData) > 1: 
     157                logging.debug("Doing a partial re-render") 
     158                c.key=request.params['key'] 
     159                c.default=request.params[c.key] 
     160                logging.debug(c.key) 
     161                logging.debug(c.default) 
     162                 
     163 
     164                c.blkfrag=1 
     165                return render("genshi", 'utils', fragment=True) 
    142166         
    143167 
     
    161185 
    162186 
    163     def __getDropdown(self, currentVal, list): 
     187    def saveAtomToExist(self, atom): 
     188        ''' 
     189        Save the specified atom in eXist 
     190        @param atom: atom object to save to eXist 
     191        @return atom: atom object saved in eXist 
     192        ''' 
     193        logging.info("Saving changes to eXist") 
     194        # lookup the eXist DB to use according to the provider ID for the  
     195        # data - NB, this is specified in the ndgDiscovery.config file 
     196        self.existHost = self.cf.get('NDG_EXIST', atom.ME.providerID) 
     197        self.configFile = self.cf.get('NDG_EXIST','passwordFile') 
     198        self.eXist = edc.eXistDBClient(eXistDBHostname = self.existHost, \ 
     199                                       configFile = self.configFile) 
     200        createdAtom = self.eXist.createAtomInExist(atom) 
     201        logging.info("Changes successfully saved to eXist") 
     202        return createdAtom 
     203         
     204     
     205    @validate(schema=CreateAtomFormSchema(), form='create') 
     206    def create(self, saveData = 0, **inputs): 
     207        '''  
     208        Create a new atom 
     209        ''' 
     210        logging.debug("--------------------------%s--------------------" %saveData) 
     211        if saveData: 
     212            logging.info("Creating basic atom") 
     213            self.__setup() 
     214            inputs = request.params 
     215            logging.debug("Input params, '%s'" %inputs) 
     216            atom = self.saveAtomToExist(Atom(**dict(inputs))) 
     217            h.redirect_to (controller = 'editatom', action='edit', \ 
     218                           uri = atom.ndgURI, saveData = 0) 
     219             
     220        logging.info("Setting up atom create template") 
     221        c.errors = {} 
     222        c.title='Create new atom' 
     223         
     224        # set up the drop down content 
     225        vocabData = VTD() 
     226        c.atomTypes = self.__getDropdown(vocabData.getValidTypes(vocabData.ATOM_CATEGORY)) 
     227        c.providerIDs = self.__getDropdown(vocabData.getValidTypes(vocabData.PROVIDER_CATEGORY)) 
     228 
     229        try: 
     230            return render("genshi", 'atom_creator') 
     231 
     232        except Exception, e: 
     233            #we may be showing an xml document ... but it could go wrong if 
     234            #we have crap content ... 
     235            c.xml='Unexpected error loading page [%s]' %str(e) 
     236            c.doc='' 
     237            logging.error(c.xml) 
     238         
     239        response.status_code = 400 
     240        return render('error') 
     241 
     242 
     243    def __getDropdown(self, list, selected=None): 
    164244        '''  
    165245        Gets a dropdown option list suitable for use in the h.select helper 
    166         @param currentVal: the value currently selected 
    167246        @param list: list of VocabTermItems 
    168         ''' 
    169         logging.debug("Setting up drop down list for data (current val:'%s')" %currentVal) 
     247        @keyword selected: the value currently selected 
     248        ''' 
     249        logging.debug("Setting up drop down list for data") 
     250        if selected: 
     251            logging.debug("(current val:'%s')" %selected) 
    170252        r='' 
    171253        for val in list: 
    172254            default='' 
    173             if val.termID == currentVal: 
     255            if selected and val.termID == selected: 
    174256                default='selected="selected"' 
    175257            r+='<option value="%s" %s>%s</option>'%(val.termID, default, \ 
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/lib/ndgInterface.py

    r4188 r4237  
    108108         
    109109 
    110     def GetXML(self,uri,outputSchema=''): 
    111         ''' This method provides a secure interface to the server 
     110    def GetXML(self,uri,outputSchema='', useCache=True): 
     111        '''  
     112        This method provides a secure interface to the server 
    112113        document cache and a remote NDG exist. It is assumed that 
    113114        the local filesystem is protected in that you can't get to 
    114         files except via the CSML api ''' 
     115        files except via the CSML api 
     116        @param uri: ndg format uri to locate doc from 
     117        @keyword outputSchema: format to return doc in 
     118        @keyword useCache: check for data in the cache and use this, if set to 
     119        True (the default)    
     120        ''' 
    115121        #    Note that this method should not be used to obtain 
    116122        #unsecured discovery documents, these are called directly 
     
    133139            cleared=None 
    134140         
    135         if outputSchema: 
     141        if outputSchema or not useCache: 
    136142            #bypass the cache ... 
    137143            status,xmlh=ndgRetrieve(ndgO, 
     
    153159                                            output=outputSchema, 
    154160                                            discovery=g.standalone) 
    155                 if status: self.XMLHCache[uri]=xmlh 
     161                if status:  
     162                    self.XMLHCache[uri]=xmlh 
    156163             
    157164        if not status: return status,xmlh 
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/templates/atom_editor.html

    r4232 r4237  
    1212      <div id="contents"> 
    1313            <div class="metadata"> 
     14                            <a href="${h.url_for(controller='listatom',action='atomHome')}">Home</a> 
    1415                            <h3>  $c.title </h3> 
    1516                <table> 
     
    1718                <tr><td>Provider ID:</td><td>$c.atom.ME.providerID</td></tr> 
    1819                                <tr><td>Created:</td><td>$c.atom.publishedDate</td></tr> 
    19                 <tr><td>Last updated:</td><td>$c.atom.updateDate</td></tr> 
     20                <tr><td>Last updated:</td><td>$c.atom.updatedDate</td></tr> 
    2021                </table> 
    2122                        <div class="headingblock"> 
     
    3031                                </td> 
    3132                                </tr> 
     33                                <span py:if="len(c.subTypes) &gt; 0" py:strip=""> 
    3234                                <tr><th><label for="subtype">Sub-Type:</label></th> 
    3335                                <td> 
     
    3638                                </td> 
    3739                            </tr> 
     40                            </span> 
    3841                                <tr> 
    3942                                <td></td> 
    4043                                <td> 
    41                                         <input type="submit" value="Submit" /> 
     44                                        <input type="submit" value="Update" /> 
    4245                                        <input type="submit" name="cancel" value="Cancel" /> 
    4346                                </td> 
     
    4649                        </div> 
    4750 
    48 <div id="$c.mainDivID"> 
    49             <center> ${Markup(h.submit(value="Update Mandatory Fields"))}</center> 
    50             ${Markup(h.end_form())} 
    51 </div> 
    52  
    53         <h4> Abstract </h4> 
    54         <div py:replace="txtBlkEd('abstract',c.atom.Summary,'absDiv',c.updateTxtLink)" id="absDiv"/> 
     51        <h4> Summary </h4> 
     52        <div py:replace="txtBlkEd('Summary',c.atom.Summary,'absDiv',h.url(controller='editatom',action='edit', saveData='2'))" id="absDiv"/> 
    5553                </div> 
    5654        </div> 
    57  
    58     <div id="footer"> 
    59       <hr /> 
    60       <p class="legalese">$blah</p> 
    61     </div> 
    6255  </body> 
    6356</html> 
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/templates/atom_functions.html

    r4230 r4237  
    218218            <tr py:if="c.atom.ndgObject.gettable==1"><td></td><td>(Original records are the raw material harvested from data providers)</td></tr> 
    219219        </tbody></table> 
    220     </div> <!-- ServiceList --> 
     220    </div> 
    221221     
    222222</html> 
Note: See TracChangeset for help on using the changeset viewer.