seccanj avatar seccanj committed aed8167

Release 1.4.8 (2011-10-23):

o Strongly enhanced the upgrade mechanism. Now it's more robust, should work with all the databases and between arbitrary Test Manager versions.

The only drawback is that upgrade is only supported from 1.4.7, not from previous versions.

o Enhancement #9077 (Track-Hacks): Ability to separate and report on test plans by product

o Enhancement #9208 (Track-Hacks): Test plan with only selected test cases from the catalog, take snapshot version of test cases.
This is an important one. Many users were asking for a way of including only selected test cases into
a Test Plan, for different reasons. Now you have it :D

o Added French language catalog! Thanks to someone who doesn't want to be cited :D

o Fixed Ticket #9141 (Track-Hacks): Update installation 1.4.6 -> 1.4.7 not possible
o Fixed Ticket #9167 (Track-Hacks): installation of 1.4.7 with postgres database not possible
o Fixed Ticket #9187 (Track-Hacks): Current test status report should consider only last result of a testcase in the plan.
Thanks to Andreas for his contribution to fixing this one!

Comments (0)

Files changed (43)

 
 (Refer to the tickets on trac-hacks or SourceForge for complete descriptions.)
 
+Release 1.4.8 (2011-10-23):
+  o Strongly enhanced the upgrade mechanism. Now it's more robust, should work with all the databases and between arbitrary Test Manager versions.
+
+    The only drawback is that upgrade is only supported from 1.4.7, not from previous versions.
+
+  o Enhancement #9077 (Track-Hacks): Ability to separate and report on test plans by product
+
+  o Enhancement #9208 (Track-Hacks): Test plan with only selected test cases from the catalog, take snapshot version of test cases.
+                                     This is an important one. Many users were asking for a way of including only selected test cases into
+                                     a Test Plan, for different reasons. Now you have it :D
+
+  o Added French language catalog! Thanks to someone who doesn't want to be cited :D
+
+  o Fixed Ticket #9141 (Track-Hacks): Update installation 1.4.6 -> 1.4.7 not possible
+  o Fixed Ticket #9167 (Track-Hacks): installation of 1.4.7 with postgres database not possible
+  o Fixed Ticket #9187 (Track-Hacks): Current test status report should consider only last result of a testcase in the plan. 
+                                      Thanks to Andreas for his contribution to fixing this one!
+
 Release 1.4.7 (2011-08-28):
   o Enhancement #8907 (Track-Hacks): Add template for "New TestCase" - Thanks a lot to Christian for the hard work on this enhancement!!!
                                      Now you can define templates for your new test catalogs and new test cases, and assign default templates based
 rem python setup.py extract_messages_js
 rem python setup.py update_catalog -l it
 rem python setup.py update_catalog_js -l it
-rem python ./setup.py compile_catalog -f -l it
-rem python ./setup.py compile_catalog_js -f -l it
+rem python setup.py compile_catalog -f -l it
+rem python setup.py compile_catalog_js -f -l it
 rem python setup.py update_catalog -l es
 rem python setup.py update_catalog_js -l es
-rem python ./setup.py compile_catalog -f -l es
-rem python ./setup.py compile_catalog_js -f -l es
+rem python setup.py compile_catalog -f -l es
+rem python setup.py compile_catalog_js -f -l es
 rem python setup.py update_catalog -l de
 rem python setup.py update_catalog_js -l de
-rem python ./setup.py compile_catalog -f -l de
-rem python ./setup.py compile_catalog_js -f -l de
+rem python setup.py compile_catalog -f -l de
+rem python setup.py compile_catalog_js -f -l de
+rem python setup.py update_catalog -l fr
+rem python setup.py update_catalog_js -l fr
+rem python setup.py compile_catalog -f -l fr
+rem python setup.py compile_catalog_js -f -l fr
 
 python setup.py bdist_egg
 xcopy /y dist\*.egg ..\..\bin
 #python ./setup.py update_catalog_js -l de
 #python ./setup.py compile_catalog -f -l de
 #python ./setup.py compile_catalog_js -f -l de
