← Back to team overview

mlhim-specs-dev team mailing list archive

[Branch ~cdd-dev/cdd/trunk] Rev 312: Added back exportation of XSDs on menu, now reading from the tree

 

------------------------------------------------------------
revno: 312
committer: Eduardo Ribeiro <xcesar@xxxxxxxxx>
branch nick: devel
timestamp: Mon 2013-02-04 14:06:31 -0200
message:
  Added back exportation of XSDs on menu, now reading from the tree
added:
  src/2.0/ccdRMAdapter.py
  src/2.0/ccdgen.py
modified:
  src/2.0/aux_gui.py
  src/2.0/cdd.py


--
lp:cdd
https://code.launchpad.net/~cdd-dev/cdd/trunk

Your team MLHIM Specifications Developers is subscribed to branch lp:cdd.
To unsubscribe from this branch go to https://code.launchpad.net/~cdd-dev/cdd/trunk/+edit-subscription
=== modified file 'src/2.0/aux_gui.py'
--- src/2.0/aux_gui.py	2013-02-01 19:30:12 +0000
+++ src/2.0/aux_gui.py	2013-02-04 16:06:31 +0000
@@ -106,12 +106,13 @@
 
     return l2
 
-def save_file_diag(self, filename, dir):
+def save_file_diag(self, filename, dir, wildcard='All files (*.*)|*.*'):
     dlg = wx.FileDialog(
             self, message="Save as...",
             defaultDir=dir, 
             defaultFile=filename,
-            style=wx.SAVE
+            wildcard=wildcard,
+            style=wx.SAVE,
             )
     
     if dlg.ShowModal() == wx.ID_OK:
@@ -128,7 +129,7 @@
             defaultDir=dir, 
             defaultFile='',
             wildcard=wildcard,
-            style=wx.OPEN | wx.MULTIPLE | wx.CHANGE_DIR
+            style=wx.OPEN | wx.MULTIPLE | wx.CHANGE_DIR,
             )
     
     if dlg.ShowModal() == wx.ID_OK:

=== added file 'src/2.0/ccdRMAdapter.py'
--- src/2.0/ccdRMAdapter.py	1970-01-01 00:00:00 +0000
+++ src/2.0/ccdRMAdapter.py	2013-02-04 16:06:31 +0000
@@ -0,0 +1,84 @@
+import xls2ccdRM
+
+class Adapter(object):
+    def __init__(self):
+        self.indent = 4
+    
+    def set_indent(self, indent):
+        self.indent = indent
+        
+    def get_type_string(self, name, data, defin_id, ct_name, dt_id, docs):
+
+        e_data_type = 'ClusterType'
+
+##        if name == 'AdminEntry':
+##            data_name = data
+##            result = xls2ccdRM.getCareEntryType(data_name, ct_name, docs, dt_id, e_data_type, self.indent):
+            
+        if name == 'CareEntry':
+            data_name = name
+            data_name = ''
+            result = xls2ccdRM.getCareEntryType(data_name, ct_name, docs, dt_id, e_data_type, indent=self.indent)
+            return result
+##        elif name == 'DemographicEntry':
+##            pass
+        
+        elif name == 'Cluster':
+            data_name = name
+            cluster_subject = ''
+            ed_id = ct_name
+            result = xls2ccdRM.getClusterType(data_name, ed_id, dt_id, cluster_subject, indent=self.indent)
+            return result
+##        elif name == 'DvBoolean':
+##            pass
+
+        elif name == 'DvCodedString':
+            data_name = data['data_name']
+            terminology = data['terminology']
+            
+            ta = [] ; tn = [] ; tv = [] ; tc = [] ; cs = []
+            for lista in terminology:
+                ta.append(lista[2])
+                tn.append(lista[1])
+                tv.append(lista[3])
+                tc.append(lista[0])
+                cs.append(lista[4])
+            
+            result = xls2ccdRM.getDvCodedStringType(data_name, ct_name, docs, self.indent,ta,tn,tv,tc,cs)
+            return result
+##        elif name == 'DvCount':
+##            pass
+##
+##        elif name == 'DvDate':
+##            pass
+##
+##        elif name == 'DvInterval':
+##            pass
+##
+##        elif name == 'DvOrdinal':
+##            pass
+##
+##        elif name == 'DvQuantity':
+##            pass
+##
+##        elif name == 'DvString':
+##            pass
+##
+##        elif name == 'DvTime':
+##            pass
+
+        elif name == 'Element':
+            result = xls2ccdRM.getElementType(defin_id, dt_id, indent=self.indent)
+            return result
+        
+        elif name == 'PartIdentified':
+            result = xls2ccdRM.getPartIdentifiedType(dt_id, indent)
+            return result
+        
+        elif name == 'PartySelf':
+            result = xls2ccdRM.getPartySelfType(dt_id, indent)
+            return result
+##        elif name == 'ReferenceRange':
+##            pass
+        else:
+            return ''

