seccanj avatar seccanj committed f143f7a

Release 1.4.4. Enhancement #8596, Fixed Ticket #8567

o Fixed Ticket #8567 (Track-Hacks): Javascript error when deleting test plans

o Enhancement #8596 (Track-Hacks): Remove hard dependency on XML RPC plugin for Trac 0.11

Comments (0)

Files changed (16)

 
 (Refer to the tickets on trac-hacks or SourceForge for complete descriptions.)
 
+Release 1.4.4 (2011-02-11):
+  o Fixed Ticket #8567 (Track-Hacks): Javascript error when deleting test plans
+  o Enhancement #8596 (Track-Hacks): Remove hard dependency on XML RPC plugin for Trac 0.11
+
 Release 1.4.3 (2011-01-20):
   o Enhancement #8427 (Track-Hacks): Add XML-RPC complete interface for remote management of test objects
 
 
 #python setup.py extract_messages
 #python setup.py extract_messages_js
-#python ./setup.py update_catalog -l it_IT
-#python ./setup.py update_catalog_js -l it_IT
-#python ./setup.py compile_catalog -f -l it_IT
-#python ./setup.py compile_catalog_js -f -l it_IT
+#python ./setup.py update_catalog -l it
+#python ./setup.py update_catalog_js -l it
+#python ./setup.py compile_catalog -f -l it
+#python ./setup.py compile_catalog_js -f -l it
 
 python setup.py bdist_egg
 cp dist/*.egg ../../bin

testman4trac/trunk/setup.py

 
 setup(
     name='TestManager',
-    version='1.4.3',
+    version='1.4.4',
     packages=['testmanager'],
     package_data={
         'testmanager' : [

testman4trac/trunk/testmanager/README.txt

 
 (Refer to the tickets on trac-hacks or SourceForge for complete descriptions.)
 
+Release 1.4.4 (2011-02-11):
+  o Fixed Ticket #8567 (Track-Hacks): Javascript error when deleting test plans
+  o Enhancement #8596 (Track-Hacks): Remove hard dependency on XML RPC plugin for Trac 0.11
+
 Release 1.4.3 (2011-01-20):
   o Enhancement #8427 (Track-Hacks): Add XML-RPC complete interface for remote management of test objects
 

testman4trac/trunk/testmanager/api.py

 
             autosave = req.args.get('autosave', 'false')
             duplicate = req.args.get('duplicate')
+            multiple = req.args.get('multiple')
             paste = req.args.get('paste')
             tcId = req.args.get('tcId')
 
 
                     req.perm.require('TEST_PLAN_ADMIN')
 
+                    if multiple and multiple != '':
+                        delete_old = False
+                        tcIdsList = tcId.split(',')
+                    else:
+                        delete_old = True
+                        tcIdsList = [tcId]
+                    
                     try:
                         catid = path.rpartition('_TT')[2]
                         tcat = TestCatalog(self.env, catid)
                         
-                        old_pagename = tcId
-                        tc_id = tcId.rpartition('_TC')[2]
-                        tc = TestCase(self.env, tc_id, tcId)
-                        tc.author = author
-                        tc.remote_addr = req.remote_addr
-                        if tc.exists:
-                            tc.move_to(tcat)                            
-                        else:
-                            self.env.log.debug("Test case not found")
+                        for tcId in tcIdsList:
+                            if tcId is not None and tcId != '':
+                                old_pagename = tcId
+                                tc_id = tcId.rpartition('_TC')[2]
+
+                                tc = TestCase(self.env, tc_id, tcId)
+                                tc.author = author
+                                tc.remote_addr = req.remote_addr
+                                if tc.exists:
+                                    if delete_old:
+                                        tc.move_to(tcat)                            
+                                    else:
+                                        tc['page_name'] = pagename
+                                        tc.save_as({'id': id})
+                                else:
+                                    self.env.log.debug("Test case not found")
+
+                            # Generate a new Id for the next iteration
+                            id = self.get_next_id(type)
+                            pagename = path + '_TC'+str(id)
+                                    
                     except:
-                        self.env.log.info("Error pasting test case!")
+                        self.env.log.info("Error pasting test cases!")
                         self.env.log.info(formatExceptionInfo())
                         req.redirect(req.href.wiki(pagename))
                 

testman4trac/trunk/testmanager/htdocs/js/compatibility.js

     /* In Trac 0.11 we must handle sections explicitly */
     $('#'+nodeId).toggleClass('collapsed');
 }
+
+function _(str) {
+	return str;
+}

testman4trac/trunk/testmanager/htdocs/js/testmanager.js

 }
 
 /******************************************************/
-/**         Move test case into another catalog       */
+/**    Move or copy test case into another catalog    */
 /******************************************************/
 
 function checkMoveTCDisplays() {
     displayNode('copiedTCMessage', isPasteEnabled());
     displayNode('pasteTCHereMessage', isPasteEnabled());
-    displayNode('pasteTCHereDiv', isPasteEnabled());
+    displayNode('pasteTCHereButton', isPasteEnabled(), 'inline');
+
+    displayNode('copiedMultipleTCsMessage', isMultiplePasteEnabled());
+    displayNode('pasteMultipleTCsHereMessage', isMultiplePasteEnabled());
+    displayNode('pasteMultipleTCsHereButton', isMultiplePasteEnabled(), 'inline');
 }
 
 function isPasteEnabled() {
     return false;
 }
 
+function isMultiplePasteEnabled() {
+    if (getCookie('TestManager_MultipleTestCases')) {
+        return true;
+    }
+    
+    return false;
+}
+
+function showSelectionCheckboxes(id) {
+	/* toggleAll(true); */
+
+    var nodes=document.getElementById("ticketContainer").getElementsByTagName('input');
+	for (var i=0;i<nodes.length;i++) {
+		var el=nodes.item(i);
+		
+		if (el.getAttribute("name") && el.getAttribute("name") == "select_tc_checkbox") {
+			el.style.display = "block";
+		}
+	}
+}
+
 function copyTestCaseToClipboard(tcId) {
     setCookie('TestManager_TestCase', tcId, 1, '/', '', '');
     setTimeout('window.location="'+window.location+'"', 100);
 }
 
+function copyMultipleTestCasesToClipboard() {
+	var selectedTickets = "";
+
+    var nodes=document.getElementById("ticketContainer").getElementsByTagName('input');
+	for (var i=0;i<nodes.length;i++) {
+		var el=nodes.item(i);
+		
+		if (el.getAttribute("name") && el.getAttribute("name") == "select_tc_checkbox") {
+			if (el.checked) {
+				selectedTickets += el.value + ','
+			}
+		}
+	}
+
+    setCookie('TestManager_MultipleTestCases', selectedTickets, 1, '/', '', '');
+    setTimeout('window.location="'+window.location+'"', 100);
+}
+
 function pasteTestCaseIntoCatalog(catName) {
     var tcId = getCookie('TestManager_TestCase');
     
     }
 }
 
+function pasteMultipleTestCasesIntoCatalog(catName) {
+    var tcIds = getCookie('TestManager_MultipleTestCases');
+    
+    if (tcIds != null) {
+        deleteCookie('TestManager_MultipleTestCases', '/', '');
+        var url = baseLocation+"/testcreate?type=testcase&paste=true&multiple=true&path="+catName+"&tcId="+tcIds;
+        window.location = url;
+    }
+}
+
 function cancelTCMove() {
     deleteCookie('TestManager_TestCase', '/', '');
     setTimeout('window.location="'+window.location+'"', 100);
 }
 
+function cancelTCsCopy() {
+    deleteCookie('TestManager_MultipleTestCases', '/', '');
+    setTimeout('window.location="'+window.location+'"', 100);
+}
+
 /******************************************************/
 /**                 Tree view widget                  */
 /******************************************************/
     return result;
 }
 
