From 6b80344fc9cf66fdb6dd71a2ab65e73049821152 Mon Sep 17 00:00:00 2001
From: Thomas Bock <thomas.bock@ptb.de>
Date: Wed, 27 Mar 2019 16:21:14 +0100
Subject: [PATCH] config links to dcc

---
 README.md   |  8 ++++++++
 config.json |  3 ++-
 server.py   | 16 ++++++++++------
 utils.py    | 29 +++++++++++++++++++----------
 4 files changed, 39 insertions(+), 17 deletions(-)

diff --git a/README.md b/README.md
index cb4e895..cea0263 100644
--- a/README.md
+++ b/README.md
@@ -83,6 +83,14 @@ Returns the version of the validation server:
 > <version>0.2.0</version>
 ```
 
+### /version_xsd [GET]
+
+Returns the version of the xsd-definition:
+
+```
+> curl http://localhost:5005/version
+> <version>0.2.0</version>
+``
 
 ### /update [POST]
 
diff --git a/config.json b/config.json
index ff70ec6..d436be0 100644
--- a/config.json
+++ b/config.json
@@ -7,7 +7,8 @@
         "dir":"."
     },
     "xsd":{
-        "dir":"./xsd",
+        "dir":"../DCC/schemata",
+        "file": "DCC_v1.9.xsd",
         "url": "https://intranet.ptb.de/fileadmin/dokumente/intranet/abteilungen/abteilung_1/Digitaler_Kalibrierschein/DCC"
   }
 }
diff --git a/server.py b/server.py
index 226343d..7d4cd0e 100644
--- a/server.py
+++ b/server.py
@@ -5,9 +5,6 @@ import utils as utils
 config = utils.get_config_dict()
 git_cmd = utils.git_cmd(config)
 
-## kommt später vom server
-xsd_file_name = 'DCC_v1.8.3.xsd'
-
 app = Flask(__name__)
 CORS(app)
 
@@ -18,6 +15,14 @@ def version():
     
     return utils.xml_response(ret)
 
+@app.route('/version_xsd', methods=['get'])
+def version_xsd():
+    app.logger.debug('hit version_xsd')
+    xsd_str = utils.get_xsd(config, from_server=False)
+    version_str = utils.get_xsd_version(xsd_str)
+    
+    return utils.xml_response(utils.return_version(version_str))
+
 @app.route('/update', methods=['post'])
 def update():
     app.logger.debug('hit update')
@@ -31,7 +36,7 @@ def update():
 @app.route('/update_xsd', methods=['post'])
 def update_xsd():
     app.logger.debug('hit update xsd')
-    xsd_str = utils.get_xsd(config, xsd_file_name, from_server=True)
+    xsd_str = utils.get_xsd(config, from_server=True)
     xsd_xml = utils.parse(xsd_str)
     if xsd_xml:
         ret = utils.save_xsd(config, xsd_str, xsd_file_name)
@@ -40,14 +45,13 @@ def update_xsd():
 
     return  utils.xml_response(ret)
 
-
 @app.route('/validate', methods=['post'])
 def validate():
     app.logger.debug('hit validate')
     xml_str = request.data
     xml_tree = utils.parse(xml_str)
     if xml_tree:
-        xsd_str = utils.get_xsd(config, xsd_file_name, from_server=False)
+        xsd_str = utils.get_xsd(config, from_server=False)
         ret = utils.validate(xml_str=xml_str, xsd_str=xsd_str)
     else:
         ret = utils.return_error(error='unvalid xml data')
diff --git a/utils.py b/utils.py
index 07301e4..d8fa1ba 100644
--- a/utils.py
+++ b/utils.py
@@ -5,8 +5,9 @@ from flask import Response
 from xml.etree import ElementTree as ET
 import xmlschema
 
+ns = {"w3":"http://www.w3.org/2001/XMLSchema"}
+
 def get_config_dict():
-    ## sollte vielleicht doch xml-datei werden
     with open('./config.json') as json_config_file:
         config = json.load(json_config_file)
 
@@ -15,24 +16,25 @@ def get_config_dict():
 def git_cmd(config):
     return git.cmd.Git(config['git']['dir'])
 
-def get_xsd_url(config, xsd_name):
-    return "{uri}/{xsd_name}".format(uri=config['xsd']['url'], xsd_name=xsd_name)
+def get_xsd_url(config, file_name):
+    return "{uri}/{file_name}".format(uri=config['xsd']['url'], file_name=file_name)
 
-def get_xsd_path_file(config, xsd_name):
-    return "{dir}/{xsd_name}".format(dir=config['xsd']['dir'], xsd_name=xsd_name)
+def get_xsd_path_file(config, file_name):
+    return "{dir}/{file_name}".format(dir=config['xsd']['dir'], file_name=file_name)
 
-def get_xsd(config, xsd_name, from_server=True):
+def get_xsd(config, from_server=True):
+    file_name = config['xsd']['file']
     if from_server:
-        url = get_xsd_url(config, xsd_name)
+        url = get_xsd_url(config, file_name)
         xsd_str = requests.get(url).text
     else:
-        path_file = get_xsd_path_file(config, xsd_name)
+        path_file = get_xsd_path_file(config, file_name)
         xsd_str = open(path_file).read()
 
     return xsd_str
 
-def save_xsd(config, xsd_str, xsd_name):
-    path_file = get_xsd_path_file(config, xsd_name)
+def save_xsd(config, xsd_str, file_name):
+    path_file = get_xsd_path_file(config, file_name)
     file = open(path_file, "w")
     file.write(xsd_str)  
     
@@ -45,6 +47,13 @@ def parse(xml_str):
         tree = None
     return tree
 
+def get_xsd_version(xsd_str):
+    tree = parse(xsd_str)
+    for annotation in tree.findall("w3:annotation", ns):
+        version_text = annotation.find("w3:documentation", ns).text
+
+    return version_text
+
 def validate(xml_str, xsd_str):
     tree = parse(xml_str)
     schema = xmlschema.XMLSchema(xsd_str)
-- 
GitLab