=== added file 'src/2.0/ccdgen.py'
--- src/2.0/ccdgen.py	1970-01-01 00:00:00 +0000
+++ src/2.0/ccdgen.py	2013-02-04 16:06:31 +0000
@@ -0,0 +1,215 @@
+# -*- coding: utf-8 -*-
+import string
+import uuid
+import copy
+from xml.sax.saxutils import escape
+
+import ccdRMAdapter
+
+
+class CCDGen(object):
+    def __init__(self):
+
+        self.formatter = string.Formatter()
+
+        # Config Data
+        self.version = ''
+        
+        # Metadata
+        self.title = ''
+        self.description = ''
+        self.creator = ''
+        self.creator_email = ''
+        self.contributors = ''
+        self.publisher = ''
+        self.subject = ''
+        self.source = ''
+        self.rights = ''
+        self.relation = ''
+        self.coverage = ''
+        self.language = ''
+        self.date = ''
+
+        self.structure = None
+        self.fd = None
+
+        self.ccd_id = 'ccd-' + str(uuid.uuid4())
+        
+    def open_file(self, filename):
+        self.fd = open(filename, 'wb')
+        
+    def close_file(self):
+        self.fd.close()
+
+    def update_ccd_id(self, ccd_id):
+        self.ccd_id = ccd_id
+
+    # Depends on container module design
+    def get_container_data(self, structure):
+        self.structure = copy.copy(structure)
+        metadata = self.structure.pop('metadata')
+
+        self.title = metadata.get('title')
+        self.description = metadata.get('description')
+        self.creator = metadata.get('creator')
+        self.creator_email = metadata.get('creator_email')
+        self.contributors = metadata.get('contributors')
+        self.publisher = metadata.get('publisher')
+        self.subject = metadata.get('subject')
+        self.source = metadata.get('source')
+        self.rights = metadata.get('rights')
+        self.relation = metadata.get('relation')
+        self.coverage = metadata.get('coverage')
+        self.language = metadata.get('language')
+        self.date = metadata.get('date')
+        
+        
+    # Depends on config module design
+    def get_version(self, rm_version):
+        self.version = rm_version.replace('.','_')
+
+    def _print_header(self):
+        self._test_open_file()
+        txt = \
+"""<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema  xmlns:xs="http://www.w3.org/2001/XMLSchema";
+            xmlns:mlhim2="http://www.mlhim.org/xmlns/mlhim2/{version}"; 
+            xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"; 
+            xmlns:owl="http://www.w3.org/2002/07/owl#";
+            xmlns:dc="http://purl.org/dc/elements/1.1/";	   
+            xmlns:sawsdl="http://www.w3.org/ns/sawsdl";
+            xmlns:sawsdlrdf="http://www.w3.org/ns/sawsdl#";
+            id="mlhim2-{ccd_id}"
+            elementFormDefault="qualified"
+            targetNamespace="http://www.mlhim.org/xmlns/mlhim2/{version}";
+            xmlns:data-view="http://www.w3.org/2003/g/data-view#"; 
+            data-view:transformation="http://www.mlhim.org/ccd/ccd_md_view.xsl";>"""
+
+        self.fd.write(self.formatter.format(txt,
+            version = self.version,
+            ccd_id = self.ccd_id,
+            )
+        )
+    def _print_metadata(self):
+        self._test_open_file()
+        txt = \
+"""
+    
+    <xs:annotation>
+      <xs:appinfo>
+        <rdf:RDF>
+
+          <rdf:Description rdf:about="http://www.hkcr.net/ccd/{ccd_id}";>
+            <dc:title>{title}</dc:title>
+            <dc:creator>{creator} &lt;{creator_email}&gt; </dc:creator>
+            {contributors}
+            <dc:subject>{subject}</dc:subject>
+            <dc:source>{source}</dc:source>
+            <dc:rights>{rights}</dc:rights>
+            <dc:relation>{relation}</dc:relation>
+            <dc:coverage>{coverage}</dc:coverage>
+            <dc:type>{resource_type}</dc:type>
+            <dc:identifier>{identifier}</dc:identifier>
+            <dc:description>{description}</dc:description>
+            <dc:publisher>{publisher}</dc:publisher>
+            <dc:date>{date}</dc:date>
+            <dc:format>{resource_format}</dc:format>
+            <dc:language>{language}</dc:language>
+          </rdf:Description>
+        </rdf:RDF>
+      </xs:appinfo>
+    </xs:annotation>"""
+
+        contributors_formated = '<dc:contributor>' + \
+            '</dc:contributor>\n            <dc:contributor>'.join([ escape(i).strip() for i in self.contributors.split(';')]) + \
+            '</dc:contributor>'
+
+
+
+        self.fd.write(self.formatter.format(txt,
+            title = self.title,
+            description = self.description,
+            creator = self.creator,
+            creator_email = self.creator_email,
+            
+            contributors = contributors_formated,
+            
+            publisher = self.publisher,
+            subject = self.subject,
+            source = self.source,
+            rights = self.rights,
+            relation = self.relation,
+            coverage = self.coverage,
+            language = self.language,
+            date = self.date,
+            
+            ccd_id = self.ccd_id,
+            identifier = self.ccd_id,
+            
+            resource_type = "MLHIM Concept Constraint Definition (CCD)",
+            resource_format = "text/xml",
+            )
+        )
+    
+    def _print_structure(self):
+        self._test_open_file()
+        txt = \
+"""
+
+  <xs:include schemaLocation="http://www.mlhim.org/xmlns/mlhim2/{version}/mlhim2.xsd"/>
+
+  <xs:element name="{ccd_id}" type="mlhim2:ct-{UUID_complex}"/>
+
+  <xs:complexType name="ct-{UUID_complex}">
+    <xs:complexContent>
+      <xs:restriction base="mlhim2:CCDType">
+	<xs:sequence>
+	  <xs:element minOccurs="1"  maxOccurs="1" ref="mlhim2:el-{UUID_definition}"/>
+	</xs:sequence>
+      </xs:restriction>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:element name='el-{UUID_definition}' substitutionGroup="mlhim2:definition" type='mlhim2:ct-{UUID_definition}'/>
+
+"""
+        UUID_definition = str(uuid.uuid4())
+        UUID_complex = str(uuid.uuid4())
+
+
+        self.fd.write(self.formatter.format(txt,
+            version = self.version,
+            UUID_complex = UUID_complex,
+            UUID_definition = UUID_definition,
+            ccd_id = self.ccd_id,
+            )
+        )
+        
+        adapter = ccdRMAdapter.Adapter()
+        adapter.set_indent = 2
+        
+        for node in self.structure.items():
+            name = node[1][0]
+            data = node[1][1]
+            ct = str(uuid.uuid4())
+            dt_id = str(uuid.uuid4())
+            defin_id = self.ccd_id[4:]
+            docs = ''
+            xsd_type_string = adapter.get_type_string(name, data, defin_id, ct, dt_id, docs)
+            #print xsd_type_string
+            self.fd.write(xsd_type_string)
+        
+    
+    def _test_open_file(self):
+        if not self.fd:
+            raise IOError('File not defined')
+
+    def get_information(self, structure, version):
+        self.get_version(version)
+        self.get_container_data(structure)
+        
+    def export_ccd(self):
+        
+        self._print_header()
+        self._print_metadata()
+        self._print_structure()
+        self.fd.flush()

