'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 |
|---|