+#python ./setup.py update_catalog -l fr
+#python ./setup.py update_catalog_js -l fr
+#python ./setup.py compile_catalog -f -l fr
+#python ./setup.py compile_catalog_js -f -l fr
 
 python setup.py bdist_egg
 cp dist/*.egg ../../bin

sqlexecutor/trunk/setup.py

 
 setup(
     name='SQLExecutor',
-    version='1.0.3',
+    version='1.0.4',
     packages=['sqlexecutor'],
     package_data={'sqlexecutor' : ['*.txt', 'templates/*.html', 'htdocs/*.*', 'htdocs/js/*.js', 'htdocs/css/*.css', 'htdocs/images/*.*']},
     author = 'Roberto Longobardi',

sqlexecutor/trunk/sqlexecutor/sql.py

 import time
 import traceback
 
+from genshi.builder import tag
 from datetime import datetime
+
 from trac.core import *
 from trac.perm import IPermissionRequestor
 from trac.util.text import CRLF
 from trac.util.translation import _, N_, gettext
 from trac.web.api import IRequestHandler
-from trac.web.chrome import ITemplateProvider
+from trac.web.chrome import ITemplateProvider, INavigationContributor
 
 from tracgenericclass.util import *
 
 class SqlExecutor(Component):
     """SQL Executor."""
 
-    implements(IPermissionRequestor, IRequestHandler, ITemplateProvider)
+    implements(IPermissionRequestor, IRequestHandler, ITemplateProvider, INavigationContributor)
     
     # IPermissionRequestor methods
     def get_permission_actions(self):
         return ['SQL_RUN']
 
         
+    # INavigationContributor methods
+    def get_active_navigation_item(self, req):
+        if 'SQL_RUN' in req.perm:
+            return 'sqlexecutor'
+
+    def get_navigation_items(self, req):
+        if 'SQL_RUN' in req.perm:
+            yield ('mainnav', 'sqlexecutor',
+                tag.a(_("SQL Executor"), href=req.href+'/sqlexec', accesskey='Q'))
+
+
     # IRequestHandler methods
 
     def match_request(self, req):
-        return req.path_info.startswith('/sqlexec') and 'SQL_RUN' in req.perm
+        return (req.path_info.startswith('/sqlexec') and 'SQL_RUN' in req.perm)
 
     def process_request(self, req):
         """
 
         req.perm.require('SQL_RUN')
         
-        sql = req.args.get('sql')
-        self.env.log.debug(sql)
+        if req.path_info.startswith('/sqlexec'):
+            sql = req.args.get('sql', '')
+            result = []
+            message = ""
+            
+            if not sql == '':
+                self.env.log.debug(sql)
 
-        strdata = """
-            <html>
-              <body>
-                <p>Result:</p>
-                <br />
-                <div id="response">
-                    <table><tbody>
-            """
-    
-        try:
-            db = self.env.get_db_cnx()
-            cursor = db.cursor()
-            cursor.execute(sql)
+                try:
+                    db = self.env.get_db_cnx()
+                    cursor = db.cursor()
+                    cursor.execute(sql)
+                    
+                    for row in cursor:
+                        curr_row = []
+                        for i in row:
+                            if isinstance(i, basestring):
+                                curr_row.append(i.encode('utf-8'))
+                            elif isinstance(i, long):
+                                curr_row.append(from_any_timestamp(i).isoformat() + ' (' + str(i) + ')')
+                            else:
+                                curr_row.append(str(i).encode('utf-8'))
+                            
+                        result.append(curr_row)
+
+                    db.commit()
+                    
+                    message = "Query executed successfully."
+                    
+                    self.env.log.debug(result)
+                except:
+                    message = formatExceptionInfo()
+                    db.rollback()
+                    self.env.log.debug("SqlExecutor - Exception: ")
+                    self.env.log.debug(message)
+
+            data = {'sql': sql, 'result': result, 'message': message, 'baseurl': fix_base_location(req)}
             
-            for row in cursor:
-                strdata += '<tr>'
-                for i in row:
-                    strdata += '<td>'
-                    if isinstance(i, basestring):
-                        strdata += i.encode('utf-8')
-                    elif isinstance(i, long):
-                        strdata += from_any_timestamp(i).isoformat() + ' (' + str(i) + ')'
-                    else:
-                        strdata += str(i).encode('utf-8')
-                    strdata += '<td>'
-
-                strdata += '<tr>'
-
-            db.commit()
-            
-            self.env.log.debug(strdata)
-        except:
-            strdata = formatExceptionInfo()
-            db.rollback()
-            self.env.log.debug("SqlExecutor - Exception: ")
-            self.env.log.debug(strdata)
-
-        strdata += """
-                    </tbody></table>
-                </div>
-              </body>
-            </html>
-            """
-        
-        req.send_header("Content-Length", len(strdata))
-        req.write(strdata)
-        
-        #return 'result.html', {'result': result}, None
-        return
+            return 'result.html', data, None
 
 
     # ITemplateProvider methods

sqlexecutor/trunk/sqlexecutor/templates/result.html

-<html>
+<!DOCTYPE html
+    PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+      xmlns:py="http://genshi.edgewall.org/"
+      xmlns:xi="http://www.w3.org/2001/XInclude">
+  <xi:include href="layout.html" />
+  <xi:include href="macros.html" />
+  <head>
+
+	<style type="text/css">
+        .sql_message {
+            font-size: medium;
+            color: blue;
+        }
+	</style>
+
+  </head>
+
   <body>
-    <p>Result:</p>
-    <br />
-    <div id="response">$result</div>
+      <p/>
+      <h1>SQL Executor</h1>
+
+      <form method="post" id="sqlexecutor_form" action="${baseurl}/sqlexec">
+        <h2>Type your SQL query here:</h2>
+<textarea cols="100" rows="10" name="sql">${sql}</textarea>
+        <br />
+        
+        <input type="submit" value="Execute" /> 
+        
+        <br /><br />
+        
+        <h2>Result:</h2>
+
+        <p class="sql_message">${message}</p>
+          
+        <table class="listing">
+          <tbody>
+            <tr py:for="row in result">
+			  <td py:for="col in row">${col}</td>
+			</tr>
+		  </tbody>
+		</table>
+        
+      </form>
+    
   </body>
 </html>

testman4trac/trunk/setup.py

 
 setup(
     name='TestManager',
-    version='1.4.7',
-    packages=['testmanager'],
+    version='1.4.8',
+    packages=['testmanager','testmanager.upgrades'],
     package_data={
         'testmanager' : [
             '*.txt', 

testman4trac/trunk/testmanager/README.txt

 
 (Refer to the tickets on trac-hacks or SourceForge for complete descriptions.)
 
+Release 1.4.8 (2011-10-23):
+  o Strongly enhanced the upgrade mechanism. Now it's more robust, should work with all the databases and between arbitrary Test Manager versions.
+
+    The only drawback is that upgrade is only supported from 1.4.7, not from previous versions.
+
+  o Enhancement #9077 (Track-Hacks): Ability to separate and report on test plans by product
+
+  o Enhancement #9208 (Track-Hacks): Test plan with only selected test cases from the catalog, take snapshot version of test cases.
+                                     This is an important one. Many users were asking for a way of including only selected test cases into
+                                     a Test Plan, for different reasons. Now you have it :D
+
+  o Added French language catalog! Thanks to someone who doesn't want to be cited :D
+
+  o Fixed Ticket #9141 (Track-Hacks): Update installation 1.4.6 -> 1.4.7 not possible
+  o Fixed Ticket #9167 (Track-Hacks): installation of 1.4.7 with postgres database not possible
+  o Fixed Ticket #9187 (Track-Hacks): Current test status report should consider only last result of a testcase in the plan. 
+                                      Thanks to Andreas for his contribution to fixing this one!
+
 Release 1.4.7 (2011-08-28):
   o Enhancement #8907 (Track-Hacks): Add template for "New TestCase" - Thanks a lot to Christian for the hard work on this enhancement!!!
                                      Now you can define templates for your new test catalogs and new test cases, and assign default templates based

testman4trac/trunk/testmanager/api.py

                 
             elif type == 'testplan':
                 req.perm.require('TEST_PLAN_ADMIN')
-                
+
+                contains_all_str = req.args.get('containsAll', 'true')
+                snapshot_str = req.args.get('snapshot', 'false')
+                selected_tcs_str = req.args.get('selectedTCs', '')
+
+                contains_all = (0, 1)[contains_all_str == 'true']
+                snapshot = (0, 1)[snapshot_str == 'true']
+                selected_tcs = []
+                if contains_all_str == 'false' and not selected_tcs_str == '':
+                    selected_tcs = selected_tcs_str.split(',')
+
                 catid = path.rpartition('_TT')[2]
 
                 try:
                     # Add the new test plan in the database
-                    new_tc = TestPlan(self.env, id, catid, pagename, title, author)
+                    new_tc = TestPlan(self.env, id, catid, pagename, title, author, contains_all, snapshot, selected_tcs)
                     new_tc.insert()
 
                 except:

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

+// Generated messages javascript file from compiled MO file
+babel.Translations.load({"domain":"testmanager-js","locale":"fr","messages":{"Are you sure you want to delete the test plan and the state of all its contained test cases?":"\u00cates-vous s\u00fbr de vouloir supprimer le Plan de Tests et l'\u00e9tat de toutes les Fiches de test qu'il contient ?","Are you sure you want to duplicate the test catalog and all its contained test cases?":"\u00cates-vous s\u00fbr de vouloir dupliquer le Catalogue de Tests et toutes les Fiches de Test qu'il contient ?","Length between 4 and 90 characters.":"Longueur entre 4 et 90 caract\u00e8res.","Results: ":"R\u00e9sultats :","You must specify a name. Length between 4 and 90 characters.":"Vous devez sp\u00e9cifier un nom. Longueur entre 4 et 90 caract\u00e8res.","[Insert problem summary]":"[Insert problem summary]"},"plural_expr":"(n \u003e 1)"}).install();

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

     }
 }
 
-function creaTestCase(catName){ 
+function creaTestCase(catName) { 
 	var tcInput = document.getElementById('tcName');
 	var testCaseName = tcInput.value; 
 
     }
 }
 
-function creaTestPlan(catName){ 
+function creaTestPlan(catName) { 
 	var planInput = document.getElementById('planName');
 	var testPlanName = planInput.value; 
 
     		document.getElementById('errorMsgSpan2').innerHTML = _("Length between 4 and 90 characters.");
     	} else { 
     		document.getElementById('errorMsgSpan2').innerHTML = ''; 
-    		var url = baseLocation+"/testcreate?type=testplan&path="+catName+"&title="+tplanName;
-    		window.location = url;
+            (function($) {
+                $(function() {
+                    $("#dialog_testplan").dialog({width: 640, height: 430, modal: true});
+                });
+            })(jQuery_testmanager);	
     	}
     }
 }
 
-function duplicateTestCase(tcName, catName){ 
+function createTestPlanConfirm(catName) {
+    var planInput = document.getElementById('planName');
+    var testPlanName = planInput.value; 
+    var tplanName = stripLessSpecialChars(testPlanName); 
+
+    var testplanContainsAll = "true";
+    var testplanSnapshot = "false";
+
+    // The following should work... but doesn't in case one has first selected some test cases from the tree.
+    //var testplanContainsAll = $("input[@name='testplan_contains_all']:checked").val();
+    //var testplanSnapshot = $("input[@name=testplan_snapshot]:checked").val();
+
+    var nodes = $("input[@name='testplan_contains_all']:checked");
+    for (var i=0; i<nodes.length; i++) {
+        var node = nodes[i];
+        if (node.name == 'testplan_contains_all') {
+            testplanContainsAll = node.value;
+        }
+    }
+
+    nodes = $("input[@name='testplan_snapshot']:checked");
+    for (var i=0; i<nodes.length; i++) {
+        var node = nodes[i];
+        if (node.name == 'testplan_snapshot') {
+            testplanSnapshot = node.value;
+        }
+    }
+
+    var selectedTestCases = "";
+    if (testplanContainsAll == 'false') {
+        selectedTestCases = "&selectedTCs="+getSelectedTestCases();
+    }
+    
+    var url = baseLocation+"/testcreate?type=testplan&path="+catName+"&containsAll="+testplanContainsAll+"&snapshot="+testplanSnapshot+"&title="+tplanName+selectedTestCases;
+    window.location = url;
+}
+
+function createTestPlanCancel() {
+	(function($) {
+        $(function() {
+            $("#dialog_testplan").dialog('close');
+        });
+    })(jQuery_testmanager);	
+}
+
+function duplicateTestCase(tcName, catName) { 
 	var url = baseLocation+'/testcreate?type=testcase&duplicate=true&tcId='+tcName+'&path='+catName; 
 	window.location = url;
 }
 }
 
 function creaTicket(tcName, planId, planName, summary){
-    var tokens = $('span[name=breadcrumb]').map(function() { return this.innerHTML }).get();
+    var tokens = $('span[name=breadcrumb]').map(function() { return this.innerHTML; }).get();
     var fullSummary = "";
     
     for (i=1; i<tokens.length; i++) {
 }
 
 function copyMultipleTestCasesToClipboard() {
-	var selectedTickets = "";
+	var selectedTestCases = getSelectedTestCases();
 
-    var nodes=document.getElementById("ticketContainer").getElementsByTagName('input');
+    setCookie('TestManager_MultipleTestCases', selectedTestCases, 1, '/', '', '');
+    setTimeout('window.location="'+window.location+'"', 100);
+}
+
+function getSelectedTestCases() {
+	var selectedTestCases = "";
+	var nodes;
+
+	if (document.getElementById("ticketContainer") !== null) {
+	    nodes=document.getElementById("ticketContainer").getElementsByTagName('input');
+	}
+	if (document.getElementById("testcaseList") !== null) {
+	    nodes=document.getElementById("testcaseList").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 + ','
+				selectedTestCases += el.value + ',';
 			}
 		}
 	}
 
-    setCookie('TestManager_MultipleTestCases', selectedTickets, 1, '/', '', '');
-    setTimeout('window.location="'+window.location+'"', 100);
+    return selectedTestCases;
 }
 
 function pasteTestCaseIntoCatalog(catName) {
 }
 
 /******************************************************/