-function displayNode(id, show) {
+function displayNode(id, show, mode) {
     var msgNode = document.getElementById(id);
     if (msgNode) {
-        msgNode.style.display = show ? "block" : "none";
+       msgNode.style.display = show ? (mode ? mode : "block") : "none";
     }
 }
 
Add a comment to this file

testman4trac/trunk/testmanager/locale/it/LC_MESSAGES/testmanager-js.mo

Binary file modified.

testman4trac/trunk/testmanager/locale/it/LC_MESSAGES/testmanager-js.po

-# Italian (Italy) translations for TestManager.
-# Copyright (C) 2010 Roberto Longobardi
-# This file is distributed under the same license as the TestManager
-# project.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: TestManager 1.3.12\n"
-"Report-Msgid-Bugs-To: seccanj@gmail.com\n"
-"POT-Creation-Date: 2010-12-17 16:54+0100\n"
-"PO-Revision-Date: 2010-12-17 16:55+0100\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: it_IT <LL@li.org>\n"
-"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.5\n"
-
-#: testmanager/htdocs/js/testmanager.js:15
-#: testmanager/htdocs/js/testmanager.js:34
-#: testmanager/htdocs/js/testmanager.js:53
-msgid "You must specify a name. Length between 4 and 90 characters."
-msgstr "Devi indicare un nome. Lunghezza da 4 a 90 caratteri."
-
-#: testmanager/htdocs/js/testmanager.js:20
-#: testmanager/htdocs/js/testmanager.js:39
-#: testmanager/htdocs/js/testmanager.js:58
-msgid "Length between 4 and 90 characters."
-msgstr "Lunghezza da 4 a 90 caratteri."
-
-#: testmanager/htdocs/js/testmanager.js:88
-msgid ""
-"Are you sure you want to duplicate the test catalog and all its contained"
-" test cases?"
-msgstr "Sei sicuro di voler duplicare il catalogo e tutti i test case in esso contenuti?"
-
-#: testmanager/htdocs/js/testmanager.js:95
-msgid ""
-"Are you sure you want to delete the test plan and the state of all its "
-"contained test cases?"
-msgstr "Sei sicuro di voler eliminare il piano di test e lo stato di tutti i test case in esso contenuti?"
-
-#: testmanager/htdocs/js/testmanager.js:212
-#: testmanager/htdocs/js/testmanager.js:361
-msgid "Results: "
-msgstr "Risultati: "
-
+# Italian (Italy) translations for TestManager.
+# Copyright (C) 2010 Roberto Longobardi
+# This file is distributed under the same license as the TestManager
+# project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: TestManager 1.3.12\n"
+"Report-Msgid-Bugs-To: seccanj@gmail.com\n"
+"POT-Creation-Date: 2010-12-17 16:54+0100\n"
+"PO-Revision-Date: 2011-03-10 16:35+0100\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: it_IT <LL@li.org>\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.5\n"
+
+#: testmanager/htdocs/js/testmanager.js:15
+#: testmanager/htdocs/js/testmanager.js:34
+#: testmanager/htdocs/js/testmanager.js:53
+msgid "You must specify a name. Length between 4 and 90 characters."
+msgstr "Devi indicare un nome. Lunghezza da 4 a 90 caratteri."
+
+#: testmanager/htdocs/js/testmanager.js:20
+#: testmanager/htdocs/js/testmanager.js:39
+#: testmanager/htdocs/js/testmanager.js:58
+msgid "Length between 4 and 90 characters."
+msgstr "Lunghezza da 4 a 90 caratteri."
+
+#: testmanager/htdocs/js/testmanager.js:88
+msgid ""
+"Are you sure you want to duplicate the test catalog and all its contained"
+" test cases?"
+msgstr ""
+"Sei sicuro di voler duplicare il catalogo e tutti i test case in esso "
+"contenuti?"
+
+#: testmanager/htdocs/js/testmanager.js:95
+msgid ""
+"Are you sure you want to delete the test plan and the state of all its "
+"contained test cases?"
+msgstr ""
+"Sei sicuro di voler eliminare il piano di test e lo stato di tutti i test"
+" case in esso contenuti?"
+
+#: testmanager/htdocs/js/testmanager.js:270
+#: testmanager/htdocs/js/testmanager.js:419
+msgid "Results: "
+msgstr "Risultati: "
+
Add a comment to this file

testman4trac/trunk/testmanager/locale/it/LC_MESSAGES/testmanager.mo

Binary file modified.

testman4trac/trunk/testmanager/locale/it/LC_MESSAGES/testmanager.po

 # project.
 # FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
 #
-#, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: TestManager 1.3.11\n"
 "Report-Msgid-Bugs-To: seccanj@gmail.com\n"
 "POT-Creation-Date: 2010-12-14 12:35+0100\n"
-"PO-Revision-Date: 2010-12-18 21:34+0100\n"
+"PO-Revision-Date: 2011-03-10 16:35+0100\n"
 "Last-Translator: Roberto Longobardi <seccanj@gmail.com>\n"
 "Language-Team: Italian it_IT <trac-dev@googlegroups.com>\n"
 "Plural-Forms: nplurals=2; plural=(n != 1)\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Generated-By: Babel 0.9.5\n"
 
-#: testmanager/api.py:102
-msgid "Successful"
-msgstr "Passato"
-
-#: testmanager/api.py:103
-msgid "Untested"
-msgstr "Da Testare"
-
-#: testmanager/api.py:104
-msgid "Failed"
-msgstr "Fallito"
-
-#: testmanager/api.py:121 testmanager/macros.py:540 testmanager/macros.py:864
+#: testmanager/api.py:181 testmanager/macros.py:541 testmanager/macros.py:864
 msgid "Timestamp"
 msgstr "Timestamp"
 
-#: testmanager/api.py:121 testmanager/macros.py:490 testmanager/macros.py:540
-#: testmanager/macros.py:864 testmanager/model.py:471
+#: testmanager/api.py:181 testmanager/macros.py:491 testmanager/macros.py:541
+#: testmanager/macros.py:864 testmanager/model.py:542
 msgid "Author"
 msgstr "Autore"
 
-#: testmanager/api.py:121 testmanager/api.py:134 testmanager/macros.py:490
-#: testmanager/macros.py:864 testmanager/model.py:464
+#: testmanager/api.py:181 testmanager/api.py:194 testmanager/macros.py:491
+#: testmanager/macros.py:864 testmanager/model.py:535
 msgid "Status"
 msgstr "Stato"
 
-#: testmanager/macros.py:217
+#: testmanager/macros.py:218
 msgid "All Catalogs"
 msgstr "Tutti i Cataloghi"
 
-#: testmanager/macros.py:306 testmanager/macros.py:327
-#: testmanager/macros.py:445 testmanager/macros.py:467
+#: testmanager/macros.py:307 testmanager/macros.py:328
+#: testmanager/macros.py:446 testmanager/macros.py:468
 msgid "Filter:"
 msgstr "Filtro:"
 
-#: testmanager/macros.py:306 testmanager/macros.py:327
-#: testmanager/macros.py:445 testmanager/macros.py:467
+#: testmanager/macros.py:307 testmanager/macros.py:328
+#: testmanager/macros.py:446 testmanager/macros.py:468
 msgid ""
 "Type the test to search for, even more than one word. You can also filter"
 " on the test case status (untested, successful, failed)."
 "Inserire il testo da cercare, anche piu\\' parole. Si puo\\' filtrare "
 "anche per stato dei test cases (da testare, passato, fallito)."
 
-#: testmanager/macros.py:307 testmanager/macros.py:446
+#: testmanager/macros.py:308 testmanager/macros.py:447
 msgid "Expand all"
 msgstr "Espandi tutto"
 
-#: testmanager/macros.py:307 testmanager/macros.py:446
+#: testmanager/macros.py:308 testmanager/macros.py:447
 msgid "Collapse all"
 msgstr "Comprimi tutto"
 
-#: testmanager/macros.py:332 testmanager/macros.py:472 testmanager/model.py:470
+#: testmanager/macros.py:333 testmanager/macros.py:473 testmanager/model.py:541
 msgid "Name"
 msgstr "Nome"
 
-#: testmanager/macros.py:341 testmanager/macros.py:481 testmanager/model.py:453
-#: testmanager/model.py:457 testmanager/model.py:461 testmanager/model.py:467
+#: testmanager/macros.py:342 testmanager/macros.py:482 testmanager/model.py:524
+#: testmanager/model.py:528 testmanager/model.py:532 testmanager/model.py:538
 msgid "ID"
 msgstr "ID"
 
-#: testmanager/macros.py:351
+#: testmanager/macros.py:352
 msgid "Description"
 msgstr "Descrizione"
 
-#: testmanager/macros.py:490
+#: testmanager/macros.py:491
 msgid "Last Change"
 msgstr "Ultima Modifica"
 
-#: testmanager/macros.py:526
+#: testmanager/macros.py:527
 msgid "Available Test Plans"
 msgstr "Piani di Test disponibili"
 
-#: testmanager/macros.py:540
+#: testmanager/macros.py:541
 msgid "Plan Name"
 msgstr "Nome del Piano"
 
-#: testmanager/macros.py:546
+#: testmanager/macros.py:547
 msgid "Open Test Plan"
 msgstr "Apri il Piano di Test"
 
-#: testmanager/macros.py:551
+#: testmanager/macros.py:552
 msgid "Delete"
 msgstr "Elimina"
 
-#: testmanager/macros.py:614 testmanager/macros.py:709
+#: testmanager/macros.py:615 testmanager/macros.py:710
 msgid "Open"
 msgstr "Apri"
 
-#: testmanager/macros.py:655 testmanager/macros.py:657
+#: testmanager/macros.py:656 testmanager/macros.py:658
 msgid "Edit the Test Case"
 msgstr "Modifica il Caso di Test"
 
-#: testmanager/macros.py:821
+#: testmanager/macros.py:828
 msgid "Change the Status:"
 msgstr "Modifica lo Stato:"
 
-#: testmanager/macros.py:831
-#, fuzzy
-msgid "SUCCESSFUL"
-msgstr "Passato"
-
-#: testmanager/macros.py:839
-#, fuzzy
-msgid "TO_BE_TESTED"
-msgstr "Da Testare"
-
-#: testmanager/macros.py:847
-#, fuzzy
-msgid "FAILED"
-msgstr "Fallito"
-
 #: testmanager/macros.py:861
 msgid "Status change history"
 msgstr "Storia dei cambiamenti di stato"
 
-#: testmanager/model.py:454 testmanager/model.py:458 testmanager/model.py:463
-#: testmanager/model.py:469
+#: testmanager/model.py:525 testmanager/model.py:529 testmanager/model.py:534
+#: testmanager/model.py:540
 msgid "Wiki page name"
 msgstr "Nome della pagina wiki"
 
-#: testmanager/model.py:462
+#: testmanager/model.py:533
 msgid "Plan ID"
 msgstr "ID del Piano"
 
-#: testmanager/model.py:468
+#: testmanager/model.py:539
 msgid "Catalog ID"
 msgstr "ID del Catalogo"
 
-#: testmanager/model.py:472
+#: testmanager/model.py:543
 msgid "Created"
 msgstr "Creato"
 
+#: testmanager/model.py:665 testmanager/wiki.py:381 testmanager/wiki.py:445
+msgid "Test Case"
+msgstr "Caso di Test"
+
+#: testmanager/model.py:669
+msgid "Test Plan"
+msgstr "Piano di Test: "
+
+#: testmanager/model.py:674
+msgid "Successful"
+msgstr "Passato"
+
+#: testmanager/model.py:675
+msgid "Untested"
+msgstr "Da Testare"
+
+#: testmanager/model.py:676
+msgid "Failed"
+msgstr "Fallito"
+
 #: testmanager/web_ui.py:67
 msgid "Test Manager"
 msgstr "Test Manager"
 
 #: testmanager/wiki.py:152
 msgid ""
+"Select the catalog into which to paste the Test Cases and click on 'Paste"
+" the copied Test Cases here'. "
+msgstr ""
+"Seleziona il catalogo dove incollare il Caso di Test copiato e clicca su "
+"'Sposta il Caso di Test copiato qui'. "
+
+#: testmanager/wiki.py:153 testmanager/wiki.py:157 testmanager/wiki.py:179
+#: testmanager/wiki.py:184 testmanager/wiki.py:371 testmanager/wiki.py:376
+msgid "Cancel"
+msgstr "Annulla"
+
+#: testmanager/wiki.py:156
+msgid ""
 "Select the catalog into which to paste the Test Case and click on 'Move "
 "the copied Test Case here'. "
 msgstr ""
 "Seleziona il catalogo dove incollare il Caso di Test copiato e clicca su "
 "'Sposta il Caso di Test copiato qui'. "
 
-#: testmanager/wiki.py:153 testmanager/wiki.py:175 testmanager/wiki.py:348
-msgid "Cancel"
-msgstr "Annulla"
-
-#: testmanager/wiki.py:155
+#: testmanager/wiki.py:159
 msgid "Test Catalogs List"
 msgstr "Lista dei Cataloghi di Test"
 
-#: testmanager/wiki.py:158
+#: testmanager/wiki.py:162
 msgid "New Catalog:"
 msgstr "Nuovo Catalogo:"
 
-#: testmanager/wiki.py:159
+#: testmanager/wiki.py:163
 msgid "Add a Catalog"
 msgstr "Aggungi un Catalogo"
 
-#: testmanager/wiki.py:174
+#: testmanager/wiki.py:178
+msgid ""
+"Select the catalog (even this one) into which to paste the Test Cases and"
+" click on 'Paste the copied Test Cases here'. "
+msgstr ""
+"Seleziona il catalogo (anche questo stesso) dove incollare i Casi di "
+"Test copiati e clicca su 'Incolla qui i Casi di Test copiati'. "
+
+#: testmanager/wiki.py:183
 msgid ""
 "Select the catalog (even this one) into which to paste the Test Case and "
 "click on 'Move the copied Test Case here'. "
 "Seleziona il catalogo (anche questo stesso) dove incollare il Caso di "
 "Test copiato e clicca su 'Sposta il Caso di Test copiato qui'. "
 
-#: testmanager/wiki.py:178
+#: testmanager/wiki.py:187
 msgid "Test Catalog"
 msgstr "Catalogo di Test"
 
-#: testmanager/wiki.py:180
+#: testmanager/wiki.py:189
 msgid "New Sub-Catalog:"
 msgstr "Nuovo Sotto Catalogo:"
 
-#: testmanager/wiki.py:181
+#: testmanager/wiki.py:190
 msgid "Add a Sub-Catalog"
 msgstr "Aggiungi un Sotto Catalogo"
 
-#: testmanager/wiki.py:196
-msgid "Move the copied Test Case here"
-msgstr "Sposta il Caso di Test copiato qui"
-
-#: testmanager/wiki.py:218
+#: testmanager/wiki.py:223
 msgid "New Test Case:"
 msgstr "Nuovo Caso di Test:"
 
-#: testmanager/wiki.py:222
+#: testmanager/wiki.py:227
 msgid "Add a Test Case"
 msgstr "Aggiungi un Caso di Test"
 
-#: testmanager/wiki.py:226
+#: testmanager/wiki.py:231
 msgid "New Test Plan:"
 msgstr "Nuovo Piano di Test:"
 
-#: testmanager/wiki.py:230
+#: testmanager/wiki.py:235
 msgid "Generate a new Test Plan"
 msgstr "Genera un Piano di Test"
 
-#: testmanager/wiki.py:279 testmanager/wiki.py:449
+#: testmanager/wiki.py:244
+msgid "Select Multiple Test Cases"
+msgstr "Seleziona piu' Casi di Test"
+
+#: testmanager/wiki.py:247
+msgid "Copy the Selected Test Cases"
+msgstr "Copia i Casi di Test Selezionati"
+
+#: testmanager/wiki.py:251
+msgid "Paste the copied Test Cases here"
+msgstr "Incolla qui i Casi di Test copiati"
+
+#: testmanager/wiki.py:254
+msgid "Move the copied Test Case here"
+msgstr "Sposta qui il Caso di Test tagliato"
+
+#: testmanager/wiki.py:303 testmanager/wiki.py:478
 msgid "Back to the Catalog"
 msgstr "Torna al Catalogo"
 
-#: testmanager/wiki.py:290
+#: testmanager/wiki.py:314
 msgid "Test Plan: "
 msgstr "Piano di Test: "
 
-#: testmanager/wiki.py:347
+#: testmanager/wiki.py:370
 msgid ""
-"The Test Case has been copied. Now select the catalog into which to move "
-"the Test Case and click on 'Move the copied Test Case here'. "
+"The Test Cases have been copied. Now select the catalog into which to "
+"paste the Test Cases and click on 'Paste the copied Test Cases here'.  "
 msgstr ""
-"Il Caso di Test e' stato copiato. Adesso seleziona il catalogo dove "
-"spostarlo e clicca su 'Sposta il Caso di Test copiato qui'. "
+"I Casi di Test sono stati copiati. Adesso seleziona il catalogo dove "
+"incollarli e clicca su 'Incolla qui i Casi di Test Copiati'. "
 
-#: testmanager/wiki.py:353 testmanager/wiki.py:416
-msgid "Test Case"
-msgstr "Caso di Test"
+#: testmanager/wiki.py:375
+msgid ""
+"The Test Case has been cut. Now select the catalog into which to move the"
+" Test Case and click on 'Move the copied Test Case here'. "
+msgstr ""
+"Il Caso di Test e' stato tagliato. Adesso seleziona il catalogo dove "
+"spostarlo e clicca su 'Sposta qui il Caso di Test tagliato'. "
 
-#: testmanager/wiki.py:363 testmanager/wiki.py:428
+#: testmanager/wiki.py:391 testmanager/wiki.py:457
 msgid "Open a Ticket on this Test Case"
 msgstr "Apri una Segnalazione su questo Caso di Test"
 
-#: testmanager/wiki.py:365 testmanager/wiki.py:430
+#: testmanager/wiki.py:393 testmanager/wiki.py:459
 msgid "Show Related Tickets"
 msgstr "Mostra le Segnalazioni correlate"
 
-#: testmanager/wiki.py:367
+#: testmanager/wiki.py:395
 msgid "Move the Test Case into another catalog"
 msgstr "Sposta il Caso di Test in altro catalogo"
 
-#: testmanager/wiki.py:369
+#: testmanager/wiki.py:397
 msgid "Duplicate the Test Case"
 msgstr "Duplica il Caso di Test"
 
-#: testmanager/wiki.py:446
+#: testmanager/wiki.py:475
 msgid "Back to the Test Plan"
 msgstr "Torna al Piano di Test"
 
-#: testmanager/wiki.py:514
+#: testmanager/wiki.py:543
 msgid "Edit"
 msgstr "Modifica"
 
-#: testmanager/wiki.py:518
+#: testmanager/wiki.py:547
 msgid "Save"
 msgstr "Salva"
 
-#: testmanager/templates/testmanagerstats.html:53
+#: testmanager/templates/testmanagerstats.html:55
 msgid "Test Management Statistics"
 msgstr "Statistiche sulla gestione dei Test"
 
-#: testmanager/templates/testmanagerstats.html:83
+#: testmanager/templates/testmanagerstats.html:85
 msgid "Settings"
 msgstr "Impostazioni"
 
-#: testmanager/templates/testmanagerstats.html:85
+#: testmanager/templates/testmanagerstats.html:87
 msgid "Start Date:"
 msgstr "Dal:"
 
-#: testmanager/templates/testmanagerstats.html:87
+#: testmanager/templates/testmanagerstats.html:89
 msgid "End Date:"
 msgstr "Al:"
 
-#: testmanager/templates/testmanagerstats.html:89
+#: testmanager/templates/testmanagerstats.html:91
 msgid "Resolution:"
 msgstr "Risoluzione:"
 
-#: testmanager/templates/testmanagerstats.html:92
+#: testmanager/templates/testmanagerstats.html:94
 msgid "1 Day"
 msgstr "1 Giorno"
 
-#: testmanager/templates/testmanagerstats.html:93
+#: testmanager/templates/testmanagerstats.html:95
 msgid "1 Week"
 msgstr "1 Settimana"
 
-#: testmanager/templates/testmanagerstats.html:94
+#: testmanager/templates/testmanagerstats.html:96
 msgid "2 Weeks"
 msgstr "2 Settimane"
 
-#: testmanager/templates/testmanagerstats.html:95
+#: testmanager/templates/testmanagerstats.html:97
 msgid "1 Month"
 msgstr "1 Mese"
 
-#: testmanager/templates/testmanagerstats.html:96
+#: testmanager/templates/testmanagerstats.html:98
 msgid "2 Months"
 msgstr "2 Mesi"
 
-#: testmanager/templates/testmanagerstats.html:97
+#: testmanager/templates/testmanagerstats.html:99
 msgid "3 Months"
 msgstr "3 Mesi"
 
-#: testmanager/templates/testmanagerstats.html:98
+#: testmanager/templates/testmanagerstats.html:100
 msgid "6 Months"
 msgstr "6 Mesi"
 
-#: testmanager/templates/testmanagerstats.html:99
+#: testmanager/templates/testmanagerstats.html:101
 msgid "1 Year"
 msgstr "1 Anno"
 
-#: testmanager/templates/testmanagerstats.html:101
-#, fuzzy
+#: testmanager/templates/testmanagerstats.html:103
 msgid "Test Plan:"
 msgstr "Piano di Test: "
 
-#: testmanager/templates/testmanagerstats.html:103
-#, fuzzy
+#: testmanager/templates/testmanagerstats.html:105
 msgid "All Test Plans"
 msgstr "Tutti i Piani di Test"
 
-#: testmanager/templates/testmanagerstats.html:112
+#: testmanager/templates/testmanagerstats.html:114
 msgid "URL to bookmark:"
 msgstr "URL da salvare nei preferiti:"
 
-#: testmanager/templates/testmanagerstats.html:126
+#: testmanager/templates/testmanagerstats.html:128
 msgid "Export this data to Excel"
 msgstr "Esporta i dati in Excel"
 
-#: testmanager/templates/testmanagerstats.html:126
+#: testmanager/templates/testmanagerstats.html:128
 msgid "(CSV format)"
 msgstr "(formato CSV)"
 
+#~ msgid "SUCCESSFUL"
+#~ msgstr "Passato"
+
+#~ msgid "TO_BE_TESTED"
+#~ msgstr "Da Testare"
+
+#~ msgid "FAILED"
+#~ msgstr "Fallito"
+

testman4trac/trunk/testmanager/locale/messages-js.pot

-# Translations template for TestManager.
-# Copyright (C) 2010 Roberto Longobardi
-# This file is distributed under the same license as the TestManager
-# project.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: TestManager 1.3.12\n"
-"Report-Msgid-Bugs-To: seccanj@gmail.com\n"
-"POT-Creation-Date: 2010-12-17 16:54+0100\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.5\n"
-
-#: testmanager/htdocs/js/testmanager.js:15
-#: testmanager/htdocs/js/testmanager.js:34
-#: testmanager/htdocs/js/testmanager.js:53
-msgid "You must specify a name. Length between 4 and 90 characters."
-msgstr ""
-
-#: testmanager/htdocs/js/testmanager.js:20
-#: testmanager/htdocs/js/testmanager.js:39
-#: testmanager/htdocs/js/testmanager.js:58
-msgid "Length between 4 and 90 characters."
-msgstr ""
-
-#: testmanager/htdocs/js/testmanager.js:88
-msgid ""
-"Are you sure you want to duplicate the test catalog and all its contained"
-" test cases?"
-msgstr ""
-
-#: testmanager/htdocs/js/testmanager.js:95
-msgid ""
-"Are you sure you want to delete the test plan and the state of all its "
-"contained test cases?"
-msgstr ""
-
-#: testmanager/htdocs/js/testmanager.js:212
-#: testmanager/htdocs/js/testmanager.js:361
-msgid "Results: "
-msgstr ""
-
+# Translations template for TestManager.
+# Copyright (C) 2011 Roberto Longobardi
+# This file is distributed under the same license as the TestManager
+# project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: TestManager 1.4.3\n"
+"Report-Msgid-Bugs-To: seccanj@gmail.com\n"
+"POT-Creation-Date: 2011-03-10 16:35+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.5\n"
+
+#: testmanager/htdocs/js/testmanager.js:15
+#: testmanager/htdocs/js/testmanager.js:34
+#: testmanager/htdocs/js/testmanager.js:53
+msgid "You must specify a name. Length between 4 and 90 characters."
+msgstr ""
+
+#: testmanager/htdocs/js/testmanager.js:20
+#: testmanager/htdocs/js/testmanager.js:39
+#: testmanager/htdocs/js/testmanager.js:58
+msgid "Length between 4 and 90 characters."
+msgstr ""
+
+#: testmanager/htdocs/js/testmanager.js:88
+msgid ""
+"Are you sure you want to duplicate the test catalog and all its contained"
+" test cases?"
+msgstr ""
+
+#: testmanager/htdocs/js/testmanager.js:95
+msgid ""
+"Are you sure you want to delete the test plan and the state of all its "
+"contained test cases?"
+msgstr ""
+
+#: testmanager/htdocs/js/testmanager.js:270
+#: testmanager/htdocs/js/testmanager.js:419
+msgid "Results: "
+msgstr ""
+

testman4trac/trunk/testmanager/locale/messages.pot

 # Translations template for TestManager.
-# Copyright (C) 2010 Roberto Longobardi
+# Copyright (C) 2011 Roberto Longobardi
 # This file is distributed under the same license as the TestManager
 # project.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
 #
 #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: TestManager 1.3.12\n"
+"Project-Id-Version: TestManager 1.4.3\n"
 "Report-Msgid-Bugs-To: seccanj@gmail.com\n"
-"POT-Creation-Date: 2010-12-18 21:34+0100\n"
+"POT-Creation-Date: 2011-03-10 16:35+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Generated-By: Babel 0.9.5\n"
 
-#: testmanager/api.py:102
-msgid "Successful"
-msgstr ""
-
-#: testmanager/api.py:103
-msgid "Untested"
-msgstr ""
-
-#: testmanager/api.py:104
-msgid "Failed"
-msgstr ""
-
-#: testmanager/api.py:121 testmanager/macros.py:540
+#: testmanager/api.py:181 testmanager/macros.py:541
 #: testmanager/macros.py:864
 msgid "Timestamp"
 msgstr ""
 
-#: testmanager/api.py:121 testmanager/macros.py:490
-#: testmanager/macros.py:540 testmanager/macros.py:864
-#: testmanager/model.py:471
+#: testmanager/api.py:181 testmanager/macros.py:491
+#: testmanager/macros.py:541 testmanager/macros.py:864
+#: testmanager/model.py:542
 msgid "Author"
 msgstr ""
 
-#: testmanager/api.py:121 testmanager/api.py:134 testmanager/macros.py:490
-#: testmanager/macros.py:864 testmanager/model.py:464
+#: testmanager/api.py:181 testmanager/api.py:194 testmanager/macros.py:491
+#: testmanager/macros.py:864 testmanager/model.py:535
 msgid "Status"
 msgstr ""
 
-#: testmanager/macros.py:217
+#: testmanager/macros.py:218
 msgid "All Catalogs"
 msgstr ""
 
-#: testmanager/macros.py:306 testmanager/macros.py:327
-#: testmanager/macros.py:445 testmanager/macros.py:467
+#: testmanager/macros.py:307 testmanager/macros.py:328
+#: testmanager/macros.py:446 testmanager/macros.py:468
 msgid "Filter:"
 msgstr ""
 
-#: testmanager/macros.py:306 testmanager/macros.py:327
-#: testmanager/macros.py:445 testmanager/macros.py:467
+#: testmanager/macros.py:307 testmanager/macros.py:328
+#: testmanager/macros.py:446 testmanager/macros.py:468
 msgid ""
 "Type the test to search for, even more than one word. You can also "
 "filter on the test case status (untested, successful, failed)."
 msgstr ""
 
-#: testmanager/macros.py:307 testmanager/macros.py:446
+#: testmanager/macros.py:308 testmanager/macros.py:447
 msgid "Expand all"
 msgstr ""
 
-#: testmanager/macros.py:307 testmanager/macros.py:446
+#: testmanager/macros.py:308 testmanager/macros.py:447
 msgid "Collapse all"
 msgstr ""
 
-#: testmanager/macros.py:332 testmanager/macros.py:472
-#: testmanager/model.py:470
+#: testmanager/macros.py:333 testmanager/macros.py:473
+#: testmanager/model.py:541
 msgid "Name"
 msgstr ""
 
-#: testmanager/macros.py:341 testmanager/macros.py:481
-#: testmanager/model.py:453 testmanager/model.py:457
-#: testmanager/model.py:461 testmanager/model.py:467
+#: testmanager/macros.py:342 testmanager/macros.py:482
+#: testmanager/model.py:524 testmanager/model.py:528
+#: testmanager/model.py:532 testmanager/model.py:538
 msgid "ID"
 msgstr ""
 
-#: testmanager/macros.py:351
+#: testmanager/macros.py:352
 msgid "Description"
 msgstr ""
 
-#: testmanager/macros.py:490
+#: testmanager/macros.py:491
 msgid "Last Change"
 msgstr ""
 
-#: testmanager/macros.py:526
+#: testmanager/macros.py:527
 msgid "Available Test Plans"
 msgstr ""
 
-#: testmanager/macros.py:540
+#: testmanager/macros.py:541
 msgid "Plan Name"
 msgstr ""
 
-#: testmanager/macros.py:546
+#: testmanager/macros.py:547
 msgid "Open Test Plan"
 msgstr ""
 
-#: testmanager/macros.py:551
+#: testmanager/macros.py:552
 msgid "Delete"
 msgstr ""
 
-#: testmanager/macros.py:614 testmanager/macros.py:709
+#: testmanager/macros.py:615 testmanager/macros.py:710
 msgid "Open"
 msgstr ""
 
-#: testmanager/macros.py:655 testmanager/macros.py:657
+#: testmanager/macros.py:656 testmanager/macros.py:658
 msgid "Edit the Test Case"
 msgstr ""
 
-#: testmanager/macros.py:821
+#: testmanager/macros.py:828
 msgid "Change the Status:"
 msgstr ""
 
-#: testmanager/macros.py:831
-msgid "SUCCESSFUL"
-msgstr ""
-
-#: testmanager/macros.py:839
-msgid "TO_BE_TESTED"
-msgstr ""
-
-#: testmanager/macros.py:847
-msgid "FAILED"
-msgstr ""
-
 #: testmanager/macros.py:861
 msgid "Status change history"
 msgstr ""
 
-#: testmanager/model.py:454 testmanager/model.py:458
-#: testmanager/model.py:463 testmanager/model.py:469
+#: testmanager/model.py:525 testmanager/model.py:529
+#: testmanager/model.py:534 testmanager/model.py:540
 msgid "Wiki page name"
 msgstr ""
 
-#: testmanager/model.py:462
+#: testmanager/model.py:533
 msgid "Plan ID"
 msgstr ""
 
-#: testmanager/model.py:468
+#: testmanager/model.py:539
 msgid "Catalog ID"
 msgstr ""
 
-#: testmanager/model.py:472
+#: testmanager/model.py:543
 msgid "Created"
 msgstr ""
 
+#: testmanager/model.py:665 testmanager/wiki.py:381 testmanager/wiki.py:445
+msgid "Test Case"
+msgstr ""
+
+#: testmanager/model.py:669
+msgid "Test Plan"
+msgstr ""
+
+#: testmanager/model.py:674
+msgid "Successful"
+msgstr ""
+
+#: testmanager/model.py:675
+msgid "Untested"
+msgstr ""
+
+#: testmanager/model.py:676
+msgid "Failed"
+msgstr ""
+
 #: testmanager/web_ui.py:67
 msgid "Test Manager"
 msgstr ""
 
 #: testmanager/wiki.py:152
 msgid ""
+"Select the catalog into which to paste the Test Cases and click on "
+"'Paste the copied Test Cases here'. "
+msgstr ""
+
+#: testmanager/wiki.py:153 testmanager/wiki.py:157 testmanager/wiki.py:179
+#: testmanager/wiki.py:184 testmanager/wiki.py:371 testmanager/wiki.py:376
+msgid "Cancel"
+msgstr ""
+
+#: testmanager/wiki.py:156
+msgid ""
 "Select the catalog into which to paste the Test Case and click on "
 "'Move the copied Test Case here'. "
 msgstr ""
 
-#: testmanager/wiki.py:153 testmanager/wiki.py:175 testmanager/wiki.py:348
-msgid "Cancel"
-msgstr ""
-
-#: testmanager/wiki.py:155
+#: testmanager/wiki.py:159
 msgid "Test Catalogs List"
 msgstr ""
 
-#: testmanager/wiki.py:158
+#: testmanager/wiki.py:162
 msgid "New Catalog:"
 msgstr ""
 
-#: testmanager/wiki.py:159
+#: testmanager/wiki.py:163
 msgid "Add a Catalog"
 msgstr ""
 
-#: testmanager/wiki.py:174
+#: testmanager/wiki.py:178
+msgid ""
+"Select the catalog (even this one) into which to paste the Test Cases"
+" and click on 'Paste the copied Test Cases here'. "
+msgstr ""
+
+#: testmanager/wiki.py:183
 msgid ""
 "Select the catalog (even this one) into which to paste the Test Case "
 "and click on 'Move the copied Test Case here'. "
 msgstr ""
 
-#: testmanager/wiki.py:178
+#: testmanager/wiki.py:187
 msgid "Test Catalog"
 msgstr ""
 
-#: testmanager/wiki.py:180
+#: testmanager/wiki.py:189
 msgid "New Sub-Catalog:"
 msgstr ""
 
-#: testmanager/wiki.py:181
+#: testmanager/wiki.py:190
 msgid "Add a Sub-Catalog"
 msgstr ""
 
-#: testmanager/wiki.py:196
+#: testmanager/wiki.py:223
+msgid "New Test Case:"
+msgstr ""
+
+#: testmanager/wiki.py:227
+msgid "Add a Test Case"
+msgstr ""
+
+#: testmanager/wiki.py:231
+msgid "New Test Plan:"
+msgstr ""
+
+#: testmanager/wiki.py:235
+msgid "Generate a new Test Plan"
+msgstr ""
+
+#: testmanager/wiki.py:244
+msgid "Select Multiple Test Cases"
+msgstr ""
+
+#: testmanager/wiki.py:247
+msgid "Copy the Selected Test Cases"
+msgstr ""
+
+#: testmanager/wiki.py:251
+msgid "Paste the copied Test Cases here"
+msgstr ""
+
+#: testmanager/wiki.py:254
 msgid "Move the copied Test Case here"
 msgstr ""
 
-#: testmanager/wiki.py:218
-msgid "New Test Case:"
-msgstr ""
-
-#: testmanager/wiki.py:222
-msgid "Add a Test Case"
-msgstr ""
-
-#: testmanager/wiki.py:226
-msgid "New Test Plan:"
-msgstr ""
-
-#: testmanager/wiki.py:230
-msgid "Generate a new Test Plan"
-msgstr ""
-
-#: testmanager/wiki.py:279 testmanager/wiki.py:449
+#: testmanager/wiki.py:303 testmanager/wiki.py:478
 msgid "Back to the Catalog"
 msgstr ""
 
-#: testmanager/wiki.py:290
+#: testmanager/wiki.py:314
 msgid "Test Plan: "
 msgstr ""
 
-#: testmanager/wiki.py:347
+#: testmanager/wiki.py:370
 msgid ""
-"The Test Case has been copied. Now select the catalog into which to "
-"move the Test Case and click on 'Move the copied Test Case here'. "
+"The Test Cases have been copied. Now select the catalog into which to"
+" paste the Test Cases and click on 'Paste the copied Test Cases "
+"here'.  "
 msgstr ""
 
-#: testmanager/wiki.py:353 testmanager/wiki.py:416
-msgid "Test Case"
+#: testmanager/wiki.py:375
+msgid ""
+"The Test Case has been cut. Now select the catalog into which to move"
+" the Test Case and click on 'Move the copied Test Case here'. "
 msgstr ""
 
-#: testmanager/wiki.py:363 testmanager/wiki.py:428
+#: testmanager/wiki.py:391 testmanager/wiki.py:457
 msgid "Open a Ticket on this Test Case"
 msgstr ""
 
-#: testmanager/wiki.py:365 testmanager/wiki.py:430
+#: testmanager/wiki.py:393 testmanager/wiki.py:459
 msgid "Show Related Tickets"
 msgstr ""
 
-#: testmanager/wiki.py:367
+#: testmanager/wiki.py:395
 msgid "Move the Test Case into another catalog"
 msgstr ""
 
-#: testmanager/wiki.py:369
+#: testmanager/wiki.py:397
 msgid "Duplicate the Test Case"
 msgstr ""
 
-#: testmanager/wiki.py:446
+#: testmanager/wiki.py:475
 msgid "Back to the Test Plan"
 msgstr ""
 
-#: testmanager/wiki.py:514
+#: testmanager/wiki.py:543
 msgid "Edit"
 msgstr ""
 
-#: testmanager/wiki.py:518
+#: testmanager/wiki.py:547
 msgid "Save"
 msgstr ""
 
-#: testmanager/templates/testmanagerstats.html:53
+#: testmanager/templates/testmanagerstats.html:55
 msgid "Test Management Statistics"
 msgstr ""
 
-#: testmanager/templates/testmanagerstats.html:83
+#: testmanager/templates/testmanagerstats.html:85
 msgid "Settings"
 msgstr ""
 
-#: testmanager/templates/testmanagerstats.html:85
+#: testmanager/templates/testmanagerstats.html:87
 msgid "Start Date:"
 msgstr ""
 
-#: testmanager/templates/testmanagerstats.html:87
+#: testmanager/templates/testmanagerstats.html:89
 msgid "End Date:"
 msgstr ""
 
-#: testmanager/templates/testmanagerstats.html:89
+#: testmanager/templates/testmanagerstats.html:91
 msgid "Resolution:"
 msgstr ""
 
-#: testmanager/templates/testmanagerstats.html:92
+#: testmanager/templates/testmanagerstats.html:94
 msgid "1 Day"
 msgstr ""
 
-#: testmanager/templates/testmanagerstats.html:93
+#: testmanager/templates/testmanagerstats.html:95
 msgid "1 Week"
 msgstr ""
 
-#: testmanager/templates/testmanagerstats.html:94
+#: testmanager/templates/testmanagerstats.html:96
 msgid "2 Weeks"
 msgstr ""
 
-#: testmanager/templates/testmanagerstats.html:95
+#: testmanager/templates/testmanagerstats.html:97
 msgid "1 Month"
 msgstr ""
 
-#: testmanager/templates/testmanagerstats.html:96
+#: testmanager/templates/testmanagerstats.html:98
 msgid "2 Months"
 msgstr ""
 
-#: testmanager/templates/testmanagerstats.html:97
+#: testmanager/templates/testmanagerstats.html:99
 msgid "3 Months"
 msgstr ""
 
-#: testmanager/templates/testmanagerstats.html:98
+#: testmanager/templates/testmanagerstats.html:100
 msgid "6 Months"
 msgstr ""
 
-#: testmanager/templates/testmanagerstats.html:99
+#: testmanager/templates/testmanagerstats.html:101
 msgid "1 Year"
 msgstr ""
 
-#: testmanager/templates/testmanagerstats.html:101
+#: testmanager/templates/testmanagerstats.html:103
 msgid "Test Plan:"
 msgstr ""
 
-#: testmanager/templates/testmanagerstats.html:103
+#: testmanager/templates/testmanagerstats.html:105
 msgid "All Test Plans"
 msgstr ""
 
-#: testmanager/templates/testmanagerstats.html:112
+#: testmanager/templates/testmanagerstats.html:114
 msgid "URL to bookmark:"
 msgstr ""
 
-#: testmanager/templates/testmanagerstats.html:126
+#: testmanager/templates/testmanagerstats.html:128
 msgid "Export this data to Excel"
 msgstr ""
 
-#: testmanager/templates/testmanagerstats.html:126
+#: testmanager/templates/testmanagerstats.html:128
 msgid "(CSV format)"
 msgstr ""
 

testman4trac/trunk/testmanager/macros.py

 
         if has_status:
             statusLabel = tc_statuses[status][1]
-            text+="<li style='font-weight: normal;' onmouseover='showPencil(\"pencilIcon"+tick['id']+"\", true)' onmouseout='hidePencil(\"pencilIcon"+tick['id']+"\", false)'><img class='iconElement' src='"+statusIcon+"' title='"+statusLabel+"'></img><a href='"+tick['id']+"?planid="+planid+"' target='_blank'>"+tick['title']+"&nbsp;</a><span style='display: none;'>"+statusLabel+"</span><span><a class='rightIcon' style='display: none;' title='"+_("Edit the Test Case")+"' href='"+tick['id']+"?action=edit&planid="+planid+"' target='_blank' id='pencilIcon"+tick['id']+"'></a></span></li>"
+            text+="<li name='tc_node' style='font-weight: normal;' onmouseover='showPencil(\"pencilIcon"+tick['id']+"\", true)' onmouseout='hidePencil(\"pencilIcon"+tick['id']+"\", false)'><img class='iconElement' src='"+statusIcon+"' title='"+statusLabel+"'></img><a href='"+tick['id']+"?planid="+planid+"' target='_blank'>"+tick['title']+"&nbsp;</a><span style='display: none;'>"+statusLabel+"</span><span><a class='rightIcon' style='display: none;' title='"+_("Edit the Test Case")+"' href='"+tick['id']+"?action=edit&planid="+planid+"' target='_blank' id='pencilIcon"+tick['id']+"'></a></span></li>"
         else:
-            text+="<li style='font-weight: normal;' onmouseover='showPencil(\"pencilIcon"+tick['id']+"\", true)' onmouseout='hidePencil(\"pencilIcon"+tick['id']+"\", false)'><a href='"+tick['id']+"' target='_blank'>"+tick['title']+"&nbsp;</a><span><a class='rightIcon' style='display: none;' title='"+_("Edit the Test Case")+"' href='"+tick['id']+"?action=edit' target='_blank' id='pencilIcon"+tick['id']+"'></a></span></li>"
+            text+="<li name='tc_node' style='font-weight: normal;' onmouseover='showPencil(\"pencilIcon"+tick['id']+"\", true)' onmouseout='hidePencil(\"pencilIcon"+tick['id']+"\", false)'><input name='select_tc_checkbox' value='"+tick['id']+"' type='checkbox' style='display: none;float: left; position: relative; top: 3px;' /><a href='"+tick['id']+"' target='_blank'>"+tick['title']+"&nbsp;</a><span><a class='rightIcon' style='display: none;' title='"+_("Edit the Test Case")+"' href='"+tick['id']+"?action=edit' target='_blank' id='pencilIcon"+tick['id']+"'></a></span></li>"
             
     return text
         

testman4trac/trunk/testmanager/rpcsupport.py

 
 from trac.core import *
 from trac.util import get_reporter_id
-
-from tracrpc.api import IXMLRPCHandler, AbstractRPCHandler, expose_rpc, Binary
-from tracrpc.util import StringIO, to_utimestamp, from_utimestamp
-
+    
 from tracgenericclass.model import GenericClassModelProvider
 from tracgenericclass.util import formatExceptionInfo
 
 from testmanager.api import TestManagerSystem
 from testmanager.model import TestCatalog, TestCase, TestCaseInPlan, TestPlan
 
+try:
+    # Check that tracrpc plugin is available. Otherwise, an ImportError exception will be raised.
+    from tracrpc.api import IXMLRPCHandler
 
-__all__ = ['TestManagerRPC']
 
-class TestManagerRPC(Component):
-    implements(IXMLRPCHandler)
+    __all__ = ['TestManagerRPC']
 
-    def __init__(self):
-        self.testmanagersys = TestManagerSystem(self.env)
+    class TestManagerRPC(Component):
+        implements(IXMLRPCHandler)
 
-    def xmlrpc_namespace(self):
-        return 'testmanager'
+        def __init__(self):
+            self.testmanagersys = TestManagerSystem(self.env)
 
-    def xmlrpc_methods(self):
-        yield ('TEST_MODIFY', ((str, str, str, str),), self.createTestCatalog)
-        yield ('TEST_MODIFY', ((str, str, str, str),), self.createTestCase)
-        yield ('TEST_PLAN_ADMIN', ((str, str, str),), self.createTestPlan)
-        yield (None, ((bool, str, str),), self.deleteTestObject)
-        yield (None, ((bool, str, str),(bool, str, str, dict)), self.modifyTestObject)
-        yield (None, ((bool, str, str, str),), self.setTestCaseStatus)
-        yield ('TEST_VIEW', ((list, str),(list, str, str)), self.listTestCases)
-        yield ('TEST_VIEW', ((list, str),), self.getTestCatalog)
-        yield ('TEST_VIEW', ((list, str),(list, str, str)), self.getTestCase)
-        yield ('TEST_VIEW', ((list, str, str),), self.getTestPlan)
-        yield ('TEST_VIEW', ((list, str),), self.listSubCatalogs)
-        yield ('TEST_VIEW', ((list, str),), self.listTestPlans)
+        def xmlrpc_namespace(self):
+            return 'testmanager'
 
-    def createTestCatalog(self, req, parent_catalog_id, title, description):
-        """ Creates a new test catalog, in the parent catalog specified, 
-        with the specified title and description.
-		To create a root catalog, specify '' as the parent catalog.
-        Returns the generated object ID, or '-1' if an error occurs. """
-        
-        result = '-1'
-        try:
-            id = self.testmanagersys.get_next_id('catalog')
+        def xmlrpc_methods(self):
+            yield ('TEST_MODIFY', ((str, str, str, str),), self.createTestCatalog)
+            yield ('TEST_MODIFY', ((str, str, str, str),), self.createTestCase)
+            yield ('TEST_PLAN_ADMIN', ((str, str, str),), self.createTestPlan)
+            yield (None, ((bool, str, str),), self.deleteTestObject)
+            yield (None, ((bool, str, str),(bool, str, str, dict)), self.modifyTestObject)
+            yield (None, ((bool, str, str, str),), self.setTestCaseStatus)
+            yield ('TEST_VIEW', ((list, str),(list, str, str)), self.listTestCases)
+            yield ('TEST_VIEW', ((list, str),), self.getTestCatalog)
+            yield ('TEST_VIEW', ((list, str),(list, str, str)), self.getTestCase)
+            yield ('TEST_VIEW', ((list, str, str),), self.getTestPlan)
+            yield ('TEST_VIEW', ((list, str),), self.listSubCatalogs)
+            yield ('TEST_VIEW', ((list, str),), self.listTestPlans)
 
-            pagename = None
-            if parent_catalog_id is not None and parent_catalog_id != '':
-                # Check parent catalog really exists, and get its page_name
-                tcat = TestCatalog(self.env, parent_catalog_id)
+        def createTestCatalog(self, req, parent_catalog_id, title, description):
+            """ Creates a new test catalog, in the parent catalog specified, 
+            with the specified title and description.
+            To create a root catalog, specify '' as the parent catalog.
+            Returns the generated object ID, or '-1' if an error occurs. """
+            
+            result = '-1'
+            try:
+                id = self.testmanagersys.get_next_id('catalog')
+
+                pagename = None
+                if parent_catalog_id is not None and parent_catalog_id != '':
+                    # Check parent catalog really exists, and get its page_name
+                    tcat = TestCatalog(self.env, parent_catalog_id)
+                    if not tcat.exists:
+                        self.env.log.error("Input parent test catalog with ID %s not found." % parent_catalog_id)
+                        return result
+                        
+                    pagename = tcat['page_name'] + '_TT' + id
+                else:
+                    pagename = 'TC_TT' + id
+
+                author = get_reporter_id(req, 'author')
+                
+                new_tc = TestCatalog(self.env, id, pagename, title, description)
+                new_tc.author = author
+                new_tc.remote_addr = req.remote_addr
+                # This also creates the Wiki page
+                new_tc.insert()
+                result = id
+                
+            except:
+                self.env.log.error("Error adding test catalog with title '%s' in catalog with ID %s!" % (title, parent_catalog_id))
+                self.env.log.error(formatExceptionInfo())
+            
+            return id
+
+        def createTestCase(self, req, catalog_id, title, description):
+            """ Creates a new test case, in the catalog specified, with the 
+            specified title and description.
+            Returns the generated object ID, or '-1' if an error occurs. """
+            
+            result = '-1'
+            try:
+                if catalog_id is None or catalog_id == '':
+                    self.env.log.error("Cannot create a test plan on the root catalog container.")
+                    return result
+                
+                # Check catalog really exists, and get its page_name
+                tcat = TestCatalog(self.env, catalog_id)
                 if not tcat.exists:
-                    self.env.log.error("Input parent test catalog with ID %s not found." % parent_catalog_id)
+                    self.env.log.error("Input test catalog with ID %s not found." % catalog_id)
                     return result
+                
+                author = get_reporter_id(req, 'author')
+                
+                id = self.testmanagersys.get_next_id('testcase')
+                pagename = tcat['page_name'] + '_TC' + id
+
+                new_tc = TestCase(self.env, id, pagename, title, description)
+                new_tc.author = author
+                new_tc.remote_addr = req.remote_addr
+                # This also creates the Wiki page
+                new_tc.insert()
+                result = id
+                
+            except:
+                self.env.log.error("Error adding test case with title '%s' in catalog with ID %s!" % (title, catalog_id))
+                self.env.log.error(formatExceptionInfo())
+            
+            return id
+
+        def createTestPlan(self, req, catalog_id, name):
+            """ Creates a new test plan, on the catalog specified, with the 
+            specified name.
+            Returns the generated object ID, or '-1' if an error occurs. """
+            
+            result = '-1'
+            try:
+                # Check catalog really exists, and get its page_name
+                tcat = TestCatalog(self.env, catalog_id)
+                if not tcat.exists:
+                    self.env.log.error("Input test catalog with ID %s not found." % catalog_id)
+                    return result
+                
+                author = get_reporter_id(req, 'author')
+                
+                id = self.testmanagersys.get_next_id('testplan')
+                pagename = tcat['page_name']
+
+                new_tp = TestPlan(self.env, id, catalog_id, pagename, name, author)
+                new_tp.insert()
+                result = id
+                
+            except:
+                self.env.log.error("Error adding test plan with name '%s' for catalog with ID %s!" % (name, catalog_id))
+                self.env.log.error(formatExceptionInfo())
+            
+            return result
+
+        def deleteTestObject(self, req, objtype, id):
+            """ Deletes the test object of the specified type identified
+            by the given id. 
+            Returns True if successful, False otherwise. """
+            
+            try:
+                # Check the object exists
+                obj = None
+                if objtype == 'testcatalog':
+                    req.perm.require('TEST_MODIFY')
+                    obj = TestCatalog(self.env, id)
+                elif objtype == 'testcase':
+                    req.perm.require('TEST_MODIFY')
+                    obj = TestCase(self.env, id)
+                elif objtype == 'testplan':
+                    req.perm.require('TEST_PLAN_ADMIN')
+                    obj = TestPlan(self.env, id)
+
+                if not obj.exists:
+                    self.env.log.error("Input test object of type %s with ID %s not found." % (objtype, id))
+                    return False
+
+                obj.delete()
+                
+            except:
+                self.env.log.error("Error deleting test object of type %s with ID %s." % (objtype, id))
+                self.env.log.error(formatExceptionInfo())
+                return False
+            
+            return True
+
+        def modifyTestObject(self, req, objtype, id, attributes={}):
+            """ Modifies the test object of the specified type identified
+            by the given id.
+            Returns True if successful, False otherwise. """
+
+            try:
+                # Check the object exists
+                obj = None
+                if objtype == 'testcatalog':
+                    req.perm.require('TEST_MODIFY')
+                    obj = TestCatalog(self.env, id)
+                elif objtype == 'testcase':
+                    req.perm.require('TEST_MODIFY')
+                    obj = TestCase(self.env, id)
+                elif objtype == 'testplan':
+                    req.perm.require('TEST_PLAN_ADMIN')
+                    obj = TestPlan(self.env, id)
+
+                if not obj.exists:
+                    self.env.log.error("Input test object of type %s with ID %s not found." % (objtype, id))
+                    return False
+
+                author = get_reporter_id(req, 'author')
+
+                for k, v in attributes.iteritems():
+                    if k == 'title':
+                        obj.title = v
+                    elif k == 'description':
+                        obj.description = v
+                    else:
+                        obj[k] = v
                     
-                pagename = tcat['page_name'] + '_TT' + id
-            else:
-                pagename = 'TC_TT' + id
+                obj.author = author
+                obj.remote_addr = req.remote_addr
+                obj.save_changes(author, "Changed through RPC.")
 
-            author = get_reporter_id(req, 'author')
+            except:
+                self.env.log.error("Error modifying test object of type %s with ID %s." % (objtype, id))
+                self.env.log.error(formatExceptionInfo())
+                return False
             
-            new_tc = TestCatalog(self.env, id, pagename, title, description)
-            new_tc.author = author
-            new_tc.remote_addr = req.remote_addr
-            # This also creates the Wiki page
-            new_tc.insert()
-            result = id
+            return True
+
+        def setTestCaseStatus(self, req, testcase_id, plan_id, status):
+            """ Sets the test case status.
+            Returns True if successful, False otherwise. """
             
-        except:
-            self.env.log.error("Error adding test catalog with title '%s' in catalog with ID %s!" % (title, parent_catalog_id))
-            self.env.log.error(formatExceptionInfo())
-        
-        return id
+            try:
+                author = get_reporter_id(req, 'author')
 
-    def createTestCase(self, req, catalog_id, title, description):
-        """ Creates a new test case, in the catalog specified, with the 
-        specified title and description.
-        Returns the generated object ID, or '-1' if an error occurs. """
-        
-        result = '-1'
-        try:
-            if catalog_id is None or catalog_id == '':
-                self.env.log.error("Cannot create a test plan on the root catalog container.")
-                return result
-            
-            # Check catalog really exists, and get its page_name
-            tcat = TestCatalog(self.env, catalog_id)
-            if not tcat.exists:
-                self.env.log.error("Input test catalog with ID %s not found." % catalog_id)
-                return result
-            
-            author = get_reporter_id(req, 'author')
-            
-            id = self.testmanagersys.get_next_id('testcase')
-            pagename = tcat['page_name'] + '_TC' + id
+                tcip = TestCaseInPlan(self.env, testcase_id, plan_id)
+                if tcip.exists:
+                    tcip.set_status(status, author)
+                    tcip.save_changes(author, "Status changed")
+                else:
+                    tc = TestCase(self.env, testcase_id)
+                    tcip['page_name'] = tc['page_name']
+                    tcip.set_status(status, author)
+                    tcip.insert()
 
-            new_tc = TestCase(self.env, id, pagename, title, description)
-            new_tc.author = author
-            new_tc.remote_addr = req.remote_addr
-            # This also creates the Wiki page
-            new_tc.insert()
-            result = id
-            
-        except:
-            self.env.log.error("Error adding test case with title '%s' in catalog with ID %s!" % (title, catalog_id))
-            self.env.log.error(formatExceptionInfo())
-        
-        return id
-
-    def createTestPlan(self, req, catalog_id, name):
-        """ Creates a new test plan, on the catalog specified, with the 
-        specified name.
-        Returns the generated object ID, or '-1' if an error occurs. """
-        
-        result = '-1'
-        try:
-            # Check catalog really exists, and get its page_name
-            tcat = TestCatalog(self.env, catalog_id)
-            if not tcat.exists:
-                self.env.log.error("Input test catalog with ID %s not found." % catalog_id)
-                return result
-            
-            author = get_reporter_id(req, 'author')
-            
-            id = self.testmanagersys.get_next_id('testplan')
-            pagename = tcat['page_name']
-
-            new_tp = TestPlan(self.env, id, catalog_id, pagename, name, author)
-            new_tp.insert()
-            result = id
-            
-        except:
-            self.env.log.error("Error adding test plan with name '%s' for catalog with ID %s!" % (name, catalog_id))
-            self.env.log.error(formatExceptionInfo())
-        
-        return result
-
-    def deleteTestObject(self, req, objtype, id):
-        """ Deletes the test object of the specified type identified
-        by the given id. 
-        Returns True if successful, False otherwise. """
-        
-        try:
-            # Check the object exists
-            obj = None
-            if objtype == 'testcatalog':
-                req.perm.require('TEST_MODIFY')
-                obj = TestCatalog(self.env, id)
-            elif objtype == 'testcase':
-                req.perm.require('TEST_MODIFY')
-                obj = TestCase(self.env, id)
-            elif objtype == 'testplan':
-                req.perm.require('TEST_PLAN_ADMIN')
-                obj = TestPlan(self.env, id)
-
-            if not obj.exists:
-                self.env.log.error("Input test object of type %s with ID %s not found." % (objtype, id))
+            except:
+                self.env.log.error("Error setting the test case status with ID %s on plan %s to %s!" % (testcase_id, plan_id, status))
+                self.env.log.error(formatExceptionInfo())
                 return False
 
-            obj.delete()
+            return True
+                
+        def getTestCatalog(self, req, catalog_id):
+            """ Returns the catalog properties.
+            The result is in the form, all strings:
+            (wiki_page_name, title, description) """
             
-        except:
-            self.env.log.error("Error deleting test object of type %s with ID %s." % (objtype, id))
-            self.env.log.error(formatExceptionInfo())
-            return False
-        
-        return True
+            try:
+                # Check catalog really exists
+                tcat = TestCatalog(self.env, catalog_id)
+                if not tcat.exists:
+                    self.env.log.error("Input test catalog with ID %s not found." % catalog_id)
+                else:
+                    return (tcat['page_name'], tcat.title, tcat.description)
 
-    def modifyTestObject(self, req, objtype, id, attributes={}):
-        """ Modifies the test object of the specified type identified
-        by the given id.
-        Returns True if successful, False otherwise. """
+            except:
+                self.env.log.error("Error getting the test catalog with ID %s!" % catalog_id)
+                self.env.log.error(formatExceptionInfo())
+                
+        def getTestCase(self, req, testcase_id, plan_id=''):
+            """ Returns the test case properties.
+            If plan_id is provided, also the status of the test case in the
+            plan will be returned.
+            Each result is in the form, all strings:
+                If plan_id is NOT provided:
+                    (wiki_page_name, title, description)
+                If plan_id is provided:
+                    (wiki_page_name, title, description, status) """
+            
+            try:
+                # Check test case really exists
+                tc = TestCase(self.env, testcase_id)
+                if not tc.exists:
+                    self.env.log.error("Input test case with ID %s not found." % testcase_id)
+                else:
+                    if plan_id is None or plan_id == '':
+                        return (tc['page_name'], tc.title, tc.description)
+                    else:
+                        tcip = TestCaseInPlan(self.env, testcase_id, plan_id)
+                        return (tc['page_name'], tc.title, tc.description, tcip['status'])
 
-        try:
-            # Check the object exists
-            obj = None
-            if objtype == 'testcatalog':
-                req.perm.require('TEST_MODIFY')
-                obj = TestCatalog(self.env, id)
-            elif objtype == 'testcase':
-                req.perm.require('TEST_MODIFY')
-                obj = TestCase(self.env, id)
-            elif objtype == 'testplan':
-                req.perm.require('TEST_PLAN_ADMIN')
-                obj = TestPlan(self.env, id)
+            except:
+                self.env.log.error("Error getting the test case with ID %s!" % testcase_id)
+                self.env.log.error(formatExceptionInfo())
+                
+        def getTestPlan(self, req, plan_id, catalog_id):
+            """ Returns the test plan properties.
+            The result is in the form, all strings:
+            (wiki_page_name, name) """
+            
+            try:
+                # Check test plan really exists
+                tp = TestPlan(self.env, plan_id, catalog_id)
+                if not tp.exists:
+                    self.env.log.error("Input test plan with ID %s on catalog %s not found." % (plan_id, catalog_id))
+                else:
+                    return (tp['page_name'], tp['name'])
 
-            if not obj.exists:
-                self.env.log.error("Input test object of type %s with ID %s not found." % (objtype, id))
-                return False
+            except:
+                self.env.log.error("Error getting the test plan with ID %s on catalog %s." % (plan_id, catalog_id))
+                self.env.log.error(formatExceptionInfo())
+                
+        def listSubCatalogs(self, req, catalog_id):
+            """ Returns a iterator over the direct sub-catalogs of the specified 
+            catalog.
+            Each result is in the form, all strings:
+            (test_catalog_id, wiki_page_name, title, description) """
+            
+            try:
+                # Check catalog really exists
+                tcat = TestCatalog(self.env, catalog_id)
+                if not tcat.exists:
+                    self.env.log.error("Input test catalog with ID %s not found." % catalog_id)
+                else:
+                    for tc in tcat.list_subcatalogs():
+                        yield (tc['id'], tc['page_name'], tc.title, tc.description)
+                
+            except:
+                self.env.log.error("Error listing the test catalogs!")
+                self.env.log.error(formatExceptionInfo())
 
-            author = get_reporter_id(req, 'author')
+        def listTestPlans(self, req, catalog_id):
+            """ Returns a iterator over the test plans associated 
+            to the specified catalog.
+            Each result is in the form, all strings:
+            (testplan_id, name) """