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) { ]} >