'jinja2 template generate data from dictionary with loop and condition

I have one csv file which has few colums marked with .M as mandatory which will be passed to jinja template as it with no condition check . But for some columns i have to check for column heading and then make a sub section in template to accept all those parameters in that section .

Input :

|configuration|Server Node|ENUM-DNS service Instance Name.M|Zone Name.M|type.M|domain.M|description|ttl|soa-mname|soa-rname|soa-refresh|soa-retry|soa-expire|soa-minimum|soa-name-server|transfer-master-server|transfer-order|Remarks

enum-dns-zone,nn-edge01,,mnc001mcc655,dns,ims.mnc001.mcc655.3gppnetwork.org,,86400,kashif,hehhe,jjjj,jkjkj,ssss,kjkjkj,kjkjkjk,jkjkjk,hhhh,k enum-dns-zone,nn-edge02,,mnc001mcc655,dns,ims.mnc001.mcc655.3gppnetwork.org,,86400,iqbal,jhjhjhs,hshss,hjjahj,h,sss,aa,ddeee,sss,

Output :

enum-dns-zone::  {
Zone name=mnc001mcc655
type=dns
domain=ims.mnc001.mcc655.3gppnetwork.org



soa { 
   
   mname=kashif
   

   rname=hehhe
   

   refresh=jjjj
   

   retry=jkjkj
   

   expire=ssss
  

   minimum=kjkjkj
 
   name=kjkjkjk
}
.... repeated to number of occurances of **soa** keyword



transfer {


   master=jkjkjk



   order=hhhh


  }
... repeated to n number of occurances to keyword **transfer**

Expected Output:

enum-dns-zone::  {
Zone name=mnc001mcc655
type=dns
domain=ims.mnc001.mcc655.3gppnetwork.org
soa { 
   mname=kashif
   rname=hehhe
   refresh=jjjj
   retry=jkjkj
   expire=ssss
   minimum=kjkjkj
   name=kjkjkjk
}
transfer {
   master=jkjkjk
   order=hhhh
  }

J2Template:

data_enum= (""" {{row.configuration}}::{{row.type}} {{row.type}} {
{% for key1,value1 in mydata.items() %}
{{key1}}={{value1}}
{% endfor %}
{% for key,value in row.items() %}
{% if "soa" in key %}
  soa {
  {% for key, value in row.items() %} 
  {% if "soa"  in key  %}
  {% set split_list=key.split('-') %} {{ split_list[1] }}={{value}}
  {% endif %}
  {% endfor %}
}
{% elif "root" in key %}
  root {
  {% for key, value in row.items() %} 
  {% if "root"  in key  %}
  {% set split_list=key.split('-') %} {{ split_list[1] }}={{value}}
  {% endif %}
  {% endfor %}
}
{% elif "Probability" in key %}
  probability {
  {% for key, value in row.items() %} 
  {% if "Probability"  in key  %}
  {% set split_list=key.split('-') %} {{ split_list[1] }}={{value}}
  {% endif %}
  {% endfor %}
  }
{% elif "recursion" in key %}
  recursion {
  {% for key, value in row.items() %} 
  {% if "recursion"  in key  %}
  {% set split_list=key.split('-') %} {{ split_list[1] }}={{value}}
  {% endif %}
  {% endfor %}
  }
{% elif "transfer" in key %}
  transfer {
  {% for key, value in row.items() %} 
  {% if "transfer"  in key  %}
  {% set split_list=key.split('-') %} {{ split_list[1] }}={{value}}
  {% endif %}
  {% endfor %}
  }
{% endif %}
{% endfor %}
}
"""

Python Code:

with open("enum-dns-zone.csv", 'r') as read_obj:
#     if files_temp.split('.')[0]=="enum-monitoring-endpoint":
            datatemp=data_enum
    # pass the file object to DictReader() to get the DictReader object
            csv_dict_reader = csv.DictReader(read_obj)
    # iterate over each line as a ordered dictionary
            for row in csv_dict_reader:
          # row variable is a dictionary that represents a row in csv
                for key in row.keys():
                    #print(key)
                    if key[-1]=="M":
                        if row[key]!="":
                            mandatory_parameters[key[:-2]]= row[key]
                #print(mandatory_parameters)
                temp = Template(data_enum)
                with open("kashif", 'a') as f:
                    f.write(temp.render(row=row, mydata=mandatory_parameters))
                    f.close()
                print(temp.render(row=row, mydata=mandatory_parameters))
                    # print(mandatory_parameters)
                mandatory_parameters = {} ```  


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source