diff --git a/api/cueSearch/migrations/0006_auto_20220224_0933.py b/api/cueSearch/migrations/0006_auto_20220224_0933.py
new file mode 100644
index 00000000..16f38d3b
--- /dev/null
+++ b/api/cueSearch/migrations/0006_auto_20220224_0933.py
@@ -0,0 +1,23 @@
+# Generated by Django 3.2.5 on 2022-02-24 09:33
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('dataset', '0001_initial'),
+ ('cueSearch', '0005_searchcardtemplate_connectiontype'),
+ ]
+
+ operations = [
+ migrations.RemoveField(
+ model_name='searchcardtemplate',
+ name='connectionType',
+ ),
+ migrations.AddField(
+ model_name='searchcardtemplate',
+ name='connectionType',
+ field=models.ManyToManyField(blank=True, null=True, to='dataset.ConnectionType'),
+ ),
+ ]
diff --git a/api/cueSearch/migrations/0007_alter_searchcardtemplate_connectiontype.py b/api/cueSearch/migrations/0007_alter_searchcardtemplate_connectiontype.py
new file mode 100644
index 00000000..c8f15f1f
--- /dev/null
+++ b/api/cueSearch/migrations/0007_alter_searchcardtemplate_connectiontype.py
@@ -0,0 +1,19 @@
+# Generated by Django 3.2.5 on 2022-02-24 10:49
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('dataset', '0001_initial'),
+ ('cueSearch', '0006_auto_20220224_0933'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='searchcardtemplate',
+ name='connectionType',
+ field=models.ManyToManyField(blank=True, to='dataset.ConnectionType'),
+ ),
+ ]
diff --git a/api/cueSearch/models.py b/api/cueSearch/models.py
index 075ddc3d..f9cdbd6d 100644
--- a/api/cueSearch/models.py
+++ b/api/cueSearch/models.py
@@ -26,9 +26,8 @@ def __str__(self):
class SearchCardTemplate(models.Model):
RENDER_TYPE_TABLE = "table"
RENDER_TYPE_LINE = "line"
- connectionType = models.ForeignKey(
- ConnectionType, on_delete=models.SET_NULL, null=True, blank=True
- )
+
+ connectionType = models.ManyToManyField(ConnectionType, blank=True) #on_delete=models.SET_NULL
templateName = models.TextField(null=True, blank=True)
title = models.TextField(null=True, blank=True)
bodyText = models.TextField(null=True, blank=True)
diff --git a/api/cueSearch/serializers.py b/api/cueSearch/serializers.py
index af0c799c..54e1345f 100644
--- a/api/cueSearch/serializers.py
+++ b/api/cueSearch/serializers.py
@@ -2,7 +2,7 @@
from rest_framework import serializers
from dataset.models import ConnectionType, Dataset
from cueSearch.models import GlobalDimension, SearchCardTemplate
-
+from dataset.serializers import ConnectionTypeSerializer
class AllDimensionsSerializer(serializers.ModelSerializer):
"""
@@ -81,18 +81,9 @@ class Meta:
class SearchCardTemplateSerializer(serializers.ModelSerializer):
"""Serializers for get Search card template"""
- connectionTypeName = serializers.SerializerMethodField()
- connectionTypeId = serializers.SerializerMethodField()
-
- def get_connectionTypeName(self, obj):
- name = ""
- if obj.connectionType:
- name = obj.connectionType.name
- return name
+ connectionTypeName = ConnectionTypeSerializer(many=True, read_only=True)
+ connectionTypeId = ConnectionTypeSerializer(many=True, read_only=True)
- def get_connectionTypeId(self, obj):
- if obj.connectionType:
- return obj.connectionType.id
class Meta:
model = SearchCardTemplate
diff --git a/api/cueSearch/services/cardTemplate.py b/api/cueSearch/services/cardTemplate.py
index c29d3842..76804242 100644
--- a/api/cueSearch/services/cardTemplate.py
+++ b/api/cueSearch/services/cardTemplate.py
@@ -10,7 +10,6 @@
logger = logging.getLogger(__name__)
-
class CardTemplates:
"""
Service to create, read, update & delete operation on Search card template
@@ -22,27 +21,30 @@ def createCardTemplate(payload: dict):
Create search card template
"""
try:
- res = ApiResponse("Error occurred while creating search card template")
- connectionTypeId = int(payload.get("connectionTypeId", 1))
- connectionType = ConnectionType.objects.get(id=connectionTypeId)
+ res = ApiResponse("Error occur while creating search card template")
renderType = payload.get("renderType", "table")
templateName = payload.get("templateName", "")
title = payload.get("title", "")
bodyText = payload.get("bodyText", "")
sql = payload.get("sql", "")
-
+
cardTemplateObj = SearchCardTemplate.objects.create(
templateName=templateName,
title=title,
bodyText=bodyText,
sql=sql,
renderType=renderType,
- connectionType=connectionType,
)
+
+ connectionTypeId = list(payload.get("connectionTypeId"))
+ for id in connectionTypeId:
+ value = ConnectionType.objects.get(id=id)
+ cardTemplateObj.connectionType.add(value)
+
res.update(True, "Search card template created successfully")
except Exception as ex:
logging.error("Error %s", str(ex))
- res.update(False, "Exception occurred while creating templates")
+ res.update(False, "Exception occured while creating templates")
return res
@staticmethod
@@ -65,8 +67,7 @@ def updateCardTemplate(templateId: int, payload: dict):
"""Method to update card template"""
try:
res = ApiResponse("Error while updating card template")
- connectionTypeId = int(payload.get("connectionTypeId"))
- connectionType = ConnectionType.objects.get(id=connectionTypeId)
+
renderType = payload.get("renderType", "table")
templateName = payload.get("templateName", "")
title = payload.get("title", "")
@@ -80,8 +81,20 @@ def updateCardTemplate(templateId: int, payload: dict):
templateObj.title = title
templateObj.templateName = templateName
templateObj.renderType = renderType
- templateObj.connectionType = connectionType
templateObj.save()
+
+ oldConnTypeId = templateObj.connectionType.values()
+
+ for item in oldConnTypeId:
+ connId = item['id']
+ templateObj.connectionType.remove(connId,None)
+
+ connectionTypeId = list(payload.get("connectionTypeId"))
+ for id in connectionTypeId:
+ value = ConnectionType.objects.get(id=id)
+ templateObj.connectionType.add(value)
+
+
res.update(True, "Successfully updated template")
except Exception as ex:
logging.error("Error %s", str(ex))
@@ -102,7 +115,7 @@ def publishedCardTemplate(payload: dict):
res.update(True, "Card Template published successfully")
except Exception as ex:
logging.error("Error %s", str(ex))
- res.update(False, "Error occurred while publishing Card Template")
+ res.update(False, "Error occured while publishing Card Template")
return res
def deleteCardTemplate(templateId: int):
@@ -114,7 +127,7 @@ def deleteCardTemplate(templateId: int):
res.update(True, "Card template deleted successfully")
except Exception as ex:
logging.error("Error while deleting %s", str(ex))
- res.update(False, "Error occurred while deleting card template")
+ res.update(False, "Error occured while deleting card template")
return res
@staticmethod
@@ -127,23 +140,22 @@ def getCardTemplateById(templateId: int):
res.update(True, "Fetched card templates", data)
except Exception as ex:
logging.error("Error while get card template by Id %s", str(ex))
- res.update(False, "Error occurred while getting template by id")
+ res.update(False, "Error occured while getting template by id")
return res
@staticmethod
def verifyCardTemplate(payload: dict):
res = ApiResponse()
- try:
- sampleParams = json.loads(json.dumps(SAMPLE_PARAMS))
- param = {
- **sampleParams,
- "templateTitle": payload["templateTitle"],
- "templateText": payload["templateText"],
- "templateSql": payload["templateSql"],
- }
- response = SearchCardTemplateServices.renderTemplatesUnsafe(param)
- res.update(True, "Template rendered successfully")
- except Exception as ex:
- logger.error("Error in rendering templates: %s", str(ex))
- res.update(False, "Error occurred during rendering", str(ex))
- return res
+ sampleParams = json.loads(json.dumps(SAMPLE_PARAMS))
+ param = {
+ "templateTitle": payload['templateTitle'],
+ "templateText": payload['templateText'],
+ "templateSql": payload['templateSql'],
+ "param": sampleParams,
+ }
+ response = SearchCardTemplateServices.renderTemplates(param)
+ if len(response) == 0:
+ res.update(False,"Error occur during rendering")
+ else:
+ res.update(True,"Template rendered successfully")
+ return res
\ No newline at end of file
diff --git a/api/seeddata/searchCardTemplate.json b/api/seeddata/searchCardTemplate.json
index 9fae1cf4..28582ced 100644
--- a/api/seeddata/searchCardTemplate.json
+++ b/api/seeddata/searchCardTemplate.json
@@ -9,7 +9,7 @@
"bodyText": "This table displays raw data for dataset {{dataset}} with filter {{filter}} ",
"sql": "SELECT * FROM ({{ datasetSql|safe }}) WHERE {{filter|safe}} limit 500",
"renderType": "table",
- "connectionType": 6
+ "connectionType": [6]
}
},
{
@@ -22,7 +22,7 @@
"bodyText": "{% load event_tags %} {% for filterDim in filterDimensions %} {% conditionalCount searchResults 'dimension' filterDim as dimCount %} {% if dimCount > 1 %} {% for metricName in metrics %} This chart displays filtered values on dimension {{filterDim}} along with other filters applied i.e. {{filter|safe}} for metric {{metricName}} on dataset {{dataset}} +-; {% endfor %} {% endif %} {% endfor %}",
"sql": "{% load event_tags %} {% for filterDim in filterDimensions %} {% conditionalCount searchResults 'dimension' filterDim as dimCount %} {% if dimCount > 1 %} {% for metricName in metrics %} SELECT ({{ timestampColumn }}), {{ filterDim }}, SUM({{ metricName }}) as {{metricName}} FROM ({{ datasetSql|safe }}) WHERE {{filter|safe}} GROUP BY 1, 2 limit 500 +-; {% endfor %} {% endif %} {% endfor %}",
"renderType": "line",
- "connectionType": 6
+ "connectionType": [6]
}
},
{
@@ -35,7 +35,7 @@
"bodyText": " {% for metric in metrics %} For {{filter}} +-; {% endfor %}",
"sql": " {% for metric in metrics %} SELECT ({{ timestampColumn }}), SUM({{ metric }}) as {{ metric }} FROM ({{ datasetSql|safe }}) WHERE {{filter|safe}} GROUP BY 1 limit 500 +-; {% endfor %}",
"renderType": "line",
- "connectionType": 6
+ "connectionType": [6]
}
},
{
@@ -48,7 +48,7 @@
"bodyText": "This table displays raw data for dataset {{dataset}} with filter {{filter}} ",
"sql": "SELECT * FROM ({{ datasetSql|safe }}) AS templatetable WHERE {% for orResults in groupedResultsForFilter %} {% for orResult in orResults %} \"templatetable\".\"{{ orResult.dimension }}\" = '{{ orResult.value }}' OR {% endfor %} True AND {% endfor %} True limit 500",
"renderType": "table",
- "connectionType": 1
+ "connectionType": [1]
}
},
{
@@ -61,7 +61,7 @@
"bodyText": "{% load event_tags %} {% for filterDim in filterDimensions %} {% conditionalCount searchResults 'dimension' filterDim as dimCount %} {% if dimCount > 1 %} {% for metricName in metrics %} This chart displays filtered values on dimension {{filterDim}} along with other filters applied i.e. {{filter|safe}} for metric {{metricName}} on dataset {{dataset}} +-; {% endfor %} {% endif %} {% endfor %}",
"sql": "{% load event_tags %} {% for filterDim in filterDimensions %} {% conditionalCount searchResults 'dimension' filterDim as dimCount %} {% if dimCount > 1 %} {% for metricName in metrics %} SELECT \"templatetable\".\"{{ timestampColumn }}\", \"templatetable\".\"{{ filterDim }}\", SUM(\"templatetable\".\"{{ metricName }}\") as {{metricName}} FROM ({{ datasetSql|safe }}) AS templatetable WHERE {% for orResults in groupedResultsForFilter %} {% for orResult in orResults %} \"templatetable\".\"{{ orResult.dimension }}\" = '{{ orResult.value }}' OR {% endfor %} True AND {% endfor %} True GROUP BY 1, 2 limit 500 +-; {% endfor %} {% endif %} {% endfor %}",
"renderType": "line",
- "connectionType": 1
+ "connectionType": [1]
}
},
{
@@ -74,7 +74,7 @@
"bodyText": " {% for metric in metrics %} For {{filter}} +-; {% endfor %}",
"sql": " {% for metric in metrics %} SELECT \"templatetable\".\"{{ timestampColumn }}\", SUM(\"templatetable\".\"{{ metric }}\") as {{ metric }} FROM ({{ datasetSql|safe }}) AS templatetable WHERE {% for orResults in groupedResultsForFilter %} {% for orResult in orResults %} \"templatetable\".\"{{ orResult.dimension }}\" = '{{ orResult.value }}' OR {% endfor %} True AND {% endfor %} True GROUP BY 1 limit 500 +-; {% endfor %}",
"renderType": "line",
- "connectionType": 1
+ "connectionType": [1]
}
},
{
diff --git a/ui/src/components/Search/CardTemplates/AddCardTemplates.js b/ui/src/components/Search/CardTemplates/AddCardTemplates.js
index b50f4722..5f0ee164 100644
--- a/ui/src/components/Search/CardTemplates/AddCardTemplates.js
+++ b/ui/src/components/Search/CardTemplates/AddCardTemplates.js
@@ -14,7 +14,7 @@ const { Option } = Select;
export default function AddCardTemplates(props) {
const [form] = Form.useForm();
const [renderType, setRenderType] = useState("table");
- const [connectionType, setConnectionType] = useState();
+ const [connectionType, setConnectionType] = useState([]);
useEffect(() => {
getConnectionType();
}, []);
@@ -32,6 +32,7 @@ export default function AddCardTemplates(props) {
const addCardTemplateFormSubmit = async (values) => {
let payload = {};
let connType = values["connectionType"].split(".");
+ console.log(connType);
payload["connectionTypeId"] = connType[0];
payload["connectionTypeName"] = connType[1];
payload["templateName"] = values["templateName"];
@@ -166,6 +167,8 @@ export default function AddCardTemplates(props) {
]}
>