Author: dammina Date: Sun Aug 3 11:40:12 2014 New Revision: 1615401 URL: http://svn.apache.org/r1615401 Log: Modified several components of the feature.
Modified: bloodhound/branches/bep_0011_batch_create_tickets/bloodhound_theme/bhtheme/htdocs/js/batchcreate.js bloodhound/branches/bep_0011_batch_create_tickets/bloodhound_theme/bhtheme/theme.py Modified: bloodhound/branches/bep_0011_batch_create_tickets/bloodhound_theme/bhtheme/htdocs/js/batchcreate.js URL: http://svn.apache.org/viewvc/bloodhound/branches/bep_0011_batch_create_tickets/bloodhound_theme/bhtheme/htdocs/js/batchcreate.js?rev=1615401&r1=1615400&r2=1615401&view=diff ============================================================================== --- bloodhound/branches/bep_0011_batch_create_tickets/bloodhound_theme/bhtheme/htdocs/js/batchcreate.js (original) +++ bloodhound/branches/bep_0011_batch_create_tickets/bloodhound_theme/bhtheme/htdocs/js/batchcreate.js Sun Aug 3 11:40:12 2014 @@ -1,11 +1,16 @@ -function emptyTable(products,href,token) { +function emptyTable(product,milestones,components,href,token) { + var numOfRows = document.getElementById("numOfRows").value; - form_token = token.split(";")[0].split("=")[1];//I'm not really sure about this method - if(numOfRows != "" && document.getElementById("empty-table") == null){ + var created_rows = document.getElementById("numOfRows").value; + form_token = token.split(";")[0].split("=")[1]; + if(numOfRows == ""){ + alert("Enter the ticket batch size.") + } + else if(numOfRows != "" && document.getElementById("empty-table") == null){ var contentDiv = document.getElementById("content"); //var headers = {"summary":"Summary","description":"Description","product":"Product","status":"Status","priority":"Priority","type":"Types","owner":"Owner","cc":"Cc","milestone":"Milestone","keywords":"Keywords"} - var headers = {"summary":"Summary","description":"Description","product":"Product","status":"Status","priority":"Priority"} - statuses = ["accepted", "assigned", "closed", "new", "reopened"]; + var headers = {"ticket":"","summary":"Summary","description":"Description","product":"Product","priority":"Priority","milestone":"Milestone","component":"Component"} + //statuses = ["new", "accepted", "assigned", "closed", "reopened"]; priorities = ["blocker", "critical", "major", "minor", "trivial"]; types = ["defect", "enhancement", "task"]; @@ -49,7 +54,17 @@ function emptyTable(products,href,token) for (i=0;i<numOfRows;i++){ tr_rows = document.createElement("tr"); for (header in headers){ - if (header == "summary"){ + if(header == "ticket"){ + td_row = document.createElement("td"); + input_ticket = document.createElement("input"); + input_ticket.setAttribute("type","checkbox"); + input_ticket.setAttribute("id","field-ticket"+i); + input_ticket.setAttribute("class","input-block-level"); + input_ticket.setAttribute("name","field_ticket"+i); + td_row.appendChild(input_ticket); + tr_rows.appendChild(td_row); + } + else if (header == "summary"){ td_row = document.createElement("td"); input_summary = document.createElement("input"); input_summary.setAttribute("type","text"); @@ -70,7 +85,7 @@ function emptyTable(products,href,token) td_row.appendChild(input_description); tr_rows.appendChild(td_row); } - else if (header == "status") { + /*else if (header == "status") { td_row = document.createElement("td"); input_status = document.createElement("select"); input_status.setAttribute("id","field-status"+i); @@ -84,7 +99,7 @@ function emptyTable(products,href,token) } td_row.appendChild(input_status); tr_rows.appendChild(td_row); - } + }*/ else if (header == "priority") { td_row = document.createElement("td"); input_priority = document.createElement("select"); @@ -121,10 +136,10 @@ function emptyTable(products,href,token) field_product.setAttribute("id","field-product"+i); field_product.setAttribute("class","input-block-level"); field_product.setAttribute("name","field_product"+i); - for (product in products){ + for (p in product){ option = document.createElement("option"); - option.setAttribute("value",(products[product])[0]); - option.appendChild(document.createTextNode((products[product])[1])); + option.setAttribute("value",(product[p])[0]); + option.appendChild(document.createTextNode((product[p])[1])); field_product.appendChild(option); } td_row.appendChild(field_product); @@ -150,16 +165,36 @@ function emptyTable(products,href,token) td_row.appendChild(input_cc); tr_rows.appendChild(td_row); }*/ - /*else if (header == "milestone"){ + else if (header == "milestone"){ + td_row = document.createElement("td"); + field_milestone = document.createElement("select"); + field_milestone.setAttribute("id","field-milestone"+i); + field_milestone.setAttribute("class","input-block-level"); + field_milestone.setAttribute("name","field_milestone"+i); + for (milestone in milestones){ + option = document.createElement("option"); + option.setAttribute("value",(milestones[milestone])[0]); + option.appendChild(document.createTextNode((milestones[milestone])[0])); + field_milestone.appendChild(option); + } + td_row.appendChild(field_milestone); + tr_rows.appendChild(td_row); + } + else if (header == "component"){ td_row = document.createElement("td"); - input_milestone = document.createElement("input"); - input_milestone.setAttribute("type","text"); - input_milestone.setAttribute("id","field-milestone"+i); - input_milestone.setAttribute("class","input-block-level"); - input_milestone.setAttribute("name","field_milestone"+i); - td_row.appendChild(input_milestone); + field_component = document.createElement("select"); + field_component.setAttribute("id","field-component"+i); + field_component.setAttribute("class","input-block-level"); + field_component.setAttribute("name","field_component"+i); + for (component in components){ + option = document.createElement("option"); + option.setAttribute("value",(components[component])[0]); + option.appendChild(document.createTextNode((components[component])[0])); + field_component.appendChild(option); + } + td_row.appendChild(field_component); tr_rows.appendChild(td_row); - }*/ + } /*else if (header == "keywords"){ td_row = document.createElement("td"); input_keywords = document.createElement("input"); @@ -179,7 +214,10 @@ function emptyTable(products,href,token) remove_row_button = document.createElement("button"); remove_row_button.setAttribute("class","btn pull-right"); remove_row_button.setAttribute("type","button"); - remove_row_button.setAttribute("onclick","remove_row_btn_action()"); + remove_row_button.addEventListener("click", function(event) { + numOfRows=parseInt(numOfRows)-parseInt(remove_row_btn_action(numOfRows)); + event.preventDefault(); + }); remove_row_button.setAttribute("id","bct-rmv-empty-row"); remove_row_button.appendChild(document.createTextNode("-")); form.appendChild(remove_row_button); @@ -188,7 +226,9 @@ function emptyTable(products,href,token) add_row_button.setAttribute("class","btn pull-right"); add_row_button.setAttribute("type","button"); add_row_button.addEventListener("click", function(event) { - add_row_btn_action(products); + add_row_btn_action(product,milestones,components,created_rows); + numOfRows=parseInt(numOfRows)+1; + created_rows=parseInt(created_rows)+1; event.preventDefault(); }); add_row_button.setAttribute("id","bct-add-empty-row"); @@ -198,7 +238,29 @@ function emptyTable(products,href,token) submit_button = document.createElement("button"); submit_button.setAttribute("class","btn pull-right"); submit_button.setAttribute("type","button"); - submit_button.setAttribute("onclick","submit_btn_action()"); + submit_button.addEventListener("click", function(event) { + var empty_row=false; + var cnt=0; + for (var k = 0; k <parseInt(numOfRows)+parseInt(cnt); k++) { + var element = document.getElementById("field-summary"+k); + if(element==null){ + cnt=parseInt(cnt)+1; + continue; + } + + var summary_val=document.getElementById("field-summary"+k).value; + if(summary_val==""){ + var line_number = parseInt(k)+1; + var confirmation = confirm("Summery field of one or more tickets are empty. They will not get created!"); + empty_row=true; + break; + } + }; + if(confirmation == true || !empty_row){ + submit_btn_action(); + event.preventDefault(); + } + }); submit_button.setAttribute("id","bct-create"); submit_button.setAttribute("data-target",href); submit_button.appendChild(document.createTextNode("save")); @@ -239,8 +301,8 @@ function submit_btn_action() { function(ticket) { deleteForm(); removeBatchCreate(); - - var headers = {"id":"Ticket","summary":"Summary","product":"Product","status":"Status"} + + var headers = {"ticket":"Ticket","summary":"Summary","product":"Product","status":"Status","milestone":"Milestone","component":"Component"} var contentDiv = document.getElementById("content"); var div = document.createElement("div"); div.setAttribute("class","span12"); @@ -266,7 +328,7 @@ function submit_btn_action() { for ( i=0 ; i<Object.keys(ticket.tickets).length ; i++ ){ tr = document.createElement("tr"); - for (j=0;j<4;j++){ + for (j=0;j<6;j++){ if(j==0){ td = document.createElement("td"); a = document.createElement("a"); @@ -293,6 +355,16 @@ function submit_btn_action() { tkt = JSON.parse(ticket.tickets[i]); td.appendChild(document.createTextNode(tkt.status)); } + else if(j==4){ + td = document.createElement("td"); + tkt = JSON.parse(ticket.tickets[i]); + td.appendChild(document.createTextNode(tkt.milestone)); + } + else if(j==5){ + td = document.createElement("td"); + tkt = JSON.parse(ticket.tickets[i]); + td.appendChild(document.createTextNode(tkt.component)); + } tr.appendChild(td); } table.appendChild(tr); @@ -302,18 +374,27 @@ function submit_btn_action() { }); } -function add_row_btn_action(products){ - // alert("1"); +function add_row_btn_action(product,milestones,components,i){ - var headers = {"summary":"Summary","description":"Description","product":"Product","status":"Status","priority":"Priority"} - var statuses = ["accepted", "assigned", "closed", "new", "reopened"]; + var headers = {"ticket":"","summary":"Summary","description":"Description","product":"Product","priority":"Priority","milestone":"Milestone","component":"Component"} + //var statuses = ["new", "accepted", "assigned", "closed", "reopened"]; var priorities = ["blocker", "critical", "major", "minor", "trivial"]; var types = ["defect", "enhancement", "task"]; tr_rows = document.createElement("tr"); for (header in headers){ - if (header == "summary"){ + if(header == "ticket"){ + td_row = document.createElement("td"); + input_ticket = document.createElement("input"); + input_ticket.setAttribute("type","checkbox"); + input_ticket.setAttribute("id","field-ticket"+i); + input_ticket.setAttribute("class","input-block-level"); + input_ticket.setAttribute("name","field_ticket"+i); + td_row.appendChild(input_ticket); + tr_rows.appendChild(td_row); + } + else if (header == "summary"){ td_row = document.createElement("td"); input_summary = document.createElement("input"); input_summary.setAttribute("type","text"); @@ -322,123 +403,105 @@ function add_row_btn_action(products){ input_summary.setAttribute("name","field_summary"+i); td_row.appendChild(input_summary); tr_rows.appendChild(td_row); + } + else if (header == "description") { + td_row = document.createElement("td"); + input_description = document.createElement("textarea"); + input_description.setAttribute("id","field-description"+i); + input_description.setAttribute("class","input-block-level"); + input_description.setAttribute("name","field_description"+i); + input_description.setAttribute("rows","2"); + input_description.setAttribute("cols","28"); + td_row.appendChild(input_description); + tr_rows.appendChild(td_row); + } + /*else if (header == "status") { + td_row = document.createElement("td"); + input_status = document.createElement("select"); + input_status.setAttribute("id","field-status"+i); + input_status.setAttribute("class","input-block-level"); + input_status.setAttribute("name","field_status"+i); + for (status in statuses){ + option = document.createElement("option"); + option.setAttribute("value",statuses[status]); + option.appendChild(document.createTextNode(statuses[status])); + input_status.appendChild(option); + } + td_row.appendChild(input_status); + tr_rows.appendChild(td_row); + }*/ + else if (header == "priority") { + td_row = document.createElement("td"); + input_priority = document.createElement("select"); + input_priority.setAttribute("id","field-priority"+i); + input_priority.setAttribute("class","input-block-level"); + input_priority.setAttribute("name","field_priority"+i); + for (priority in priorities){ + option = document.createElement("option"); + option.setAttribute("value",priorities[priority]); + option.appendChild(document.createTextNode(priorities[priority])); + input_priority.appendChild(option); } - else if (header == "description") { - td_row = document.createElement("td"); - input_description = document.createElement("textarea"); - input_description.setAttribute("id","field-description"+i); - input_description.setAttribute("class","input-block-level"); - input_description.setAttribute("name","field_description"+i); - input_description.setAttribute("rows","2"); - input_description.setAttribute("cols","28"); - td_row.appendChild(input_description); - tr_rows.appendChild(td_row); - } - else if (header == "status") { - td_row = document.createElement("td"); - input_status = document.createElement("select"); - input_status.setAttribute("id","field-status"+i); - input_status.setAttribute("class","input-block-level"); - input_status.setAttribute("name","field_status"+i); - for (status in statuses){ - option = document.createElement("option"); - option.setAttribute("value",statuses[status]); - option.appendChild(document.createTextNode(statuses[status])); - input_status.appendChild(option); - } - td_row.appendChild(input_status); - tr_rows.appendChild(td_row); + td_row.appendChild(input_priority); + tr_rows.appendChild(td_row); + } + else if (header == "product") { + td_row = document.createElement("td"); + field_product = document.createElement("select"); + field_product.setAttribute("id","field-product"+i); + field_product.setAttribute("class","input-block-level"); + field_product.setAttribute("name","field_product"+i); + for (p in product){ + option = document.createElement("option"); + option.setAttribute("value",(product[p])[0]); + option.appendChild(document.createTextNode((product[p])[1])); + field_product.appendChild(option); } - else if (header == "priority") { - td_row = document.createElement("td"); - input_priority = document.createElement("select"); - input_priority.setAttribute("id","field-priority"+i); - input_priority.setAttribute("class","input-block-level"); - input_priority.setAttribute("name","field_priority"+i); - for (priority in priorities){ - option = document.createElement("option"); - option.setAttribute("value",priorities[priority]); - option.appendChild(document.createTextNode(priorities[priority])); - input_priority.appendChild(option); - } - td_row.appendChild(input_priority); - tr_rows.appendChild(td_row); + td_row.appendChild(field_product); + tr_rows.appendChild(td_row); + } + else if (header == "milestone"){ + td_row = document.createElement("td"); + field_milestone = document.createElement("select"); + field_milestone.setAttribute("id","field-milestone"+i); + field_milestone.setAttribute("class","input-block-level"); + field_milestone.setAttribute("name","field_milestone"+i); + for (milestone in milestones){ + option = document.createElement("option"); + option.setAttribute("value",(milestones[milestone])[0]); + option.appendChild(document.createTextNode((milestones[milestone])[0])); + field_milestone.appendChild(option); } - /*else if (header == "type") { - td_row = document.createElement("td"); - input_type = document.createElement("select"); - input_type.setAttribute("id","field-type"+i); - input_type.setAttribute("class","input-block-level"); - input_type.setAttribute("name","field_type"+i); - for (type in types){ - option = document.createElement("option"); - option.setAttribute("value",types[type]); - option.appendChild(document.createTextNode(types[type])); - input_type.appendChild(option); - } - td_row.appendChild(input_type); - tr_rows.appendChild(td_row); - }*/ - else if (header == "product") { - td_row = document.createElement("td"); - field_product = document.createElement("select"); - field_product.setAttribute("id","field-product"+i); - field_product.setAttribute("class","input-block-level"); - field_product.setAttribute("name","field_product"+i); - for (product in products){ - option = document.createElement("option"); - option.setAttribute("value",(products[product])[0]); - option.appendChild(document.createTextNode((products[product])[1])); - field_product.appendChild(option); - } - td_row.appendChild(field_product); - tr_rows.appendChild(td_row); + td_row.appendChild(field_milestone); + tr_rows.appendChild(td_row); + } + else if (header == "component"){ + td_row = document.createElement("td"); + field_component = document.createElement("select"); + field_component.setAttribute("id","field-component"+i); + field_component.setAttribute("class","input-block-level"); + field_component.setAttribute("name","field_component"+i); + for (component in components){ + option = document.createElement("option"); + option.setAttribute("value",(components[component])[0]); + option.appendChild(document.createTextNode((components[component])[0])); + field_component.appendChild(option); } - /*else if (header == "owner"){ - td_row = document.createElement("td"); - input_owner = document.createElement("input"); - input_owner.setAttribute("type","text"); - input_owner.setAttribute("id","field-owner"+i); - input_owner.setAttribute("class","input-block-level"); - input_owner.setAttribute("name","field_owner"+i); - td_row.appendChild(input_owner); - tr_rows.appendChild(td_row); - }*/ - /*else if (header == "cc"){ - td_row = document.createElement("td"); - input_cc = document.createElement("input"); - input_cc.setAttribute("type","text"); - input_cc.setAttribute("id","field-cc"+i); - input_cc.setAttribute("class","input-block-level"); - input_cc.setAttribute("name","field_cc"+i); - td_row.appendChild(input_cc); - tr_rows.appendChild(td_row); - }*/ - /*else if (header == "milestone"){ - td_row = document.createElement("td"); - input_milestone = document.createElement("input"); - input_milestone.setAttribute("type","text"); - input_milestone.setAttribute("id","field-milestone"+i); - input_milestone.setAttribute("class","input-block-level"); - input_milestone.setAttribute("name","field_milestone"+i); - td_row.appendChild(input_milestone); - tr_rows.appendChild(td_row); - }*/ - /*else if (header == "keywords"){ - td_row = document.createElement("td"); - input_keywords = document.createElement("input"); - input_keywords.setAttribute("type","text"); - input_keywords.setAttribute("id","field-keywords"+i); - input_keywords.setAttribute("class","input-block-level"); - input_keywords.setAttribute("name","field_keywords"+i); - td_row.appendChild(input_keywords); - tr_rows.appendChild(td_row); - }*/ - + td_row.appendChild(field_component); + tr_rows.appendChild(td_row); + } } document.getElementById("empty-table").childNodes[1].childNodes[1].childNodes[1].appendChild(tr_rows); } -function remove_row_btn_action(){ - document.getElementById("empty-table").childNodes[1].childNodes[1].childNodes[1].lastChild.remove(); +function remove_row_btn_action(numOfRows){ + var cnt=0; + for(var i=0;i<parseInt(numOfRows)-parseInt(cnt);i++){ + if(document.getElementById("empty-table").childNodes[1].childNodes[1].childNodes[1].childNodes[i].childNodes[0].childNodes[0].checked){ + document.getElementById("empty-table").childNodes[1].childNodes[1].childNodes[1].childNodes[i].remove(); + cnt=cnt+1; + i--; + } + } + return cnt; } Modified: bloodhound/branches/bep_0011_batch_create_tickets/bloodhound_theme/bhtheme/theme.py URL: http://svn.apache.org/viewvc/bloodhound/branches/bep_0011_batch_create_tickets/bloodhound_theme/bhtheme/theme.py?rev=1615401&r1=1615400&r2=1615401&view=diff ============================================================================== --- bloodhound/branches/bep_0011_batch_create_tickets/bloodhound_theme/bhtheme/theme.py (original) +++ bloodhound/branches/bep_0011_batch_create_tickets/bloodhound_theme/bhtheme/theme.py Sun Aug 3 11:40:12 2014 @@ -691,6 +691,7 @@ class QuickCreateTicketDialog(Component) from pkg_resources import get_distribution application_version = get_distribution('BloodhoundTheme').version + class BatchCreateTicketDialog(Component): implements( IRequestFilter, @@ -802,7 +803,7 @@ class BatchCreateTicketDialog(Component) if k.startswith('field_')) # new_tkts variable will contain the tickets that have been created as a batch # that information will be used to load the resultant query table - product, tid, new_tkts, num_of_tkts = self.batch_create( + product, tid, new_tkts = self.batch_create( req, attrs, True) # product, tid = self.batch_create(req, attrs, True) except Exception as exc: @@ -811,6 +812,7 @@ class BatchCreateTicketDialog(Component) else: tkt_list = [] tkt_dict = {} + num_of_tkts = len(new_tkts) for i in range(0, num_of_tkts): tres = Neighborhood( 'product', @@ -832,6 +834,8 @@ class BatchCreateTicketDialog(Component) href), 'summary': new_tkts[i].values['summary'], 'status': new_tkts[i].values['status'], + 'milestone': new_tkts[i].values['milestone'], + 'component': new_tkts[i].values['component'], 'priority': new_tkts[i].values['priority'], 'description': new_tkts[i].values['description']})) tkt_dict["tickets"] = tkt_list @@ -850,11 +854,19 @@ class BatchCreateTicketDialog(Component) # Template Stream Filter methods def filter_stream(self, req, method, filename, stream, data): - if (filename == 'bh_wiki_view.html') and (req.perm.has_permission( - 'TRAC_ADMIN') or req.perm.has_permission('TICKET_BATCH_CREATE')): + if (self.env.product is not None) and (filename == 'bh_wiki_view.html') and ( + req.perm.has_permission('TRAC_ADMIN') or req.perm.has_permission('TICKET_BATCH_CREATE')): add_script(req, 'theme/js/batchcreate.js') xpath = '//form[@id=modifypage]' - products = self.env.db_query("SELECT * FROM bloodhound_product") + + product_id = str(self.env.product.resource.id) + + product_name = self.env.db_query( + "SELECT * FROM bloodhound_product WHERE prefix=%s", (product_id,)) + milestones = self.env.db_query( + "SELECT * FROM milestone WHERE product=%s", (product_id,)) + components = self.env.db_query( + "SELECT * FROM component WHERE product=%s", (product_id,)) form = tag.form( method="get", style="display:inline", @@ -872,7 +884,11 @@ class BatchCreateTicketDialog(Component) style="background-color:transparent;border:0;position:absolute;right:0;top:0;margin-top: 0px;height:29px;background-color:#5C85FF;color:white", type="button", onclick="Javascript:emptyTable(" + - to_json(products) + + to_json(product_name) + + "," + + to_json(milestones) + + "," + + to_json(components) + "," + to_json( req.href() + @@ -895,9 +911,15 @@ class BatchCreateTicketDialog(Component) def batch_create(self, req, attributes={}, notify=False): """ Create batch of tickets, returning created tickets. """ - num_of_tkts = attributes.__len__() / 5 + num_of_tkts = attributes.__len__() / 6 created_tickets = [] - for i in range(0, num_of_tkts): + loop_condition = True + i = -1 + + while loop_condition: + i += 1 + if 'summary' + str(i) not in attributes: + continue if 'product' + str(i) in attributes: env = self.env.parent or self.env @@ -909,11 +931,18 @@ class BatchCreateTicketDialog(Component) str(i)]) else: env = self.env + + if attributes.get('summary' + str(i)) == "": + num_of_tkts -= 1 + continue + description = attributes.pop('description' + str(i)) - status = attributes.pop('status' + str(i)) + status = 'new' summary = attributes.pop('summary' + str(i)) product = attributes.pop('product' + str(i)) priority = attributes.pop('priority' + str(i)) + milestone = attributes.pop('milestone' + str(i)) + component = attributes.pop('component' + str(i)) t = Ticket(env) t['summary'] = summary @@ -923,6 +952,8 @@ class BatchCreateTicketDialog(Component) t['resolution'] = '' t['product'] = product t['priority'] = priority + t['milestone'] = milestone + t['component'] = component t.insert() created_tickets.append(t) @@ -935,7 +966,8 @@ class BatchCreateTicketDialog(Component) "Failure sending notification on creation " "of ticket #%s: %s" % (t.id, e)) - # start_id = self.env.db_query("SELECT MAX(uid) FROM ticket")[0][0] - num_of_tkts - # created_tickets = self.env.db_query("SELECT * FROM ticket WHERE uid>%s"%start_id) - # return t['product'], t.id, created_tickets - return t['product'], t.id, created_tickets, num_of_tkts + num_of_tkts -= 1 + if num_of_tkts <= 0: + loop_condition = False + + return t['product'], t.id, created_tickets