Now the user can add any number of tickets at once(User need to have the
permissions TICKET_BATCH_CREATE + WIKI_ADMIN/WIKI_DELETE). After logging in
the component will display a text field and button (Batch Create) where the
users can enter the number of tickets that they are going to create. Then
the component will generate a empty table where the users can enter the
relevant details of the tickets and create that batch of tickets. Currently
after creating the tickets the component will redirect the users into a
blank page. So now I'm working on that, to render the ticket table with the
details of that created batch instead of the black page.


On Mon, Jun 23, 2014 at 12:45 PM, <[email protected]> wrote:

> Author: dammina
> Date: Mon Jun 23 11:45:24 2014
> New Revision: 1604759
>
> URL: http://svn.apache.org/r1604759
> Log:
> User interaction capability added to the component
>
> Added:
>
> bloodhound/branches/bep_0011_batch_create_tickets/bloodhound_theme/bhtheme/htdocs/js/batchcreate.js
>   (with props)
> Modified:
>
> bloodhound/branches/bep_0011_batch_create_tickets/bloodhound_theme/bhtheme/theme.py
>
> Added:
> 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=1604759&view=auto
>
> ==============================================================================
> ---
> bloodhound/branches/bep_0011_batch_create_tickets/bloodhound_theme/bhtheme/htdocs/js/batchcreate.js
> (added)
> +++
> bloodhound/branches/bep_0011_batch_create_tickets/bloodhound_theme/bhtheme/htdocs/js/batchcreate.js
> Mon Jun 23 11:45:24 2014
> @@ -0,0 +1,204 @@
> +function emptyTable(products,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 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"];
> +       priorities = ["blocker", "critical", "major", "minor", "trivial"];
> +       types = ["defect", "enhancement", "task"];
> +
> +       var div = document.createElement("div");
> +       div.setAttribute("class","span12");
> +       div.setAttribute("id","empty-table");
> +       var h2 = document.createElement("h2");
> +       h2.appendChild(document.createTextNode("Batch Create Tickets"));
> +       div.appendChild(h2);
> +
> +       var form = document.createElement("form");
> +       form.setAttribute("id","bct-form");
> +       form.setAttribute("name","bct");
> +       form.setAttribute("method","post");
> +       form.setAttribute("action",href);
> +
> +       var div_token = document.createElement("div");
> +       var form_token_val = document.createElement("input");
> +       form_token_val.setAttribute("type","hidden");
> +       form_token_val.setAttribute("name","__FORM_TOKEN");
> +       form_token_val.setAttribute("value",form_token);
> +       div_token.appendChild(form_token_val);
> +       form.appendChild(div_token);
> +
> +       var table = document.createElement("table");
> +       table.setAttribute("class","listing tickets table table-bordered
> table-condensed query");
> +       table.setAttribute("style","border-radius: 0px 0px 4px 4px");
> +
> +       var tr = document.createElement("tr");
> +       tr.setAttribute("class","trac-columns");
> +       for (header in headers){
> +               font = document.createElement("font");
> +               font.setAttribute("color","#1975D1");
> +               font.appendChild(document.createTextNode(headers[header]))
> +               th = document.createElement("th");
> +               th.appendChild(font);
> +               tr.appendChild(th);
> +       }
> +       table.appendChild(tr);
> +
> +       tbody = document.createElement("tbody");
> +       for (i=0;i<numOfRows;i++){
> +               tr_rows = document.createElement("tr");
> +               for (header in headers){
> +                       if (header == "summary"){
> +                               td_row = document.createElement("td");
> +                               input_summary =
> document.createElement("input");
> +                               input_summary.setAttribute("type","text");
> +
> input_summary.setAttribute("id","field-summary"+i);
> +
> input_summary.setAttribute("class","input-block-level");
> +
> 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);
> +                               }
> +                               td_row.appendChild(input_priority);
> +                               tr_rows.appendChild(td_row);
> +                       }
> +                       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);
> +                       }
> +                       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);
> +                       }
> +               }
> +               tbody.appendChild(tr_rows);
> +       }
> +       table.appendChild(tbody);
> +       form.appendChild(table);
> +
> +    submit_button = document.createElement("button");
> +       submit_button.setAttribute("class","btn pull-right");
> +       submit_button.setAttribute("type","button");
> +       submit_button.setAttribute("onclick","submitForm()");
> +       submit_button.appendChild(document.createTextNode("save"));
> +       form.appendChild(submit_button);
> +       div.appendChild(form);
> +       contentDiv.appendChild(div);
> +       }
> +
> +    //var rowCount = table.rows.length;
> +    //var row = table.insertRow(rowCount);
> +}
> +
> +function submitForm(){
> +       document.getElementById("bct-form").submit();
> +}
> +
> +//function deleteRow(obj) {
> +
> +//    var index = obj.parentNode.parentNode.rowIndex;
> +//    var table = document.getElementById("myTableData");
> +//    table.deleteRow(index);
> +
> +//}
>
> Propchange:
> bloodhound/branches/bep_0011_batch_create_tickets/bloodhound_theme/bhtheme/htdocs/js/batchcreate.js
>
> ------------------------------------------------------------------------------
>     svn:eol-style = native
>
> 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=1604759&r1=1604758&r2=1604759&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
> Mon Jun 23 11:45:24 2014
> @@ -800,6 +800,7 @@ class BatchCreateTicketDialog(Component)
>                                'url': get_resource_url(self.env, tres,
> href)}),
>                       'application/json')
>
> +
>      def _get_ticket_module(self):
>          ptm = None
>          if ProductTicketModule is not None:
> @@ -813,124 +814,29 @@ 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('TICKET_ADMIN') or
> req.perm.has_permission('TICKET_BATCH_CREATE')):
> -            #(req.perm.has_permission('TICKET_ADMIN') or
> req.perm.has_permission('TICKET_CREATE')
> -            #headers =
> {'summary':'Summary','description':'Description','product':'Product','status':'Status','priority':'Priority','type':'Type','owner':'Owner','cc':'Cc','keywords':'Keywords','milestone':'Milestone'}
> -            headers =
> {'summary':'Summary','description':'Description','product':'Product','status':'Status'}
> +        if (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")
> -            xpath = '//div[@id="content"]'
> -            div = tag.div(class_="span12", id="batch_create_empty_table")
> -            text = tag.text("Batch Create Tickets")
> -            h1 = tag.h1(text)
> -            div.append(h1)
> -            form = tag.form(id="qct-form", name="bct", method="post",
> action=req.href()+"/bct")
> -            table = tag.table(class_="listing tickets table
> table-bordered table-condensed query", style="border-radius: 0px 0px 4px
> 4px")
> -            tr = tag.tr(class_="trac-columns")
> -            for header in sorted(headers):
> -                font = tag.font(color="#1975D1")
> -                text = tag.text(headers[header])
> -                font.append(text)
> -                th = tag.th(font)
> -                tr.append(th)
> -            table.append(tr)
> -            tbody = tag.tbody()
> -            for num in range(0,5):
> -                tr_rows = tag.tr()
> -                for header in sorted(headers):
> -                    if header == "summary":
> -                        td_row = tag.td()
> -                        input_summary = tag.input(type="text", id =
> "field-summary"+str(num), class_="input-block-level",
> name="field_summary"+str(num))
> -                        td_row.append(input_summary)
> -                        tr_rows.append(td_row)
> -                    elif header == "description":
> -                        td_row = tag.td()
> -                        input_description = tag.textarea(id =
> "field-description"+str(num), name="field_description"+str(num),
> class_="input-block-level", rows="1", cols="28")
> -                        td_row.append(input_description)
> -                        tr_rows.append(td_row)
> -                    elif header == "status":
> -                        statuses = ["accepted", "assigned", "closed",
> "new", "reopened"]
> -                        td_row = tag.td()
> -                        input_status = tag.select(id =
> "field-status"+str(num), name="field_status"+str(num))
> -                        for status in statuses:
> -                            option = tag.option(value=str(status))
> -                            text = tag.text(str(status))
> -                            option.append(text)
> -                            input_status.append(option)
> -                        td_row.append(input_status)
> -                        tr_rows.append(td_row)
> -                    elif header == "priority":
> -                        priorities = ["blocker", "critical", "major",
> "minor", "trivial"]
> -                        td_row = tag.td()
> -                        input_priority = tag.select(id =
> "field-priority"+str(num), name="field_priority"+str(num))
> -                        for priority in priorities:
> -                            option = tag.option(value=str(priority))
> -                            text = tag.text(str(priority))
> -                            option.append(text)
> -                            input_priority.append(option)
> -                        td_row.append(input_priority)
> -                        tr_rows.append(td_row)
> -                    elif header=="type":
> -                        types = ["defect", "enhancement", "task"]
> -                        td_row = tag.td()
> -                        input_type = tag.select(id =
> "field-type"+str(num), name="field_type"+str(num))
> -                        for type in types:
> -                            option = tag.option(value=str(type))
> -                            text = tag.text(str(type))
> -                            option.append(text)
> -                            input_type.append(option)
> -                        td_row.append(input_type)
> -                        tr_rows.append(td_row)
> -                    elif header == "product":
> -                        td_row = tag.td()
> -                        input_product = tag.select(id =
> "field-product"+str(num), name="field_product"+str(num))
> -                        option = tag.option(value="")
> -                        text = tag.text("Choose...")
> -                        option.append(text)
> -                        input_product.append(option)
> -                        for product in products:
> -                            option = tag.option(value=str(product[0]))
> -                            text = tag.text(str(product[1]))
> -                            option.append(text)
> -                            input_product.append(option)
> -                        td_row.append(input_product)
> -                        tr_rows.append(td_row)
> -                    elif header == "owner":
> -                        td_row = tag.td()
> -                        input_owner = tag.input(type="text", id =
> "field-owner"+str(num), class_="input-block-level",
> name="field_owner"+str(num))
> -                        td_row.append(input_owner)
> -                        tr_rows.append(td_row)
> -                    elif header == "cc":
> -                        td_row = tag.td()
> -                        input_cc = tag.input(type="text", id =
> "field-cc"+str(num), class_="input-block-level", name="field_cc"+str(num))
> -                        td_row.append(input_cc)
> -                        tr_rows.append(td_row)
> -                    elif header == "milestone":
> -                        td_row = tag.td()
> -                        input_cc = tag.input(type="text", id =
> "field-milestone"+str(num), class_="input-block-level",
> name="field_milestone"+str(num))
> -                        td_row.append(input_cc)
> -                        tr_rows.append(td_row)
> -                    elif header == "keywords":
> -                        td_row = tag.td()
> -                        input_cc = tag.input(type="text", id =
> "field-keywords"+str(num), class_="input-block-level",
> name="field_keywords"+str(num))
> -                        td_row.append(input_cc)
> -                        tr_rows.append(td_row)
> -                tbody.append(tr_rows)
> -            table.append(tbody)
> -            form.append(table)
> -            div_button = tag.div(class_="btn-group pull-right")
> -            input_button = tag.input(type="submit", class_="btn
> pull-right", name="save", value="save")
> -            div_button.append(input_button)
> -            form.append(div_button)
> -            div.append(form)
> -            div.append("\n")
> -            stream |= Transformer(xpath).append(div)
> +            form = tag.form(method="get", style="display:inline",
> id="batchcreate")
> +            div = tag.div(class_="btn-group")
> +            span = tag.span(class_="input-group-btn")
> +            button = tag.button(class_="btn btn-default", type="button",
> onclick="Javascript:emptyTable("+to_json(products)+","+to_json(req.href()+"/bct")+","+to_json(str(req.environ["HTTP_COOKIE"]))+")")
> +            input = tag.input(id="numOfRows",type="text",
> style="width:110px;", class_="form-control", placeholder="How many
> tickets?")
> +            text = tag.text("Batch Create")
> +            button.append(text)
> +            span.append(button)
> +            span.append(input)
> +            div.append(span)
> +            form.append(div)
> +            stream |= Transformer(xpath).append(form)
>          return stream
>
>      # Public API
>      def batch_create(self, req, attributes={}, notify=False):
>          """ Create batch of tickets, returning created tickets.
>          """
> -        num_of_tkts = attributes.__len__()/4
> +        num_of_tkts = attributes.__len__()/5
>          for i in range(0,num_of_tkts):
>              if 'product'+str(i) in attributes:
>                  env = self.env.parent or self.env
> @@ -942,6 +848,7 @@ class BatchCreateTicketDialog(Component)
>              status = attributes.pop('status'+str(i))
>              summary = attributes.pop('summary'+str(i))
>              product = attributes.pop('product'+str(i))
> +            priority = attributes.pop('priority'+str(i))
>
>              t = Ticket(env)
>              t['summary'] = summary
> @@ -950,6 +857,7 @@ class BatchCreateTicketDialog(Component)
>              t['status'] = status
>              t['resolution'] = ''
>              t['product'] = product
> +            t['priority'] = priority
>              t.insert()
>
>              if notify:
>
>
>


-- 
Dammina Sahabandu.
Committer for ASF (Apache Bloodhound)
Undergraduate Department of Computer Science and Engineering
University of Moratuwa
Sri Lanka.

Reply via email to