source: MILK/trunk/milk_server/milk_server/controllers/atom_editor/listatom.py @ 4724

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/MILK/trunk/milk_server/milk_server/controllers/atom_editor/listatom.py@4724
Revision 4724, 7.5 KB checked in by cbyrom, 11 years ago (diff)

Restructure atom editor controllers - pulling out parent superclass
to allow re-use of shared code + use new routes names + add new method
to handle drop down setting up.

Line 
1'''
2 Class representing pylons controller for the listing and searching of atom
3 data
4 
5 @author: C Byrom, Tessella Sep 2008
6'''
7import logging, xmlrpclib
8from ndgUtils.models.Atom import Atom
9from ndgUtils import DocumentRetrieve
10from ndgUtils.eXistInterface import ndg_eXist
11from ndgUtils.models.vocabtermdata import VocabTermData as VTD, VocabTermItem as VTI
12from milk_server.lib.base import *
13from editorconstants import *
14import milk_server.lib.htmlUtilities as utils
15from atomeditorcontroller import AtomEditorController
16   
17class ListatomController(AtomEditorController):
18    '''
19    Provides the pylons controller for listing/searching NDG Atom documents.
20    '''
21
22   
23    def atomHome(self):
24        '''
25        Render a simple home page for the atom editor
26        '''
27        logging.info("Rendering atom home page")
28        c.title = ATOM_HOME_TITLE
29        return self.savePageAndRender("atom_editor/atom_home")
30
31
32    def showExampleGranulite(self):
33        '''
34        Show an example granulite file
35        '''
36        logging.info("Rendering example granulite file page")
37        c.title = EXAMPLE_GRANULITE_TITLE
38        return self.savePageAndRender("atom_editor/granulite_example")
39
40
41    def showAtomHelp(self):
42        '''
43        Show the help page
44        '''
45        logging.info("Rendering help page")
46        c.title = HELP_PAGE_TITLE
47        return self.savePageAndRender("atom_editor/atom_help")
48   
49   
50    def list(self, searchData=None, associatedAtomID=None, \
51             associatedAtomType=None, associationType=None):
52        '''
53        Provide a simple search interface to the atoms data
54        - display a filter + display any results + if an atomID is
55        provided, allow atoms to be linked to this
56        @keyword searchData: if '1' do a search, if '0' just display search filter
57        @keyword associatedAtomID: the ID of an atom to which other atoms
58        should be linked - via deployments
59        @keyword associatedAtomType: type of atom that the data is being
60        associated with
61        @keyword associationType: type of association to be done - NB, use
62        the constants in htmlUtilities for these
63        '''
64        try:
65            c.searchData = None
66            self._setup()
67            if searchData and int(searchData) > 0:
68                logging.info("Preparing atom search")
69                c.searchData = searchData
70                atomTypeID = self.inputs.get('atomTypeID')
71                providerID = self.inputs.get('providerID')
72                # NB, avoid page being reloaded in incorrect state - e.g. after
73                # browser reload
74                if not (atomTypeID and providerID):
75                    return self.list()
76                   
77                atomTypeID = atomTypeID.split('--')[1]
78                providerID = providerID.split('--')[1]
79               
80                # if we're dealing with activity deployments, substitute the typeID
81                # for the subType Deployments term
82                if atomTypeID == VTD.ACTIVITY_DEPLOYMENT_TERM:
83                    atomTypeID = VTD.DEPLOYMENT_TERM
84                   
85                c.results = self.searchAtoms(providerID, atomTypeID, self.inputs.get('title'))
86               
87            logging.info("Rendering atom listings page")
88            c.errors = {}
89            c.title = LIST_ATOM_TITLE
90            c.assocAtomType = associatedAtomType
91            c.associateLink = ""
92            if associatedAtomID:
93                c.associateLink = h.url_for('save', uri = associatedAtomID, \
94                                            saveLevel = self.ADD_ASSOCIATIONS)
95            c.searchLink = h.url_for('list', searchData='1', 
96                                     associatedAtomID = associatedAtomID, \
97                                     associatedAtomType = associatedAtomType, \
98                                     associationType = associationType)
99           
100            # set up the drop down content
101            # NB, if we are here whilst doing an association, restrict the filter
102            # appropriately
103            listVals = []
104            defaultVal = None
105            # set up a default 'all' value
106            allVal = VTI(ndg_eXist.DEFAULT_ALL_VAL, ndg_eXist.DEFAULT_ALL_VAL)
107            if associationType:
108                val = int(associationType)
109                if val == utils.GRANULE_ASSOCIATION:
110                    c.title += GRANULE_ASSOCIATION_TITLE
111                    listVals = [g.vtd.TERM_DATA[g.vtd.GRANULE_TERM]]
112                elif val == utils.DEPLOYMENT_ASSOCIATION:
113                    c.title += DEPLOYMENTS_ASSOCIATION_TITLE
114                    listVals = [g.vtd.TERM_DATA[g.vtd.DEPLOYMENT_TERM]]
115                elif val == utils.ENTITY_ASSOCIATION:
116                    c.title += DEPLOYMENTS_DATA_ASSOCIATION_TITLE
117                    listVals = g.vtd.getValidTypes(g.vtd.DEPLOYABLE_ATOM_CATEGORY)
118                    defaultVal = allVal
119            else:
120                listVals = g.vtd.getValidTypes(g.vtd.ATOM_CATEGORY)
121                defaultVal = allVal
122           
123            c.atomTypes = utils.getVocabTermDataDropdown(listVals, \
124                                                   defaultVal = defaultVal, \
125                                                   selected = self.inputs.get('atomTypeID'))
126            c.providerIDs = utils.getVocabTermDataDropdown(g.vtd.getValidTypes(g.vtd.PROVIDER_CATEGORY), 
127                                                     defaultVal = allVal, \
128                                                     selected = self.inputs.get('providerID'))
129
130            return self.savePageAndRender('atom_editor/atom_list', **self.inputs)
131
132        except Exception, e:
133            c.xml='Unexpected error loading page [%s]' %str(e)
134            c.doc=''
135            logging.error(c.xml)
136       
137        response.status_code = 400
138        return render("genshi", 'atom_editor/error')
139   
140   
141    def searchAtoms(self, providerID, atomTypeID, term):
142        '''
143        Search for atoms with specified filter info
144        @param providerID: provider ID of atom or 'all' for all
145        @param atomTypeID: type of atom or 'all' for all
146        @param term: text to search for in atom
147        @return array of dicts with info for each doc found in search
148        '''
149        logging.info("Search for atoms with the following filter: \
150            \nProviderID: '%s'\nAtom Type: '%s'\nText in title: '%s'" \
151            %(providerID, atomTypeID, term))
152       
153        dr = DocumentRetrieve(self.cf.get('NDG_EXIST','local'),
154                              pwfile=self.cf.get('NDG_EXIST','passwordFile'))
155       
156        # NB, for some reason, the xmlrpc call to eXist sometimes results in a spurious
157        # 'java.lang.IndexOutOfBoundsException' - retry a couple of times, if so
158        attempt = 0
159        results = None
160        while results is None:
161            try:
162                results = dr.search(term,
163                            start=1,
164                            howmany=10000, # NB, we want to get back everything!
165                            target=ndg_eXist.ATOM_TARGET,
166                            providerID = providerID, 
167                            atomTypeID = atomTypeID)
168            except xmlrpclib.Fault, e:
169                logging.info("Error caught whilst calling eXist: %s" %e.faultString)
170                attempt += 1
171                if attempt < 3:
172                    logging.info("- retrying eXist call")
173                else:
174                    raise e
175
176        logging.info("Search completed")
177        return results
178
179           
180       
Note: See TracBrowser for help on using the repository browser.