Commit a0efbbb9 by yasir

InsyaAllah selesai

1 parent 6203408b
......@@ -89,6 +89,7 @@ test-postpaid-inquiry,/api/test/postpaid/inquiry,API TEST INQUIRY POSTPAUD,1,0
api-vsi,/api/vsi,'API VSI,1,0
pay-form,/pay/{pay_token},Metode Pembayaran,1,0
pay-info,/pay_info/{pay_token}/{meth},Informasi Pembayaran,1,0
pay-info,/pay_info/{pay_token}/{state}/,Informasi Pembayaran,1,0
pay-request,/pay_request,Pembayaran,1,0
pay-request-resp,/pay_request_resp,Respon Request Pembayaran,1,0
\ No newline at end of file
pay-request-resp,/pay_request_resp,Respon Request Pembayaran,1,0
tangkap-response,/tangkap_response,tes_dong,1,0
\ No newline at end of file
......@@ -10,6 +10,10 @@ from .api_payment import set_register_values, build_register
from .api_merchant import get_vendor_produk
from ..pay_request_tools import methods, vacs, cvss, loans, cps, ems
from datetime import datetime, timedelta
from opensipkd.base import get_settings
from ..tools import json_rpc_header
import requests
import json
class VaSchema(colander.Schema):
......@@ -93,35 +97,19 @@ class view_pay(BaseView):
request = self.req
session = self.ses
url_dict = request.matchdict
print('isi url_dict >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>')
print(url_dict)
print('isi request.params >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>')
print(request.params)
data_form = {}
post_data = request.POST
items = dict(post_data)
produks = []
print('masuk controller pay >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>')
if post_data:
if 'bayar' in post_data:
print('masuk bayar >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>')
if 'invoice_no' not in post_data:
#error invoice
pass
user_id = request.session
# inv_no = items['invoice_no']
# row = PartnerPay.query().filter_by(cust_inv_no=inv_no).first()
customer = Partner.query().filter(Partner.id == 6).first()
# customer = Partner.query_user(user).first()
# if row and row.status > 0:
# #error invoice
# pass
row = DBSession.query(PartnerPay).filter(PartnerPay.token_pay_req == url_dict['pay_token']).first()
merchant_url = row.response_url
customer = Partner.query().filter(Partner.id == row.customer_id).first()
registered_user = customer.users
produk_kd = ''
......@@ -143,17 +131,15 @@ class view_pay(BaseView):
vendor_kd = None
produk_kd = denom
print('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>jenis string')
# whatisthis(produk_kd)
produk_kd = produk_kd.replace('\xad', '')
produk_kd = produk_kd.replace('\u00ad', '')
produk_kd = produk_kd.replace('\N{SOFT HYPHEN}', '')
print('isi denom >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>')
print(denom)
vendor_produk = get_vendor_produk(produk_kd, vendor_kd = vendor_kd)
row = DBSession.query(PartnerPay).filter(PartnerPay.token_pay_req == url_dict['pay_token']).first()
# row = DBSession.query(PartnerPay).filter(PartnerPay.id == 519).first()
row.vendor_id = vendor_produk.partner_id
row.produk_id = vendor_produk.produk.id
......@@ -166,12 +152,27 @@ class view_pay(BaseView):
row.pay_req_mth = mth
row.pay_denom = denom
produks = row.cart
for a in produks['item']:
del a['qty']
del a['subtotal']
basic_json = build_request_json(row, produks)
ccard = None
if mth == 'VA':
row.inv_valid_date='va_valid_date' in items and items['va_valid_date'] or dt
row.inv_valid_time='va_valid_time' in items and items['va_valid_time'] or tm
row.inv_cust_va='va_fix_acct_id' in items and items['va_fix_acct_id'] or ''
ccard = None
adt_va = {}
adt_va['va'] = dict(
valid_date = dt,
valid_time = tm,
fix_acct_id = ""
)
set_pay_detail(basic_json, adt_va)
elif mth == 'CC':
row.instmnt_mon='cc_instmnt_mon' in items and items['cc_instmnt_mon'] or ''
row.instmnt_type='cc_instmnt_type' in items and items['cc_instmnt_type'] or ''
......@@ -179,16 +180,36 @@ class view_pay(BaseView):
ccard = None
flush_row(row)
result_request = build_register(vendor_produk, row, ccard=ccard)
agratek_api_url = get_api_url()
headers_register = json_rpc_header(registered_user.user_name, registered_user.api_key)
result_request = requests.post(agratek_api_url, data=json.dumps(basic_json), headers = headers_register)
dict_results = json.loads(result_request.text)
err_param = ''
if 'result' in dict_results:
state = int(dict_results['result']['code'])
if state != 0:
err_param = '?adt=fail'
elif 'error' in dict_results:
state = int(dict_results['error']['code'])
err_param = '?adt=fail'
route_to = request.route_url(route_name='pay-info', pay_token = url_dict['pay_token'], state = state)
route_to = route_to + err_param
# values = set_register_values(encode_to_json(items, produks), customer)
if merchant_url or merchant_url != '':
headers_merchant = {}
headers_merchant['Content-Type'] = 'application/json'
headers_merchant = headers_merchant
try:
requests.post(merchant_url, data=result_request.text, headers = headers_merchant, timeout=None)
except Exception as e:
pass
print('hasil build request > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>')
print(result_request)
a = request.route_url(route_name='pay-info', pay_token = url_dict['pay_token'], meth = mth)
return HTTPFound(a)
return HTTPFound(route_to)
elif 'batal' in post_data:
return HTTPFound(location=request.route_url('api-merchant-home'))
......@@ -261,4 +282,183 @@ class view_pay(BaseView):
produks = produks,
)
\ No newline at end of file
)
def get_api_url():
settings = get_settings()
hostnya = settings['_host']
# hostnya = 'https://devel.agratek.id'
url = hostnya + "/api/merchant"
return url
def set_pay_detail(the_basic_json, pay_method_json):
data = the_basic_json['params']['data']
data.update(pay_method_json)
def build_request_json(row, produks):
time_stamp = datetime.now().strftime('%Y%m%d%H%M%S')
req_dt = datetime.now().strftime('%Y%m%d')
req_tm = datetime.now().strftime('%H%M%S')
body = {
"jsonrpc": "2.0",
"id": "1",
"method": "register",
"params": {
"data": {
"denom": row.pay_denom,
"time_stamp": time_stamp,
"currency": "IDR",
"amount": row.amt_sell,
"invoice_no": row.cust_inv_no,
"description": row.description,
"fee": row.fee,
"vat": row.vat,
"notax_amt": row.notax_amt or 0,
"req_dt": req_dt,
"req_tm": req_tm,
"biller": {
"name": row.biller_name or "",
"phone": row.biller_phone or "",
"email": row.biller_email or "",
"address": row.biller_address or "",
"city": row.biller_city or "",
"state": row.biller_state or "",
"post_code": row.biller_post_code or "",
"country": row.biller_country or ""
},
"customer": {
"name": row.inv_cust_nm or "",
"phone": row.inv_cust_email or "",
"email": row.inv_cust_email or "",
"address": row.inv_cust_addr or "",
"city": row.inv_cust_city or "",
"state": row.inv_cust_state or "",
"post_code": row.inv_cust_pos or "",
"country": row.inv_cust_country or "",
"ip": row.server_ip or "",
"session_id": row.inv_cust_session or "",
"agent": row.inv_cust_agent or "",
"language": "en-US"
},
"deliver_to": {
"name": row.delivery_nm or "",
"phone": row.delivery_phone or "",
"email": row.delivery_email or "",
"address": row.delivery_addr or "",
"city": row.delivery_city or "",
"state": row.delivery_state or "",
"post_code": row.delivery_pos or "",
"country": row.delivery_country or ""
},
"cart": produks,
"server": {
"domain": row.domain or "",
"ip": row.server_ip or ""
}
}
}
}
return body
# {
# "error": {
# "code": -32600,
# "message": "invalid request"
# },
# "id": null,
# "jsonrpc": "2.0"
# }
# {
# "result": {
# "time_stamp": "20200116155500",
# "deliver_to": {
# "state": "",
# "post_code": "",
# "phone": "",
# "city": "",
# "name": "safasf",
# "email": "",
# "country": "Indonesia",
# "address": ""
# },
# "description": "Test Transaction Pasarqu",
# "amount": "35000",
# "trans_time": "155501",
# "customer": {
# "state": "",
# "post_code": "",
# "phone": "",
# "agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
# "session_id": "697D6922C961070967D3BA1BA5699C2C",
# "city": "",
# "country": "Indonesia",
# "email": "",
# "name": "ffsdfsfsf",
# "language": "en-US",
# "ip": "127.0.0.1",
# "address": ""
# },
# "code": 0,
# "notax_amt": 0,
# "trans_date": "20200116",
# "va": {
# "valid_time": "155500",
# "valid_date": "20200117",
# "vacct_no": "70014000091555018516"
# },
# "message": "SUCCESS",
# "fee": 0,
# "biller": {
# "state": "",
# "post_code": "",
# "phone": "",
# "city": "",
# "name": "dsafsfa",
# "email": "",
# "country": "",
# "address": ""
# },
# "currency": "IDR",
# "denom": "VA-MANDIRI",
# "invoice_no": "300bssx5t",
# "server": {
# "ip": "127.0.0.1",
# "domain": "merchant.com"
# },
# "vat": 0,
# "cart": {
# "count": 3,
# "item": [
# {
# "goods_detail": "E-Pulsa",
# "goods_amt": "25225",
# "goods_name": "Pulsa Telkomsel 25.000",
# "img_url": "https://i1.wp.com/resepkoki.id/wp-content/uploads/2017/09/Jeruk-mandarin.jpg"
# },
# {
# "goods_detail": "E-Pulsa",
# "goods_amt": "149575",
# "goods_name": "Pulsa Telkomsel 150.000",
# "img_url": "https://www.bantennews.co.id/wp-content/uploads/2019/09/Screenshot_2019-09-24-23-48-36-251_org.detikcom.rss_.jpg"
# },
# {
# "goods_detail": "E-Pulsa",
# "goods_amt": "50050",
# "goods_name": "Pulsa Telkomsel 50.000",
# "img_url": "https://blog.regopantes.com/wp-content/uploads/2019/02/apel-fuji-via-pixabay.jpg"
# }
# ]
# },
# "req_tm": "155500",
# "tx_id": "adminc8e2905791584c97548b360bc4adac577544bc4c5df41e01fa97d26add2fe90f",
# "req_dt": "20200116"
# },
# "id": "1",
# "jsonrpc": "2.0"
# }
\ No newline at end of file
......@@ -9,60 +9,78 @@ from ..pay_request_tools import methods, vacs, cvss, loans, cps, ems, get_str_ha
class view_pay(BaseView):
@view_config(route_name = 'pay-info', renderer = 'templates/pay_info.pt')#permission = 'pay-form',
@view_config(route_name = 'pay-info', renderer = 'templates/pay_info_fail.pt', request_param='adt=fail')#permission = 'pay-form',
def the_form(self):
request = self.req
session = self.ses
url_dict = request.matchdict
meth = url_dict['meth']
state = url_dict['state']
pay_token = url_dict['pay_token']
row_pay = PartnerPay.query().filter(PartnerPay.token_pay_req == pay_token).first()
amount = 0,
if meth == 'VA':
subject = 'No. Virtual Account'
content = row_pay.card_no
dt_tm_str = '',
img_src = '',
va_dt = row_pay.inv_valid_date
va_tm = row_pay.inv_valid_time
va_dt = datetime.strptime(va_dt, "%Y%m%d").date()
hari_str = get_str_hari(va_dt.day, va_dt.month, va_dt.year)
bulan_str = get_str_bulan(va_dt.month)
va_tm = datetime.strptime(va_tm, "%H%M%S").time()
jam_str = str(va_tm.hour) + str(va_tm.minute)
# Jum'at, 27 Desember 2019, Pukul 04:44 WIB
dt_tm_str = hari_str + ', ' + str(va_dt.day) + ' ' + bulan_str + ' ' + str(va_dt.year) + ', Pukul ' + str(va_tm) + ' WIB'
meth_str = '',
denom_str = row_pay.pay_denom
layanan = denom_str.split('-')[1]
img_src = VA_IMG_SRC[layanan]
subject = '',
content = '',
response_url = ''
amount = format(row_pay.amt_sell, ',d').replace(',', '.')
# bringback_url = bringback_url
if state == '0':
pay_token = url_dict['pay_token']
row_pay = PartnerPay.query().filter(PartnerPay.token_pay_req == pay_token).first()
meth = row_pay.pay_req_mth
meth_str = dict(methods)[meth] + ', ' + dict(vacs)[denom_str]
bringback_url = row_pay.bringback_url
if meth == 'VA':
subject = 'No. Virtual Account'
content = row_pay.card_no
va_dt = row_pay.inv_valid_date
va_tm = row_pay.inv_valid_time
va_dt = datetime.strptime(va_dt, "%Y%m%d").date()
hari_str = get_str_hari(va_dt.day, va_dt.month, va_dt.year)
bulan_str = get_str_bulan(va_dt.month)
va_tm = datetime.strptime(va_tm, "%H%M%S").time()
jam_str = str(va_tm.hour) + str(va_tm.minute)
# Jum'at, 27 Desember 2019, Pukul 04:44 WIB
dt_tm_str = hari_str + ', ' + str(va_dt.day) + ' ' + bulan_str + ' ' + str(va_dt.year) + ', Pukul ' + str(va_tm) + ' WIB'
elif meth == 'CC':
content = row_pay.card_no
elif meth == 'CVS':
subject = ''
content = ''
elif meth == 'EM':
subject = ''
content = ''
elif meth == 'loan':
subject = ''
content = ''
elif meth == 'CP':
subject = ''
content = ''
denom_str = row_pay.pay_denom
layanan = denom_str.split('-')[1]
img_src = VA_IMG_SRC[layanan]
amount = format(row_pay.amt_sell, ',d').replace(',', '.')
meth = row_pay.pay_req_mth
meth_str = dict(methods)[meth] + ', ' + dict(vacs)[denom_str]
response_url = row_pay.response_url
elif meth == 'CC':
content = row_pay.card_no
elif meth == 'CVS':
subject = ''
content = ''
elif meth == 'EM':
subject = ''
content = ''
elif meth == 'loan':
subject = ''
content = ''
elif meth == 'CP':
subject = ''
content = ''
return dict(
state = state,
amount = amount,
dt_tm_str = dt_tm_str,
......@@ -73,5 +91,5 @@ class view_pay(BaseView):
subject = subject,
content = content,
bringback_url = bringback_url
response_url = response_url
)
\ No newline at end of file
......@@ -67,6 +67,7 @@ class ParamsSchema(colander.Schema):
currency = colander.SchemaNode(colander.String(), title = "Mata Uang ", widget=widget.HiddenWidget(readonly=True))
amount = colander.SchemaNode(colander.String(), title = "Total Bayar")
invoice_no = colander.SchemaNode(colander.String(), title = "Nomor Invoice")
response_url = colander.SchemaNode(colander.String(), title = "Response URL")
description = colander.SchemaNode(colander.String(), title = "Deskripsi Transaksi", missing=colander.drop)
fee = colander.SchemaNode(colander.Integer(), title = "Fee")
vat = colander.SchemaNode(colander.Integer(), title = "VAT")
......@@ -114,6 +115,8 @@ class ItemsSchema(colander.Schema):
goods_name = colander.SchemaNode(colander.String(), title = "Nama Produk")
goods_detail = colander.SchemaNode(colander.String(), title = "Detail")
goods_amt = colander.SchemaNode(colander.String(), title = "Harga")
qty = colander.SchemaNode(colander.String(), title = "Qty")
subtotal = colander.SchemaNode(colander.String(), title = "Subtotal")
class CartSchema(colander.Schema):
count = colander.SchemaNode(colander.String(), title = "Jumlah", oid="count")
......@@ -192,6 +195,8 @@ class view_pay(BaseView):
goods_name = items[key],
goods_detail = items['goods_detail-' + uniq],
goods_amt = items['goods_amt-' + uniq],
qty = items['qty-' + uniq],
subtotal = items['subtotal-' + uniq]
)
produks.append(produk)
......@@ -227,6 +232,7 @@ class view_pay(BaseView):
"method": "pay_request",
"params": {
"data": {
"response_url": items['response_url'],
"time_stamp": time_stamp,
"currency": "IDR",
"amount": items['amount'],
......
......@@ -20,9 +20,6 @@ log = logging.getLogger(__name__)
def encode_form_to_json(form_request_data, parsed_produks):
decoded_dict = {}
print('isi form_request_data dalam encode_to_json >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>')
print(form_request_data)
customer_req = {}
deliver_to = {}
server = {}
......@@ -75,14 +72,14 @@ def added_register_values(current_register_values, dat):
added_dict['biller_state'] = dat['biller']['state']
added_dict['biller_post_code'] = dat['biller']['post_code']
added_dict['biller_country'] = dat['biller']['country']
added_dict['bringback_url'] = dat['bringback_url']
added_dict['response_url'] = dat['response_url']
return added_dict
@jsonrpc_method(method='pay_request', endpoint='api-merchant')
def pay_request(request, data, **kwargs):
# user = auth_from_rpc(request)
user = DBSession.query(User).filter(User.id == 1).first()
user = auth_from_rpc(request)
# user = DBSession.query(User).filter(User.id == 1).first()
i = 0
print('masuk sini loh >>>>>>>>>>>>>>>>>>>>>>>>>>>')
if not data:
......@@ -120,7 +117,7 @@ def pay_request(request, data, **kwargs):
r_data["status"] = "SUCCESS"
r_data["message"] = "Data tersimpan silahkan lanjutkan pembayaran"
r_data['code'] = 1
r_data['code'] = 0
r_data['pay_token'] = ar_invoice.token_pay_req
r_data['pay_url'] = request._host + '/pay/' + ar_invoice.token_pay_req
......
from opensipkd.base.views import BaseView
from pyramid.view import view_config
class view_pay(BaseView):
@view_config(route_name = 'tangkap-response', renderer = 'json')#permission = 'pay-form',
def view(self):
request = self.req
session = self.ses
url_dict = request.matchdict
print('masuk masuk >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>')
print(request.json_body)
\ No newline at end of file
......@@ -275,20 +275,12 @@ td, th {
</select>
<p id="error-${fieldItem.oid}" class="help-block" tal:condition="fieldItem.error" tal:repeat="error fieldItem.error.messages()">${error}</p>
</div>
</div>
</div>
<div id="bt_box" class="col-md-12" style="text-align: right;">
<button style="margin: 0px;" class="btn btn-success col-md-5 col-xs-5 col-sm-5 pull-left" type="submit" name="bayar" id="bt_bayar" >Bayar</button>
<button style="margin: 0px;" class="btn btn-warning col-md-5 col-xs-5 col-sm-5 pull-right" type="submit" name="batal_bayar" id="bt_batal_bayar" >Batal</button>
<div id="bt_box" class="col-md-12" style="text-align: center;">
<button style="margin: 0px; width: 100%;" class="btn btn-success" type="submit" name="bayar" id="bt_bayar" >Bayar</button>
</div>
</form>
<!-- End Template Form -->
<!-- </div> -->
......
......@@ -80,9 +80,6 @@ td, th {
<hr class="col-sm-12 col-md-12 col-xs-12" >
<label style="font-weight: normal;" class="col-md-12 col-xs-12 col-sm-12">${subject}</label>
<label style="font-weight: bolder;" class="col-md-12 col-xs-12 col-sm-12">${content}</label>
<div id="bt_box" class="col-md-12 col-xs-12 col-sm-12" style="padding: 0px; text-align: center; margin-bottom: 10px;">
<button id="btn_tutup" class="btn btn-warning" style="margin: 0px; width: 90%;" type="button">Tutup</button>
</div>
</div>
</div>
......@@ -102,9 +99,6 @@ td, th {
<script>
$(document).ready(function() {
$('#btn_tutup').click(function(){
window.open('${bringback_url}', '_self');
})
})
</script>
......
<html metal:use-macro="load: opensipkd.base:views/templates/base3-clean.pt">
<div metal:fill-slot="content">
<style>
button {
margin:0px 3px;
}
#main{min-height: 1px;
padding-bottom: 1px;}
hr {
display: block;
margin-top: 0px;
margin-bottom: 5px;
margin-left: auto;
margin-right: auto;
/*border-style: inset;*/
/*border-width: 0.2px;*/
}
table {
font-family: arial, sans-serif;
border-collapse: collapse;
width: 100%;
}
td, th {
border: 1px solid #dddddd;
text-align: left;
padding: 8px;
}
.control-label{
text-align: left !important;
}
</style>
</div>
<div metal:fill-slot="scripts">
<div class="panel-body col-md-12">
<div class="col-md-6 col-md-offset-3 col-xs-12 well" style="padding: 0px;">
<!-- Proses Template Form -->
<div style="height: 300px; text-align: center;" class="col-xs-12 col-md-12 col-sm-12">
<label style="color: indianred; padding-top: 140px; display: block; font-weight: bold;">Terjadi Kesalahan Sistem, Gagal melakukan transaksi.</label>
<label style="color: indianred; padding-top: 5px; display: block; font-weight: bold;">Code : ${state}</label>
</div>
<!-- End Template Form -->
<!-- </div> -->
</div>
</div>
<script>
$(document).ready(function() {
})
</script>
</div>
</html>
......@@ -334,20 +334,12 @@
`<div class="col-md-12" id="pack-`+cnt+`">`+
`<legend id="judul"></legend>`+
`<button type="button" onclick="removeItem('pack-`+cnt+`')">Hapus</button> `+
`<div tal:define="fieldItem formItemCart['img_url']" id="item-${fieldItem.oid}">`+
`<div class="col-md-8">`+
`<input type="text" name="${fieldItem.name}-`+cnt+`" value="" id="${fieldItem.name}-`+cnt+`">`+
`</div>`+
`</div>`+
`<br></br>`+
`<div tal:define="fieldItem formItemCart['goods_name']" id="item-${fieldItem.oid}">`+
`<label for="${fieldItem.oid}" class="control-label col-md-4 required" id="req-${fieldItem.oid}">`+
`${fieldItem.title}</label>`+
`<div class="col-md-8">`+
`<select class="form-control" name="${fieldItem.name}-`+cnt+`" id="${fieldItem.name}-`+cnt+`" required="required">`+
`<option disabled selected value> -- pilih produk -- </option>`+
`<option tal:repeat="item produks" value="${item[1]}">${item[1]}</option>`+
`</select>`+
`<input type="text" class="form-control" id="${fieldItem.name}-`+cnt+`" name="${fieldItem.name}-`+cnt+`" value="" >`+
`<p id="error-${fieldItem.oid}" class="help-block" tal:condition="fieldItem.error" tal:repeat="error fieldItem.error.messages()">${error}</p>`+
`</div>`+
`</div>`+
......@@ -356,7 +348,7 @@
`<label for="${fieldItem.oid}" class="control-label col-md-4" id="req-${fieldItem.oid}">`+
`${fieldItem.title}</label>`+
`<div class="col-md-8">`+
`<input type="text" class="form-control" id="${fieldItem.name}-`+cnt+`" name="${fieldItem.name}-`+cnt+`" value="" readonly="">`+
`<input type="text" class="form-control" id="${fieldItem.name}-`+cnt+`" name="${fieldItem.name}-`+cnt+`" value="" >`+
`<p id="error-${fieldItem.oid}" class="help-block" tal:condition="fieldItem.error" tal:repeat="error fieldItem.error.messages()">${error}</p>`+
`</div>`+
`</div>`+
......@@ -364,8 +356,33 @@
`<div tal:define="fieldItem formItemCart['goods_amt']" id="item-${fieldItem.oid}">`+
`<label for="${fieldItem.oid}" class="control-label col-md-4" id="req-${fieldItem.oid}">`+
`${fieldItem.title}</label>`+
`<div class="col-md-8" style="width: 150px;">`+
`<input type="text" class="form-control" id="${fieldItem.name}-`+cnt+`" name="${fieldItem.name}-`+cnt+`" value="" readonly="">`+
`<div class="col-md-8" >`+
`<input type="text" class="form-control" id="${fieldItem.name}-`+cnt+`" name="${fieldItem.name}-`+cnt+`" value="" >`+
`<p id="error-${fieldItem.oid}" class="help-block" tal:condition="fieldItem.error" tal:repeat="error fieldItem.error.messages()">${error}</p>`+
`</div>`+
`</div>`+
`<br></br>`+
`<div tal:define="fieldItem formItemCart['img_url']" id="item-${fieldItem.oid}">`+
`<label for="${fieldItem.oid}" class="control-label col-md-4" id="req-${fieldItem.oid}">`+
`${fieldItem.title}</label>`+
`<div class="col-md-8" >`+
`<input type="text" class="form-control" id="${fieldItem.name}-`+cnt+`" name="${fieldItem.name}-`+cnt+`" value="" >`+
`<p id="error-${fieldItem.oid}" class="help-block" tal:condition="fieldItem.error" tal:repeat="error fieldItem.error.messages()">${error}</p>`+
`</div>`+
`</div>`+
`<div tal:define="fieldItem formItemCart['qty']" id="item-${fieldItem.oid}">`+
`<label for="${fieldItem.oid}" class="control-label col-md-4" id="req-${fieldItem.oid}">`+
`${fieldItem.title}</label>`+
`<div class="col-md-8" >`+
`<input type="text" class="form-control" id="${fieldItem.name}-`+cnt+`" name="${fieldItem.name}-`+cnt+`" value="" >`+
`<p id="error-${fieldItem.oid}" class="help-block" tal:condition="fieldItem.error" tal:repeat="error fieldItem.error.messages()">${error}</p>`+
`</div>`+
`</div>`+
`<div tal:define="fieldItem formItemCart['subtotal']" id="item-${fieldItem.oid}">`+
`<label for="${fieldItem.oid}" class="control-label col-md-4" id="req-${fieldItem.oid}">`+
`${fieldItem.title}</label>`+
`<div class="col-md-8" >`+
`<input type="text" class="form-control" id="${fieldItem.name}-`+cnt+`" name="${fieldItem.name}-`+cnt+`" value="" >`+
`<p id="error-${fieldItem.oid}" class="help-block" tal:condition="fieldItem.error" tal:repeat="error fieldItem.error.messages()">${error}</p>`+
`</div>`+
`</div>`+
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!