Changeset 4297 for TI05-delivery


Ignore:
Timestamp:
07/10/08 15:31:29 (11 years ago)
Author:
cbyrom
Message:

Fully implement the 'atom association' functionality in the server
controllers and templates - i.e. to allow the addition and removal of
atoms to activity deployments.

Location:
TI05-delivery/ows_framework/trunk/ows_server/ows_server
Files:
6 edited

Legend:

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

    r4283 r4297  
    4141                saveData = None) 
    4242    map.connect('atomHome', controller = 'listatom', action='atomHome') 
    43     map.connect('addAtom', controller = 'editatom', action='addAtom') 
    44     map.connect('listAtom/:searchData/:associatedAtomID', controller = 'listatom', \ 
    45                 action='list', searchData='', associatedAtomID='') 
     43    map.connect('listAtom/:searchData/:associatedAtomID/:associatedAtomType', \ 
     44                controller = 'listatom', action='list', searchData='', \ 
     45                associatedAtomID='', associatedAtomType='') 
    4646    map.connect('viewDeployments/:uri', controller = 'retrieve', action='viewDeployments') 
    4747 
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/controllers/editatom.py

    r4283 r4297  
    4848    VTD = VTD() 
    4949     
     50    ADD_ASSOCIATIONS = 3 
     51    REMOVE_ASSOCIATIONS = 4 
     52     
    5053    def __setup(self,uri=None): 
    5154        ''' Common setup stuff for all the actions on this controller ''' 
     
    8285        inputs = request.params 
    8386 
    84         authors = self.extractAuthorDetails(inputs) 
    85         if authors: 
    86             c.atom.addAuthors(authors) 
    87  
    88         onlineRefs = self.extractOnlineReferenceDetails(inputs) 
    89         if onlineRefs: 
     87        # save atom association changes 
     88        if int(saveLevel) == self.ADD_ASSOCIATIONS: 
     89            atomLinks = self.extractAtomAssociations(inputs) 
     90            c.atom.addUniqueRelatedlinks(atomLinks) 
     91        elif int(saveLevel) == self.REMOVE_ASSOCIATIONS: 
     92            atomLinks = self.extractAtomAssociations(inputs) 
     93            c.atom.relatedLinks = atomLinks 
     94        else: 
     95            authors = self.extractAuthorDetails(inputs) 
     96            if authors: 
     97                c.atom.addAuthors(authors) 
     98     
     99            onlineRefs = self.extractOnlineReferenceDetails(inputs) 
    90100            c.atom.relatedLinks = onlineRefs 
    91  
    92         if inputs.get('subtype'): 
    93             c.atom.subtype = self.getLatestTermURLFromDropDownInput( \ 
    94                     inputs.get('subtype')) 
     101     
     102            if inputs.get('subtype'): 
     103                c.atom.subtype = self.getLatestTermURLFromDropDownInput( \ 
     104                        inputs.get('subtype')) 
    95105 
    96106        self.saveAtomToExist(c.atom) 
     107 
    97108                     
    98         # if we're dealing with an expandable text input, re-render this now 
    99         if int(saveLevel) > 1: 
    100             logging.debug("Doing a partial re-render") 
    101             c.key=request.params['key'] 
    102             c.default=request.params[c.key] 
    103             logging.debug(c.key) 
    104             logging.debug(c.default) 
    105  
    106             c.blkfrag=1 
    107             return render("genshi", 'utils', fragment=True) 
    108  
    109109        # now do redirection - NB, this ensures that current atom contents are 
    110110        # reloaded and displayed 
     
    164164        c.saveLink = h.url_for(controller='editatom',action='saveAtom', \ 
    165165                               saveLevel='1',  uri = c.atom.ndgURI) 
    166         c.saveLink2 = h.url_for(controller='editatom',action='saveAtom', saveData='2') 
     166        c.saveLink2 = h.url_for(controller='editatom',action='saveAtom', saveLevel='2') 
     167        c.saveAssoc = h.url_for(controller='editatom',action='saveAtom', \ 
     168                                 saveLevel = self.REMOVE_ASSOCIATIONS) 
     169         
     170        # adjust atom type to cope with activity deployment exception 
     171        atomType = c.atom.atomTypeID 
     172        if c.atom.atomTypeID == VTD.ACTIVITY_TERM and \ 
     173            c.atom.subtypeID == VTD.DEPLOYMENT_TERM: 
     174            atomType = VTD.DEPLOYMENT_TERM 
     175             
    167176        c.addLink = h.url_for(controller='listatom',action='list', searchData = '0', \ 
    168                                associatedAtomID = c.atom.ndgURI) 
     177                               associatedAtomID = c.atom.ndgURI, \ 
     178                               associatedAtomType = atomType) 
    169179 
    170180        # account for special case where we're dealing with deployments 
     
    305315 
    306316 
    307     def extractAtomIDs(self, inputs): 
    308         ''' 
    309         Retrieve atom IDs from inputs and set appropriately on Atom, if any 
    310         found 
    311         @return: list of atom IDs 
     317    def extractAtomAssociations(self, inputs): 
     318        ''' 
     319        Retrieve atom data from inputs and create related links pointing to 
     320        this data 
     321        @return: list of Links representing the related atoms 
    312322        ''' 
    313323        logging.info("Extracting related atom ID data from inputs") 
    314324        atoms = [] 
     325        processedAtoms = [] 
    315326 
    316327        for key in inputs: 
    317328            if key.lower().startswith(Atom.ATOM_REF_LABEL): 
    318                 tag = key.split('/')[-1] 
    319                 if tag not in atoms: 
    320                     atoms.append(tag) 
     329                (x, href, title, subtype) = key.split(Atom.DELIMITER) 
     330                # NB, we handle removes by effectively ignoring them later on 
     331                if href not in processedAtoms and not subtype.endswith(Atom.REMOVE_LABEL): 
     332                    processedAtoms.append(href) 
     333                     
     334                    link = Link() 
     335                    # NB, adding an empty object here is valid as it will clear out 
     336                    # existing entries, potentially 
     337                    link.href = href or "" 
     338                    link.title = title or "" 
     339                    link.rel = subtype or "" 
     340                     
     341                    if inputs.get(key + Atom.REMOVE_LABEL): 
     342                        logging.info("Removing atom association") 
     343                    else: 
     344                        logging.info("Adding atom association") 
     345                        logging.debug("Extracted atom info (href:'%s', title:'%s', rel:'%s')" \ 
     346                                      %(link.href, link.title, link.rel)) 
     347                        atoms.append(link) 
    321348            else: 
    322349                continue 
     
    369396            # activity deployments should have subtype deployment specified automatically 
    370397            if atomTypeID == VTD.ACTIVITY_DEPLOYMENT_TERM: 
    371                 inputs['subtype'] = \ 
    372                     self.VTD.getTermCurrentVocabURL(VTD.DEPLOYMENT_TERM) 
     398                inputs['subtypeID'] = VTD.DEPLOYMENT_TERM 
    373399                inputs['atomTypeID'] = VTD.ACTIVITY_TERM 
    374400                 
     
    402428        response.status_code = 400 
    403429        return render('error') 
    404  
    405  
    406  
    407     def addAtom(self): 
    408         ''' 
    409         Add atom details to a deployment 
    410         ''' 
    411         logging.info("Adding atom associations") 
    412         inputs = request.params 
    413         ids = self.extractAtomIDs(inputs) 
    414         # extract out the atom IDs to associate - NB, these are specified with the full ID tags 
    415         logging.info("Finished adding associations - redirect back to edit page") 
    416         h.redirect_to(controller = 'editatom', action='edit', uri = inputs['associatedAtomID']) 
    417430 
    418431 
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/controllers/listatom.py

    r4283 r4297  
    2222from ndgUtils.vocabtermdata import VocabTermData as VTD, VocabTermItem as VTI 
    2323from ows_server.templates.htmlUtilities import getVocabTermDataDropdown 
    24  
    25 class AtomFormSchema(Schema): 
    26     def __init__(self): 
    27         logging.debug("Setting up AtomFormSchema") 
    28          
    29     filter_extra_fields = True 
    30     allow_extra_fields = True 
    31     #subtype = validators.UnicodeString(not_empty=True)#URL(not_empty=True, add_http=True, check_exists=False) 
    32     title = validators.UnicodeString(not_empty=True) 
    33  
    34 class CreateAtomFormSchema(Schema): 
    35     def __init__(self): 
    36         logging.debug("Setting up CreateAtomFormSchema") 
    37          
    38     filter_extra_fields = True 
    39     allow_extra_fields = True 
    40     title = validators.UnicodeString(not_empty=True) 
    41     providerID = validators.UnicodeString(not_empty=True) 
    42     atomTypeID = validators.UnicodeString(not_empty=True) 
     24from editatom import EditatomController as ec 
    4325 
    4426 
     
    4729    Provides the pylons controller for listing/searching NDG Atom documents. 
    4830    ''' 
    49      
    5031    def __setup(self,uri=None): 
    5132        ''' Common setup stuff for all the actions on this controller ''' 
     
    7455 
    7556     
    76     def list(self, searchData=None, associatedAtomID=None): 
     57    def list(self, searchData=None, associatedAtomID=None, associatedAtomType=None): 
    7758        '''  
    7859        Provide a simple search interface to the atoms data  
     
    8364        ''' 
    8465        try: 
     66            c.vtd = VTD() 
     67     
    8568            inputs = request.params 
    8669            c.searchData = None 
     
    9679            c.errors = {} 
    9780            c.title='Browse atoms' 
    98             c.addAtom = associatedAtomID 
    99  
     81            c.assocAtomType = associatedAtomType 
     82            c.associateLink = h.url_for(controller='editatom', action='saveAtom', \ 
     83                    saveLevel = ec.ADD_ASSOCIATIONS, uri = associatedAtomID) 
     84            c.searchLink = h.url_for(controller = 'listatom', action='list', \ 
     85                                     searchData='1', associatedAtomID = associatedAtomID) 
     86             
    10087            c.searchTerm = inputs.get('title') 
    10188             
     
    10390            # set default value 
    10491            defaultVal = VTI(ndg_eXist.DEFAULT_ALL_VAL, ndg_eXist.DEFAULT_ALL_VAL) 
    105             vtd = VTD() 
    106             c.atomTypes = getVocabTermDataDropdown(vtd.getValidTypes(vtd.ATOM_CATEGORY), \ 
     92            c.atomTypes = getVocabTermDataDropdown(c.vtd.getValidTypes(c.vtd.ATOM_CATEGORY), \ 
    10793                                                   defaultVal = defaultVal, \ 
    10894                                                   selected = inputs.get('atomTypeID')) 
    109             c.providerIDs = getVocabTermDataDropdown(vtd.getValidTypes(vtd.PROVIDER_CATEGORY),  
     95            c.providerIDs = getVocabTermDataDropdown(c.vtd.getValidTypes(c.vtd.PROVIDER_CATEGORY),  
    11096                                                     defaultVal = defaultVal, \ 
    11197                                                     selected = inputs.get('providerID')) 
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/templates/atom_editor.html

    r4283 r4297  
    2222                        <div class="headingblock"> 
    2323 
    24                                 <h4>  Mandatory Material </h4> 
     24                                <h4>General Info</h4> 
    2525                                <form action="${c.saveLink}" method="post"> 
    26                                 <table summary="" width="100%"><tr> 
     26                                <table summary="" width="100%"> 
     27                                <tr> 
    2728                                <td class="cellhead" width="10%">Title:</td> 
    2829                                <td class="column"> 
     
    3940                            </tr> 
    4041                            </span> 
     42                                <tr py:if="c.notDeployment"> 
     43                                <td class="cellhead" width="10%">Abbreviation:</td> 
     44                                <td class="column"> 
     45                                        ${Markup(h.text_field('abbreviation',c.atom.ME.abbreviation))} 
     46                                </td> 
     47                                </tr> 
    4148                                <tr> 
    4249                                <td></td> 
     
    5259                        <div py:replace="People('Author', [c.atom.author], c.saveLink)"/> 
    5360                        <div py:if="c.notDeployment" py:replace="OnlineReferences(c.atom.relatedLinks, c.saveLink)"/> 
    54                         <div py:if="not c.notDeployment" py:replace="Associations(c.atom.relatedLinks, c.addLink, c.saveLink)"/> 
     61                        <div py:if="not c.notDeployment" py:replace="Associations(c.atom.relatedLinks, c.addLink, c.saveAssoc)"/> 
    5562                        <div py:if="c.notDeployment" py:replace="People('Contributors', c.atom.contributors, c.saveLink)"/> 
    5663                        <div py:if="c.notDeployment" py:replace="FullParameterList(c.atom.parameters)"/> 
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/templates/atom_functions.html

    r4283 r4297  
    286286                                </li> 
    287287                        </ul> 
     288                        <span py:if="not links">No data specified at present</span> 
    288289                        </div> 
    289290                        </td></tr> 
     
    338339 
    339340        <div py:def="AssociationsTable(links, editLink)"> 
    340                 <form action="${editLink}" method="post"> 
     341                <form py:if="links" action="${editLink}" method="post"> 
    341342            <table> 
    342                 <tr py:if="links"> 
     343                <tr> 
    343344                                <th align="left">Type</th> 
    344345                        <th align="left">Title</th> 
    345                         <th py:if="links" align="center">Remove</th> 
     346                        <th py:if="editLink and links" align="center">Remove</th> 
    346347                </tr> 
    347348                                <?python 
    348349                                        from ndgUtils.models.Atom import Atom as a 
    349                                         refLabel = a.ATOM_REF_LABEL + "." 
     350                                        delim = a.DELIMITER 
     351                                        refLabel = a.ATOM_REF_LABEL + delim 
    350352                                ?> 
    351353                    <tr py:for="i, link in enumerate(links)"> 
     
    354356                        displayVal = link.title or link.href 
    355357                        from ndgUtils.vocabtermdata import VocabTermData as VTD 
    356                         vti = VTD().getTermItemfromFullVocabURI(link.rel) 
     358                        vtd = VTD() 
     359                        vti = vtd.getTermItemfromFullVocabURI(link.rel) 
     360                        subType = vtd.tidySubTypeTitle(vti.title) 
     361                        inputLabel = refLabel + link.href + delim + (link.title or "") + delim + link.rel 
    357362                            ?> 
    358                             <td>${vti.title}</td> 
     363                            <td>${subType}</td> 
    359364                            <td><a href="$link.href">${displayVal}</a></td> 
    360365                        <td py:if="editLink and links" align="center"> 
    361                                 ${Markup(h.check_box(refLabel + str(i) + '.remove'))} 
     366                                ${Markup(h.hidden_field(inputLabel))} 
     367                                ${Markup(h.check_box(inputLabel + a.REMOVE_LABEL))} 
    362368                        </td> 
    363369                                </tr> 
    364                         <tr py:if="editLink"><td> 
    365                     ${Markup(h.submit(value="Update"))} 
     370                        <tr py:if="editLink and links"><td></td><td></td><td align="center"> 
     371                    ${Markup(h.submit(value="Remove"))} 
    366372                </td></tr> 
    367373                        </table> 
    368374                </form> 
     375                <table py:if="not links"><tr><td> 
     376                        No data specified at present 
     377                </td></tr> 
     378                </table> 
    369379        </div> 
    370380 
     
    557567                                <td colspan="2" align="center"> 
    558568                                <span py:if="editLink" py:strip=""> 
    559                                 <span class="cellhead">N</span> ${Markup(h.text_field('maxY', c.atom.maxY))} 
     569                                <span class="cellhead">Max Y</span> ${Markup(h.text_field('maxY', c.atom.maxY))} 
    560570                                </span> 
    561571                        <span py:if="not editLink" py:strip=""> 
    562                         <span class="cellhead">N</span> ${c.atom.maxY} 
     572                        <span class="cellhead">Max Y</span> ${c.atom.maxY} 
    563573                                </span> 
    564574                                </td></tr> 
    565575                        <tr><td align="center"> 
    566576                                <span py:if="editLink" py:strip=""> 
    567                                 <span class="cellhead">W</span> ${Markup(h.text_field('minX', c.atom.minX))} 
     577                                <span class="cellhead">Min X</span> ${Markup(h.text_field('minX', c.atom.minX))} 
    568578                                </span> 
    569579                        <span py:if="not editLink" py:strip=""> 
    570                         <span class="cellhead">W</span> ${c.atom.minX} 
     580                        <span class="cellhead">Min X</span> ${c.atom.minX} 
    571581                                </span> 
    572582                        </td><td align="center"> 
    573583                                <span py:if="editLink" py:strip=""> 
    574                                 <span class="cellhead">E</span> ${Markup(h.text_field('maxX', c.atom.maxX))} 
     584                                <span class="cellhead">Max X</span> ${Markup(h.text_field('maxX', c.atom.maxX))} 
    575585                                </span> 
    576586                        <span py:if="not editLink" py:strip=""> 
    577                         <span class="cellhead">E</span> ${c.atom.maxX} 
     587                        <span class="cellhead">Max X</span> ${c.atom.maxX} 
    578588                                </span> 
    579589                        </td></tr> 
    580590                        <tr><td colspan="2" align="center"> 
    581591                                <span py:if="editLink" py:strip=""> 
    582                                 <span class="cellhead">S</span> ${Markup(h.text_field('minY', c.atom.minY))} 
     592                                <span class="cellhead">Min Y</span> ${Markup(h.text_field('minY', c.atom.minY))} 
    583593                                </span> 
    584594                        <span py:if="not editLink" py:strip=""> 
    585                         <span class="cellhead">S</span> ${c.atom.minY} 
     595                        <span class="cellhead">Min Y</span> ${c.atom.minY} 
    586596                                </span> 
    587597                        </td></tr> 
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/templates/atom_list.html

    r4283 r4297  
    1515                            <h3>  $c.title </h3> 
    1616                        <div class="headingblock"> 
    17                                 <form action="${h.url_for(controller = 'listatom', action='list', searchData='1', associatedAtomID = c.addAtom)}" method="post"> 
     17                                <form action="${c.searchLink}" method="post"> 
    1818                                <table> 
    1919                                        <tr><td colspan="3"  class="linehead">Search filter</td></tr> 
     
    5050                                        <tr><td>No data found for search selections</td></tr> 
    5151                                </table> 
    52                                 <form action="${h.url_for(controller = 'editatom', action='addAtom')}" method="post"> 
     52                                <form action="${c.associateLink}" method="post"> 
    5353                        <table width="100%" py:if="c.results" border="1"> 
    5454                                <tr> 
     
    5959                                <th>Title</th> 
    6060                                <th>Subtype</th> 
    61                                 <th py:if="c.addAtom" align="center">Add</th> 
     61                                <th py:if="c.assocAtomType" align="center">Add</th> 
    6262                                </tr> 
    6363                                <?python  
    6464                                                from ndgUtils.vocabtermdata import VocabTermData as VTD 
    65                                         vtd = VTD() 
    6665                                        from ndgUtils.models.Atom import Atom as a 
    67                                         refLabel = a.ATOM_REF_LABEL + "." 
     66                                        delim = a.DELIMITER 
     67                                        refLabel = a.ATOM_REF_LABEL + delim 
     68                                        c.showAddButton = False 
    6869                                ?> 
    6970                                <tr py:for="atom in c.results"> 
    7071                                <?python 
    71                                                 subtype = "None" 
     72                                                subType = "None" 
     73                                                subTypeVTI = None 
    7274                                                if atom.subtype: 
    73                                                         #vti = vtd.getTermItemfromFullVocabURI(atom.subtype) 
    74                                                         #subType = vti.title 
    75                                                         subtype = atom.subtype 
    76                                                          
    77                                                 vti = vtd.getVTI(atom.type) 
     75                                                        subTypeVTI = c.vtd.getTermItemfromFullVocabURI(atom.subtype) 
     76                                                        subType = c.vtd.tidySubTypeTitle(subTypeVTI.title) 
     77                                                vti = c.vtd.getTermItemfromFullVocabURI(atom.type) 
    7878                                                type = vti.title 
     79                                                allowAdd = False 
     80                                                if c.assocAtomType: 
     81                                                        if c.assocAtomType == c.vtd.DEPLOYMENT_TERM and c.vtd.isDeployable(vti): 
     82                                                                if not subTypeVTI or subTypeVTI.termID != c.vtd.DEPLOYMENT_TERM: 
     83                                                                        allowAdd = True 
     84                                                        elif c.assocAtomType == c.vtd.DE_TERM and c.vtd.isDeployment(vti): 
     85                                                                allowAdd = True 
     86                                                if allowAdd: 
     87                                                        c.showAddButton = True 
    7988                                        ?> 
    8089                                <td> 
     
    96105                                ${Markup(subType)} 
    97106                                </td> 
    98                                 <td py:if="c.addAtom" align="center"> 
    99                                 ${Markup(h.check_box(refLabel + atom.id))} 
     107                                <td py:if="allowAdd" align="center"> 
     108                                ${Markup(h.check_box(refLabel + atom.href + delim + (atom.name or "") + delim + atom.subtype))} 
    100109                                </td> 
    101110                                </tr> 
    102                                 <tr py:if="c.addAtom"> 
     111                                <tr py:if="c.assocAtomType and c.showAddButton"> 
    103112                                <td colspan = "6"/> 
    104113                                <td> 
Note: See TracChangeset for help on using the changeset viewer.