Changeset 4420 for TI05-delivery


Ignore:
Timestamp:
11/11/08 10:18:09 (11 years ago)
Author:
cbyrom
Message:

Add new run mode - debug for atom editor - to display stack trace with
any errors experienced - add necessary code + templates for this +
add new templates for the granulator web page + add template function
to allow generic uploading of data files and start connecting this into
the code - to allow ingest of granulite and CSML/CDML data.

Location:
TI05-delivery/ows_framework/trunk/ows_server
Files:
2 added
7 edited

Legend:

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

    r4259 r4420  
    7474helpFile:       %(layout)shelp.html 
    7575 
     76[ATOM_EDITOR] 
     77# if set to True, errors output with stacktrace to templates 
     78debug: True              
     79 
    7680[NDG_A_SERVICE] 
    7781badc.nerc.ac.uk: http://glue.badc.rl.ac.uk/cgi-bin/dxui 
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/config/ndgMiddleware.py

    r4259 r4420  
    4545        self.globals.icons_R=cf.get('RELATED','icon') 
    4646        self.globals.icons_key=cf.get('layout','key') 
     47        self.globals.debugAtomEditor = cf.get('ATOM_EDITOR','debug') 
    4748        
    4849        self.globals.disclaimer=cf.get('default','disclaimer') 
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/config/routing.py

    r4348 r4420  
    3434     
    3535    # following is the shell for the rest of the ndg  
     36    map.connect('upload/:uri', controller = 'editatom', action='upload', uri = None) 
    3637    map.connect('editAtom/:uri', controller = 'editatom', action='edit') 
    3738    map.connect('saveAtom/:uri/:saveLevel', controller = 'editatom', \ 
     
    3940    map.connect('createAtom/:saveData', controller = 'editatom', action='create', \ 
    4041                saveData = None) 
     42    map.connect('createGranule', controller = 'editatom', action='createGranule') 
    4143    map.connect('atomHome', controller = 'listatom', action='atomHome') 
    4244    map.connect('listAtom/:searchData/:associatedAtomID/:associatedAtomType/:associationType', \ 
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/controllers/editatom.py

    r4348 r4420  
    1313from ows_server.lib.ndgInterface import interface  
    1414from xml.parsers.expat import ExpatError 
    15 import logging 
     15import logging, traceback, sys 
    1616from ndgUtils.models.Atom import Atom, Person, Link, Category, ValidationError 
    1717from formencode import Invalid 
     
    2323from ndgUtils.vocabtermdata import VocabTermData as VTD 
    2424import ows_server.templates.htmlUtilities as utils 
     25from granulatorTool.granulite import granulite as granulite 
    2526 
    2627class EditatomController(BaseController): 
     
    4647        logging.info("EditatomController set up") 
    4748        return 0 
    48      
     49 
     50 
     51    def __handleError(self, e, template='error'): 
     52        ''' 
     53        Handle exceptions thrown; if debug mode on, display full stack trace 
     54        in output, otherwise just show basic error message in error template 
     55        @param e: Exception to process 
     56        @keyword template: template to render - 'error' is the default - NB, if 
     57        an alternative is specified it should have a div with class set to 'error' 
     58        containing the variable, c.xml to display properly  
     59        ''' 
     60        errorMessage = e.message 
     61        if g.debugAtomEditor: 
     62            errorMessage = traceback.format_exc()#print_exception(*sys.exc_info()) 
     63 
     64        c.xml = 'Unexpected error loading page [%s]' %str(errorMessage) 
     65        c.doc='' 
     66        logging.error(c.xml) 
     67         
     68        response.status_code = 400 
     69        return render("genshi", template) 
     70 
     71     
     72    def upload(self, uri): 
     73        ''' 
     74        Upload a CSML or granulite file and store it in the session variable 
     75        ''' 
     76        logging.info("Uploading file...") 
     77        file = request.POST.get('upload_CSML') 
     78        isGranulite = False 
     79        if file is None: 
     80            # check for granulite 
     81            file = request.POST.get('upload_granulite') 
     82            isGranulite = True 
     83             
     84        if file == '': 
     85            errorMessage = "Error: could not load file - please try again" 
     86            logging.error(errorMessage) 
     87            c.errors = {'Load error' : errorMessage} 
     88            return hc.index(hc()) 
     89 
     90        logging.debug("- file name: '%s'" %file.name) 
     91        # Prepare the basic data model 
     92        c.errors = {} 
     93        try: 
     94            # NB, if loading a granulite, this will create the displayed atom 
     95            if uri != None: 
     96                self.prepareDataModel(uri) 
     97            else: 
     98                self.__setup() 
     99        except SystemError, e: 
     100            return self.__handleError(e) 
     101 
     102        # now process the input file and add any extra required data 
     103        try: 
     104            if isGranulite: 
     105                self.__processGranuliteFile(file.value) 
     106            else: 
     107                self.__processCSMLFile(file.value) 
     108        except Exception, e: 
     109            return self.__handleError(e, template='atom_granulator') 
     110 
     111        # save new data 
     112        self.saveAtomToExist(c.atom) 
     113                     
     114        # now do redirection - NB, this ensures that current atom contents are 
     115        # reloaded and displayed 
     116        logging.info("File data loaded and extracted to atom") 
     117        h.redirect_to(controller = 'editatom', action='edit', \ 
     118                        uri = c.atom.ndgURI) 
     119 
     120 
     121 
     122    def __processCSMLFile(self, fileContents): 
     123        ''' 
     124        Accept the contents of a CSML file and extract and add appropriate data 
     125        to the current atom data model 
     126        @param fileContents: contents of the file uploaded 
     127        ''' 
     128        logging.info("Extracting CSML data") 
     129        c.atom.addCSMLData(fileContents) 
     130        logging.info("Finished extracting CSML data") 
     131     
     132 
     133    def __processGranuliteFile(self, fileContents): 
     134        ''' 
     135        Accept the contents of a granulite file and extract and add appropriate data 
     136        to the current atom data model 
     137        @param fileContents: contents of the file uploaded 
     138        ''' 
     139        logging.info("Extracting granulite data") 
     140 
     141             
     142        # check for uploaded CSML/CDML file data 
     143        cdmlFile = request.POST.get('upload_cdml') 
     144        csmlFile = request.POST.get('upload_csml') 
     145        if cdmlFile is not None and csmlFile is not None: 
     146            raise ValueError("Cannot specify both CDML and CSML file - please choose a single one to ingest.") 
     147         
     148        # NB, we'll be creating the atom in the default local eXist 
     149        eXistClient = self.__getExistClient('local') 
     150        gran = granulite(fileContents, eXistClient = eXistClient) 
     151         
     152        logging.info("Finished extracting granulite data") 
     153 
    49154     
    50155    def saveAtom(self, uri, saveLevel=0): 
     
    59164            self.prepareDataModel(uri) 
    60165        except SystemError, e: 
    61             logging.error(e.message) 
    62             return render('error') 
     166            return self.__handleError(e) 
    63167         
    64168        inputs = request.params 
     
    102206 
    103207        self.saveAtomToExist(c.atom) 
    104  
    105208                     
    106209        # now do redirection - NB, this ensures that current atom contents are 
     
    155258                self.prepareDataModel(uri) 
    156259        except SystemError, e: 
    157             logging.error(e.message) 
    158             return render('error') 
     260            return self.__handleError(e) 
    159261 
    160262        c.title='Editing [%s]'%self.ndgObject 
     263        c.uri = c.atom.ndgURI 
    161264         
    162265        c.saveLink = h.url_for(controller='editatom',action='saveAtom', \ 
     
    419522        ''' 
    420523        logging.info("Saving changes to eXist") 
    421         # lookup the eXist DB to use according to the provider ID for the  
    422         # data - NB, this is specified in the ndgDiscovery.config file 
    423         self.existHost = self.cf.get('NDG_EXIST', atom.ME.providerID) 
    424         self.configFile = self.cf.get('NDG_EXIST','passwordFile') 
    425         self.eXist = edc.eXistDBClient(eXistDBHostname = self.existHost, \ 
    426                                        configFile = self.configFile) 
     524        self.eXist = self.__getExistClient(atom.ME.providerID) 
    427525        createdAtom = self.eXist.createAtomInExist(atom) 
    428526        logging.info("Changes successfully saved to eXist") 
    429527        return createdAtom 
    430          
     528 
     529    def __getExistClient(self, providerID): 
     530        ''' 
     531        Use the config data to set up and return an eXist client 
     532        ''' 
     533        logging.info("Setting up eXist client") 
     534        # lookup the eXist DB to use according to the provider ID for the  
     535        # data - NB, this is specified in the ndgDiscovery.config file 
     536        existHost = self.cf.get('NDG_EXIST', providerID) 
     537        configFile = self.cf.get('NDG_EXIST','passwordFile') 
     538        eXistClient = edc.eXistDBClient(eXistDBHostname = existHost, \ 
     539                                       configFile = configFile) 
     540        logging.info("Returning eXist client") 
     541        return eXistClient 
    431542     
    432543    def create(self, saveData = None, **inputs): 
     
    478589 
    479590        except Exception, e: 
    480             c.xml='Unexpected error loading page [%s]' %str(e) 
    481             c.doc='' 
    482             logging.error(c.xml) 
    483          
    484         response.status_code = 400 
    485         return render('error') 
     591            return self.__handleError(e) 
     592 
     593     
     594    def createGranule(self, **inputs): 
     595        '''  
     596        Create a new atom from a granulite file 
     597        ''' 
     598        logging.info("Setting up create atom from granulite template") 
     599        c.title='Create new data granule atom - from a granulite file' 
     600         
     601        try: 
     602            return render("genshi", 'atom_granulator') 
     603 
     604        except Exception, e: 
     605            return self.__handleError(e) 
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/templates/atom_editor.html

    r4349 r4420  
    2323 
    2424                <div py:if="not c.atom.isDeployment() and not c.atom.isGranule()" py:replace="GeneralInfo(c.saveLink)"/> 
     25                <div py:if="not c.atom.isDeployment()" py:replace="UploadFile('Ingest data from CSML file', 'CSML', c.saveLink)"/> 
    2526                <div py:if="not c.atom.isDeployment() and not c.atom.isGranule()" py:replace="TextArea('Summary', c.atom.Summary, c.saveLink)"/> 
    2627                <div py:if="not c.atom.isDeployment() and not c.atom.isGranule()" py:replace="TextArea('Content', c.atom.Content, c.saveLink)"/> 
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/templates/atom_functions.html

    r4349 r4420  
    1616        </table> 
    1717    </div> 
     18 
     19     
     20    <div class="headingblock" py:def="UploadFile(title, fileType, editLink)"> 
     21        ${Markup(h.form(h.url(controller='editatom', action='upload', uri = c.uri), multipart=True))} 
     22        <table py:if="editLink"> 
     23                              <tr> 
     24                              <td class="cellhead"> 
     25                              ${Markup(title)} 
     26                                  </td> 
     27                                  </tr> 
     28                                  <tr> 
     29                                  <td></td> 
     30                                  <td> 
     31                                          ${Markup(h.file_field('upload_' + fileType, size="80"))} 
     32                                  </td> 
     33                                  </tr> 
     34                              <tr> 
     35                              <td /> 
     36                              <td colspan="2"> 
     37                          ${Markup(h.submit('Upload'))} 
     38                              </td> 
     39                              </tr> 
     40        </table> 
     41                ${Markup(h.end_form())} 
     42        </div> 
    1843 
    1944     
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/templates/atom_home.html

    r4349 r4420  
    1717                                </h2> 
    1818                            <h2> 
     19                            <a href="${h.url_for(controller='editatom',action='createGranule')}">Create data granule atom using granulite file</a> 
     20                                </h2> 
     21                            <h2> 
    1922                            <a href="${h.url_for(controller='listatom',action='list')}">Edit/List atoms</a> 
     23                            </h2> 
     24                            <h2> 
     25                <div py:replace="UploadFile('Create granule with granulite file', 'granulite', True)"/> 
    2026                            </h2> 
    2127                </div> 
Note: See TracChangeset for help on using the changeset viewer.