Changeset 67


Ignore:
Timestamp:
01/12/06 16:46:44 (14 years ago)
Author:
laszlo
Message:

Started the XML export/import implementation. refs #165 spent 3h remaining 8h

Location:
trunk
Files:
1 added
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/LOM.py

    r66 r67  
    11from Products.Archetypes.public import MetadataSchema 
    2 from Products.Archetypes.public import StringField 
     2from Products.Archetypes.public import StringField, ComputedField 
    33from Products.Archetypes.public import StringWidget 
    44 
    55LOMSchema = MetadataSchema(( 
    6     StringField('LOMIdentifier', 
    7         searchable=1, 
    8         accessor='getLOMIdentifier', 
    9         widget=StringWidget()), 
    106    StringField('LOMCoverage', 
    117        searchable=1, 
     
    1410)) 
    1511 
     12from xml.dom.minidom import parse, parseString, getDOMImplementation, Node 
     13 
     14def getDocument(element): 
     15    while element.nodeType != Node.DOCUMENT_NODE: 
     16        element=element.parentNode 
     17    return element 
     18 
     19def addText(element, text): 
     20    textNode = getDocument(element).createTextNode(text) 
     21    element.appendChild(textNode) 
     22    return textNode 
     23 
     24def addNode(element, node): 
     25    newNode = getDocument(element).createElement(node) 
     26    element.appendChild(newNode) 
     27    return newNode 
     28 
     29def addLangstring(element, language, text): 
     30    langstring = addNode(element, "langstring") 
     31    if not language: 
     32        language = 'en' 
     33    langstring.setAttribute("xml:lang", language) 
     34    addText(langstring, text) 
     35    return langstring 
     36 
     37def exportLOM(object): 
     38     
     39    impl = getDOMImplementation() 
     40    document = impl.createDocument(None, "lom", None) 
     41    top_element = document.documentElement 
     42     
     43    if object.meta_type=='Module': 
     44        general = addNode(top_element, "general") 
     45        general_identifier = addNode(general, "identifier") 
     46        addText(general_identifier, object.getId()) 
     47        general_description = addNode(general, "description") 
     48        addLangstring(general_description, object.Language(), object.Description()) 
     49        general_title = addNode(general, "title") 
     50        addLangstring(general_title, object.Language(), object.Title()) 
     51         
     52        rights = addNode(top_element, "rights") 
     53        rights_description = addNode(rights, "description") 
     54        addLangstring(rights_description, object.Language(), object.Rights()) 
     55     
     56    output = document.toxml('utf-8') 
     57 
     58    document.unlink() 
     59     
     60    return output      
     61         
     62     
     63def miniXPath(element, path): 
     64    for part in path.split('/'): 
     65        if(element.getElementsByTagName(part)): 
     66            element = element.getElementsByTagName(part)[0] 
     67        else: 
     68            return None 
     69    return element         
     70 
     71def getText(element): 
     72    rc = "" 
     73    for node in element.childNodes: 
     74        if node.nodeType == node.TEXT_NODE: 
     75            rc = rc + node.data 
     76    return rc 
     77 
     78def constructLOM(folder): 
     79    id = folder.generateUniqueId() 
     80    folder.invokeFactory(type_name='Module',id=id) 
     81    return getattr(folder,id) 
     82 
     83def importLOM(folder, file): 
     84    dom = parseString(file) 
     85    document = dom.documentElement 
     86    # TODO: i18n 
     87    description_element = miniXPath(document, 'general/description/langstring') 
     88    title_element = miniXPath(document, 'general/title/langstring') 
     89    rights_element = miniXPath(document, 'rights/description/langstring') 
     90    
     91    ob = constructLOM(folder) 
     92    ob.setDescription(getText(description_element)) 
     93    ob.setTitle(getText(title_element)) 
     94    ob.setRights(getText(rights_element)) 
     95     
     96    return ob 
     97     
     98     
Note: See TracChangeset for help on using the changeset viewer.