=== modified file 'src/2.0/cdd.py'
--- src/2.0/cdd.py	2013-02-01 19:30:12 +0000
+++ src/2.0/cdd.py	2013-02-04 16:06:31 +0000
@@ -40,6 +40,9 @@
 import config
 ConfigDialog = config.ConfigDialog
 
+import ccdgen
+xsd_generator = ccdgen.CCDGen()
+
 import container
 container = container.Container()
 
@@ -63,6 +66,12 @@
 
         # Setup the tree
         self.setup_tree()
+        
+        # Store ccd metadata in container
+        self.metadata.get_panel_configs()
+        md = self.metadata.get_as_dict()
+        container.set_metadata(md)
+
     
     def setup_tree(self):
         self.root, self.metadata_item, self.definition_item = self.tree_ctrl_ccd.setup_tree()
@@ -301,7 +310,7 @@
         
     def file_open(self, event):  # wxGlade: MainFrame.<event_handler>
         wildcard = \
-            "Pickle files (*.pickle)|*.pickle|" \
+            "CDD files (*.cdd)|*.cdd|" \
             "All files (*.*)|*.*"
 
         path = self.config_dialog.workspace
@@ -317,13 +326,17 @@
         self.tree_ctrl_ccd.SelectItem(self.metadata_item)
         
     def file_save(self, event, ask=False):  # wxGlade: MainFrame.<event_handler>