-/**                 Tree view widget                  */
+/**                 Import Test Cases                 */
 /******************************************************/
 
 function importTestCasesIntoCatalog(catName) {
 	(function($) {
         $(function() {
-            $("#dialog").dialog({width: 640, height: 430, modal: true});
+            $("#dialog_import").dialog({width: 640, height: 430, modal: true});
         });
     })(jQuery_testmanager);	
 }
 function importTestCasesCancel() {
 	(function($) {
         $(function() {
-            $("#dialog").dialog('close');
+            $("#dialog_import").dialog('close');
         });
     })(jQuery_testmanager);	
 }
 /** Configuration property to specify whether matching search results should be displayed in bold font. */
 var selectBold = true;
 
-var selectData = [];
-var deselectData = [];
+var selectData = {};
+var deselectData = {};
 var htimer = null;
 var searchResults = 0;
 
-function toggleAll(isexpand) {
-    var nodes=document.getElementById("ticketContainer").getElementsByTagName("span");
+function toggleAll(tableId, isexpand) {
+    var nodes=document.getElementById(tableId).getElementsByTagName("span");
     for(var i=0;i<nodes.length;i++) {
         if(nodes.item(i).getAttribute("name") === "toggable") {
             if (isexpand) {
 function toggle(id) {
     var el=document.getElementById(id);
     if (el.firstChild['expanded']) {
-        collapse(id)
+        collapse(id);
     } else {
-        expand(id)
+        expand(id);
     }
 }
 
-function highlight(str) {
-    clearSelection();
+function highlight(tableId, str) {
+    clearSelection(tableId);
     if (str && str !== "") {
         var res=[];
         var tks=str.split(" ");
         for (var i=0;i<tks.length;i++) {
             res[res.length]=new RegExp(regexpescape(tks[i].toLowerCase()), "g");
         }
-        var nodes=document.getElementById("ticketContainer").getElementsByTagName("a");
+        var nodes=document.getElementById(tableId).getElementsByTagName("a");
         for(var i=0;i<nodes.length;i++) {
             var n=nodes.item(i);
             if (n.nextSibling) {
                 if (filterMatch(n, n.nextSibling, res)) {
-                    select(n);
+                    select(tableId, n);
                 } else {
-                    deselect(n);
+                    deselect(tableId, n);
                 }
             }
         }
 
-        document.getElementById('searchResultsNumberId').innerHTML = _("Results: ")+searchResults;
+        document.getElementById(tableId+'_searchResultsNumberId').innerHTML = _("Results: ")+searchResults;
     }
 }
 
     return match;
 }
 
-function clearSelection() {
-    toggleAll(false);
-    for (var i=0;i<selectData.length;i++) {
-        selectData[i].style.fontWeight="normal";
-        selectData[i].style.display=""
-    };
+function clearSelection(tableId) {
+    toggleAll(tableId, false);
     
-    selectData=[];
+    if (tableId in selectData) {
+        for (var i=0;i<selectData[tableId].length;i++) {
+            selectData[tableId][i].style.fontWeight="normal";
+            selectData[tableId][i].style.display="";
+        };
+    }
     
-    for (var i=0;i<deselectData.length;i++) {
-        if (selectHide) {
-            deselectData[i].style.display=""
-        }
-    };
+    selectData[tableId]=[];
     
-    deselectData=[];
+    if (tableId in deselectData) {
+	    for (var i=0;i<deselectData[tableId].length;i++) {
+	        if (selectHide) {
+	            deselectData[tableId][i].style.display="";
+	        }
+	    };
+    }
+    
+    deselectData[tableId]=[];
     searchResults = 0;
     
-    document.getElementById("searchResultsNumberId").innerHTML = '';
+    document.getElementById(tableId+"_searchResultsNumberId").innerHTML = '';
 }
 
-function select(node) {
+function select(tableId, node) {
     searchResults++;
 
     do {
                 node.style.display = "block";
             };
             
-            selectData[selectData.length]=node;
+            selectData[tableId][selectData[tableId].length]=node;
         };
         node=node.parentNode;
-    } while (node.id!=="ticketContainer");
+    } while (node.id!==tableId);
 }
 
-function deselect(node) {
+function deselect(tableId, node) {
     do {
         if (node.tagName === "LI") {
             if (selectHide && node.style.display==="") {
                 node.style.display = "none";
-                deselectData[deselectData.length]=node;
+                deselectData[tableId][deselectData[tableId].length]=node;
             }
         };
         
         node=node.parentNode;
-    } while (node.id!=="ticketContainer");
+    } while (node.id!==tableId);
 }
 
-function starthighlight(str,now) {
+function starthighlight(tableId, str,now) {
     if (htimer) {
         clearTimeout(htimer);
     } 
     if (now) {
-        highlight(str);
+        highlight(tableId, str);
     } else {
         htimer = setTimeout(function() {
-                                highlight(str);
+                                highlight(tableId, str);
                             },500);
     }
 }
 
-function checkFilter(now) {
+function checkFilter(tableId, now) {
     var f=document.getElementById("tcFilter");
     if (f) {
-        if (document.getElementById("ticketContainer") !== null) {
-            starthighlight(f.value,now);
-        }
-        
-        if (document.getElementById("testcaseList") !== null) {
-            starthighlightTable(f.value,now);
+    	var rootEl = document.getElementById(tableId);
+        if (rootEl !== null) {
+        	if (rootEl.tagName.toLowerCase() == "div") {
+        		starthighlight(f.value,now);
+        	} else {
+                starthighlightTable(f.value,now);
+        	}
         }
     }
 }
 /**                 Tree table widget                 */
 /******************************************************/
 
-function starthighlightTable(str,now) {
+function starthighlightTable(tableId, str,now) {
     if (htimer) {
         clearTimeout(htimer);
     } 
     if (now) {
-        highlightTable(str);
+        highlightTable(tableId, str);
     } else {
         htimer = setTimeout(function() {
-                                highlightTable(str);
+                                highlightTable(tableId, str);
                             },500);
     }
 }
 
-function highlightTable(str) {
-    clearSelectionTable();
+function highlightTable(tableId, str) {
+    clearSelectionTable(tableId);
     if (str && str !== "") {
         var res=[];
         var tks=str.split(" ");
         for (var i=0;i<tks.length;i++) {
             res[res.length]=new RegExp(regexpescape(tks[i].toLowerCase()), "g");
         }
-        var nodes=document.getElementById("testcaseList").getElementsByTagName("tr");
+        var nodes=document.getElementById(tableId).getElementsByTagName("tr");
         for(var i=0;i<nodes.length;i++) {
             var n=nodes.item(i);
             if (filterMatchTable(n, res)) {
-                selectRow(n);
+                selectRow(tableId, n);
             } else {
-                deselectRow(n);
+                deselectRow(tableId, n);
             }
         }
 
-        document.getElementById('searchResultsNumberId').innerHTML = _("Results: ")+searchResults;
+        document.getElementById(tableId+'_searchResultsNumberId').innerHTML = _("Results: ")+searchResults;
     }
 }
 
 function filterMatchTable(node, res) {
-    var name = ""
+    var name = "";
     
     while (node.tagName !== "TR") {
         node = node.parentNode;
     return match;
 }
 
-function clearSelectionTable() {
-    for (var i=0;i<selectData.length;i++) {
-        selectData[i].className="";
-    };
+function clearSelectionTable(tableId) {
+	if (tableId in selectData) {
+	    for (var i=0;i<selectData[tableId].length;i++) {
+	        selectData[tableId][i].className="";
+	    };
+	}
     
-    selectData=[];
+    selectData[tableId]=[];
     
-    for (var i=0;i<deselectData.length;i++) {
-        deselectData[i].className=""
-    };
-    
-    deselectData=[];
+	if (tableId in deselectData) {
+	    for (var i=0;i<deselectData[tableId].length;i++) {
+	        deselectData[tableId][i].className="";
+	    };
+	}
+	
+    deselectData[tableId]=[];
     searchResults = 0;
     
-    document.getElementById("searchResultsNumberId").innerHTML = '';
+    document.getElementById(tableId+"_searchResultsNumberId").innerHTML = '';
 }
 
-function selectRow(node) {
+function selectRow(tableId, node) {
     searchResults++;
 
     while (node.tagName !== "TR") {
         node = node.parentNode;
     }
 
-    node.className = "rowSelected"
+    node.className = "rowSelected";
 
-    selectData[selectData.length]=node;
+    selectData[tableId][selectData[tableId].length]=node;
 }
 
-function deselectRow(node) {
+function deselectRow(tableId, node) {
     while (node.tagName !== "TR") {
         node = node.parentNode;
     }
 
-    node.className = "rowHidden"
+    node.className = "rowHidden";
     
-    deselectData[deselectData.length]=node;
+    deselectData[tableId][deselectData[tableId].length]=node;
 }
 
 function showPencil(id) {
 	script.src = filename;
 	script.type = 'text/javascript';
 	
-	head.appendChild(script)
+	head.appendChild(script);
 }
 
 function loadMessageCatalog() {
                 oldonload(); 
             } 
             func(); 
-        } 
+        };
     } 
 }
 
Add a comment to this file

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

Binary file modified.

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

 "Project-Id-Version: Test Manager for Trac plugin\n"
 "Report-Msgid-Bugs-To: http://trac-hacks.org/wiki/TestManagerForTracPlugin"
 "\n"
-"POT-Creation-Date: 2011-08-21 22:54+0200\n"
+"POT-Creation-Date: 2011-10-23 17:39+0200\n"
 "PO-Revision-Date: 2011-08-18 13:49+0000\n"
 "Last-Translator: podskalsky <andreas.podskalsky@siemens.com>\n"
 "Language-Team: German "
 msgid "Length between 4 and 90 characters."
 msgstr "Länge zwischen 4 und 90 Zeichen."
 
-#: testmanager/htdocs/js/testmanager.js:85
+#: testmanager/htdocs/js/testmanager.js:133
 msgid "[Insert problem summary]"
 msgstr ""
 
-#: testmanager/htdocs/js/testmanager.js:97
+#: testmanager/htdocs/js/testmanager.js:145
 msgid ""
 "Are you sure you want to duplicate the test catalog and all its contained"
 " test cases?"
 "Sind Sie sich sicher, daß Sie dieses Testverzeichnis mit allen "
 "dazugehörigen Testfällen kopieren möchten?"
 
-#: testmanager/htdocs/js/testmanager.js:104
+#: testmanager/htdocs/js/testmanager.js:152
 msgid ""
 "Are you sure you want to delete the test plan and the state of all its "
 "contained test cases?"
 "Sind Sie sich sicher, daß Sie diesen Testplan und den Status aller "
 "dazugehörigen Testfälle löschen möchten?"
 
-#: testmanager/htdocs/js/testmanager.js:307
-#: testmanager/htdocs/js/testmanager.js:456
+#: testmanager/htdocs/js/testmanager.js:368
+#: testmanager/htdocs/js/testmanager.js:523
 msgid "Results: "
 msgstr "Ergebnisse:"
 
Add a comment to this file

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

Binary file modified.

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

 "Project-Id-Version: Test Manager for Trac plugin\n"
 "Report-Msgid-Bugs-To: http://trac-hacks.org/wiki/TestManagerForTracPlugin"
 "\n"
-"POT-Creation-Date: 2011-08-21 23:30+0200\n"
+"POT-Creation-Date: 2011-10-23 17:39+0200\n"
 "PO-Revision-Date: 2011-08-18 13:43+0000\n"
 "Last-Translator: podskalsky <andreas.podskalsky@siemens.com>\n"
 "Language-Team: German "
 msgid "Template saved"
 msgstr ""
 
-#: testmanager/api.py:223 testmanager/macros.py:539 testmanager/macros.py:911
+#: testmanager/api.py:223 testmanager/macros.py:548 testmanager/macros.py:927
+#: testmanager/wiki.py:589
 msgid "Timestamp"
 msgstr "Zeitstempel"
 
-#: testmanager/api.py:223 testmanager/macros.py:489 testmanager/macros.py:539
-#: testmanager/macros.py:911 testmanager/model.py:553
+#: testmanager/api.py:223 testmanager/macros.py:496 testmanager/macros.py:548
+#: testmanager/macros.py:927 testmanager/model.py:617 testmanager/wiki.py:589
 msgid "Author"
 msgstr "Autor"
 
-#: testmanager/api.py:223 testmanager/api.py:236 testmanager/macros.py:489
-#: testmanager/macros.py:911 testmanager/model.py:546
+#: testmanager/api.py:223 testmanager/api.py:236 testmanager/macros.py:496
+#: testmanager/macros.py:927 testmanager/model.py:610
 msgid "Status"
 msgstr "Status"
 
 msgid "Error adding test catalog"
 msgstr "Ergänzten Test-Verzeichnis"
 
-#: testmanager/api.py:460
+#: testmanager/api.py:470
 msgid "Error adding test case"
 msgstr ""
 
-#: testmanager/macros.py:218
+#: testmanager/macros.py:217
 msgid "All Catalogs"
 msgstr "Alle Verzeichnisse"
 
-#: testmanager/macros.py:306 testmanager/macros.py:327
-#: testmanager/macros.py:444 testmanager/macros.py:466
+#: testmanager/macros.py:305 testmanager/macros.py:326
+#: testmanager/macros.py:451 testmanager/macros.py:473
+#: testmanager/macros.py:534
 msgid "Filter:"
 msgstr "Filter:"
 
-#: testmanager/macros.py:306 testmanager/macros.py:327
-#: testmanager/macros.py:444 testmanager/macros.py:466
+#: testmanager/macros.py:305 testmanager/macros.py:326
+#: testmanager/macros.py:451 testmanager/macros.py:473
 msgid ""
 "Type the test to search for, even more than one word. You can also filter"
 " on the test case status (untested, successful, failed)."
 "Sucheingabefeld für Testfall. Auch mehrere Wörter möglich. Filterung kann"
 " auch den Testfall-Status (untested, successful, failed) beinhalten."
 
-#: testmanager/macros.py:307 testmanager/macros.py:445
+#: testmanager/macros.py:306 testmanager/macros.py:452
 msgid "Expand all"
 msgstr "Alles ausklappen"
 
-#: testmanager/macros.py:307 testmanager/macros.py:445
+#: testmanager/macros.py:306 testmanager/macros.py:452
 msgid "Collapse all"
 msgstr "Alles einklappen"
 
-#: testmanager/macros.py:332 testmanager/macros.py:471 testmanager/model.py:552
+#: testmanager/macros.py:331 testmanager/macros.py:478 testmanager/model.py:616
 #: testmanager/templates/admin_templates.html:28
 #: testmanager/templates/admin_templates.html:59
 #: testmanager/templates/admin_templates.html:134
 msgid "Name"
 msgstr "Name"
 
-#: testmanager/macros.py:341 testmanager/macros.py:480 testmanager/model.py:535
-#: testmanager/model.py:539 testmanager/model.py:543 testmanager/model.py:549
+#: testmanager/macros.py:340 testmanager/macros.py:487 testmanager/model.py:598
+#: testmanager/model.py:602 testmanager/model.py:606 testmanager/model.py:613
 msgid "ID"
 msgstr "ID"
 
-#: testmanager/macros.py:351 testmanager/templates/admin_templates.html:28
+#: testmanager/macros.py:350 testmanager/templates/admin_templates.html:28
 #: testmanager/templates/admin_templates.html:59
 #: testmanager/templates/admin_templates.html:139
 msgid "Description"
 msgstr "Beschreibung"
 
-#: testmanager/macros.py:489
+#: testmanager/macros.py:496
 msgid "Last Change"
 msgstr "Letzte Änderung"
 
-#: testmanager/macros.py:525
+#: testmanager/macros.py:533
 msgid "Available Test Plans"
 msgstr "Verfügbare Testpläne"
 
-#: testmanager/macros.py:539
+#: testmanager/macros.py:534
+msgid "Type the test to search for, even more than one word."
+msgstr ""
+
+#: testmanager/macros.py:548
 msgid "Plan Name"
 msgstr "Plan-Name"
 
-#: testmanager/macros.py:545
+#: testmanager/macros.py:554
 msgid "Open Test Plan"
 msgstr "Testplan öffnen"
 
-#: testmanager/macros.py:550
+#: testmanager/macros.py:559
 msgid "Delete"
 msgstr "Löschen"
 
-#: testmanager/macros.py:618 testmanager/macros.py:719
+#: testmanager/macros.py:627 testmanager/macros.py:732
 msgid "Open"
 msgstr "Öffnen"
 
-#: testmanager/macros.py:661 testmanager/macros.py:663
+#: testmanager/macros.py:674 testmanager/macros.py:676
 msgid "Edit the Test Case"
 msgstr "Testfall bearbeiten"
 
-#: testmanager/macros.py:687 testmanager/macros.py:780
-#: testmanager/macros.py:918
+#: testmanager/macros.py:700 testmanager/macros.py:796
+#: testmanager/macros.py:934
 msgid "Unknown"
 msgstr "Unbekannt"
 
-#: testmanager/macros.py:860
+#: testmanager/macros.py:876
 msgid "Change the Status:"
 msgstr "Status ändern"
 
-#: testmanager/macros.py:908
+#: testmanager/macros.py:924
 msgid "Status change history"
 msgstr "Statusänderungen"
 
-#: testmanager/model.py:536 testmanager/model.py:540 testmanager/model.py:545
-#: testmanager/model.py:551
+#: testmanager/model.py:599 testmanager/model.py:603 testmanager/model.py:608
+#: testmanager/model.py:615
 msgid "Wiki page name"
 msgstr "Wiki-Seiten-Name"
 
-#: testmanager/model.py:544
+#: testmanager/model.py:607
 msgid "Plan ID"
 msgstr "Plan ID"
 
-#: testmanager/model.py:550
+#: testmanager/model.py:609
+msgid "Wiki page version"
+msgstr ""
+
+#: testmanager/model.py:614
 msgid "Catalog ID"
 msgstr "Verzeichnis ID"
 
-#: testmanager/model.py:554
+#: testmanager/model.py:618
 msgid "Created"
 msgstr "Erstellt"
 
-#: testmanager/model.py:678 testmanager/wiki.py:339 testmanager/wiki.py:396
+#: testmanager/model.py:619
+msgid "Contains all Test Cases"
+msgstr ""
+
+#: testmanager/model.py:620
+msgid "Freeze Test Case versions"
+msgstr ""
+
+#: testmanager/model.py:751 testmanager/wiki.py:346 testmanager/wiki.py:406
 msgid "Test Case"
 msgstr "Testfall"
 
-#: testmanager/model.py:682
+#: testmanager/model.py:755
 msgid "Test Plan"
 msgstr "Testplan"
 
-#: testmanager/model.py:687 testmanager/stats.py:221
+#: testmanager/model.py:760 testmanager/stats.py:228
 msgid "Successful"
 msgstr "Erfolgreich"
 
-#: testmanager/model.py:688
+#: testmanager/model.py:761
 msgid "Untested"
 msgstr "Ungetestet"
 
-#: testmanager/model.py:689 testmanager/stats.py:221
+#: testmanager/model.py:762 testmanager/stats.py:228
 msgid "Failed"
 msgstr "Fehlgeschlagen"
 
-#: testmanager/stats.py:221
+#: testmanager/stats.py:228
 msgid "To be tested"
 msgstr "Ungetestet"
 
 msgid "Test Manager"
 msgstr "Testmanager"
 
-#: testmanager/wiki.py:136
+#: testmanager/wiki.py:138
 msgid ""
 "Select the catalog into which to paste the Test Cases and click on 'Paste"
 " the copied Test Cases here'. "
 "Verzeichnis zum Einfügen der Testfälle auswählen und 'Kopierte Testfälle "
 "hierher einfügen' anklicken."
 
-#: testmanager/wiki.py:137 testmanager/wiki.py:141 testmanager/wiki.py:163
-#: testmanager/wiki.py:168 testmanager/wiki.py:329 testmanager/wiki.py:334
+#: testmanager/wiki.py:139 testmanager/wiki.py:143 testmanager/wiki.py:165
+#: testmanager/wiki.py:170 testmanager/wiki.py:336 testmanager/wiki.py:341
 #: testmanager/templates/admin_templates.html:155
 msgid "Cancel"
 msgstr "Abbrechen"
 
-#: testmanager/wiki.py:140
+#: testmanager/wiki.py:142
 msgid ""
 "Select the catalog into which to paste the Test Case and click on 'Move "
 "the copied Test Case here'. "
 "Verzeichnis zum Einfügen des Testfalls auswählen und 'Kopierten Testfall "
 "hierher verschieben' anklicken."
 
-#: testmanager/wiki.py:143
+#: testmanager/wiki.py:145
 msgid "Test Catalogs List"
 msgstr "Test-Verzeichnis-Liste"
 
-#: testmanager/wiki.py:146
+#: testmanager/wiki.py:148
 msgid "New Catalog:"
 msgstr "Neues Verzeichnis:"
 
-#: testmanager/wiki.py:147
+#: testmanager/wiki.py:149
 msgid "Add a Catalog"
 msgstr "Verzeichnis hinzufügen"
 
-#: testmanager/wiki.py:162
+#: testmanager/wiki.py:164
 msgid ""
 "Select the catalog (even this one) into which to paste the Test Cases and"
 " click on 'Paste the copied Test Cases here'. "
 "Verzeichnis zum Einfügen der Testfälle auswählen (auch das aktuelle) und "
 "'Kopierte Testfälle hierher einfügen' anklicken."
 
-#: testmanager/wiki.py:167
+#: testmanager/wiki.py:169
 msgid ""
 "Select the catalog (even this one) into which to paste the Test Case and "
 "click on 'Move the copied Test Case here'. "
 "Verzeichnis zum Einfügen des Testfalls auswählen (auch das aktuelle) und "
 "'Kopierten Testfall hierher verschieben ' anklicken."
 
-#: testmanager/wiki.py:171 testmanager/templates/admin_templates.html:102
+#: testmanager/wiki.py:173 testmanager/templates/admin_templates.html:102
 msgid "Test Catalog"
 msgstr "Test-Verzeichnis"
 
-#: testmanager/wiki.py:173
+#: testmanager/wiki.py:175
 msgid "New Sub-Catalog:"
 msgstr "Neues Unterverzeichnis:"
 
-#: testmanager/wiki.py:174
+#: testmanager/wiki.py:176
 msgid "Add a Sub-Catalog"
 msgstr "Unterverzeichnis hinzufügen"
 
-#: testmanager/wiki.py:205
+#: testmanager/wiki.py:207
 msgid "New Test Case:"
 msgstr "Neuer Testfall"
 
-#: testmanager/wiki.py:209
+#: testmanager/wiki.py:211
 msgid "Add a Test Case"
 msgstr "Testfall hinzufügen"
 
-#: testmanager/wiki.py:213
+#: testmanager/wiki.py:215
 msgid "New Test Plan:"
 msgstr "Neuer Testplan:"
 
-#: testmanager/wiki.py:217
+#: testmanager/wiki.py:219
 msgid "Generate a new Test Plan"
 msgstr "Neuen Testplan erstellen"
 
-#: testmanager/wiki.py:226
+#: testmanager/wiki.py:229
 msgid "Select Multiple Test Cases"
 msgstr "Mehrfache Testfälle auswählen"
 
-#: testmanager/wiki.py:229
+#: testmanager/wiki.py:232
 msgid "Copy the Selected Test Cases"
 msgstr "Ausgewählte Testfälle kopieren"
 
-#: testmanager/wiki.py:233
+#: testmanager/wiki.py:236
 msgid "Paste the copied Test Cases here"
 msgstr "Kopierte Testfälle hierher einfügen"
 
-#: testmanager/wiki.py:236
+#: testmanager/wiki.py:239
 msgid "Move the copied Test Case here"
 msgstr "Kopierten Testfall hierher verschieben "
 
-#: testmanager/wiki.py:240
+#: testmanager/wiki.py:243
 msgid "Import Test Cases"
 msgstr "Testfälle importieren"
 
-#: testmanager/wiki.py:275 testmanager/wiki.py:436
+#: testmanager/wiki.py:282 testmanager/wiki.py:447
 msgid "Back to the Catalog"
 msgstr "Zürück zum Verzeichnis"
 
-#: testmanager/wiki.py:286
+#: testmanager/wiki.py:293
 msgid "Test Plan: "
 msgstr "Testplan:"
 
-#: testmanager/wiki.py:328
+#: testmanager/wiki.py:335
 msgid ""
 "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'.  "
 "Testfälle auswählen und 'Kopierte Testfälle hierher verschieben' "
 "anklicken."
 
-#: testmanager/wiki.py:333
+#: testmanager/wiki.py:340
 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'. "
 " Testfalls auswählen und 'Kopierten Testfall hierher verschieben ' "
 "anklicken."
 
-#: testmanager/wiki.py:348 testmanager/wiki.py:407
+#: testmanager/wiki.py:355 testmanager/wiki.py:417
 msgid "Open a Ticket on this Test Case"
 msgstr "Ticket zu diesem Testfall öffnen"
 
-#: testmanager/wiki.py:350 testmanager/wiki.py:409
+#: testmanager/wiki.py:357 testmanager/wiki.py:419
 msgid "Show Related Tickets"
 msgstr "Zugehörige Tickets anzeigen"
 
-#: testmanager/wiki.py:352
+#: testmanager/wiki.py:359
 msgid "Move the Test Case into another catalog"
 msgstr "Testfall in ein anderes Verzeichnis verschieben"
 
-#: testmanager/wiki.py:354
+#: testmanager/wiki.py:361
 msgid "Duplicate the Test Case"
 msgstr "Testfall kopieren"
 
-#: testmanager/wiki.py:429
+#: testmanager/wiki.py:440
 msgid "Back to the Test Plan"
 msgstr "Zürück zum Testplan"
 
-#: testmanager/wiki.py:500
+#: testmanager/wiki.py:511
 msgid "Edit"
 msgstr "Bearbeiten"
 
-#: testmanager/wiki.py:504
+#: testmanager/wiki.py:515
 msgid "Save"
 msgstr "Speichern"
 
+#: testmanager/wiki.py:586
+msgid "Object change history"
+msgstr ""
+
+#: testmanager/wiki.py:589
+msgid "Property"
+msgstr ""
+
+#: testmanager/wiki.py:589
+msgid "Previous Value"
+msgstr ""
+
+#: testmanager/wiki.py:589
+msgid "New Value"
+msgstr ""
+
 #: testmanager/templates/admin_settings.html:12
 msgid "Test Manager Settings"
 msgstr ""
Add a comment to this file

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

Binary file modified.

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

 "Project-Id-Version: Test Manager for Trac plugin\n"
 "Report-Msgid-Bugs-To: http://trac-hacks.org/wiki/TestManagerForTracPlugin"
 "\n"
-"POT-Creation-Date: 2011-08-21 22:54+0200\n"
+"POT-Creation-Date: 2011-10-23 17:39+0200\n"
 "PO-Revision-Date: 2011-08-13 22:12+0000\n"
 "Last-Translator: crossroad <jesuchristopher@gmail.com>\n"
 "Language-Team: Spanish (Castilian) "
 msgid "Length between 4 and 90 characters."
 msgstr "Longitud entre 4 y 90 caracteres."
 
-#: testmanager/htdocs/js/testmanager.js:85
+#: testmanager/htdocs/js/testmanager.js:133
 msgid "[Insert problem summary]"
 msgstr ""
 
-#: testmanager/htdocs/js/testmanager.js:97
+#: testmanager/htdocs/js/testmanager.js:145
 msgid ""
 "Are you sure you want to duplicate the test catalog and all its contained"
 " test cases?"
 "¿Esta seguro que desea duplicar el catálogo y todos los casos de pruebas "
 "contenidos en él?"
 
-#: testmanager/htdocs/js/testmanager.js:104
+#: testmanager/htdocs/js/testmanager.js:152
 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:307
-#: testmanager/htdocs/js/testmanager.js:456
+#: testmanager/htdocs/js/testmanager.js:368
+#: testmanager/htdocs/js/testmanager.js:523
 msgid "Results: "
 msgstr "Resultados:"
 
Add a comment to this file

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

Binary file modified.

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

 "Project-Id-Version: Test Manager for Trac plugin\n"
 "Report-Msgid-Bugs-To: http://trac-hacks.org/wiki/TestManagerForTracPlugin"
 "\n"
-"POT-Creation-Date: 2011-08-21 23:30+0200\n"
+"POT-Creation-Date: 2011-10-23 17:39+0200\n"
 "PO-Revision-Date: 2011-08-13 22:08+0000\n"
 "Last-Translator: crossroad <jesuchristopher@gmail.com>\n"
 "Language-Team: Spanish (Castilian) "
 msgid "Template saved"
 msgstr ""
 
-#: testmanager/api.py:223 testmanager/macros.py:539 testmanager/macros.py:911
+#: testmanager/api.py:223 testmanager/macros.py:548 testmanager/macros.py:927
+#: testmanager/wiki.py:589
 msgid "Timestamp"
 msgstr "Fecha Hora Registro"
 
-#: testmanager/api.py:223 testmanager/macros.py:489 testmanager/macros.py:539
-#: testmanager/macros.py:911 testmanager/model.py:553
+#: testmanager/api.py:223 testmanager/macros.py:496 testmanager/macros.py:548
+#: testmanager/macros.py:927 testmanager/model.py:617 testmanager/wiki.py:589
 msgid "Author"
 msgstr "Autor"
 
-#: testmanager/api.py:223 testmanager/api.py:236 testmanager/macros.py:489
-#: testmanager/macros.py:911 testmanager/model.py:546
+#: testmanager/api.py:223 testmanager/api.py:236 testmanager/macros.py:496
+#: testmanager/macros.py:927 testmanager/model.py:610
 msgid "Status"
 msgstr "Estado"
 
 msgid "Error adding test catalog"
 msgstr ""
 
-#: testmanager/api.py:460
+#: testmanager/api.py:470
 msgid "Error adding test case"
 msgstr ""
 
-#: testmanager/macros.py:218
+#: testmanager/macros.py:217
 msgid "All Catalogs"
 msgstr "Todos los Catálogos"
 
-#: testmanager/macros.py:306 testmanager/macros.py:327
-#: testmanager/macros.py:444 testmanager/macros.py:466
+#: testmanager/macros.py:305 testmanager/macros.py:326
+#: testmanager/macros.py:451 testmanager/macros.py:473
+#: testmanager/macros.py:534
 msgid "Filter:"
 msgstr "Filtro:"
 
-#: testmanager/macros.py:306 testmanager/macros.py:327
-#: testmanager/macros.py:444 testmanager/macros.py:466
+#: testmanager/macros.py:305 testmanager/macros.py:326
+#: testmanager/macros.py:451 testmanager/macros.py:473
 msgid ""
 "Type the test to search for, even more than one word. You can also filter"
 " on the test case status (untested, successful, failed)."
 "También puede filtrar por el estado de un caso de prueba(Sin Revisar, "
 "Existoso, Fallido)"
 
-#: testmanager/macros.py:307 testmanager/macros.py:445
+#: testmanager/macros.py:306 testmanager/macros.py:452
 msgid "Expand all"
 msgstr "Expandir todo"
 
-#: testmanager/macros.py:307 testmanager/macros.py:445
+#: testmanager/macros.py:306 testmanager/macros.py:452
 msgid "Collapse all"
 msgstr "Colapsar todo"
 
-#: testmanager/macros.py:332 testmanager/macros.py:471 testmanager/model.py:552
+#: testmanager/macros.py:331 testmanager/macros.py:478 testmanager/model.py:616
 #: testmanager/templates/admin_templates.html:28
 #: testmanager/templates/admin_templates.html:59
 #: testmanager/templates/admin_templates.html:134
 msgid "Name"
 msgstr "Nombre"
 
-#: testmanager/macros.py:341 testmanager/macros.py:480 testmanager/model.py:535
-#: testmanager/model.py:539 testmanager/model.py:543 testmanager/model.py:549
+#: testmanager/macros.py:340 testmanager/macros.py:487 testmanager/model.py:598
+#: testmanager/model.py:602 testmanager/model.py:606 testmanager/model.py:613
 msgid "ID"
 msgstr "ID"
 
-#: testmanager/macros.py:351 testmanager/templates/admin_templates.html:28
+#: testmanager/macros.py:350 testmanager/templates/admin_templates.html:28
 #: testmanager/templates/admin_templates.html:59
 #: testmanager/templates/admin_templates.html:139
 msgid "Description"
 msgstr "Descripción"
 
-#: testmanager/macros.py:489
+#: testmanager/macros.py:496
 msgid "Last Change"
 msgstr "Ultimo Cambio"
 
-#: testmanager/macros.py:525
+#: testmanager/macros.py:533
 msgid "Available Test Plans"
 msgstr "Planes de Pruebas Disponibles"
 
-#: testmanager/macros.py:539
+#: testmanager/macros.py:534
+msgid "Type the test to search for, even more than one word."
+msgstr ""
+
+#: testmanager/macros.py:548
 msgid "Plan Name"
 msgstr "Nombre del Plan"
 
-#: testmanager/macros.py:545
+#: testmanager/macros.py:554
 msgid "Open Test Plan"
 msgstr "Plan de Pruebas abierto"
 
-#: testmanager/macros.py:550
+#: testmanager/macros.py:559
 msgid "Delete"
 msgstr "Eliminar"
 
-#: testmanager/macros.py:618 testmanager/macros.py:719
+#: testmanager/macros.py:627 testmanager/macros.py:732
 msgid "Open"
 msgstr "Abrir"
 
-#: testmanager/macros.py:661 testmanager/macros.py:663
+#: testmanager/macros.py:674 testmanager/macros.py:676
 msgid "Edit the Test Case"
 msgstr "Editar el Caso de Prueba"
 
-#: testmanager/macros.py:687 testmanager/macros.py:780
-#: testmanager/macros.py:918
+#: testmanager/macros.py:700 testmanager/macros.py:796
+#: testmanager/macros.py:934
 msgid "Unknown"
 msgstr ""
 
-#: testmanager/macros.py:860
+#: testmanager/macros.py:876
 msgid "Change the Status:"
 msgstr "Cambio el Estado"
 
-#: testmanager/macros.py:908
+#: testmanager/macros.py:924
 msgid "Status change history"
 msgstr "Historial de Cambios de Estado"
 
-#: testmanager/model.py:536 testmanager/model.py:540 testmanager/model.py:545
-#: testmanager/model.py:551
+#: testmanager/model.py:599 testmanager/model.py:603 testmanager/model.py:608
+#: testmanager/model.py:615
 msgid "Wiki page name"
 msgstr "Nombre de la Pagina Wiki"
 
-#: testmanager/model.py:544
+#: testmanager/model.py:607
 msgid "Plan ID"
 msgstr "Plan ID"
 
-#: testmanager/model.py:550
+#: testmanager/model.py:609
+msgid "Wiki page version"
+msgstr ""
+
+#: testmanager/model.py:614
 msgid "Catalog ID"
 msgstr "Catalogo ID"
 
-#: testmanager/model.py:554
+#: testmanager/model.py:618
 msgid "Created"
 msgstr "Creado"
 
-#: testmanager/model.py:678 testmanager/wiki.py:339 testmanager/wiki.py:396
+#: testmanager/model.py:619
+msgid "Contains all Test Cases"
+msgstr ""
+
+#: testmanager/model.py:620
+msgid "Freeze Test Case versions"
+msgstr ""
+
+#: testmanager/model.py:751 testmanager/wiki.py:346 testmanager/wiki.py:406
 msgid "Test Case"
 msgstr "Caso de Prueba"
 
-#: testmanager/model.py:682
+#: testmanager/model.py:755
 msgid "Test Plan"
 msgstr "Plan de Pruebas"
 
-#: testmanager/model.py:687 testmanager/stats.py:221
+#: testmanager/model.py:760 testmanager/stats.py:228
 msgid "Successful"
 msgstr "Exitoso"
 
-#: testmanager/model.py:688
+#: testmanager/model.py:761
 msgid "Untested"
 msgstr "Sin Revisar"
 
-#: testmanager/model.py:689 testmanager/stats.py:221
+#: testmanager/model.py:762 testmanager/stats.py:228
 msgid "Failed"
 msgstr "Fallido"
 
-#: testmanager/stats.py:221
+#: testmanager/stats.py:228
 msgid "To be tested"
 msgstr "Por Revisar"
 
 msgid "Test Manager"
 msgstr "Administrador de Pruebas"
 
-#: testmanager/wiki.py:136
+#: testmanager/wiki.py:138
 msgid ""
 "Select the catalog into which to paste the Test Cases and click on 'Paste"
 " the copied Test Cases here'. "
 "luego haga clic sobre el botón \"Pegar aquí los Casos de Pruebas "
 "Copiados\""
 
-#: testmanager/wiki.py:137 testmanager/wiki.py:141 testmanager/wiki.py:163
-#: testmanager/wiki.py:168 testmanager/wiki.py:329 testmanager/wiki.py:334
+#: testmanager/wiki.py:139 testmanager/wiki.py:143 testmanager/wiki.py:165
+#: testmanager/wiki.py:170 testmanager/wiki.py:336 testmanager/wiki.py:341
 #: testmanager/templates/admin_templates.html:155
 msgid "Cancel"
 msgstr "Cancelar"
 
-#: testmanager/wiki.py:140
+#: testmanager/wiki.py:142
 msgid ""
 "Select the catalog into which to paste the Test Case and click on 'Move "
 "the copied Test Case here'. "
 "Pruebas y luego haga clic sobre el botón \"Mover aquí los Casos de "
 "Pruebas Copiados\""
 
-#: testmanager/wiki.py:143
+#: testmanager/wiki.py:145
 msgid "Test Catalogs List"
 msgstr "Lista de Catalogos de Pruebas"
 
-#: testmanager/wiki.py:146
+#: testmanager/wiki.py:148
 msgid "New Catalog:"
 msgstr "Nuevo Catálogo"
 
-#: testmanager/wiki.py:147
+#: testmanager/wiki.py:149
 msgid "Add a Catalog"
 msgstr "Añadir Catálogo"
 
-#: testmanager/wiki.py:162
+#: testmanager/wiki.py:164
 msgid ""
 "Select the catalog (even this one) into which to paste the Test Cases and"
 " click on 'Paste the copied Test Cases here'. "
 "Pruebas y luego haga clic sobre el botón \"Pegar aquí los Casos de "
 "Pruebas Copiados\""
 
-#: testmanager/wiki.py:167
+#: testmanager/wiki.py:169
 msgid ""
 "Select the catalog (even this one) into which to paste the Test Case and "
 "click on 'Move the copied Test Case here'. "
 "Pruebas y luego haga clic sobre el botón \"Mover aquí los Casos de "
 "Pruebas Copiados\""
 
-#: testmanager/wiki.py:171 testmanager/templates/admin_templates.html:102
+#: testmanager/wiki.py:173 testmanager/templates/admin_templates.html:102
 msgid "Test Catalog"
 msgstr "Catálogo de Pruebas"
 
-#: testmanager/wiki.py:173
+#: testmanager/wiki.py:175
 msgid "New Sub-Catalog:"
 msgstr "Nuevo Sub-Catálogo"
 
-#: testmanager/wiki.py:174
+#: testmanager/wiki.py:176
 msgid "Add a Sub-Catalog"
 msgstr "Añadir un Sub-Catálogo"
 
-#: testmanager/wiki.py:205
+#: testmanager/wiki.py:207
 msgid "New Test Case:"
 msgstr "Nuevo Caso de Prueba"
 
-#: testmanager/wiki.py:209
+#: testmanager/wiki.py:211
 msgid "Add a Test Case"
 msgstr "Añadir un Caso de Prueba"
 
-#: testmanager/wiki.py:213
+#: testmanager/wiki.py:215
 msgid "New Test Plan:"
 msgstr "Nuevo Plan de Pruebas"
 
-#: testmanager/wiki.py:217
+#: testmanager/wiki.py:219
 msgid "Generate a new Test Plan"
 msgstr "Generar un nuevo Plan de Pruebas"
 
-#: testmanager/wiki.py:226
+#: testmanager/wiki.py:229
 msgid "Select Multiple Test Cases"
 msgstr "Seleccionar Multiples Casos de Pruebas"
 
-#: testmanager/wiki.py:229
+#: testmanager/wiki.py:232
 msgid "Copy the Selected Test Cases"
 msgstr "Copiar los Casos de Pruebas Seleccionados"
 
-#: testmanager/wiki.py:233
+#: testmanager/wiki.py:236
 msgid "Paste the copied Test Cases here"
 msgstr "Pegar aquí los Casos de Pruebas Copiados"
 
-#: testmanager/wiki.py:236
+#: testmanager/wiki.py:239
 msgid "Move the copied Test Case here"
 msgstr "Mover aquí los Casos de Pruebas Copiados"
 
-#: testmanager/wiki.py:240
+#: testmanager/wiki.py:243
 msgid "Import Test Cases"
 msgstr "Importar Casos de Pruebas"
 
-#: testmanager/wiki.py:275 testmanager/wiki.py:436
+#: testmanager/wiki.py:282 testmanager/wiki.py:447
 msgid "Back to the Catalog"
 msgstr "Volver al Catálogo"
 
-#: testmanager/wiki.py:286
+#: testmanager/wiki.py:293
 msgid "Test Plan: "
 msgstr "Plan de Pruebas:"
 
-#: testmanager/wiki.py:328
+#: testmanager/wiki.py:335
 msgid ""
 "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:333
+#: testmanager/wiki.py:340
 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:348 testmanager/wiki.py:407
+#: testmanager/wiki.py:355 testmanager/wiki.py:417
 msgid "Open a Ticket on this Test Case"
 msgstr "Abrir un Ticket sobre este Caso de Prueba"
 
-#: testmanager/wiki.py:350 testmanager/wiki.py:409
+#: testmanager/wiki.py:357 testmanager/wiki.py:419
 msgid "Show Related Tickets"
 msgstr "Ver Tickets Relacionados"
 
-#: testmanager/wiki.py:352
+#: testmanager/wiki.py:359
 msgid "Move the Test Case into another catalog"
 msgstr ""
 
-#: testmanager/wiki.py:354
+#: testmanager/wiki.py:361
 msgid "Duplicate the Test Case"
 msgstr "Duplicar Caso de Prueba"
 
-#: testmanager/wiki.py:429
+#: testmanager/wiki.py:440
 msgid "Back to the Test Plan"
 msgstr "Volver al Plan de Pruebas"
 
-#: testmanager/wiki.py:500
+#: testmanager/wiki.py:511
 msgid "Edit"
 msgstr "Editar"
 
-#: testmanager/wiki.py:504
+#: testmanager/wiki.py:515
 msgid "Save"
 msgstr "Guardar"
 
+#: testmanager/wiki.py:586
+msgid "Object change history"
+msgstr ""
+
+#: testmanager/wiki.py:589
+msgid "Property"
+msgstr ""
+
+#: testmanager/wiki.py:589
+msgid "Previous Value"
+msgstr ""
+
+#: testmanager/wiki.py:589
+msgid "New Value"
+msgstr ""
+
 #: testmanager/templates/admin_settings.html:12
 msgid "Test Manager Settings"
 msgstr ""
Add a comment to this file

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

Binary file added.

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

+# French translations for TestManager.
+# Copyright (C) 2011 Roberto Longobardi
+# This file is distributed under the same license as the TestManager
+# project.
+#
+# Translators:
+# <frederic.chareyron@c-s.fr>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: Test Manager for Trac plugin\n"
+"Report-Msgid-Bugs-To: http://trac-hacks.org/wiki/TestManagerForTracPlugin"
+"\n"
+"POT-Creation-Date: 2011-10-23 17:39+0200\n"
+"PO-Revision-Date: 2011-09-28 21:08+0000\n"
+"Last-Translator: chareyron <>\n"
+"Language-Team: French "
+"(http://www.transifex.net/projects/p/testman4trac/team/fr/)\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.6\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 "Vous devez spécifier un nom. Longueur entre 4 et 90 caractères."
+
+#: 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 "Longueur entre 4 et 90 caractères."
+
+#: testmanager/htdocs/js/testmanager.js:133
+msgid "[Insert problem summary]"
+msgstr ""
+
+#: testmanager/htdocs/js/testmanager.js:145
+msgid ""
+"Are you sure you want to duplicate the test catalog and all its contained"
+" test cases?"
+msgstr ""
+"Êtes-vous sûr de vouloir dupliquer le Catalogue de Tests et toutes les "
+"Fiches de Test qu'il contient ?"
+
+#: testmanager/htdocs/js/testmanager.js:152
+msgid ""
+"Are you sure you want to delete the test plan and the state of all its "
+"contained test cases?"
+msgstr ""
+"Êtes-vous sûr de vouloir supprimer le Plan de Tests et l'état de toutes "
+"les Fiches de test qu'il contient ?"
+
+#: testmanager/htdocs/js/testmanager.js:368
+#: testmanager/htdocs/js/testmanager.js:523
+msgid "Results: "
+msgstr "Résultats :"
+
Add a comment to this file

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