From a5e46d3b2f3dc066da79f7a8b65031ff3d61c34a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Victor=20Frans=20Pondaco=20Winandy?=
 <jvfpw18@inf.ufpr.br>
Date: Thu, 4 Jul 2019 07:59:09 -0300
Subject: [PATCH] Echo columns from mapping protocol to table_definition

---
 database/database_table.py | 23 +++++++++++++++++++++++
 requirements.txt           |  1 +
 2 files changed, 24 insertions(+)

diff --git a/database/database_table.py b/database/database_table.py
index 73cd16a..a48234b 100644
--- a/database/database_table.py
+++ b/database/database_table.py
@@ -24,6 +24,7 @@ import time
 import json
 import re
 import logging
+import jsbeautifier
 from sqlalchemy import Table, Column, inspect, Integer, String, Boolean,\
                        PrimaryKeyConstraint, ForeignKeyConstraint, text
 from sqlalchemy.sql import select, insert, update, delete, func
@@ -306,6 +307,20 @@ class DatabaseTable(Table):
 
         return definitions
 
+    def update_defintions(self, definitions):
+        '''
+        Update the table definitions with an altered definitions object
+        '''
+        logger.debug("Updating table definitions from %s", definitions)
+        definitions_json = self.name + '.json'
+        definitions_json = os.path.join(settings.TABLE_DEFINITIONS_FOLDER, definitions_json)
+
+        new_definitions_json = jsbeautifier.beautify(json.dumps(definitions, ensure_ascii=False))
+        with open(definitions_json, "w") as def_json:
+            def_json.write(new_definitions_json)
+
+        logger.debug("Definitions Updated")
+
     def load_protocol(self, protocol):
         '''
         Takes a Protocol instance and loads it for further use
@@ -396,18 +411,26 @@ class DatabaseTable(Table):
             bind = self.metadata.bind
 
         definitions = self.get_definitions()
+        column_dict = definitions.get('columns')
+        if not column_dict:
+            column_dict = {}
 
         for column in self._protocol.get_targets():
             try:
                 column = self._protocol.dbcolumn_from_target(column)
             except InvalidTargetError:
                 continue
+            if column[0] not in column_dict.keys():
+                column_dict[column[0]] = column[1]
             if column[0]:
                 column[0] = column[0].strip()
             column = Column(column[0], get_type(column[1]))
 
             self.append_column(column)
 
+        definitions['columns'] = column_dict
+        self.update_defintions(definitions)
+
         primary_key = [self.columns.get(c) for c in definitions['pk']]
         if primary_key:
             self.constraints.add(PrimaryKeyConstraint(*primary_key))
diff --git a/requirements.txt b/requirements.txt
index 7c18f5d..c3861e1 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -5,6 +5,7 @@ ipython==7.5.0
 ipython-genutils==0.2.0
 isort==4.3.20
 jedi==0.13.3
+jsbeautifier==1.10.0
 lazy-object-proxy==1.4.1
 manage.py==0.2.10
 mccabe==0.6.1
-- 
GitLab