+        wildcard = \
+            "CDD files (*.cdd)|*.cdd|" \
+            "All files (*.*)|*.*"
+
         path = self.config_dialog.workspace
         try:
             self.first_save
             if ask or not self.pickle_name:
-                self.pickle_name = save_file_diag(self, 'CDD.pickle', path)
+                self.pickle_name = save_file_diag(self, 'current.cdd', path, wildcard)
         except AttributeError, e:
-            self.pickle_name = save_file_diag(self, 'CDD.pickle', path)
+            self.pickle_name = save_file_diag(self, 'current.cdd', path, wildcard)
         
         if self.pickle_name:
             self.first_save = False
@@ -391,9 +404,18 @@
         # Then we call wx.AboutBox giving it that info object
         wx.AboutBox(about)
 
-
     def export_xsd(self, event):  # wxGlade: MainFrame.<event_handler>
-        not_implemented_diag(self)
+        wildcard = \
+            "XSD files (*.xsd)|*.xsd|" \
+            "All files (*.*)|*.*"
+
+        path = self.config_dialog.workspace
+        if not path: return
+        filename = save_file_diag(self, xsd_generator.ccd_id + '.xsd', path, wildcard)
+
+        xsd_generator.open_file(filename)
+        xsd_generator.get_information(container.structure, self.config_dialog.rm_version)
+        xsd_generator.export_ccd()
 
     def export_xform(self, event):  # wxGlade: MainFrame.<event_handler>
         not_implemented_diag(self)
@@ -478,7 +500,7 @@
         return False
     
     def set_lang(self):
-        self.choice_language.SetSelection(int(self.top_panel.metadata.language) | 0)
+        self.choice_language.SetSelection(self.top_panel.metadata.language_num)
 
     # Relies in default name defined in GUI
     def evt_radiobox_language(self, event):  # wxGlade: DvCodedString.<event_handler>
@@ -598,6 +620,23 @@
         cdd_gui.PartySelf.__init__(self, *args, **kwds)
         CommonPanel.__init__(self)
 
+        self.define_attributes()
+
+    def evt_button_ok(self):
+        self.get_panel_data()
+        self.store_in_container()
+
+    def get_panel_data(self):
+        self.data = dict(
+            external_ref = self.text_ctrl_external_ref.GetValue(),
+            feeder_audit = self.text_ctrl_feeder_audit.GetValue(),
+            )
+
+    def set_panel_data(self, data):
+        self.text_ctrl_external_ref.SetValue(data['external_ref'])
+        self.text_ctrl_feeder_audit.SetValue(data['feeder_audit'])
+        
+        
 # end of class PartySelf
 
 class PartyIdentified(CommonPanel, cdd_gui.PartyIdentified):
@@ -605,6 +644,31 @@
         cdd_gui.PartyIdentified.__init__(self, *args, **kwds)
         CommonPanel.__init__(self)
 
+        self.define_attributes()
+
+    def evt_button_ok(self):
+        self.get_panel_data()
+        self.store_in_container()
+
+        self.text_ctrl_details = wx.TextCtrl(self, -1, "")
+        self.text_ctrl_party_name = wx.TextCtrl(self, -1, "")
+        
+    def get_panel_data(self):
+        self.data = dict(
+            details = self.text_ctrl_details.GetValue(),
+            party_name = self.text_ctrl_party_name.GetValue(),
+            external_ref = self.text_ctrl_external_ref.GetValue(),
+            feeder_audit = self.text_ctrl_feeder_audit.GetValue(),
+
+            )
+
+    def set_panel_data(self, data):
+        self.text_ctrl_details.SetValue(data['details'])
+        self.text_ctrl_party_name.SetValue(data['party_name'])
+        self.text_ctrl_external_ref.SetValue(data['external_ref'])
+        self.text_ctrl_feeder_audit.SetValue(data['feeder_audit'])
+        
+        
 # end of class PartyIdentified
 
 class FeederAudit(CommonPanel, cdd_gui.FeederAudit):