##// END OF EJS Templates
v0.2.0...
Jean-Philippe Lang -
r5:f37089f54784
parent child
Show More
@@ -0,0 +1,19
1 # Settings specified here will take precedence over those in config/environment.rb
2
3 # In the development environment your application's code is reloaded on
4 # every request. This slows down response time but is perfect for development
5 # since you don't have to restart the webserver when you make code changes.
6 config.cache_classes = false
7
8 # Log error messages when you accidentally call methods on nil.
9 config.whiny_nils = true
10
11 # Enable the breakpoint server that script/breakpointer connects to
12 config.breakpoint_server = true
13
14 # Show full error reports and disable caching
15 config.action_controller.consider_all_requests_local = true
16 config.action_controller.perform_caching = false
17
18 # Don't care if the mailer can't send
19 config.action_mailer.raise_delivery_errors = false
@@ -0,0 +1,19
1 # Settings specified here will take precedence over those in config/environment.rb
2
3 # In the development environment your application's code is reloaded on
4 # every request. This slows down response time but is perfect for development
5 # since you don't have to restart the webserver when you make code changes.
6 config.cache_classes = false
7
8 # Log error messages when you accidentally call methods on nil.
9 config.whiny_nils = true
10
11 # Enable the breakpoint server that script/breakpointer connects to
12 config.breakpoint_server = true
13
14 # Show full error reports and disable caching
15 config.action_controller.consider_all_requests_local = true
16 config.action_controller.perform_caching = false
17
18 # Don't care if the mailer can't send
19 config.action_mailer.raise_delivery_errors = false
@@ -0,0 +1,15
1 # Settings specified here will take precedence over those in config/environment.rb
2
3 # The test environment is used exclusively to run your application's
4 # test suite. You never need to work with it otherwise. Remember that
5 # your test database is "scratch space" for the test suite and is wiped
6 # and recreated between test runs. Don't rely on the data there!
7 config.cache_classes = true
8
9 # Log error messages when you accidentally call methods on nil.
10 config.whiny_nils = true
11
12 # Show full error reports and disable caching
13 config.action_controller.consider_all_requests_local = true
14 config.action_controller.perform_caching = false
15
@@ -0,0 +1,15
1 # Settings specified here will take precedence over those in config/environment.rb
2
3 # The test environment is used exclusively to run your application's
4 # test suite. You never need to work with it otherwise. Remember that
5 # your test database is "scratch space" for the test suite and is wiped
6 # and recreated between test runs. Don't rely on the data there!
7 config.cache_classes = true
8
9 # Log error messages when you accidentally call methods on nil.
10 config.whiny_nils = true
11
12 # Show full error reports and disable caching
13 config.action_controller.consider_all_requests_local = true
14 config.action_controller.perform_caching = false
15
@@ -0,0 +1,15
1 # Settings specified here will take precedence over those in config/environment.rb
2
3 # The test environment is used exclusively to run your application's
4 # test suite. You never need to work with it otherwise. Remember that
5 # your test database is "scratch space" for the test suite and is wiped
6 # and recreated between test runs. Don't rely on the data there!
7 config.cache_classes = true
8
9 # Log error messages when you accidentally call methods on nil.
10 config.whiny_nils = true
11
12 # Show full error reports and disable caching
13 config.action_controller.consider_all_requests_local = true
14 config.action_controller.perform_caching = false
15
@@ -0,0 +1,3
1 <html><head>
2 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
3 <title>Chapter&nbsp;1.&nbsp;Administration</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="index.html" title="Documentation redMine"><link rel="prev" href="index.html" title="Documentation redMine"><link rel="next" href="ch01s01.html" title="1.&nbsp;Utilisateurs"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter&nbsp;1.&nbsp;Administration</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="index.html">Prev</a>&nbsp;</td><th width="60%" align="center">&nbsp;</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="ch01s01.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="d0e4"></a>Chapter&nbsp;1.&nbsp;Administration</h2></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="section"><a href="ch01s01.html">1. Utilisateurs</a></span></dt><dd><dl><dt><span class="section"><a href="ch01s01.html#d0e12">1.1. Liste des utilisateurs</a></span></dt><dt><span class="section"><a href="ch01s01.html#d0e26">1.2. Cr&eacute;ation ou modification d'un utilisateur</a></span></dt></dl></dd><dt><span class="section"><a href="ch01s02.html">2. R&ocirc;les et permissions</a></span></dt><dt><span class="section"><a href="ch01s03.html">3. Trackers</a></span></dt><dt><span class="section"><a href="ch01s04.html">4. Champs personnalis&eacute;s</a></span></dt><dt><span class="section"><a href="ch01s05.html">5. Statut des demandes</a></span></dt><dt><span class="section"><a href="ch01s06.html">6. Workflow</a></span></dt><dt><span class="section"><a href="ch01s07.html">7. Listes de valeurs</a></span></dt><dt><span class="section"><a href="ch01s08.html">8. Notifications par mail</a></span></dt><dt><span class="section"><a href="ch01s09.html">9. Informations</a></span></dt></dl></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="index.html">Prev</a>&nbsp;</td><td width="20%" align="center">&nbsp;</td><td width="40%" align="right">&nbsp;<a accesskey="n" href="ch01s01.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Documentation redMine&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">&nbsp;1.&nbsp;Utilisateurs</td></tr></table></div></body></html> No newline at end of file
@@ -0,0 +1,3
1 <html><head>
2 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
3 <title>1.&nbsp;Utilisateurs</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch01.html" title="Chapter&nbsp;1.&nbsp;Administration"><link rel="prev" href="ch01.html" title="Chapter&nbsp;1.&nbsp;Administration"><link rel="next" href="ch01s02.html" title="2.&nbsp;R&ocirc;les et permissions"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">1.&nbsp;Utilisateurs</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch01.html">Prev</a>&nbsp;</td><th width="60%" align="center">Chapter&nbsp;1.&nbsp;Administration</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="ch01s02.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e7"></a>1.&nbsp;Utilisateurs</h2></div></div></div><p>Ces &eacute;crans vous permettent de g&eacute;rer les utilisateurs de l'application.</p><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="d0e12"></a>1.1.&nbsp;Liste des utilisateurs</h3></div></div></div><p></p><div class="screenshot"><div class="mediaobject"><img src="resources/users_list.png"></div></div><p>Les boutons Lock/Unlock vous permettent de v&eacute;rouiller/d&eacute;v&eacute;rouiller les comptes utilisateurs.</p><p>Un utilisateur dont le compte est v&eacute;rouill&eacute; ne peut plus s'identifier pour acc&eacute;der &agrave; l'application.</p></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="d0e26"></a>1.2.&nbsp;Cr&eacute;ation ou modification d'un utilisateur</h3></div></div></div><p>En mode modification, laissez le champ Password vide pour laisser le mot de passe de l'utilisateur inchang&eacute;.</p><p>Un utilisateur d&eacute;clar&eacute; comme administrateur dispose de toutes les permissions sur l'application et sur tous les projets.</p><div class="itemizedlist"><ul type="disc"><li><p><span class="guilabel">Administrateur</span>: d&eacute;clare l'utilisateur comme administrateur de l'application.</p></li><li><p><span class="guilabel">Notifications par mail</span>: permet d'activer ou non l'envoi automatique de notifications par mail pour cet utilisateur</p></li><li><p><span class="guilabel">V&eacute;rouill&eacute;</span>: d&eacute;sactive le compte de l'utilisateur</p></li></ul></div></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch01.html">Prev</a>&nbsp;</td><td width="20%" align="center"><a accesskey="u" href="ch01.html">Up</a></td><td width="40%" align="right">&nbsp;<a accesskey="n" href="ch01s02.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter&nbsp;1.&nbsp;Administration&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">&nbsp;2.&nbsp;R&ocirc;les et permissions</td></tr></table></div></body></html> No newline at end of file
@@ -0,0 +1,3
1 <html><head>
2 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
3 <title>2.&nbsp;R&ocirc;les et permissions</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch01.html" title="Chapter&nbsp;1.&nbsp;Administration"><link rel="prev" href="ch01s01.html" title="1.&nbsp;Utilisateurs"><link rel="next" href="ch01s03.html" title="3.&nbsp;Trackers"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">2.&nbsp;R&ocirc;les et permissions</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch01s01.html">Prev</a>&nbsp;</td><th width="60%" align="center">Chapter&nbsp;1.&nbsp;Administration</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="ch01s03.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e49"></a>2.&nbsp;R&ocirc;les et permissions</h2></div></div></div><p>Les r&ocirc;les permettent de d&eacute;finir les permissions des diff&eacute;rents membres d'un projet. Chaque membre d'un projet dispose d'un r&ocirc;le unique au sein d'un projet. Un utilisateur peut avoir diff&eacute;rents r&ocirc;les au sein de diff&eacute;rents projets.</p><p>Sur l'&eacute;cran d'&eacute;dition du r&ocirc;le, cochez les actions que vous souhaitez autoriser pour le r&ocirc;le.</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch01s01.html">Prev</a>&nbsp;</td><td width="20%" align="center"><a accesskey="u" href="ch01.html">Up</a></td><td width="40%" align="right">&nbsp;<a accesskey="n" href="ch01s03.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">1.&nbsp;Utilisateurs&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">&nbsp;3.&nbsp;Trackers</td></tr></table></div></body></html> No newline at end of file
@@ -0,0 +1,3
1 <html><head>
2 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
3 <title>3.&nbsp;Trackers</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch01.html" title="Chapter&nbsp;1.&nbsp;Administration"><link rel="prev" href="ch01s02.html" title="2.&nbsp;R&ocirc;les et permissions"><link rel="next" href="ch01s04.html" title="4.&nbsp;Champs personnalis&eacute;s"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">3.&nbsp;Trackers</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch01s02.html">Prev</a>&nbsp;</td><th width="60%" align="center">Chapter&nbsp;1.&nbsp;Administration</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="ch01s04.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e56"></a>3.&nbsp;Trackers</h2></div></div></div><p>Les trackers permettent de typer les demandes et de d&eacute;finir des workflows sp&eacute;cifiques pour chacun de ces types.</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch01s02.html">Prev</a>&nbsp;</td><td width="20%" align="center"><a accesskey="u" href="ch01.html">Up</a></td><td width="40%" align="right">&nbsp;<a accesskey="n" href="ch01s04.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">2.&nbsp;R&ocirc;les et permissions&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">&nbsp;4.&nbsp;Champs personnalis&eacute;s</td></tr></table></div></body></html> No newline at end of file
@@ -0,0 +1,3
1 <html><head>
2 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
3 <title>4.&nbsp;Champs personnalis&eacute;s</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch01.html" title="Chapter&nbsp;1.&nbsp;Administration"><link rel="prev" href="ch01s03.html" title="3.&nbsp;Trackers"><link rel="next" href="ch01s05.html" title="5.&nbsp;Statut des demandes"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">4.&nbsp;Champs personnalis&eacute;s</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch01s03.html">Prev</a>&nbsp;</td><th width="60%" align="center">Chapter&nbsp;1.&nbsp;Administration</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="ch01s05.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e61"></a>4.&nbsp;Champs personnalis&eacute;s</h2></div></div></div><p>Les champs personnalis&eacute;s vous permettent d'ajouter des informations suppl&eacute;mentaires sur les demandes. Un champ personnalis&eacute; peut &ecirc;tre de l'un des types suivants:</p><div class="itemizedlist"><ul type="disc"><li><p><span class="guilabel">Integer</span>: entier positif ou n&eacute;gatif</p></li><li><p><span class="guilabel">String</span>: cha&icirc;ne de caract&egrave;re</p></li><li><p><span class="guilabel">Date</span>: date</p></li><li><p><span class="guilabel">Boolean</span>: bool&eacute;en (case &agrave; cocher)</p></li><li><p><span class="guilabel">List</span>: valeur &agrave; s&eacute;lectionn&eacute;e parmi une liste pr&eacute;d&eacute;finie (liste d&eacute;roulante)</p></li></ul></div><p>Des &eacute;l&eacute;ments de validation peuvent &ecirc;tre d&eacute;finis:</p><div class="itemizedlist"><ul type="disc"><li><p><span class="guilabel">Obligatoire</span>: champ dont la saisie est obligatoire sur les demandes</p></li><li><p><span class="guilabel">Pour tous les projects</span>: champ automatiquement associ&eacute; &agrave; l'ensemble des projets</p></li><li><p><span class="guilabel">Min - max length</span>: longueurs minimales et maximales pour les champs en saisie libre (0 signifie qu'il n'y a pas de restriction)</p></li><li><p><span class="guilabel">Expression r&eacute;guli&egrave;re</span>: expression r&eacute;guli&egrave;re permettant de valider la valeur saisie</p></li><li><p><span class="guilabel">Valeurs possibles</span>: valeurs possibles pour les champs de type "Liste". Les valeurs sont s&eacute;par&eacute;es par le caract&egrave;re |</p></li></ul></div><p>Si l'option <span class="guilabel">Pour tous les projets</span> n'est pas activ&eacute;e, chaque projet pourra choisir d'utiliser ou non le champ pour ses demandes.</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch01s03.html">Prev</a>&nbsp;</td><td width="20%" align="center"><a accesskey="u" href="ch01.html">Up</a></td><td width="40%" align="right">&nbsp;<a accesskey="n" href="ch01s05.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">3.&nbsp;Trackers&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">&nbsp;5.&nbsp;Statut des demandes</td></tr></table></div></body></html> No newline at end of file
@@ -0,0 +1,3
1 <html><head>
2 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
3 <title>5.&nbsp;Statut des demandes</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch01.html" title="Chapter&nbsp;1.&nbsp;Administration"><link rel="prev" href="ch01s04.html" title="4.&nbsp;Champs personnalis&eacute;s"><link rel="next" href="ch01s06.html" title="6.&nbsp;Workflow"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">5.&nbsp;Statut des demandes</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch01s04.html">Prev</a>&nbsp;</td><th width="60%" align="center">Chapter&nbsp;1.&nbsp;Administration</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="ch01s06.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e125"></a>5.&nbsp;Statut des demandes</h2></div></div></div><p>Ces &eacute;crans vous permettent de d&eacute;finir les diff&eacute;rents statuts possibles des demandes.</p><div class="itemizedlist"><ul type="disc"><li><p><span class="guilabel">Demande ferm&eacute;e</span>: indique que le statut correspond &agrave; une demande consid&eacute;r&eacute;e comme ferm&eacute;e</p></li><li><p><span class="guilabel">Statut par d&eacute;faut</span>: statut appliqu&eacute; par d&eacute;faut aux nouvelles demandes (seul un statut peut &ecirc;tre d&eacute;clar&eacute; comme statut par d&eacute;faut)</p></li><li><p><span class="guilabel">Couleur</span>: code couleur HTML (6 caract&egrave;res) repr&eacute;sentant le statut &agrave; l'affichage</p></li></ul></div><p></p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch01s04.html">Prev</a>&nbsp;</td><td width="20%" align="center"><a accesskey="u" href="ch01.html">Up</a></td><td width="40%" align="right">&nbsp;<a accesskey="n" href="ch01s06.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">4.&nbsp;Champs personnalis&eacute;s&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">&nbsp;6.&nbsp;Workflow</td></tr></table></div></body></html> No newline at end of file
@@ -0,0 +1,3
1 <html><head>
2 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
3 <title>6.&nbsp;Workflow</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch01.html" title="Chapter&nbsp;1.&nbsp;Administration"><link rel="prev" href="ch01s05.html" title="5.&nbsp;Statut des demandes"><link rel="next" href="ch01s07.html" title="7.&nbsp;Listes de valeurs"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">6.&nbsp;Workflow</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch01s05.html">Prev</a>&nbsp;</td><th width="60%" align="center">Chapter&nbsp;1.&nbsp;Administration</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="ch01s07.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e147"></a>6.&nbsp;Workflow</h2></div></div></div><p>Le workflow permet de d&eacute;finir les changements que les diff&eacute;rents membres d'un projet sont autoris&eacute;s &agrave; effectuer sur les demandes, en fonction de leur type.</p><p>S&eacute;lectionnez le r&ocirc;le et le tracker pour lesquels vous souhaitez modifier le workflow, puis cliquez sur Edit. L'&eacute;cran vous permet alors de modifier, pour le r&ocirc;le et le tracker choisi, les changements autoris&eacute;s. Les lignes repr&eacute;sentent les statuts initiaux des demandes. Les colonnes repr&eacute;sentent les statuts autoris&eacute;s &agrave; &ecirc;tre appliqu&eacute;s.</p><p>Remarque: pour qu'un r&ocirc;le puisse changer le statut des demandes, la permission doit lui &ecirc;tre explicitement donn&eacute;e ind&eacute;pendemment de la configuration du workflow.</p><p></p><div class="screenshot"><div class="mediaobject"><img src="resources/workflow.png"></div></div><p>Dans l'exemple ci-dessus, les demandes de type Bug au statut Nouveau pourront &ecirc;tre pass&eacute;es au statut Assign&eacute;e ou R&eacute;solue par le r&ocirc;le D&eacute;veloppeur. Celles au statut Assign&eacute;e pourront &ecirc;tre pass&eacute;es au statut R&eacute;solue. Le statut de toutes les autres demandes de type Bug ne pourra pas &ecirc;tre modifi&eacute; par le D&eacute;veloppeur.</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch01s05.html">Prev</a>&nbsp;</td><td width="20%" align="center"><a accesskey="u" href="ch01.html">Up</a></td><td width="40%" align="right">&nbsp;<a accesskey="n" href="ch01s07.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">5.&nbsp;Statut des demandes&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">&nbsp;7.&nbsp;Listes de valeurs</td></tr></table></div></body></html> No newline at end of file
@@ -0,0 +1,3
1 <html><head>
2 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
3 <title>7.&nbsp;Listes de valeurs</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch01.html" title="Chapter&nbsp;1.&nbsp;Administration"><link rel="prev" href="ch01s06.html" title="6.&nbsp;Workflow"><link rel="next" href="ch01s08.html" title="8.&nbsp;Notifications par mail"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">7.&nbsp;Listes de valeurs</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch01s06.html">Prev</a>&nbsp;</td><th width="60%" align="center">Chapter&nbsp;1.&nbsp;Administration</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="ch01s08.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e165"></a>7.&nbsp;Listes de valeurs</h2></div></div></div><p>Les listes de valeurs utilis&eacute;es par l'application (exemple: les priorit&eacute;s des demandes) peuvent &ecirc;tre personnalis&eacute;es. Cet &eacute;cran vous permet de d&eacute;finir les valeurs possibles pour chacune des listes suivantes:</p><div class="itemizedlist"><ul type="disc"><li><p>Priorit&eacute;s des demandes</p></li><li><p>Cat&eacute;gories de documents</p></li></ul></div><p></p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch01s06.html">Prev</a>&nbsp;</td><td width="20%" align="center"><a accesskey="u" href="ch01.html">Up</a></td><td width="40%" align="right">&nbsp;<a accesskey="n" href="ch01s08.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">6.&nbsp;Workflow&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">&nbsp;8.&nbsp;Notifications par mail</td></tr></table></div></body></html> No newline at end of file
@@ -0,0 +1,3
1 <html><head>
2 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
3 <title>8.&nbsp;Notifications par mail</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch01.html" title="Chapter&nbsp;1.&nbsp;Administration"><link rel="prev" href="ch01s07.html" title="7.&nbsp;Listes de valeurs"><link rel="next" href="ch01s09.html" title="9.&nbsp;Informations"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">8.&nbsp;Notifications par mail</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch01s07.html">Prev</a>&nbsp;</td><th width="60%" align="center">Chapter&nbsp;1.&nbsp;Administration</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="ch01s09.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e178"></a>8.&nbsp;Notifications par mail</h2></div></div></div><p>Cet &eacute;cran vous permet de s&eacute;lectionner les actions qui donneront lieu &agrave; une notification par mail aux membres du projet.</p><p>Remarque: l'envoi de mails doit &ecirc;tre activ&eacute; dans la configuration de l'application si souhaitez effectuer des notifications.</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch01s07.html">Prev</a>&nbsp;</td><td width="20%" align="center"><a accesskey="u" href="ch01.html">Up</a></td><td width="40%" align="right">&nbsp;<a accesskey="n" href="ch01s09.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">7.&nbsp;Listes de valeurs&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">&nbsp;9.&nbsp;Informations</td></tr></table></div></body></html> No newline at end of file
@@ -0,0 +1,3
1 <html><head>
2 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
3 <title>9.&nbsp;Informations</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch01.html" title="Chapter&nbsp;1.&nbsp;Administration"><link rel="prev" href="ch01s08.html" title="8.&nbsp;Notifications par mail"><link rel="next" href="ch02.html" title="Chapter&nbsp;2.&nbsp;Projets"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">9.&nbsp;Informations</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch01s08.html">Prev</a>&nbsp;</td><th width="60%" align="center">Chapter&nbsp;1.&nbsp;Administration</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="ch02.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e185"></a>9.&nbsp;Informations</h2></div></div></div><p>Affiche des informations relatives &agrave; l'application et &agrave; son environnement.</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch01s08.html">Prev</a>&nbsp;</td><td width="20%" align="center"><a accesskey="u" href="ch01.html">Up</a></td><td width="40%" align="right">&nbsp;<a accesskey="n" href="ch02.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">8.&nbsp;Notifications par mail&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">&nbsp;Chapter&nbsp;2.&nbsp;Projets</td></tr></table></div></body></html> No newline at end of file
@@ -0,0 +1,3
1 <html><head>
2 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
3 <title>Chapter&nbsp;2.&nbsp;Projets</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="index.html" title="Documentation redMine"><link rel="prev" href="ch01s09.html" title="9.&nbsp;Informations"><link rel="next" href="ch02s01.html" title="1.&nbsp;Aper&ccedil;u du projet"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter&nbsp;2.&nbsp;Projets</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch01s09.html">Prev</a>&nbsp;</td><th width="60%" align="center">&nbsp;</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="ch02s01.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="d0e190"></a>Chapter&nbsp;2.&nbsp;Projets</h2></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="section"><a href="ch02s01.html">1. Aper&ccedil;u du projet</a></span></dt><dt><span class="section"><a href="ch02s02.html">2. Gestion des demandes</a></span></dt><dd><dl><dt><span class="section"><a href="ch02s02.html#d0e204">2.1. Liste des demandes</a></span></dt></dl></dd><dt><span class="section"><a href="ch02s03.html">3. Rapports</a></span></dt><dt><span class="section"><a href="ch02s04.html">4. Historique</a></span></dt><dt><span class="section"><a href="ch02s05.html">5. Annonces</a></span></dt><dt><span class="section"><a href="ch02s06.html">6. Documents</a></span></dt><dt><span class="section"><a href="ch02s07.html">7. Fichiers</a></span></dt><dt><span class="section"><a href="ch02s08.html">8. Configuration du projet</a></span></dt><dd><dl><dt><span class="section"><a href="ch02s08.html#d0e248">8.1. Propri&eacute;t&eacute;s du projet</a></span></dt><dt><span class="section"><a href="ch02s08.html#d0e264">8.2. Membres</a></span></dt><dt><span class="section"><a href="ch02s08.html#d0e269">8.3. Versions</a></span></dt><dt><span class="section"><a href="ch02s08.html#d0e274">8.4. Cat&eacute;gories des demandes</a></span></dt></dl></dd></dl></div><p></p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch01s09.html">Prev</a>&nbsp;</td><td width="20%" align="center">&nbsp;</td><td width="40%" align="right">&nbsp;<a accesskey="n" href="ch02s01.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">9.&nbsp;Informations&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">&nbsp;1.&nbsp;Aper&ccedil;u du projet</td></tr></table></div></body></html> No newline at end of file
@@ -0,0 +1,3
1 <html><head>
2 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
3 <title>1.&nbsp;Aper&ccedil;u du projet</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch02.html" title="Chapter&nbsp;2.&nbsp;Projets"><link rel="prev" href="ch02.html" title="Chapter&nbsp;2.&nbsp;Projets"><link rel="next" href="ch02s02.html" title="2.&nbsp;Gestion des demandes"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">1.&nbsp;Aper&ccedil;u du projet</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02.html">Prev</a>&nbsp;</td><th width="60%" align="center">Chapter&nbsp;2.&nbsp;Projets</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="ch02s02.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e194"></a>1.&nbsp;Aper&ccedil;u du projet</h2></div></div></div><p>L'aper&ccedil;u vous pr&eacute;sente les informations g&eacute;n&eacute;rales relatives au projet, les principaux membres, les derni&egrave;res annonces, ainsi qu'une synth&egrave;se du nombre de demandes ouvertes par tracker.</p><p></p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch02.html">Prev</a>&nbsp;</td><td width="20%" align="center"><a accesskey="u" href="ch02.html">Up</a></td><td width="40%" align="right">&nbsp;<a accesskey="n" href="ch02s02.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter&nbsp;2.&nbsp;Projets&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">&nbsp;2.&nbsp;Gestion des demandes</td></tr></table></div></body></html> No newline at end of file
@@ -0,0 +1,3
1 <html><head>
2 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
3 <title>2.&nbsp;Gestion des demandes</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch02.html" title="Chapter&nbsp;2.&nbsp;Projets"><link rel="prev" href="ch02s01.html" title="1.&nbsp;Aper&ccedil;u du projet"><link rel="next" href="ch02s03.html" title="3.&nbsp;Rapports"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">2.&nbsp;Gestion des demandes</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02s01.html">Prev</a>&nbsp;</td><th width="60%" align="center">Chapter&nbsp;2.&nbsp;Projets</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="ch02s03.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e200"></a>2.&nbsp;Gestion des demandes</h2></div></div></div><p></p><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="d0e204"></a>2.1.&nbsp;Liste des demandes</h3></div></div></div><p>Par d&eacute;faut, l'ensemble des demandes ouvertes du projet sont affich&eacute;es. Diff&eacute;rents filtres vous permettent de s&eacute;lectionner les demandes &agrave; afficher. Si le projet comporte des sous-projets, vous avez la possibilit&eacute; d'afficher &eacute;galement les demandes relatives aux sous-projets (non affich&eacute;es par d&eacute;faut).</p><p>Une fois appliqu&eacute;, un filtre reste valable durant toute votre session. Vous pouvez le red&eacute;finir, ou le supprimer en cliquant sur Annuler.</p><p></p><div class="screenshot"><div class="mediaobject"><img src="resources/issues_list.png"></div></div><p></p></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch02s01.html">Prev</a>&nbsp;</td><td width="20%" align="center"><a accesskey="u" href="ch02.html">Up</a></td><td width="40%" align="right">&nbsp;<a accesskey="n" href="ch02s03.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">1.&nbsp;Aper&ccedil;u du projet&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">&nbsp;3.&nbsp;Rapports</td></tr></table></div></body></html> No newline at end of file
@@ -0,0 +1,3
1 <html><head>
2 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
3 <title>3.&nbsp;Rapports</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch02.html" title="Chapter&nbsp;2.&nbsp;Projets"><link rel="prev" href="ch02s02.html" title="2.&nbsp;Gestion des demandes"><link rel="next" href="ch02s04.html" title="4.&nbsp;Historique"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">3.&nbsp;Rapports</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02s02.html">Prev</a>&nbsp;</td><th width="60%" align="center">Chapter&nbsp;2.&nbsp;Projets</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="ch02s04.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e219"></a>3.&nbsp;Rapports</h2></div></div></div><p>Cet &eacute;cran pr&eacute;sente la synth&egrave;se du nombre de demandes par statut et selon diff&eacute;rents crit&egrave;res (tracker, priorit&eacute;, cat&eacute;gorie). Des liens directs permettent d'acc&eacute;der &agrave; la liste d&eacute;taill&eacute;e des demandes pour chaque crit&egrave;re.</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch02s02.html">Prev</a>&nbsp;</td><td width="20%" align="center"><a accesskey="u" href="ch02.html">Up</a></td><td width="40%" align="right">&nbsp;<a accesskey="n" href="ch02s04.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">2.&nbsp;Gestion des demandes&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">&nbsp;4.&nbsp;Historique</td></tr></table></div></body></html> No newline at end of file
@@ -0,0 +1,3
1 <html><head>
2 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
3 <title>4.&nbsp;Historique</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch02.html" title="Chapter&nbsp;2.&nbsp;Projets"><link rel="prev" href="ch02s03.html" title="3.&nbsp;Rapports"><link rel="next" href="ch02s05.html" title="5.&nbsp;Annonces"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">4.&nbsp;Historique</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02s03.html">Prev</a>&nbsp;</td><th width="60%" align="center">Chapter&nbsp;2.&nbsp;Projets</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="ch02s05.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e224"></a>4.&nbsp;Historique</h2></div></div></div><p>Cette page pr&eacute;sente l'ensemble des demandes r&eacute;solues dans chacune des versions du projet. Certains types de demande peuvent &ecirc;tre exclus de cet affichage.</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch02s03.html">Prev</a>&nbsp;</td><td width="20%" align="center"><a accesskey="u" href="ch02.html">Up</a></td><td width="40%" align="right">&nbsp;<a accesskey="n" href="ch02s05.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">3.&nbsp;Rapports&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">&nbsp;5.&nbsp;Annonces</td></tr></table></div></body></html> No newline at end of file
@@ -0,0 +1,3
1 <html><head>
2 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
3 <title>5.&nbsp;Annonces</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch02.html" title="Chapter&nbsp;2.&nbsp;Projets"><link rel="prev" href="ch02s04.html" title="4.&nbsp;Historique"><link rel="next" href="ch02s06.html" title="6.&nbsp;Documents"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">5.&nbsp;Annonces</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02s04.html">Prev</a>&nbsp;</td><th width="60%" align="center">Chapter&nbsp;2.&nbsp;Projets</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="ch02s06.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e229"></a>5.&nbsp;Annonces</h2></div></div></div><p>Les nouvelles vous permettent d'informer les utilisateurs sur l'activit&eacute; du projet.</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch02s04.html">Prev</a>&nbsp;</td><td width="20%" align="center"><a accesskey="u" href="ch02.html">Up</a></td><td width="40%" align="right">&nbsp;<a accesskey="n" href="ch02s06.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">4.&nbsp;Historique&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">&nbsp;6.&nbsp;Documents</td></tr></table></div></body></html> No newline at end of file
@@ -0,0 +1,3
1 <html><head>
2 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
3 <title>6.&nbsp;Documents</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch02.html" title="Chapter&nbsp;2.&nbsp;Projets"><link rel="prev" href="ch02s05.html" title="5.&nbsp;Annonces"><link rel="next" href="ch02s07.html" title="7.&nbsp;Fichiers"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">6.&nbsp;Documents</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02s05.html">Prev</a>&nbsp;</td><th width="60%" align="center">Chapter&nbsp;2.&nbsp;Projets</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="ch02s07.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e234"></a>6.&nbsp;Documents</h2></div></div></div><p>Les documents sont group&eacute;s par cat&eacute;gories (voir Listes de valeurs). Un document peut contenir plusieurs fichiers (exemple: r&eacute;visions ou versions successives).</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch02s05.html">Prev</a>&nbsp;</td><td width="20%" align="center"><a accesskey="u" href="ch02.html">Up</a></td><td width="40%" align="right">&nbsp;<a accesskey="n" href="ch02s07.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">5.&nbsp;Annonces&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">&nbsp;7.&nbsp;Fichiers</td></tr></table></div></body></html> No newline at end of file
@@ -0,0 +1,3
1 <html><head>
2 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
3 <title>7.&nbsp;Fichiers</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch02.html" title="Chapter&nbsp;2.&nbsp;Projets"><link rel="prev" href="ch02s06.html" title="6.&nbsp;Documents"><link rel="next" href="ch02s08.html" title="8.&nbsp;Configuration du projet"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">7.&nbsp;Fichiers</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02s06.html">Prev</a>&nbsp;</td><th width="60%" align="center">Chapter&nbsp;2.&nbsp;Projets</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="ch02s08.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e239"></a>7.&nbsp;Fichiers</h2></div></div></div><p>Ce module vous permet de publier les diff&eacute;rents fichiers (sources, binaires, ...) pour chaque version de l'application.</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch02s06.html">Prev</a>&nbsp;</td><td width="20%" align="center"><a accesskey="u" href="ch02.html">Up</a></td><td width="40%" align="right">&nbsp;<a accesskey="n" href="ch02s08.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">6.&nbsp;Documents&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">&nbsp;8.&nbsp;Configuration du projet</td></tr></table></div></body></html> No newline at end of file
@@ -0,0 +1,3
1 <html><head>
2 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
3 <title>8.&nbsp;Configuration du projet</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch02.html" title="Chapter&nbsp;2.&nbsp;Projets"><link rel="prev" href="ch02s07.html" title="7.&nbsp;Fichiers"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">8.&nbsp;Configuration du projet</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02s07.html">Prev</a>&nbsp;</td><th width="60%" align="center">Chapter&nbsp;2.&nbsp;Projets</th><td width="20%" align="right">&nbsp;</td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e244"></a>8.&nbsp;Configuration du projet</h2></div></div></div><p></p><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="d0e248"></a>8.1.&nbsp;Propri&eacute;t&eacute;s du projet</h3></div></div></div><p></p><div class="itemizedlist"><ul type="disc"><li><p><span class="guilabel">Public</span>: si le projet est public, il sera visible (consultation des demandes, des documents, ...) pour l'ensemble des utilisateurs, y compris ceux qui ne sont pas membres du projet. Si le projet n'est pas public, seuls les membres du projet y ont acc&egrave;s, en fonction de leur r&ocirc;le.</p></li><li><p><span class="guilabel">Champs personnalis&eacute;s</span>: s&eacute;lectionner les champs personnalis&eacute;s que vous souhaitez utiliser au sein du projet. Seul l'administrateur peut ajouter de nouveaux champs personnalis&eacute;s.</p></li></ul></div><p></p></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="d0e264"></a>8.2.&nbsp;Membres</h3></div></div></div><p>Cet &eacute;cran vous permet de d&eacute;finir les membres du projet ainsi que leurs r&ocirc;les respectifs. Un utilisateur ne peut avoir qu'un r&ocirc;le au sein d'un projet donn&eacute;. Le r&ocirc;le d'un membre d&eacute;termine les permissions dont il b&eacute;n&eacute;ficie sur le projet.</p></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="d0e269"></a>8.3.&nbsp;Versions</h3></div></div></div><p>Les versions vous permettent de suivre les changements survenus tout au long du projet. A la fermeture d'une demande, vous pouvez par exemple indiquer quelle version la prend en compte. Vous pouvez par ailleurs publier les diff&eacute;rentes versions de l'application (voir Fichiers).</p></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="d0e274"></a>8.4.&nbsp;Cat&eacute;gories des demandes</h3></div></div></div><p>Les cat&eacute;gories de demande vous permettent de typer les demandes. Les cat&eacute;gories peuvent par exemple correspondre aux diff&eacute;rents modules du projet.</p></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch02s07.html">Prev</a>&nbsp;</td><td width="20%" align="center"><a accesskey="u" href="ch02.html">Up</a></td><td width="40%" align="right">&nbsp;</td></tr><tr><td width="40%" align="left" valign="top">7.&nbsp;Fichiers&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">&nbsp;</td></tr></table></div></body></html> No newline at end of file
@@ -0,0 +1,55
1 body {
2 background: #FFFFFF;
3 font: 0.8em Verdana,Tahoma,Arial,sans-serif;
4 }
5
6 h1, h2, h3, h4, h5 {
7 color: #800000;
8 font-family: sans-serif;
9 }
10
11 table {
12 font-size: 1em;
13 }
14
15 a{
16 color:#467aa7;
17 font-weight:bold;
18 text-decoration:none;
19 background-color:inherit;
20 }
21
22 a:hover{
23 color: #800000;
24 text-decoration:underline;
25 background-color:inherit;
26 }
27
28 a img{border:none;}
29
30 .screenshot {
31 text-align: center;
32 }
33
34 .guilabel {
35 font-weight: bold;
36 }
37
38 span.term {
39 font-weight: bold;
40 }
41
42 div.sidebar {
43 background: #F0F0F0;
44 border: 1px solid gray;
45 padding: 5px;
46 margin: 20px;
47 }
48
49 pre.programlisting {
50 background: #F0F0F0;
51 border: 1px solid gray;
52 padding: 2px;
53 font-size: 10pt;
54 white-space: pre;
55 }
@@ -0,0 +1,3
1 <html><head>
2 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
3 <title>Documentation redMine</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="next" href="ch01.html" title="Chapter&nbsp;1.&nbsp;Administration"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Documentation redMine</th></tr><tr><td width="20%" align="left">&nbsp;</td><th width="60%" align="center">&nbsp;</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="ch01.html">Next</a></td></tr></table><hr></div><div class="book" lang="en"><div class="titlepage"><div><div><h1 class="title"><a name="d0e1"></a>Documentation redMine</h1></div></div><hr></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="chapter"><a href="ch01.html">1. Administration</a></span></dt><dd><dl><dt><span class="section"><a href="ch01s01.html">1. Utilisateurs</a></span></dt><dd><dl><dt><span class="section"><a href="ch01s01.html#d0e12">1.1. Liste des utilisateurs</a></span></dt><dt><span class="section"><a href="ch01s01.html#d0e26">1.2. Cr&eacute;ation ou modification d'un utilisateur</a></span></dt></dl></dd><dt><span class="section"><a href="ch01s02.html">2. R&ocirc;les et permissions</a></span></dt><dt><span class="section"><a href="ch01s03.html">3. Trackers</a></span></dt><dt><span class="section"><a href="ch01s04.html">4. Champs personnalis&eacute;s</a></span></dt><dt><span class="section"><a href="ch01s05.html">5. Statut des demandes</a></span></dt><dt><span class="section"><a href="ch01s06.html">6. Workflow</a></span></dt><dt><span class="section"><a href="ch01s07.html">7. Listes de valeurs</a></span></dt><dt><span class="section"><a href="ch01s08.html">8. Notifications par mail</a></span></dt><dt><span class="section"><a href="ch01s09.html">9. Informations</a></span></dt></dl></dd><dt><span class="chapter"><a href="ch02.html">2. Projets</a></span></dt><dd><dl><dt><span class="section"><a href="ch02s01.html">1. Aper&ccedil;u du projet</a></span></dt><dt><span class="section"><a href="ch02s02.html">2. Gestion des demandes</a></span></dt><dd><dl><dt><span class="section"><a href="ch02s02.html#d0e204">2.1. Liste des demandes</a></span></dt></dl></dd><dt><span class="section"><a href="ch02s03.html">3. Rapports</a></span></dt><dt><span class="section"><a href="ch02s04.html">4. Historique</a></span></dt><dt><span class="section"><a href="ch02s05.html">5. Annonces</a></span></dt><dt><span class="section"><a href="ch02s06.html">6. Documents</a></span></dt><dt><span class="section"><a href="ch02s07.html">7. Fichiers</a></span></dt><dt><span class="section"><a href="ch02s08.html">8. Configuration du projet</a></span></dt><dd><dl><dt><span class="section"><a href="ch02s08.html#d0e248">8.1. Propri&eacute;t&eacute;s du projet</a></span></dt><dt><span class="section"><a href="ch02s08.html#d0e264">8.2. Membres</a></span></dt><dt><span class="section"><a href="ch02s08.html#d0e269">8.3. Versions</a></span></dt><dt><span class="section"><a href="ch02s08.html#d0e274">8.4. Cat&eacute;gories des demandes</a></span></dt></dl></dd></dl></dd></dl></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left">&nbsp;</td><td width="20%" align="center">&nbsp;</td><td width="40%" align="right">&nbsp;<a accesskey="n" href="ch01.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">&nbsp;</td><td width="20%" align="center">&nbsp;</td><td width="40%" align="right" valign="top">&nbsp;Chapter&nbsp;1.&nbsp;Administration</td></tr></table></div></body></html> No newline at end of file
1 NO CONTENT: new file 100644, binary diff hidden
NO CONTENT: new file 100644, binary diff hidden
1 NO CONTENT: new file 100644, binary diff hidden
NO CONTENT: new file 100644, binary diff hidden
@@ -0,0 +1,76
1 # redMine - project management software
2 # Copyright (C) 2006 Jean-Philippe Lang
3 #
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
18 require "#{File.dirname(__FILE__)}/../test_helper"
19
20 class AccountTest < ActionController::IntegrationTest
21 fixtures :users
22
23 # Replace this with your real tests.
24 def test_login
25 get "account/my_page"
26 assert_redirected_to "account/login"
27 log_user('plochon', 'admin')
28
29 get "account/my_account"
30 assert_response :success
31 assert_template "account/my_account"
32 end
33
34 def test_change_password
35 log_user('plochon', 'admin')
36 get "account/my_account"
37 assert_response :success
38 assert_template "account/my_account"
39
40 post "account/change_password", :password => 'admin', :new_password => "hello", :new_password_confirmation => "hello2"
41 assert_response :success
42 assert_tag :tag => "div", :attributes => { :class => "errorExplanation" }
43
44 post "account/change_password", :password => 'admiN', :new_password => "hello", :new_password_confirmation => "hello"
45 assert_response :success
46 assert_equal 'Wrong password', flash[:notice]
47
48 post "account/change_password", :password => 'admin', :new_password => "hello", :new_password_confirmation => "hello"
49 assert_response :success
50 log_user('plochon', 'hello')
51 end
52
53 def test_my_account
54 log_user('plochon', 'admin')
55 get "account/my_account"
56 assert_response :success
57 assert_template "account/my_account"
58
59 post "account/my_account", :user => {:firstname => "Joe", :login => "root", :admin => 1}
60 assert_response :success
61 assert_template "account/my_account"
62 user = User.find(2)
63 assert_equal "Joe", user.firstname
64 assert_equal "plochon", user.login
65 assert_equal false, user.admin?
66
67 log_user('plochon', 'admin')
68 end
69
70 def test_my_page
71 log_user('plochon', 'admin')
72 get "account/my_page"
73 assert_response :success
74 assert_template "account/my_page"
75 end
76 end
@@ -0,0 +1,61
1 # redMine - project management software
2 # Copyright (C) 2006 Jean-Philippe Lang
3 #
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
18 require "#{File.dirname(__FILE__)}/../test_helper"
19
20 class AdminTest < ActionController::IntegrationTest
21 fixtures :users
22
23 def test_add_user
24 log_user("admin", "admin")
25 get "/users/add"
26 assert_response :success
27 assert_template "users/add"
28 post "/users/add", :user => { :login => "jsmith", :firstname => "John", :lastname => "Smith", :mail => "jsmith@somenet.foo", :language => "en" }, :password => "jsmith09", :password_confirmation => "jsmith09"
29 assert_redirected_to "users/list"
30
31 user = User.find_by_login("jsmith")
32 assert_kind_of User, user
33 logged_user = User.try_to_login("jsmith", "jsmith09")
34 assert_kind_of User, logged_user
35 assert_equal "John", logged_user.firstname
36
37 post "users/edit", :id => user.id, :user => { :locked => 1 }
38 assert_redirected_to "users/list"
39 locked_user = User.try_to_login("jsmith", "jsmith09")
40 assert_equal nil, locked_user
41 end
42
43 def test_add_project
44 log_user("admin", "admin")
45 get "projects/add"
46 assert_response :success
47 assert_template "projects/add"
48 post "projects/add", :project => { :name => "blog", :descr => "weblog", :is_public => 1}
49 assert_redirected_to "admin/projects"
50 assert_equal 'Project was successfully created.', flash[:notice]
51
52 project = Project.find_by_name("blog")
53 assert_kind_of Project, project
54 assert_equal "weblog", project.descr
55 assert_equal true, project.is_public?
56
57 get "admin/projects"
58 assert_response :success
59 assert_template "admin/projects"
60 end
61 end
@@ -16,31 +16,30
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 class AccountController < ApplicationController
18 class AccountController < ApplicationController
19 layout 'base'
19 layout 'base'
20
20 # prevents login action to be filtered by check_if_login_required application scope filter
21 # prevents login action to be filtered by check_if_login_required application scope filter
21 skip_before_filter :check_if_login_required, :only => :login
22 skip_before_filter :check_if_login_required, :only => :login
22 before_filter :require_login, :except => [:show, :login]
23 before_filter :require_login, :except => [:show, :login]
23
24
24 def show
25 def show
25 @user = User.find(params[:id])
26 @user = User.find(params[:id])
26 end
27 end
27
28
28 # Login request and validation
29 # Login request and validation
29 def login
30 def login
30 if request.get?
31 if request.get?
31 session[:user] = nil
32 session[:user] = nil
32 @user = User.new
33 else
33 else
34 logged_in_user = User.try_to_login(params[:login], params[:password])
34 @user = User.new(params[:user])
35 if logged_in_user
35 logged_in_user = @user.try_to_login
36 session[:user] = logged_in_user
36 if logged_in_user
37 redirect_back_or_default :controller => 'account', :action => 'my_page'
37 session[:user] = logged_in_user
38 else
38 redirect_back_or_default :controller => 'account', :action => 'my_page'
39 flash[:notice] = _('Invalid user/password')
39 else
40 end
40 flash[:notice] = _('Invalid user/password')
41 end
41 end
42 end
42 end
43 end
44
43
45 # Log out current user and redirect to welcome page
44 # Log out current user and redirect to welcome page
46 def logout
45 def logout
@@ -64,20 +63,15 class AccountController < ApplicationController
64 end
63 end
65 end
64 end
66
65
67 # Change current user's password
66 # Change current user's password
68 def change_password
67 def change_password
69 @user = User.find(session[:user].id)
68 @user = User.find(session[:user].id)
70 if @user.check_password?(@params[:old_password])
69 if @user.check_password?(@params[:password])
71 if @params[:new_password] == @params[:new_password_confirmation]
70 @user.password, @user.password_confirmation = params[:new_password], params[:new_password_confirmation]
72 if @user.change_password(@params[:old_password], @params[:new_password])
71 flash[:notice] = 'Password was successfully updated.' if @user.save
73 flash[:notice] = 'Password was successfully updated.'
72 else
74 end
73 flash[:notice] = 'Wrong password'
75 else
74 end
76 flash[:notice] = 'Password confirmation doesn\'t match!'
75 render :action => 'my_account'
77 end
76 end
78 else
79 flash[:notice] = 'Wrong password'
80 end
81 render :action => 'my_account'
82 end
83 end
77 end
@@ -16,26 +16,32
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 class AdminController < ApplicationController
18 class AdminController < ApplicationController
19 layout 'base'
19 layout 'base'
20 before_filter :require_admin
20 before_filter :require_admin
21
21
22 helper :sort
22 helper :sort
23 include SortHelper
23 include SortHelper
24
24
25 def index
25 def index
26 end
26 end
27
27
28 def projects
28 def projects
29 sort_init 'projects.name', 'asc'
29 sort_init 'name', 'asc'
30 sort_update
30 sort_update
31 @project_pages, @projects = paginate :projects, :per_page => 15, :order => sort_clause
31 @project_count = Project.count
32 @project_pages = Paginator.new self, @project_count,
33 15,
34 @params['page']
35 @projects = Project.find :all, :order => sort_clause,
36 :limit => @project_pages.items_per_page,
37 :offset => @project_pages.current.offset
32 end
38 end
33
39
34 def mail_options
40 def mail_options
35 @actions = Permission.find(:all, :conditions => ["mail_option=?", true]) || []
41 @actions = Permission.find(:all, :conditions => ["mail_option=?", true]) || []
36 if request.post?
42 if request.post?
37 @actions.each { |a|
43 @actions.each { |a|
38 a.mail_enabled = params[:action_ids].include? a.id.to_s
44 a.mail_enabled = (params[:action_ids] || []).include? a.id.to_s
39 a.save
45 a.save
40 }
46 }
41 flash[:notice] = "Mail options were successfully updated."
47 flash[:notice] = "Mail options were successfully updated."
@@ -44,6 +50,5 class AdminController < ApplicationController
44
50
45 def info
51 def info
46 @adapter_name = ActiveRecord::Base.connection.adapter_name
52 @adapter_name = ActiveRecord::Base.connection.adapter_name
47 end
53 end
48
49 end
54 end
@@ -24,63 +24,73 class ApplicationController < ActionController::Base
24 end
24 end
25
25
26 def set_localization
26 def set_localization
27 Localization.lang = session[:user].nil? ? RDM_DEFAULT_LANG : (session[:user].language || RDM_DEFAULT_LANG)
27 Localization.lang = begin
28 if session[:user]
29 session[:user].language
30 elsif request.env['HTTP_ACCEPT_LANGUAGE']
31 accept_lang = HTTPUtils.parse_qvalues(request.env['HTTP_ACCEPT_LANGUAGE']).first.split('-').first
32 if Localization.langs.collect{ |l| l[1] }.include? accept_lang
33 accept_lang
34 end
35 end
36 rescue
37 nil
38 end || RDM_DEFAULT_LANG
28 end
39 end
29
40
30 def require_login
41 def require_login
31 unless session[:user]
42 unless session[:user]
32 store_location
43 store_location
33 redirect_to(:controller => "account", :action => "login")
44 redirect_to(:controller => "account", :action => "login")
34 end
45 end
35 end
46 end
36
47
37 def require_admin
48 def require_admin
38 if session[:user].nil?
49 if session[:user].nil?
39 store_location
50 store_location
40 redirect_to(:controller => "account", :action => "login")
51 redirect_to(:controller => "account", :action => "login")
41 else
52 else
42 unless session[:user].admin?
53 unless session[:user].admin?
43 flash[:notice] = "Acces not allowed"
54 flash[:notice] = "Acces not allowed"
44 redirect_to(:controller => "projects", :action => "list")
55 redirect_to(:controller => "projects", :action => "list")
45 end
56 end
46 end
57 end
47 end
58 end
48
59
49 # authorizes the user for the requested action.
60 # authorizes the user for the requested action.
50 def authorize
61 def authorize
51 # check if action is allowed on public projects
62 # check if action is allowed on public projects
52 if @project.public? and Permission.allowed_to_public "%s/%s" % [ @params[:controller], @params[:action] ]
63 if @project.is_public? and Permission.allowed_to_public "%s/%s" % [ @params[:controller], @params[:action] ]
53 return true
64 return true
54 end
65 end
55 # if user is not logged in, he is redirect to login form
66 # if user not logged in, redirect to login form
56 unless session[:user]
67 unless session[:user]
57 store_location
68 store_location
58 redirect_to(:controller => "account", :action => "login")
69 redirect_to(:controller => "account", :action => "login")
59 return false
70 return false
60 end
71 end
61 # check if user is authorized
72 # if logged in, check if authorized
62 if session[:user].admin? or Permission.allowed_to_role( "%s/%s" % [ @params[:controller], @params[:action] ], session[:user].role_for_project(@project.id) )
73 if session[:user].admin? or Permission.allowed_to_role( "%s/%s" % [ @params[:controller], @params[:action] ], session[:user].role_for_project(@project.id) )
63 return true
74 return true
64 end
75 end
65 flash[:notice] = "Acces denied"
76 flash[:notice] = "Acces denied"
66 redirect_to(:controller => "")
77 redirect_to(:controller => "")
67 return false
78 false
68 end
79 end
69
80
70 # store current uri in the session.
81 # store current uri in session.
71 # we can return to this location by calling redirect_back_or_default
82 # return to this location by calling redirect_back_or_default
72 def store_location
83 def store_location
73 session[:return_to] = @request.request_uri
84 session[:return_to] = @request.request_uri
74 end
85 end
75
86
76 # move to the last store_location call or to the passed default one
87 # move to the last store_location call or to the passed default one
77 def redirect_back_or_default(default)
88 def redirect_back_or_default(default)
78 if session[:return_to].nil?
89 if session[:return_to].nil?
79 redirect_to default
90 redirect_to default
80 else
91 else
81 redirect_to_url session[:return_to]
92 redirect_to_url session[:return_to]
82 session[:return_to] = nil
93 session[:return_to] = nil
83 end
94 end
84 end
95 end
85
86 end No newline at end of file
96 end
@@ -16,28 +16,32
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 class HelpController < ApplicationController
18 class HelpController < ApplicationController
19
19
20 skip_before_filter :check_if_login_required
20 skip_before_filter :check_if_login_required
21 before_filter :load_help_config
21 before_filter :load_help_config
22
22
23 def index
23 # displays help page for the requested controller/action
24 if @params[:ctrl] and @help_config[@params[:ctrl]]
24 def index
25 if @params[:page] and @help_config[@params[:ctrl]][@params[:page]]
25 # select help page to display
26 template = @help_config[@params[:ctrl]][@params[:page]]
26 if @params[:ctrl] and @help_config['pages'][@params[:ctrl]]
27 else
27 if @params[:page] and @help_config['pages'][@params[:ctrl]][@params[:page]]
28 template = @help_config[@params[:ctrl]]['index']
28 template = @help_config['pages'][@params[:ctrl]][@params[:page]]
29 end
29 else
30 end
30 template = @help_config['pages'][@params[:ctrl]]['index']
31
31 end
32 end
33 # choose language according to available help translations
34 lang = (@help_config['langs'].include? Localization.lang) ? Localization.lang : @help_config['langs'].first
35
32 if template
36 if template
33 redirect_to "/manual/#{template}"
37 redirect_to "/manual/#{lang}/#{template}"
34 else
38 else
35 redirect_to "/manual/"
39 redirect_to "/manual/#{lang}/"
36 end
40 end
37 end
41 end
38
42
39 private
43 private
40 def load_help_config
44 def load_help_config
41 @help_config = YAML::load(File.open("#{RAILS_ROOT}/config/help.yml"))
45 @help_config = YAML::load(File.open("#{RAILS_ROOT}/config/help.yml"))
42 end
46 end
43 end
47 end
@@ -32,58 +32,62 class ProjectsController < ApplicationController
32 render :action => 'list'
32 render :action => 'list'
33 end
33 end
34
34
35 # Lists public projects
35 # Lists public projects
36 def list
36 def list
37 sort_init 'projects.name', 'asc'
37 sort_init 'name', 'asc'
38 sort_update
38 sort_update
39 @project_count = Project.count(["public=?", true])
39 @project_count = Project.count(["is_public=?", true])
40 @project_pages = Paginator.new self, @project_count,
40 @project_pages = Paginator.new self, @project_count,
41 15,
41 15,
42 @params['page']
42 @params['page']
43 @projects = Project.find :all, :order => sort_clause,
43 @projects = Project.find :all, :order => sort_clause,
44 :conditions => ["public=?", true],
44 :conditions => ["is_public=?", true],
45 :limit => @project_pages.items_per_page,
45 :limit => @project_pages.items_per_page,
46 :offset => @project_pages.current.offset
46 :offset => @project_pages.current.offset
47 end
47 end
48
48
49 # Add a new project
49 # Add a new project
50 def add
50 def add
51 @custom_fields = CustomField::find_all
51 @custom_fields = CustomField::find_all
52 @project = Project.new(params[:project])
52 @root_projects = Project::find(:all, :conditions => "parent_id is null")
53 if request.post?
53 @project = Project.new(params[:project])
54 @project.custom_fields = CustomField.find(@params[:custom_field_ids]) if @params[:custom_field_ids]
54 if request.post?
55 if @project.save
55 @project.custom_fields = CustomField.find(@params[:custom_field_ids]) if @params[:custom_field_ids]
56 flash[:notice] = 'Project was successfully created.'
56 if @project.save
57 redirect_to :controller => 'admin', :action => 'projects'
57 flash[:notice] = 'Project was successfully created.'
58 end
58 redirect_to :controller => 'admin', :action => 'projects'
59 end
59 end
60 end
60 end
61 end
61
62
62 # Show @project
63 # Show @project
63 def show
64 def show
64 @members = @project.members.find(:all, :include => [:user, :role])
65 @members = @project.members.find(:all, :include => [:user, :role])
65 end
66 @subprojects = @project.children if @project.children_count > 0
67 @news = @project.news.find(:all, :limit => 5, :include => [ :author, :project ], :order => "news.created_on DESC")
68 end
66
69
67 def settings
70 def settings
68 @custom_fields = CustomField::find_all
71 @root_projects = Project::find(:all, :conditions => ["parent_id is null and id <> ?", @project.id])
69 @issue_category ||= IssueCategory.new
72 @custom_fields = CustomField::find_all
73 @issue_category ||= IssueCategory.new
70 @member ||= @project.members.new
74 @member ||= @project.members.new
71 @roles = Role.find_all
75 @roles = Role.find_all
72 @users = User.find_all - @project.members.find(:all, :include => :user).collect{|m| m.user }
76 @users = User.find_all - @project.members.find(:all, :include => :user).collect{|m| m.user }
73 end
77 end
74
78
75 # Edit @project
79 # Edit @project
76 def edit
80 def edit
77 if request.post?
81 if request.post?
78 @project.custom_fields = CustomField.find(@params[:custom_field_ids]) if @params[:custom_field_ids]
82 @project.custom_fields = CustomField.find(@params[:custom_field_ids]) if @params[:custom_field_ids]
79 if @project.update_attributes(params[:project])
83 if @project.update_attributes(params[:project])
80 flash[:notice] = 'Project was successfully updated.'
84 flash[:notice] = 'Project was successfully updated.'
81 redirect_to :action => 'settings', :id => @project
85 redirect_to :action => 'settings', :id => @project
82 else
86 else
83 settings
87 settings
84 render :action => 'settings'
88 render :action => 'settings'
85 end
89 end
86 end
90 end
87 end
91 end
88
92
89 # Delete @project
93 # Delete @project
@@ -181,7 +185,7 class ProjectsController < ApplicationController
181 end
185 end
182 end
186 end
183
187
184 # Show issues list of @project
188 # Show filtered/sorted issues list of @project
185 def list_issues
189 def list_issues
186 sort_init 'issues.id', 'desc'
190 sort_init 'issues.id', 'desc'
187 sort_update
191 sort_update
@@ -189,10 +193,10 class ProjectsController < ApplicationController
189 search_filter_init_list_issues
193 search_filter_init_list_issues
190 search_filter_update if params[:set_filter] or request.post?
194 search_filter_update if params[:set_filter] or request.post?
191
195
192 @issue_count = Issue.count(:include => :status, :conditions => search_filter_clause)
196 @issue_count = Issue.count(:include => [:status, :project], :conditions => search_filter_clause)
193 @issue_pages = Paginator.new self, @issue_count, 15, @params['page']
197 @issue_pages = Paginator.new self, @issue_count, 15, @params['page']
194 @issues = Issue.find :all, :order => sort_clause,
198 @issues = Issue.find :all, :order => sort_clause,
195 :include => [ :author, :status, :tracker ],
199 :include => [ :author, :status, :tracker, :project ],
196 :conditions => search_filter_clause,
200 :conditions => search_filter_clause,
197 :limit => @issue_pages.items_per_page,
201 :limit => @issue_pages.items_per_page,
198 :offset => @issue_pages.current.offset
202 :offset => @issue_pages.current.offset
@@ -206,7 +210,7 class ProjectsController < ApplicationController
206 search_filter_init_list_issues
210 search_filter_init_list_issues
207
211
208 @issues = Issue.find :all, :order => sort_clause,
212 @issues = Issue.find :all, :order => sort_clause,
209 :include => [ :author, :status, :tracker ],
213 :include => [ :author, :status, :tracker, :project ],
210 :conditions => search_filter_clause
214 :conditions => search_filter_clause
211
215
212 export = StringIO.new
216 export = StringIO.new
@@ -62,9 +62,6 class RolesController < ApplicationController
62 end
62 end
63
63
64 def workflow
64 def workflow
65 @roles = Role.find_all
66 @trackers = Tracker.find_all
67 @statuses = IssueStatus.find_all
68
65
69 @role = Role.find_by_id(params[:role_id])
66 @role = Role.find_by_id(params[:role_id])
70 @tracker = Tracker.find_by_id(params[:tracker_id])
67 @tracker = Tracker.find_by_id(params[:tracker_id])
@@ -80,5 +77,8 class RolesController < ApplicationController
80 flash[:notice] = 'Workflow was successfully updated.'
77 flash[:notice] = 'Workflow was successfully updated.'
81 end
78 end
82 end
79 end
80 @roles = Role.find_all
81 @trackers = Tracker.find_all
82 @statuses = IssueStatus.find(:all, :include => :workflows)
83 end
83 end
84 end
84 end
@@ -16,58 +16,62
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 class UsersController < ApplicationController
18 class UsersController < ApplicationController
19 layout 'base'
19 layout 'base'
20 before_filter :require_admin
20 before_filter :require_admin
21
21
22 helper :sort
22 helper :sort
23 include SortHelper
23 include SortHelper
24
24
25 def index
25 def index
26 list
26 list
27 render :action => 'list'
27 render :action => 'list'
28 end
28 end
29
29
30 def list
30 def list
31 sort_init 'users.login', 'asc'
31 sort_init 'login', 'asc'
32 sort_update
32 sort_update
33 @user_count = User.count
33 @user_count = User.count
34 @user_pages = Paginator.new self, @user_count,
34 @user_pages = Paginator.new self, @user_count,
35 15,
35 15,
36 @params['page']
36 @params['page']
37 @users = User.find :all, :order => sort_clause,
37 @users = User.find :all,:order => sort_clause,
38 :limit => @user_pages.items_per_page,
38 :limit => @user_pages.items_per_page,
39 :offset => @user_pages.current.offset
39 :offset => @user_pages.current.offset
40 end
40 end
41
41
42 def add
42 def add
43 if request.get?
43 if request.get?
44 @user = User.new
44 @user = User.new
45 else
45 else
46 @user = User.new(params[:user])
46 @user = User.new(params[:user])
47 @user.admin = params[:user][:admin]
47 @user.admin = params[:user][:admin] || false
48 if @user.save
48 @user.login = params[:user][:login]
49 flash[:notice] = 'User was successfully created.'
49 @user.password, @user.password_confirmation = params[:password], params[:password_confirmation]
50 redirect_to :action => 'list'
50 if @user.save
51 end
51 flash[:notice] = 'User was successfully created.'
52 end
52 redirect_to :action => 'list'
53 end
53 end
54 end
55 end
54
56
55 def edit
57 def edit
56 @user = User.find(params[:id])
58 @user = User.find(params[:id])
57 if request.post?
59 if request.post?
58 @user.admin = params[:user][:admin] if params[:user][:admin]
60 @user.admin = params[:user][:admin] if params[:user][:admin]
59 if @user.update_attributes(params[:user])
61 @user.login = params[:user][:login] if params[:user][:login]
60 flash[:notice] = 'User was successfully updated.'
62 @user.password, @user.password_confirmation = params[:password], params[:password_confirmation] unless params[:password].nil? or params[:password].empty?
61 redirect_to :action => 'list'
63 if @user.update_attributes(params[:user])
62 end
64 flash[:notice] = 'User was successfully updated.'
63 end
65 redirect_to :action => 'list'
64 end
66 end
67 end
68 end
65
69
66 def destroy
70 def destroy
67 User.find(params[:id]).destroy
71 User.find(params[:id]).destroy
68 redirect_to :action => 'list'
72 redirect_to :action => 'list'
69 rescue
73 rescue
70 flash[:notice] = "Unable to delete user"
74 flash[:notice] = "Unable to delete user"
71 redirect_to :action => 'list'
75 redirect_to :action => 'list'
72 end
76 end
73 end
77 end
@@ -38,6 +38,9 class VersionsController < ApplicationController
38 @attachment = @version.attachments.find(params[:attachment_id])
38 @attachment = @version.attachments.find(params[:attachment_id])
39 @attachment.increment_download
39 @attachment.increment_download
40 send_file @attachment.diskfile, :filename => @attachment.filename
40 send_file @attachment.diskfile, :filename => @attachment.filename
41 rescue
42 flash[:notice]="Requested file doesn't exist or has been deleted."
43 redirect_to :controller => 'projects', :action => 'list_files', :id => @project
41 end
44 end
42
45
43 def destroy_file
46 def destroy_file
@@ -27,7 +27,7 module ApplicationHelper
27
27
28 def authorize_for(controller, action)
28 def authorize_for(controller, action)
29 # check if action is allowed on public projects
29 # check if action is allowed on public projects
30 if @project.public? and Permission.allowed_to_public "%s/%s" % [ controller, action ]
30 if @project.is_public? and Permission.allowed_to_public "%s/%s" % [ controller, action ]
31 return true
31 return true
32 end
32 end
33 # check if user is authorized
33 # check if user is authorized
@@ -18,68 +18,73
18 module SearchFilterHelper
18 module SearchFilterHelper
19
19
20 def search_filter_criteria(name, options = {})
20 def search_filter_criteria(name, options = {})
21 session[:search_filter] ||= {}
21 @search_filter ||= {}
22 session[:search_filter][name] ||= {}
22 @search_filter[name] ||= {}
23 unless session[:search_filter][name][:options] and session[:search_filter][name][:conditions]
23 @search_filter[name][:options] = []
24 session[:search_filter][name][:options] = []
24 @search_filter[name][:conditions] = {}
25 session[:search_filter][name][:conditions] = {}
25 yield.each { |c|
26 yield.each { |c|
26 @search_filter[name][:options] << [c[0], c[1].to_s]
27 session[:search_filter][name][:options] << [c[0], c[1].to_s]
27 @search_filter[name][:conditions].store(c[1].to_s, c[2])
28 session[:search_filter][name][:conditions].store(c[1].to_s, c[2])
28 }
29 }
30 end
31 end
29 end
32
30
33 def search_filter_update
31 def search_filter_update
34 session[:search_filter].each_key {|field| session[:search_filter][field][:value] = params[field] }
32 @search_filter.each_key {|field| session[:search_filter][field] = params[field] }
35 end
33 end
36
34
37 def search_filter_clause
35 def search_filter_clause
38 clause = ["issues.project_id=?", @project.id]
36 clause = ["1=1"]
39 session[:search_filter].each { |k, v|
37 @search_filter.each { |k, v|
40 v[:value] ||= v[:options][0][1]
38 filter_value = session[:search_filter][k] || v[:options][0][1]
41 if (!v[:conditions][v[:value]][0].empty?)
39 if v[:conditions][filter_value]
42 clause[0] = clause[0] + " AND " + v[:conditions][v[:value]][0]
40 clause[0] = clause[0] + " AND " + v[:conditions][filter_value].first
43 clause << v[:conditions][v[:value]][1] if !v[:conditions][v[:value]][1].nil?
41 clause += v[:conditions][filter_value][1..-1]
44 end
42 end
45 }
43 }
46 clause
44 clause
47 end
45 end
48
46
49 def search_filter_tag(criteria)
47 def search_filter_tag(criteria, options = {})
48 options[:name] = criteria
50 content_tag("select",
49 content_tag("select",
51 options_for_select(session[:search_filter][criteria][:options], session[:search_filter][criteria][:value]),
50 options_for_select(@search_filter[criteria][:options], session[:search_filter][criteria]),
52 :name => criteria
51 options
53 )
52 )
54 end
53 end
55
54
56 def search_filter_init_list_issues
55 def search_filter_init_list_issues
57 search_filter_criteria('status_id') {
56 search_filter_criteria('status_id') {
58 [ ["[Open]", "O", ["issue_statuses.is_closed=?", false]],
57 [ [_('[Open]'), "O", ["issue_statuses.is_closed=?", false]],
59 ["[All]", "A", ["", false]]
58 [_('[All]'), "A", nil]
60 ] + IssueStatus.find(:all).collect {|s| [s.name, s.id, ["issues.status_id=?", s.id]] }
59 ] + IssueStatus.find(:all).collect {|s| [s.name, s.id, ["issues.status_id=?", s.id]] }
61 }
60 }
62
61
63 search_filter_criteria('tracker_id') {
62 search_filter_criteria('tracker_id') {
64 [ ["[All]", "A", ["", false]]
63 [ [_('[All]'), "A", nil]
65 ] + Tracker.find(:all).collect {|s| [s.name, s.id, ["issues.tracker_id=?", s.id]] }
64 ] + Tracker.find(:all).collect {|s| [s.name, s.id, ["issues.tracker_id=?", s.id]] }
66 }
65 }
67
66
68 search_filter_criteria('priority_id') {
67 search_filter_criteria('priority_id') {
69 [ ["[All]", "A", ["", false]]
68 [ [_('[All]'), "A", nil]
70 ] + Enumeration.find(:all, :conditions => ['opt=?','IPRI']).collect {|s| [s.name, s.id, ["issues.priority_id=?", s.id]] }
69 ] + Enumeration.find(:all, :conditions => ['opt=?','IPRI']).collect {|s| [s.name, s.id, ["issues.priority_id=?", s.id]] }
71 }
70 }
72
71
73 search_filter_criteria('category_id') {
72 search_filter_criteria('category_id') {
74 [ ["[All]", "A", ["", false]],
73 [ [_('[All]'), "A", nil],
75 ["[None]", "N", ["issues.category_id is null"]]
74 [_('[None]'), "N", ["issues.category_id is null"]]
76 ] + @project.issue_categories.find(:all).collect {|s| [s.name, s.id, ["issues.category_id=?", s.id]] }
75 ] + @project.issue_categories.find(:all).collect {|s| [s.name, s.id, ["issues.category_id=?", s.id]] }
77 }
76 }
78
77
79 search_filter_criteria('assigned_to_id') {
78 search_filter_criteria('assigned_to_id') {
80 [ ["[All]", "A", ["", false]],
79 [ [_('[All]'), "A", nil],
81 ["[Nobody]", "N", ["issues.assigned_to_id is null"]]
80 [_('[None]'), "N", ["issues.assigned_to_id is null"]]
82 ] + User.find(:all).collect {|s| [s.display_name, s.id, ["issues.assigned_to_id=?", s.id]] }
81 ] + @project.users.collect {|s| [s.display_name, s.id, ["issues.assigned_to_id=?", s.id]] }
83 }
82 }
83
84 search_filter_criteria('subproject_id') {
85 [ [_('[None]'), "N", ["issues.project_id=?", @project.id]],
86 [_('[All]'), "A", ["(issues.project_id=? or projects.parent_id=?)", @project.id, @project.id]]
87 ]
88 }
84 end
89 end
85 end No newline at end of file
90 end
@@ -30,7 +30,7 class Attachment < ActiveRecord::Base
30 self.filename = sanitize_filename(@temp_file.original_filename)
30 self.filename = sanitize_filename(@temp_file.original_filename)
31 self.disk_filename = DateTime.now.strftime("%y%m%d%H%M%S") + "_" + self.filename
31 self.disk_filename = DateTime.now.strftime("%y%m%d%H%M%S") + "_" + self.filename
32 self.content_type = @temp_file.content_type
32 self.content_type = @temp_file.content_type
33 self.size = @temp_file.size
33 self.filesize = @temp_file.size
34 end
34 end
35 end
35 end
36 end
36 end
@@ -19,6 +19,7 class Enumeration < ActiveRecord::Base
19 before_destroy :check_integrity
19 before_destroy :check_integrity
20
20
21 validates_presence_of :opt, :name
21 validates_presence_of :opt, :name
22 validates_uniqueness_of :name, :scope => [:opt]
22
23
23 OPTIONS = [
24 OPTIONS = [
24 ["Issue priorities", "IPRI"],
25 ["Issue priorities", "IPRI"],
@@ -17,9 +17,10
17
17
18 class IssueCategory < ActiveRecord::Base
18 class IssueCategory < ActiveRecord::Base
19 before_destroy :check_integrity
19 before_destroy :check_integrity
20 belongs_to :project
20 belongs_to :project
21
21
22 validates_presence_of :name
22 validates_presence_of :name
23 validates_uniqueness_of :name, :scope => [:project_id]
23
24
24 private
25 private
25 def check_integrity
26 def check_integrity
@@ -17,24 +17,26
17
17
18 class IssueStatus < ActiveRecord::Base
18 class IssueStatus < ActiveRecord::Base
19 before_destroy :check_integrity
19 before_destroy :check_integrity
20 has_many :workflows, :foreign_key => "old_status_id"
20 has_many :workflows, :foreign_key => "old_status_id"
21
22 validates_presence_of :name
23 validates_uniqueness_of :name
24
21
25 # Returns the default status for new issues
22 validates_presence_of :name
26 def self.default
23 validates_uniqueness_of :name
27 find(:first, :conditions =>["is_default=?", true])
24 validates_length_of :html_color, :is=>6
28 end
25 validates_format_of :html_color, :with => /^[a-f0-9]*$/i
29
26
30 # Returns an array of all statuses the given role can switch to
27 # Returns the default status for new issues
31 def new_statuses_allowed_to(role, tracker)
28 def self.default
32 statuses = []
29 find(:first, :conditions =>["is_default=?", true])
33 for workflow in self.workflows.find(:all, :include => :new_status)
30 end
34 statuses << workflow.new_status if workflow.role_id == role.id and workflow.tracker_id == tracker.id
31
35 end unless role.nil?
32 # Returns an array of all statuses the given role can switch to
36 statuses
33 def new_statuses_allowed_to(role, tracker)
37 end
34 statuses = []
35 for workflow in self.workflows
36 statuses << workflow.new_status if workflow.role_id == role.id and workflow.tracker_id == tracker.id
37 end unless role.nil? or tracker.nil?
38 statuses
39 end
38
40
39 def name
41 def name
40 _ self.attributes['name']
42 _ self.attributes['name']
@@ -43,7 +43,7 class Permission < ActiveRecord::Base
43 end
43 end
44
44
45 def self.allowed_to_public(action)
45 def self.allowed_to_public(action)
46 @@cached_perms_for_public ||= find(:all, :conditions => ["public=?", true]).collect {|p| "#{p.controller}/#{p.action}"}
46 @@cached_perms_for_public ||= find(:all, :conditions => ["is_public=?", true]).collect {|p| "#{p.controller}/#{p.action}"}
47 @@cached_perms_for_public.include? action
47 @@cached_perms_for_public.include? action
48 end
48 end
49
49
@@ -16,29 +16,33
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 class Project < ActiveRecord::Base
18 class Project < ActiveRecord::Base
19 has_many :versions, :dependent => true, :order => "versions.date DESC"
19 has_many :versions, :dependent => true, :order => "versions.effective_date DESC"
20 has_many :members, :dependent => true
20 has_many :members, :dependent => true
21 has_many :users, :through => :members
21 has_many :issues, :dependent => true, :order => "issues.created_on DESC", :include => :status
22 has_many :issues, :dependent => true, :order => "issues.created_on DESC", :include => :status
22 has_many :documents, :dependent => true
23 has_many :documents, :dependent => true
23 has_many :news, :dependent => true, :order => "news.created_on DESC", :include => :author
24 has_many :news, :dependent => true, :include => :author
24 has_many :issue_categories, :dependent => true
25 has_many :issue_categories, :dependent => true
25 has_and_belongs_to_many :custom_fields
26 has_and_belongs_to_many :custom_fields
27 acts_as_tree :order => "name", :counter_cache => true
26
28
27 validates_presence_of :name, :descr
29 validates_presence_of :name, :descr
30 validates_uniqueness_of :name
28
31
29 # returns 5 last created projects
32 # returns 5 last created projects
30 def self.latest
33 def self.latest
31 find(:all, :limit => 5, :order => "created_on DESC")
34 find(:all, :limit => 5, :order => "created_on DESC")
32 end
35 end
33
36
34 # Returns current version of the project
35 def current_version
36 versions.find(:first, :conditions => [ "date <= ?", Date.today ], :order => "date DESC, id DESC")
37 end
38
39 # Returns an array of all custom fields enabled for project issues
37 # Returns an array of all custom fields enabled for project issues
40 # (explictly associated custom fields and custom fields enabled for all projects)
38 # (explictly associated custom fields and custom fields enabled for all projects)
41 def custom_fields_for_issues
39 def custom_fields_for_issues
42 (CustomField.for_all + custom_fields).uniq
40 (CustomField.for_all + custom_fields).uniq
43 end
41 end
42
43 protected
44 def validate
45 errors.add(parent_id, " must be a root project") if parent and parent.parent
46 errors.add_to_base("A project with subprojects can't be a subproject") if parent and projects_count > 0
47 end
44 end
48 end
@@ -20,6 +20,9 class Tracker < ActiveRecord::Base
20 has_many :issues
20 has_many :issues
21 has_many :workflows, :dependent => true
21 has_many :workflows, :dependent => true
22
22
23 validates_presence_of :name
24 validates_uniqueness_of :name
25
23 def name
26 def name
24 _ self.attributes['name']
27 _ self.attributes['name']
25 end
28 end
@@ -18,58 +18,46
18 require "digest/sha1"
18 require "digest/sha1"
19
19
20 class User < ActiveRecord::Base
20 class User < ActiveRecord::Base
21 has_many :memberships, :class_name => 'Member', :include => [ :project, :role ], :dependent => true
21 has_many :memberships, :class_name => 'Member', :include => [ :project, :role ], :dependent => true
22
22
23 attr_accessor :password
23 attr_accessor :password, :password_confirmation
24 attr_accessor :last_before_login_on
24 attr_accessor :last_before_login_on
25 # Prevents unauthorized assignments
25 # Prevents unauthorized assignments
26 attr_protected :admin
26 attr_protected :login, :admin, :password, :password_confirmation, :hashed_password
27
27
28 validates_presence_of :login, :firstname, :lastname, :mail
28 validates_presence_of :login, :firstname, :lastname, :mail
29 validates_uniqueness_of :login, :mail
29 validates_uniqueness_of :login, :mail
30
30 # Login must contain lettres, numbers, underscores only
31 # Login must contain lettres, numbers, underscores only
31 validates_format_of :login, :with => /^[a-z0-9_]+$/i
32 validates_format_of :login, :with => /^[a-z0-9_]+$/i
32 validates_format_of :mail, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
33 validates_format_of :mail, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
33 # Password length between 4 and 12
34 validates_length_of :password, :in => 4..12, :allow_nil => true
35 validates_confirmation_of :password, :allow_nil => true
36
37 def before_save
38 # update hashed_password if password was set
39 self.hashed_password = User.hash_password(self.password) if self.password
40 end
34
41
35 def before_create
42 # Returns the user that matches provided login and password, or nil
36 self.hashed_password = User.hash_password(self.password)
43 def self.try_to_login(login, password)
37 end
44 user = find(:first, :conditions => ["login=? and hashed_password=? and locked=?", login, User.hash_password(password), false])
45 if user
46 user.last_before_login_on = user.last_login_on
47 user.update_attribute(:last_login_on, Time.now)
48 end
49 user
50 end
38
51
39 def after_create
52 # Return user's full name for display
40 @password = nil
53 def display_name
41 end
54 firstname + " " + lastname
55 end
42
56
43 # Returns the user that matches user's login and password
57 def check_password?(clear_password)
44 def try_to_login
58 User.hash_password(clear_password) == self.hashed_password
45 @user = User.login(self.login, self.password)
59 end
46 unless @user.nil?
47 @user.last_before_login_on = @user.last_login_on
48 @user.update_attribute(:last_login_on, DateTime.now)
49 end
50 @user
51 end
52
53 # Return user's full name for display
54 def display_name
55 firstname + " " + lastname #+ (self.admin ? " (Admin)" : "" )
56 end
57
60
58 # Returns the user that matches the given login and password
59 def self.login(login, password)
60 hashed_password = hash_password(password || "")
61 find(:first,
62 :conditions => ["login = ? and hashed_password = ? and locked = ?", login, hashed_password, false])
63 end
64
65 def check_password?(clear_password)
66 User.hash_password(clear_password) == self.hashed_password
67 end
68
69 def change_password(current_password, new_password)
70 self.hashed_password = User.hash_password(new_password)
71 save
72 end
73
61
74 def role_for_project(project_id)
62 def role_for_project(project_id)
75 @role_for_projects ||=
63 @role_for_projects ||=
@@ -82,8 +70,8 class User < ActiveRecord::Base
82 end
70 end
83
71
84 private
72 private
85 # Return password digest
73 # Return password digest
86 def self.hash_password(clear_password)
74 def self.hash_password(clear_password)
87 Digest::SHA1.hexdigest(clear_password)
75 Digest::SHA1.hexdigest(clear_password || "")
88 end
76 end
89 end
77 end
@@ -16,12 +16,13
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 class Version < ActiveRecord::Base
18 class Version < ActiveRecord::Base
19 before_destroy :check_integrity
19 before_destroy :check_integrity
20 belongs_to :project
20 belongs_to :project
21 has_many :fixed_issues, :class_name => 'Issue', :foreign_key => 'fixed_version_id'
21 has_many :fixed_issues, :class_name => 'Issue', :foreign_key => 'fixed_version_id'
22 has_many :attachments, :as => :container, :dependent => true
22 has_many :attachments, :as => :container, :dependent => true
23
23
24 validates_presence_of :name, :descr
24 validates_presence_of :name
25 validates_uniqueness_of :name, :scope => [:project_id]
25
26
26 private
27 private
27 def check_integrity
28 def check_integrity
@@ -16,10 +16,9
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 class Workflow < ActiveRecord::Base
18 class Workflow < ActiveRecord::Base
19 belongs_to :role
20 belongs_to :old_status, :class_name => 'IssueStatus', :foreign_key => 'old_status_id'
21 belongs_to :new_status, :class_name => 'IssueStatus', :foreign_key => 'new_status_id'
19
22
20 belongs_to :role
23 validates_presence_of :role, :old_status, :new_status
21 belongs_to :old_status, :class_name => 'IssueStatus', :foreign_key => 'old_status_id'
22 belongs_to :new_status, :class_name => 'IssueStatus', :foreign_key => 'new_status_id'
23
24 validates_presence_of :role, :old_status, :new_status
25 end
24 end
@@ -1,12 +1,12
1 <div class="box">
1 <div class="box">
2 <h2><%=_ 'Please login' %></h2>
2 <h2><%=_('Please login') %></h2>
3
3
4 <%= start_form_tag :action=> "login" %>
4 <%= start_form_tag :action=> "login" %>
5 <p><label for="user_login"><%=_ 'Login' %>:</label><br/>
5 <p><label for="login"><%=_ 'Login' %>:</label><br/>
6 <input type="text" name="user[login]" id="user_login" size="30" /></p>
6 <%= text_field_tag 'login', nil, :size => 25 %></p>
7
7
8 <p><label for="user_password"><%=_ 'Password' %>:</label><br/>
8 <p><label for="user_password"><%=_ 'Password' %>:</label><br/>
9 <input type="password" name="user[password]" id="user_password" size="30"/></p>
9 <%= password_field_tag 'password', nil, :size => 25 %></p>
10
10
11 <p><input type="submit" name="login" value="<%=_ 'Log in' %> &#187;" class="primary" /></p>
11 <p><input type="submit" name="login" value="<%=_ 'Log in' %> &#187;" class="primary" /></p>
12 <%= end_form_tag %>
12 <%= end_form_tag %>
@@ -3,13 +3,14
3 <p><%=_('Login')%>: <strong><%= @user.login %></strong><br />
3 <p><%=_('Login')%>: <strong><%= @user.login %></strong><br />
4 <%=_('Created on')%>: <%= format_time(@user.created_on) %>,
4 <%=_('Created on')%>: <%= format_time(@user.created_on) %>,
5 <%=_('Last update')%>: <%= format_time(@user.updated_on) %></p>
5 <%=_('Last update')%>: <%= format_time(@user.updated_on) %></p>
6
7 <%= error_messages_for 'user' %>
6
8
7 <div class="splitcontentleft">
9 <div class="splitcontentleft">
8 <div class="box">
10 <div class="box">
9 <h3><%=_('Information')%></h3>
11 <h3><%=_('Information')%></h3>
10 &nbsp;
12 &nbsp;
11 <%= start_form_tag :action => 'my_account' %>
13 <%= start_form_tag :action => 'my_account' %>
12 <%= error_messages_for 'user' %>
13
14
14 <!--[form:user]-->
15 <!--[form:user]-->
15 <p><label for="user_firstname"><%=_('Firstname')%> <span class="required">*</span></label><br/>
16 <p><label for="user_firstname"><%=_('Firstname')%> <span class="required">*</span></label><br/>
@@ -39,14 +40,14
39 &nbsp;
40 &nbsp;
40 <%= start_form_tag :action => 'change_password' %>
41 <%= start_form_tag :action => 'change_password' %>
41
42
42 <p><label for="old_password"><%=_('Password')%> <span class="required">*</span></label><br/>
43 <p><label for="password"><%=_('Password')%> <span class="required">*</span></label><br/>
43 <%= password_field_tag 'old_password' %></p>
44 <%= password_field_tag 'password', nil, :size => 25 %></p>
44
45
45 <p><label for="new_password"><%=_('New password')%> <span class="required">*</span></label><br/>
46 <p><label for="new_password"><%=_('New password')%> <span class="required">*</span></label><br/>
46 <%= password_field_tag 'new_password' %></p>
47 <%= password_field_tag 'new_password', nil, :size => 25 %></p>
47
48
48 <p><label for="new_password_confirmation"><%=_('Confirmation')%> <span class="required">*</span></label><br/>
49 <p><label for="new_password_confirmation"><%=_('Confirmation')%> <span class="required">*</span></label><br/>
49 <%= password_field_tag 'new_password_confirmation' %></p>
50 <%= password_field_tag 'new_password_confirmation', nil, :size => 25 %></p>
50
51
51 <center><%= submit_tag _('Save') %></center>
52 <center><%= submit_tag _('Save') %></center>
52 <%= end_form_tag %>
53 <%= end_form_tag %>
@@ -1,4 +1,10
1 <h2><%=_('Information')%></h2>
1 <h2><%=_('Information')%></h2>
2
2
3 <%=_('Version')%>: <%= RDM_APP_NAME %> <%= RDM_APP_VERSION %><br />
3 <p><%=_('Version')%>: <strong><%= RDM_APP_NAME %> <%= RDM_APP_VERSION %></strong></p>
4 <%=_('Database')%>: <%= @adapter_name %> No newline at end of file
4
5 Environment:
6 <ul>
7 <% Rails::Info.properties.each do |name, value| %>
8 <li><%= name %>: <%= value %></li>
9 <% end %>
10 </ul> No newline at end of file
@@ -2,20 +2,20
2
2
3 <table width="100%" cellspacing="1" cellpadding="2" class="listTableContent">
3 <table width="100%" cellspacing="1" cellpadding="2" class="listTableContent">
4 <tr class="ListHead">
4 <tr class="ListHead">
5 <%= sort_header_tag('projects.name', :caption => _('Project')) %>
5 <%= sort_header_tag('name', :caption => _('Project')) %>
6 <th><%=_('Description')%></th>
6 <th><%=_('Description')%></th>
7 <th><%=_('Public')%></th>
7 <th><%=_('Public')%></th>
8 <%= sort_header_tag('projects.created_on', :caption => _('Created on')) %>
8 <th><%=_('Subprojects')%></th>
9 <%= sort_header_tag('created_on', :caption => _('Created on')) %>
9 <th></th>
10 <th></th>
10 </tr>
11 </tr>
11
12
12 <% odd_or_even = 1
13 <% for project in @projects %>
13 for project in @projects
14 <tr class="<%= cycle("odd", "even") %>">
14 odd_or_even = 1 - odd_or_even %>
15 <tr class="ListLine<%= odd_or_even %>">
16 <td><%= link_to project.name, :controller => 'projects', :action => 'settings', :id => project %>
15 <td><%= link_to project.name, :controller => 'projects', :action => 'settings', :id => project %>
17 <td><%= project.descr %>
16 <td><%= project.descr %>
18 <td align="center"><%= image_tag 'true' if project.public? %>
17 <td align="center"><%= image_tag 'true' if project.is_public? %>
18 <td align="center"><%= project.projects_count %>
19 <td align="center"><%= format_date(project.created_on) %>
19 <td align="center"><%= format_date(project.created_on) %>
20 <td align="center">
20 <td align="center">
21 <%= start_form_tag({:controller => 'projects', :action => 'destroy', :id => project}) %>
21 <%= start_form_tag({:controller => 'projects', :action => 'destroy', :id => project}) %>
@@ -26,10 +26,7
26 <% end %>
26 <% end %>
27 </table>
27 </table>
28
28
29 <%= link_to ('&#171; ' + _('Previous')), { :page => @project_pages.current.previous } if @project_pages.current.previous %>
29 <p><%= pagination_links_full @project_pages %>
30 <%= pagination_links(@project_pages) %>
30 [ <%= @project_pages.current.first_item %> - <%= @project_pages.current.last_item %> / <%= @project_count %> ]</p>
31 <%= link_to (_('Next') + ' &#187;'), { :page => @project_pages.current.next } if @project_pages.current.next %>
31
32
32 <p><%= link_to ('&#187; ' + _('New project')), :controller => 'projects', :action => 'add' %></p> No newline at end of file
33 <br />
34
35 <%= link_to ('&#187; ' + _('New project')), :controller => 'projects', :action => 'add' %> No newline at end of file
@@ -10,7 +10,7
10 <th></th>
10 <th></th>
11 </tr>
11 </tr>
12 <% for custom_field in @custom_fields %>
12 <% for custom_field in @custom_fields %>
13 <tr style="background-color:#CEE1ED">
13 <tr class="<%= cycle("odd", "even") %>">
14 <td><%= link_to custom_field.name, :action => 'edit', :id => custom_field %></td>
14 <td><%= link_to custom_field.name, :action => 'edit', :id => custom_field %></td>
15 <td align="center"><%= CustomField::TYPES[custom_field.typ][0] %></td>
15 <td align="center"><%= CustomField::TYPES[custom_field.typ][0] %></td>
16 <td align="center"><%= image_tag 'true' if custom_field.is_required? %></td>
16 <td align="center"><%= image_tag 'true' if custom_field.is_required? %></td>
@@ -24,14 +24,16
24 <td><%= link_to attachment.filename, :action => 'download', :id => @document, :attachment_id => attachment %></td>
24 <td><%= link_to attachment.filename, :action => 'download', :id => @document, :attachment_id => attachment %></td>
25 <td align="center"><%= format_date(attachment.created_on) %></td>
25 <td align="center"><%= format_date(attachment.created_on) %></td>
26 <td align="center"><%= attachment.author.display_name %></td>
26 <td align="center"><%= attachment.author.display_name %></td>
27 <td><%= human_size(attachment.size) %><br /><%= attachment.downloads %> <%=_('download')%>(s)</td>
27 <td><%= human_size(attachment.filesize) %><br /><%= attachment.downloads %> <%=_('download')%>(s)</td>
28
28 <% if authorize_for('documents', 'destroy_attachment') %>
29 <% if authorize_for('documents', 'destroy_attachment') %>
29 <td align="center">
30 <td align="center">
30 <%= start_form_tag :action => 'destroy_attachment', :id => @document, :attachment_id => attachment %>
31 <%= start_form_tag :action => 'destroy_attachment', :id => @document, :attachment_id => attachment %>
31 <%= submit_tag _('Delete'), :class => "button-small" %>
32 <%= submit_tag _('Delete'), :class => "button-small" %>
32 <%= end_form_tag %>
33 <%= end_form_tag %>
33 </tr>
34 </tr>
34 <% end %>
35 <% end %>
36
35 <% end %>
37 <% end %>
36 </table>
38 </table>
37 <br />
39 <br />
@@ -1,7 +1,7
1 <%= error_messages_for 'issue_status' %>
1 <%= error_messages_for 'issue_status' %>
2
2
3 <!--[form:issue_status]-->
3 <!--[form:issue_status]-->
4 <p><label for="issue_status_name"><%=_('Name')%></label><br/>
4 <p><label for="issue_status_name"><%=_('Name')%></label> <span class="required">*</span><br/>
5 <%= text_field 'issue_status', 'name' %></p>
5 <%= text_field 'issue_status', 'name' %></p>
6
6
7 <p><%= check_box 'issue_status', 'is_closed' %>
7 <p><%= check_box 'issue_status', 'is_closed' %>
@@ -11,7 +11,7
11 <label for="issue_status_is_default"><%=_('Default status')%></label></p>
11 <label for="issue_status_is_default"><%=_('Default status')%></label></p>
12
12
13 <p><label for="issue_status_html_color"><%=_('Color')%></label>
13 <p><label for="issue_status_html_color"><%=_('Color')%></label>
14 #<%= text_field 'issue_status', 'html_color', :size => 6 %></p>
14 #<%= text_field 'issue_status', 'html_color', :maxlength => 6 %> <span class="required">*</span></p>
15
15
16 <!--[eoform:issue_status]-->
16 <!--[eoform:issue_status]-->
17
17
@@ -10,10 +10,10
10 </tr>
10 </tr>
11
11
12 <% for status in @issue_statuses %>
12 <% for status in @issue_statuses %>
13 <tr style="background-color:#CEE1ED">
13 <tr class="<%= cycle("odd", "even") %>">
14 <td><%= link_to status.name, :action => 'edit', :id => status %></td>
14 <td><%= link_to status.name, :action => 'edit', :id => status %></td>
15 <td align="center"><%= image_tag 'true' if status.is_default %></td>
15 <td align="center"><%= image_tag 'true' if status.is_default? %></td>
16 <td align="center"><%= image_tag 'true' if status.is_closed %></td>
16 <td align="center"><%= image_tag 'true' if status.is_closed? %></td>
17 <td bgcolor="#<%= status.html_color %>">&nbsp</td>
17 <td bgcolor="#<%= status.html_color %>">&nbsp</td>
18 <td align="center">
18 <td align="center">
19 <%= start_form_tag :action => 'destroy', :id => status %>
19 <%= start_form_tag :action => 'destroy', :id => status %>
@@ -10,7 +10,7
10 <p><b><%=_('Assigned to')%>:</b> <%= @issue.assigned_to.display_name unless @issue.assigned_to.nil? %></p>
10 <p><b><%=_('Assigned to')%>:</b> <%= @issue.assigned_to.display_name unless @issue.assigned_to.nil? %></p>
11
11
12 <p><b><%=_('Subject')%>:</b> <%= @issue.subject %></p>
12 <p><b><%=_('Subject')%>:</b> <%= @issue.subject %></p>
13 <p><b><%=_('Description')%>:</b> <%= @issue.descr %></p>
13 <p><b><%=_('Description')%>:</b> <%= simple_format auto_link @issue.descr %></p>
14 <p><b><%=_('Created on')%>:</b> <%= format_date(@issue.created_on) %></p>
14 <p><b><%=_('Created on')%>:</b> <%= format_date(@issue.created_on) %></p>
15
15
16 <% if authorize_for('issues', 'edit') %>
16 <% if authorize_for('issues', 'edit') %>
@@ -65,7 +65,7
65 <table width="100%">
65 <table width="100%">
66 <% for attachment in @issue.attachments %>
66 <% for attachment in @issue.attachments %>
67 <tr>
67 <tr>
68 <td><%= link_to attachment.filename, :action => 'download', :id => @issue, :attachment_id => attachment %> (<%= human_size(attachment.size) %>)</td>
68 <td><%= link_to attachment.filename, :action => 'download', :id => @issue, :attachment_id => attachment %> (<%= human_size(attachment.filesize) %>)</td>
69 <td><%= format_date(attachment.created_on) %></td>
69 <td><%= format_date(attachment.created_on) %></td>
70 <td><%= attachment.author.display_name %></td>
70 <td><%= attachment.author.display_name %></td>
71 <% if authorize_for('issues', 'destroy_attachment') %>
71 <% if authorize_for('issues', 'destroy_attachment') %>
@@ -81,7 +81,7
81 </div>
81 </div>
82
82
83 <div id="footer">
83 <div id="footer">
84 <p><a href="http://redmine.sourceforge.net/" target="_new"><%= RDM_APP_NAME %></a> <%= RDM_APP_VERSION %></p>
84 <p><a href="http://redmine.org/" target="_new"><%= RDM_APP_NAME %></a> <%= RDM_APP_VERSION %></p>
85 </div>
85 </div>
86
86
87 </div>
87 </div>
@@ -6,5 +6,5
6 <b><%=_('Date')%></b>: <%= format_time(@news.created_on) %>
6 <b><%=_('Date')%></b>: <%= format_time(@news.created_on) %>
7 </p>
7 </p>
8
8
9 <%= @news.descr %>
9 <%= simple_format auto_link @news.descr %>
10
10
@@ -4,15 +4,23
4 <p><label for="project_name"><%=_('Name')%> <span class="required">*</span></label><br/>
4 <p><label for="project_name"><%=_('Name')%> <span class="required">*</span></label><br/>
5 <%= text_field 'project', 'name' %></p>
5 <%= text_field 'project', 'name' %></p>
6
6
7 <% if session[:user].admin %>
8 <p><label for="project_parent_id"><%=_('Subproject of')%></label><br/>
9 <select name="project[parent_id]">
10 <option value=""></option>
11 <%= options_from_collection_for_select @root_projects, "id", "name", @project.parent_id %>
12 </select></p>
13 <% end %>
14
7 <p><label for="project_descr"><%=_('Description')%> <span class="required">*</span></label><br/>
15 <p><label for="project_descr"><%=_('Description')%> <span class="required">*</span></label><br/>
8 <%= text_field 'project', 'descr', :size => 60 %></p>
16 <%= text_area 'project', 'descr', :cols => 60, :rows => 3 %></p>
9
17
10 <p><label for="project_homepage"><%=_('Homepage')%></label><br/>
18 <p><label for="project_homepage"><%=_('Homepage')%></label><br/>
11 <%= text_field 'project', 'homepage', :size => 40 %></p>
19 <%= text_field 'project', 'homepage', :size => 40 %></p>
12
20
13 <p><%= check_box 'project', 'public' %>
21 <p><%= check_box 'project', 'is_public' %>
14 <label for="project_public"><%=_('Public')%></label></p>
22 <label for="project_is_public"><%=_('Public')%></label></p>
15
23
16 <fieldset><legend><%=_('Custom fields')%></legend>
24 <fieldset><legend><%=_('Custom fields')%></legend>
17 <% for custom_field in @custom_fields %>
25 <% for custom_field in @custom_fields %>
18 <input type="checkbox"
26 <input type="checkbox"
@@ -2,7 +2,7
2
2
3 <% fixed_issues = @fixed_issues.group_by {|i| i.fixed_version } %>
3 <% fixed_issues = @fixed_issues.group_by {|i| i.fixed_version } %>
4 <% fixed_issues.each do |version, issues| %>
4 <% fixed_issues.each do |version, issues| %>
5 <p><strong><%= version.name %></strong> - <%= format_date(version.date) %><br />
5 <p><strong><%= version.name %></strong> - <%= format_date(version.effective_date) %><br />
6 <%=h version.descr %></p>
6 <%=h version.descr %></p>
7 <ul>
7 <ul>
8 <% issues.each do |i| %>
8 <% issues.each do |i| %>
@@ -2,15 +2,13
2
2
3 <table width="100%" cellspacing="1" cellpadding="2" class="listTableContent">
3 <table width="100%" cellspacing="1" cellpadding="2" class="listTableContent">
4 <tr class="ListHead">
4 <tr class="ListHead">
5 <%= sort_header_tag('projects.name', :caption => _('Project')) %>
5 <%= sort_header_tag('name', :caption => _('Project')) %>
6 <th>Description</th>
6 <th>Description</th>
7 <%= sort_header_tag('projects.created_on', :caption => _('Created on')) %>
7 <%= sort_header_tag('created_on', :caption => _('Created on')) %>
8 </tr>
8 </tr>
9
9
10 <% odd_or_even = 1
10 <% for project in @projects %>
11 for project in @projects
11 <tr class="<%= cycle("odd", "even") %>">
12 odd_or_even = 1 - odd_or_even %>
13 <tr class="ListLine<%= odd_or_even %>">
14 <td><%= link_to project.name, :action => 'show', :id => project %>
12 <td><%= link_to project.name, :action => 'show', :id => project %>
15 <td><%= project.descr %>
13 <td><%= project.descr %>
16 <td align="center"><%= format_date(project.created_on) %>
14 <td align="center"><%= format_date(project.created_on) %>
@@ -17,14 +17,12
17 <tr>
17 <tr>
18 <td colspan="7"><%= image_tag 'package' %> <b><%= version.name %></b></td>
18 <td colspan="7"><%= image_tag 'package' %> <b><%= version.name %></b></td>
19 </tr>
19 </tr>
20 <% odd_or_even = 1
20 <% for file in version.attachments %>
21 for file in version.attachments
21 <tr class="<%= cycle("odd", "even") %>">
22 odd_or_even = 1 - odd_or_even %>
23 <tr class="ListLine<%= odd_or_even %>">
24 <td></td>
22 <td></td>
25 <td><%= link_to file.filename, :controller => 'versions', :action => 'download', :id => version, :attachment_id => file %></td>
23 <td><%= link_to file.filename, :controller => 'versions', :action => 'download', :id => version, :attachment_id => file %></td>
26 <td align="center"><%= format_date(file.created_on) %></td>
24 <td align="center"><%= format_date(file.created_on) %></td>
27 <td align="center"><%= human_size(file.size) %></td>
25 <td align="center"><%= human_size(file.filesize) %></td>
28 <td align="center"><%= file.downloads %></td>
26 <td align="center"><%= file.downloads %></td>
29 <td align="center"><small><%= file.digest %></small></td>
27 <td align="center"><small><%= file.digest %></small></td>
30 <% if delete_allowed %>
28 <% if delete_allowed %>
@@ -35,7 +33,8
35 </td>
33 </td>
36 <% end %>
34 <% end %>
37 </tr>
35 </tr>
38 <% end %>
36 <% end
37 reset_cycle %>
39 <% end %>
38 <% end %>
40 </table>
39 </table>
41
40
@@ -3,17 +3,19
3 <form method="post" class="noborder">
3 <form method="post" class="noborder">
4 <table cellpadding=2>
4 <table cellpadding=2>
5 <tr>
5 <tr>
6 <td><%=_('Status')%>:<br /><%= search_filter_tag("status_id") %></td>
6 <td><small><%=_('Status')%>:</small><br /><%= search_filter_tag 'status_id', :class => 'select-small' %></td>
7 <td><%=_('Tracker')%>:<br /><%= search_filter_tag("tracker_id") %></td>
7 <td><small><%=_('Tracker')%>:</small><br /><%= search_filter_tag 'tracker_id', :class => 'select-small' %></td>
8 <td><%=_('Priority')%>:<br /><%= search_filter_tag("priority_id") %></td>
8 <td><small><%=_('Priority')%>:</small><br /><%= search_filter_tag 'priority_id', :class => 'select-small' %></td>
9 <td><%=_('Category')%>:<br /><%= search_filter_tag("category_id") %></td>
9 <td><small><%=_('Category')%>:</small><br /><%= search_filter_tag 'category_id', :class => 'select-small' %></td>
10 <td><%=_('Assigned to')%>:<br /><%= search_filter_tag("assigned_to_id") %></td>
10 <td><small><%=_('Assigned to')%>:</small><br /><%= search_filter_tag 'assigned_to_id', :class => 'select-small' %></td>
11 <td><small><%=_('Subprojects')%>:</small><br /><%= search_filter_tag 'subproject_id', :class => 'select-small' %></td>
12
11 <td valign="bottom">
13 <td valign="bottom">
12 <%= submit_tag _('Apply filter') %>
14 <%= submit_tag _('Apply filter'), :class => 'button-small' %>
13 <%= end_form_tag %>
15 <%= end_form_tag %>
14
16
15 <%= start_form_tag %>
17 <%= start_form_tag %>
16 <%= submit_tag _('Reset') %>
18 <%= submit_tag _('Reset'), :class => 'button-small' %>
17 <%= end_form_tag %>
19 <%= end_form_tag %>
18 </td>
20 </td>
19 </tr>
21 </tr>
@@ -13,8 +13,8
13 <% for tracker in Tracker.find_all %>
13 <% for tracker in Tracker.find_all %>
14 <li><%= link_to tracker.name, :controller => 'projects', :action => 'list_issues', :id => @project,
14 <li><%= link_to tracker.name, :controller => 'projects', :action => 'list_issues', :id => @project,
15 :set_filter => 1,
15 :set_filter => 1,
16 "issues.tracker_id" => tracker.id %>:
16 "tracker_id" => tracker.id %>:
17 <%= tracker.issues.count(["project_id=?", @project.id]) %> <%=_('open')%>
17 <%= Issue.count(:conditions => ["project_id=? and tracker_id=? and issue_statuses.is_closed=?", @project.id, tracker.id, false], :include => :status) %> <%=_('open')%>
18 </li>
18 </li>
19 <% end %>
19 <% end %>
20 </ul>
20 </ul>
@@ -32,9 +32,18
32 <% end %>
32 <% end %>
33 </div>
33 </div>
34
34
35 <% if @subprojects %>
36 <div class="box">
37 <h3><%= image_tag "projects" %> <%=_('Subprojects')%></h3>
38 <% for subproject in @subprojects %>
39 <%= link_to subproject.name, :action => 'show', :id => subproject %><br />
40 <% end %>
41 </div>
42 <% end %>
43
35 <div class="box">
44 <div class="box">
36 <h3><%=_('Latest news')%></h3>
45 <h3><%=_('Latest news')%></h3>
37 <% for news in @project.news %>
46 <% for news in @news %>
38 <p>
47 <p>
39 <b><%= news.title %></b> <small>(<%= link_to_user news.author %> <%= format_time(news.created_on) %>)</small><br />
48 <b><%= news.title %></b> <small>(<%= link_to_user news.author %> <%= format_time(news.created_on) %>)</small><br />
40 <%= news.shortdescr %>
49 <%= news.shortdescr %>
@@ -7,7 +7,7
7 </tr>
7 </tr>
8
8
9 <% for role in @roles %>
9 <% for role in @roles %>
10 <tr style="background-color:#CEE1ED">
10 <tr class="<%= cycle("odd", "even") %>">
11 <td><%= link_to role.name, :action => 'edit', :id => role %></td>
11 <td><%= link_to role.name, :action => 'edit', :id => role %></td>
12 <td align="center">
12 <td align="center">
13 <%= start_form_tag :action => 'destroy', :id => role %>
13 <%= start_form_tag :action => 'destroy', :id => role %>
@@ -7,7 +7,7
7 </tr>
7 </tr>
8
8
9 <% for tracker in @trackers %>
9 <% for tracker in @trackers %>
10 <tr style="background-color:#CEE1ED">
10 <tr class="<%= cycle("odd", "even") %>">
11 <td><%= link_to tracker.name, :action => 'edit', :id => tracker %></td>
11 <td><%= link_to tracker.name, :action => 'edit', :id => tracker %></td>
12 <td align="center">
12 <td align="center">
13 <%= start_form_tag :action => 'destroy', :id => tracker %>
13 <%= start_form_tag :action => 'destroy', :id => tracker %>
@@ -2,10 +2,13
2
2
3 <!--[form:user]-->
3 <!--[form:user]-->
4 <p><label for="user_login"><%=_('Login')%></label><br/>
4 <p><label for="user_login"><%=_('Login')%></label><br/>
5 <%= text_field 'user', 'login' %></p>
5 <%= text_field 'user', 'login', :size => 25 %></p>
6
6
7 <p><label for="user_password"><%=_('Password')%></label><br/>
7 <p><label for="password"><%=_('Password')%></label><br/>
8 <%= password_field 'user', 'password' %></p>
8 <%= password_field_tag 'password', nil, :size => 25 %></p>
9
10 <p><label for="password_confirmation"><%=_('Confirmation')%></label><br/>
11 <%= password_field_tag 'password_confirmation', nil, :size => 25 %></p>
9
12
10 <p><label for="user_firstname"><%=_('Firstname')%></label><br/>
13 <p><label for="user_firstname"><%=_('Firstname')%></label><br/>
11 <%= text_field 'user', 'firstname' %></p>
14 <%= text_field 'user', 'firstname' %></p>
@@ -2,18 +2,18
2
2
3 <table border="0" cellspacing="1" cellpadding="2" class="listTableContent">
3 <table border="0" cellspacing="1" cellpadding="2" class="listTableContent">
4 <tr class="ListHead">
4 <tr class="ListHead">
5 <%= sort_header_tag('users.login', :caption => _('Login')) %>
5 <%= sort_header_tag('login', :caption => _('Login')) %>
6 <%= sort_header_tag('users.firstname', :caption => _('Firstname')) %>
6 <%= sort_header_tag('firstname', :caption => _('Firstname')) %>
7 <%= sort_header_tag('users.lastname', :caption => _('Lastname')) %>
7 <%= sort_header_tag('lastname', :caption => _('Lastname')) %>
8 <th><%=_('Mail')%></th>
8 <th><%=_('Mail')%></th>
9 <%= sort_header_tag('users.admin', :caption => _('Admin')) %>
9 <%= sort_header_tag('admin', :caption => _('Admin')) %>
10 <%= sort_header_tag('users.locked', :caption => _('Locked')) %>
10 <%= sort_header_tag('locked', :caption => _('Locked')) %>
11 <%= sort_header_tag('users.created_on', :caption => _('Created on')) %>
11 <%= sort_header_tag('created_on', :caption => _('Created on')) %>
12 <%= sort_header_tag('users.last_login_on', :caption => _('Last login')) %>
12 <%= sort_header_tag('last_login_on', :caption => _('Last login')) %>
13 <th></th>
13 <th></th>
14 </tr>
14 </tr>
15 <% for user in @users %>
15 <% for user in @users %>
16 <tr style="background-color:#CEE1ED">
16 <tr class="<%= cycle("odd", "even") %>">
17 <td><%= link_to user.login, :action => 'edit', :id => user %></td>
17 <td><%= link_to user.login, :action => 'edit', :id => user %></td>
18 <td><%= user.firstname %></td>
18 <td><%= user.firstname %></td>
19 <td><%= user.lastname %></td>
19 <td><%= user.lastname %></td>
@@ -25,10 +25,10
25 <td align="center">
25 <td align="center">
26 <%= start_form_tag :action => 'edit', :id => user %>
26 <%= start_form_tag :action => 'edit', :id => user %>
27 <% if user.locked? %>
27 <% if user.locked? %>
28 <%= hidden_field_tag 'user[locked]', false %>
28 <%= hidden_field_tag 'user[locked]', 0 %>
29 <%= submit_tag _('Unlock'), :class => "button-small" %>
29 <%= submit_tag _('Unlock'), :class => "button-small" %>
30 <% else %>
30 <% else %>
31 <%= hidden_field_tag 'user[locked]', true %>
31 <%= hidden_field_tag 'user[locked]', 1 %>
32 <%= submit_tag _('Lock'), :class => "button-small" %>
32 <%= submit_tag _('Lock'), :class => "button-small" %>
33 <% end %>
33 <% end %>
34 <%= end_form_tag %>
34 <%= end_form_tag %>
@@ -1,13 +1,13
1 <%= error_messages_for 'version' %>
1 <%= error_messages_for 'version' %>
2
2
3 <!--[form:version]-->
3 <!--[form:version]-->
4 <p><label for="version_name"><%=_('Version')%></label><br/>
4 <p><label for="version_name"><%=_('Version')%></label> <span class="required">*</span><br/>
5 <%= text_field 'version', 'name', :size => 20 %></p>
5 <%= text_field 'version', 'name', :size => 20 %></p>
6
6
7 <p><label for="version_descr"><%=_('Description')%></label><br/>
7 <p><label for="version_descr"><%=_('Description')%></label><br/>
8 <%= text_field 'version', 'descr', :size => 60 %></p>
8 <%= text_field 'version', 'descr', :size => 60 %></p>
9
9
10 <p><label for="version_date"><%=_('Date')%></label><br/>
10 <p><label for="version_effective_date"><%=_('Date')%></label><br/>
11 <%= date_select 'version', 'date' %></p>
11 <%= date_select 'version', 'effective_date' %></p>
12 <!--[eoform:version]-->
12 <!--[eoform:version]-->
13
13
@@ -2,7 +2,7
2 <h2><%=_('Welcome')%> !</h2>
2 <h2><%=_('Welcome')%> !</h2>
3
3
4 <div class="box">
4 <div class="box">
5 <h3>Latest news</h3>
5 <h3><%=_('Latest news')%></h3>
6 <% for news in @news %>
6 <% for news in @news %>
7 <p>
7 <p>
8 <b><%= news.title %></b> (<%= link_to_user news.author %> <%= format_time(news.created_on) %> - <%= news.project.name %>)<br />
8 <b><%= news.title %></b> (<%= link_to_user news.author %> <%= format_time(news.created_on) %> - <%= news.project.name %>)<br />
@@ -16,7 +16,7
16
16
17 <div class="splitcontentright">
17 <div class="splitcontentright">
18 <div class="box">
18 <div class="box">
19 <h3>Latest projects</h3>
19 <h3><%=_('Latest projects')%></h3>
20 <ul>
20 <ul>
21 <% for project in @projects %>
21 <% for project in @projects %>
22 <li>
22 <li>
@@ -5,6 +5,14
5 # (on OS X: gem install mysql -- --include=/usr/local/lib)
5 # (on OS X: gem install mysql -- --include=/usr/local/lib)
6 # And be sure to use new-style password hashing:
6 # And be sure to use new-style password hashing:
7 # http://dev.mysql.com/doc/refman/5.0/en/old-client.html
7 # http://dev.mysql.com/doc/refman/5.0/en/old-client.html
8
9 production:
10 adapter: mysql
11 database: redmine
12 host: localhost
13 username: root
14 password:
15
8 development:
16 development:
9 adapter: mysql
17 adapter: mysql
10 database: redmine_development
18 database: redmine_development
@@ -18,6 +26,17 development_pgsql:
18 host: localhost
26 host: localhost
19 username: postgres
27 username: postgres
20 password: "postgres"
28 password: "postgres"
29
30 development_oracle:
31 adapter: oci
32 host: 192.168.0.14
33 username: rails
34 password: "rails"
35
36 development_sqlserver:
37 adapter: sqlserver
38 host: localhost,1157
39 database: redmine
21
40
22 test:
41 test:
23 adapter: mysql
42 adapter: mysql
@@ -25,15 +44,26 test:
25 host: localhost
44 host: localhost
26 username: root
45 username: root
27 password:
46 password:
28
47
48 test_pgsql:
49 adapter: postgresql
50 database: redmine
51 host: localhost
52 username: postgres
53 password: "postgres"
54
55 test_oracle:
56 adapter: oci
57 host: 192.168.0.14
58 username: rails_test
59 password: "rails"
60
61 test_sqlserver:
62 adapter: sqlserver
63 host: localhost,1157
64 database: redmine_test
65
29 demo:
66 demo:
30 adapter: sqlite3
67 adapter: sqlite3
31 dbfile: db/redmine_demo.db
68 dbfile: db/redmine_demo.db
32
69
33 production:
34 adapter: mysql
35 database: redmine
36 host: localhost
37 username: root
38 password:
39 No newline at end of file
@@ -73,7 +73,7 end
73 # application name
73 # application name
74 RDM_APP_NAME = "redMine"
74 RDM_APP_NAME = "redMine"
75 # application version
75 # application version
76 RDM_APP_VERSION = "0.1.0"
76 RDM_APP_VERSION = "0.2.0"
77 # application host name
77 # application host name
78 RDM_HOST_NAME = "somenet.foo"
78 RDM_HOST_NAME = "somenet.foo"
79 # file storage path
79 # file storage path
@@ -1,21 +1,62
1 # administration
1 # redMine - project management software
2 admin:
2 # Copyright (C) 2006 Jean-Philippe Lang
3 index: administration.html
3 #
4 mail_options: administration.html#mail_notifications
4 # This program is free software; you can redistribute it and/or
5 info: administration.html#app_info
5 # modify it under the terms of the GNU General Public License
6 users:
6 # as published by the Free Software Foundation; either version 2
7 index: administration.html#users
7 # of the License, or (at your option) any later version.
8 roles:
8 #
9 index: administration.html#roles
9 # This program is distributed in the hope that it will be useful,
10 workflow: administration.html#workflow
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 trackers:
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 index: administration.html#trackers
12 # GNU General Public License for more details.
13 issue_statuses:
13 #
14 index: administration.html#issue_statuses
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15
17
16 # projects
18 # available languages for help pages
17 projects:
19 langs:
18 add: projects.html#settings
20 - fr
19
21
20
22 # mapping between controller/action and help pages
21 # issues No newline at end of file
23 # if action is not defined here, 'index' page will be displayed
24 pages:
25 # administration
26 admin:
27 index: ch01.html
28 mail_options: ch01s08.html
29 info: ch01s09.html
30 users:
31 index: ch01s01.html
32 roles:
33 index: ch01s02.html
34 workflow: ch01s06.html
35 trackers:
36 index: ch01s03.html
37 issue_statuses:
38 index: ch01s05.html
39 # projects
40 projects:
41 index: ch02.html
42 add: ch02s08.html
43 show: ch02s01.html
44 add_document: ch02s06.html
45 list_documents: ch02s06.html
46 add_issue: ch02s02.html
47 list_issues: ch02s02.html
48 add_news: ch02s05.html
49 list_news: ch02s05.html
50 add_file: ch02s07.html
51 list_files: ch02s07.html
52 changelog: ch02s04.html
53 issues:
54 index: ch02s02.html
55 documents:
56 index: ch02s06.html
57 news:
58 index: ch02s05.html
59 versions:
60 index: ch02s08.html
61 reports:
62 index: ch02s03.html No newline at end of file
@@ -1,3 +1,20
1 # redMine - project management software
2 # Copyright (C) 2006 Jean-Philippe Lang
3 #
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
1 class Setup < ActiveRecord::Migration
18 class Setup < ActiveRecord::Migration
2 def self.up
19 def self.up
3 create_table "attachments", :force => true do |t|
20 create_table "attachments", :force => true do |t|
@@ -5,8 +22,8 class Setup < ActiveRecord::Migration
5 t.column "container_type", :string, :limit => 30, :default => "", :null => false
22 t.column "container_type", :string, :limit => 30, :default => "", :null => false
6 t.column "filename", :string, :default => "", :null => false
23 t.column "filename", :string, :default => "", :null => false
7 t.column "disk_filename", :string, :default => "", :null => false
24 t.column "disk_filename", :string, :default => "", :null => false
8 t.column "size", :integer, :default => 0, :null => false
25 t.column "filesize", :integer, :default => 0, :null => false
9 t.column "content_type", :string, :limit => 60, :default => "", :null => false
26 t.column "content_type", :string, :limit => 60, :default => ""
10 t.column "digest", :string, :limit => 40, :default => "", :null => false
27 t.column "digest", :string, :limit => 40, :default => "", :null => false
11 t.column "downloads", :integer, :default => 0, :null => false
28 t.column "downloads", :integer, :default => 0, :null => false
12 t.column "author_id", :integer, :default => 0, :null => false
29 t.column "author_id", :integer, :default => 0, :null => false
@@ -18,8 +35,8 class Setup < ActiveRecord::Migration
18 t.column "typ", :integer, :default => 0, :null => false
35 t.column "typ", :integer, :default => 0, :null => false
19 t.column "is_required", :boolean, :default => false, :null => false
36 t.column "is_required", :boolean, :default => false, :null => false
20 t.column "is_for_all", :boolean, :default => false, :null => false
37 t.column "is_for_all", :boolean, :default => false, :null => false
21 t.column "possible_values", :text, :default => "", :null => false
38 t.column "possible_values", :text, :default => ""
22 t.column "regexp", :string, :default => "", :null => false
39 t.column "regexp", :string, :default => ""
23 t.column "min_length", :integer, :default => 0, :null => false
40 t.column "min_length", :integer, :default => 0, :null => false
24 t.column "max_length", :integer, :default => 0, :null => false
41 t.column "max_length", :integer, :default => 0, :null => false
25 end
42 end
@@ -59,7 +76,7 class Setup < ActiveRecord::Migration
59 t.column "issue_id", :integer, :default => 0, :null => false
76 t.column "issue_id", :integer, :default => 0, :null => false
60 t.column "status_id", :integer, :default => 0, :null => false
77 t.column "status_id", :integer, :default => 0, :null => false
61 t.column "author_id", :integer, :default => 0, :null => false
78 t.column "author_id", :integer, :default => 0, :null => false
62 t.column "notes", :text, :default => "", :null => false
79 t.column "notes", :text, :default => ""
63 t.column "created_on", :timestamp
80 t.column "created_on", :timestamp
64 end
81 end
65
82
@@ -99,7 +116,7 class Setup < ActiveRecord::Migration
99 create_table "news", :force => true do |t|
116 create_table "news", :force => true do |t|
100 t.column "project_id", :integer
117 t.column "project_id", :integer
101 t.column "title", :string, :limit => 60, :default => "", :null => false
118 t.column "title", :string, :limit => 60, :default => "", :null => false
102 t.column "shortdescr", :string, :default => "", :null => false
119 t.column "shortdescr", :string, :default => ""
103 t.column "descr", :text, :default => "", :null => false
120 t.column "descr", :text, :default => "", :null => false
104 t.column "author_id", :integer, :default => 0, :null => false
121 t.column "author_id", :integer, :default => 0, :null => false
105 t.column "created_on", :timestamp
122 t.column "created_on", :timestamp
@@ -109,7 +126,7 class Setup < ActiveRecord::Migration
109 t.column "controller", :string, :limit => 30, :default => "", :null => false
126 t.column "controller", :string, :limit => 30, :default => "", :null => false
110 t.column "action", :string, :limit => 30, :default => "", :null => false
127 t.column "action", :string, :limit => 30, :default => "", :null => false
111 t.column "descr", :string, :limit => 60, :default => "", :null => false
128 t.column "descr", :string, :limit => 60, :default => "", :null => false
112 t.column "public", :boolean, :default => false, :null => false
129 t.column "is_public", :boolean, :default => false, :null => false
113 t.column "sort", :integer, :default => 0, :null => false
130 t.column "sort", :integer, :default => 0, :null => false
114 t.column "mail_option", :boolean, :default => false, :null => false
131 t.column "mail_option", :boolean, :default => false, :null => false
115 t.column "mail_enabled", :boolean, :default => false, :null => false
132 t.column "mail_enabled", :boolean, :default => false, :null => false
@@ -125,8 +142,10 class Setup < ActiveRecord::Migration
125 create_table "projects", :force => true do |t|
142 create_table "projects", :force => true do |t|
126 t.column "name", :string, :limit => 30, :default => "", :null => false
143 t.column "name", :string, :limit => 30, :default => "", :null => false
127 t.column "descr", :string, :default => "", :null => false
144 t.column "descr", :string, :default => "", :null => false
128 t.column "homepage", :string, :limit => 60, :default => "", :null => false
145 t.column "homepage", :string, :limit => 60, :default => ""
129 t.column "public", :boolean, :default => true, :null => false
146 t.column "is_public", :boolean, :default => true, :null => false
147 t.column "parent_id", :integer
148 t.column "projects_count", :integer, :default => 0
130 t.column "created_on", :timestamp
149 t.column "created_on", :timestamp
131 t.column "updated_on", :timestamp
150 t.column "updated_on", :timestamp
132 end
151 end
@@ -158,8 +177,8 class Setup < ActiveRecord::Migration
158 create_table "versions", :force => true do |t|
177 create_table "versions", :force => true do |t|
159 t.column "project_id", :integer, :default => 0, :null => false
178 t.column "project_id", :integer, :default => 0, :null => false
160 t.column "name", :string, :limit => 30, :default => "", :null => false
179 t.column "name", :string, :limit => 30, :default => "", :null => false
161 t.column "descr", :string, :default => "", :null => false
180 t.column "descr", :string, :default => ""
162 t.column "date", :date, :null => false
181 t.column "effective_date", :date, :null => false
163 t.column "created_on", :timestamp
182 t.column "created_on", :timestamp
164 t.column "updated_on", :timestamp
183 t.column "updated_on", :timestamp
165 end
184 end
@@ -172,13 +191,13 class Setup < ActiveRecord::Migration
172 end
191 end
173
192
174 # project
193 # project
175 Permission.create :controller => "projects", :action => "show", :descr => "Overview", :sort => 100, :public => true
194 Permission.create :controller => "projects", :action => "show", :descr => "Overview", :sort => 100, :is_public => true
176 Permission.create :controller => "projects", :action => "changelog", :descr => "View change log", :sort => 105, :public => true
195 Permission.create :controller => "projects", :action => "changelog", :descr => "View change log", :sort => 105, :is_public => true
177 Permission.create :controller => "reports", :action => "issue_report", :descr => "View reports", :sort => 110, :public => true
196 Permission.create :controller => "reports", :action => "issue_report", :descr => "View reports", :sort => 110, :is_public => true
178 Permission.create :controller => "projects", :action => "settings", :descr => "Settings", :sort => 150
197 Permission.create :controller => "projects", :action => "settings", :descr => "Settings", :sort => 150
179 Permission.create :controller => "projects", :action => "edit", :descr => "Edit", :sort => 151
198 Permission.create :controller => "projects", :action => "edit", :descr => "Edit", :sort => 151
180 # members
199 # members
181 Permission.create :controller => "projects", :action => "list_members", :descr => "View list", :sort => 200, :public => true
200 Permission.create :controller => "projects", :action => "list_members", :descr => "View list", :sort => 200, :is_public => true
182 Permission.create :controller => "projects", :action => "add_member", :descr => "New member", :sort => 220
201 Permission.create :controller => "projects", :action => "add_member", :descr => "New member", :sort => 220
183 Permission.create :controller => "members", :action => "edit", :descr => "Edit", :sort => 221
202 Permission.create :controller => "members", :action => "edit", :descr => "Edit", :sort => 221
184 Permission.create :controller => "members", :action => "destroy", :descr => "Delete", :sort => 222
203 Permission.create :controller => "members", :action => "destroy", :descr => "Delete", :sort => 222
@@ -191,9 +210,9 class Setup < ActiveRecord::Migration
191 Permission.create :controller => "issue_categories", :action => "edit", :descr => "Edit", :sort => 421
210 Permission.create :controller => "issue_categories", :action => "edit", :descr => "Edit", :sort => 421
192 Permission.create :controller => "issue_categories", :action => "destroy", :descr => "Delete", :sort => 422
211 Permission.create :controller => "issue_categories", :action => "destroy", :descr => "Delete", :sort => 422
193 # issues
212 # issues
194 Permission.create :controller => "projects", :action => "list_issues", :descr => "View list", :sort => 1000, :public => true
213 Permission.create :controller => "projects", :action => "list_issues", :descr => "View list", :sort => 1000, :is_public => true
195 Permission.create :controller => "issues", :action => "show", :descr => "View", :sort => 1005, :public => true
214 Permission.create :controller => "issues", :action => "show", :descr => "View", :sort => 1005, :is_public => true
196 Permission.create :controller => "issues", :action => "download", :descr => "Download file", :sort => 1010, :public => true
215 Permission.create :controller => "issues", :action => "download", :descr => "Download file", :sort => 1010, :is_public => true
197 Permission.create :controller => "projects", :action => "add_issue", :descr => "Report an issue", :sort => 1050, :mail_option => 1, :mail_enabled => 1
216 Permission.create :controller => "projects", :action => "add_issue", :descr => "Report an issue", :sort => 1050, :mail_option => 1, :mail_enabled => 1
198 Permission.create :controller => "issues", :action => "edit", :descr => "Edit", :sort => 1055
217 Permission.create :controller => "issues", :action => "edit", :descr => "Edit", :sort => 1055
199 Permission.create :controller => "issues", :action => "change_status", :descr => "Change status", :sort => 1060, :mail_option => 1, :mail_enabled => 1
218 Permission.create :controller => "issues", :action => "change_status", :descr => "Change status", :sort => 1060, :mail_option => 1, :mail_enabled => 1
@@ -201,28 +220,30 class Setup < ActiveRecord::Migration
201 Permission.create :controller => "issues", :action => "add_attachment", :descr => "Add file", :sort => 1070
220 Permission.create :controller => "issues", :action => "add_attachment", :descr => "Add file", :sort => 1070
202 Permission.create :controller => "issues", :action => "destroy_attachment", :descr => "Delete file", :sort => 1075
221 Permission.create :controller => "issues", :action => "destroy_attachment", :descr => "Delete file", :sort => 1075
203 # news
222 # news
204 Permission.create :controller => "projects", :action => "list_news", :descr => "View list", :sort => 1100, :public => true
223 Permission.create :controller => "projects", :action => "list_news", :descr => "View list", :sort => 1100, :is_public => true
205 Permission.create :controller => "news", :action => "show", :descr => "View", :sort => 1101, :public => true
224 Permission.create :controller => "news", :action => "show", :descr => "View", :sort => 1101, :is_public => true
206 Permission.create :controller => "projects", :action => "add_news", :descr => "Add", :sort => 1120
225 Permission.create :controller => "projects", :action => "add_news", :descr => "Add", :sort => 1120
207 Permission.create :controller => "news", :action => "edit", :descr => "Edit", :sort => 1121
226 Permission.create :controller => "news", :action => "edit", :descr => "Edit", :sort => 1121
208 Permission.create :controller => "news", :action => "destroy", :descr => "Delete", :sort => 1122
227 Permission.create :controller => "news", :action => "destroy", :descr => "Delete", :sort => 1122
209 # documents
228 # documents
210 Permission.create :controller => "projects", :action => "list_documents", :descr => "View list", :sort => 1200, :public => true
229 Permission.create :controller => "projects", :action => "list_documents", :descr => "View list", :sort => 1200, :is_public => true
211 Permission.create :controller => "documents", :action => "show", :descr => "View", :sort => 1201, :public => true
230 Permission.create :controller => "documents", :action => "show", :descr => "View", :sort => 1201, :is_public => true
212 Permission.create :controller => "documents", :action => "download", :descr => "Download", :sort => 1202, :public => true
231 Permission.create :controller => "documents", :action => "download", :descr => "Download", :sort => 1202, :is_public => true
213 Permission.create :controller => "projects", :action => "add_document", :descr => "Add", :sort => 1220
232 Permission.create :controller => "projects", :action => "add_document", :descr => "Add", :sort => 1220
214 Permission.create :controller => "documents", :action => "edit", :descr => "Edit", :sort => 1221
233 Permission.create :controller => "documents", :action => "edit", :descr => "Edit", :sort => 1221
215 Permission.create :controller => "documents", :action => "destroy", :descr => "Delete", :sort => 1222
234 Permission.create :controller => "documents", :action => "destroy", :descr => "Delete", :sort => 1222
216 Permission.create :controller => "documents", :action => "add_attachment", :descr => "Add file", :sort => 1223
235 Permission.create :controller => "documents", :action => "add_attachment", :descr => "Add file", :sort => 1223
217 Permission.create :controller => "documents", :action => "destroy_attachment", :descr => "Delete file", :sort => 1224
236 Permission.create :controller => "documents", :action => "destroy_attachment", :descr => "Delete file", :sort => 1224
218 # files
237 # files
219 Permission.create :controller => "projects", :action => "list_files", :descr => "View list", :sort => 1300, :public => true
238 Permission.create :controller => "projects", :action => "list_files", :descr => "View list", :sort => 1300, :is_public => true
220 Permission.create :controller => "versions", :action => "download", :descr => "Download", :sort => 1301, :public => true
239 Permission.create :controller => "versions", :action => "download", :descr => "Download", :sort => 1301, :is_public => true
221 Permission.create :controller => "projects", :action => "add_file", :descr => "Add", :sort => 1320
240 Permission.create :controller => "projects", :action => "add_file", :descr => "Add", :sort => 1320
222 Permission.create :controller => "versions", :action => "destroy_file", :descr => "Delete", :sort => 1322
241 Permission.create :controller => "versions", :action => "destroy_file", :descr => "Delete", :sort => 1322
223
242
224 # create default administrator account
243 # create default administrator account
225 user = User.create :login => "admin", :password => "admin", :firstname => "redMine", :lastname => "Admin", :mail => "admin@somenet.foo", :mail_notification => true, :language => "en"
244 user = User.create :firstname => "redMine", :lastname => "Admin", :mail => "admin@somenet.foo", :mail_notification => true, :language => "en"
245 user.login = "admin"
246 user.password = "admin"
226 user.admin = true
247 user.admin = true
227 user.save
248 user.save
228
249
@@ -1,12 +1,29
1 # redMine - project management software
2 # Copyright (C) 2006 Jean-Philippe Lang
3 #
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
1 class DefaultConfiguration < ActiveRecord::Migration
18 class DefaultConfiguration < ActiveRecord::Migration
2 def self.up
19 def self.up
3 # roles
20 # roles
4 r = Role.create(:name => "Manager")
21 r = Role.create(:name => "Manager")
5 r.permissions = Permission.find(:all)
22 r.permissions = Permission.find(:all)
6 r = Role.create :name => "Developer"
23 r = Role.create :name => "Developer"
7 r.permissions = Permission.find([1, 2, 3, 6, 10, 11, 12, 16, 17, 18, 19, 20, 21, 23, 25, 26, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41])
24 r.permissions = Permission.find(:all)
8 r = Role.create :name => "Reporter"
25 r = Role.create :name => "Reporter"
9 r.permissions = Permission.find([1, 2, 3, 6, 16, 17, 18, 19, 20, 21, 23, 25, 26, 30, 31, 32, 38, 39])
26 r.permissions = Permission.find(:all)
10 # trackers
27 # trackers
11 Tracker.create(:name => "Bug", :is_in_chlog => true)
28 Tracker.create(:name => "Bug", :is_in_chlog => true)
12 Tracker.create(:name => "Feature request", :is_in_chlog => true)
29 Tracker.create(:name => "Feature request", :is_in_chlog => true)
@@ -2,13 +2,22
2
2
3 redMine - project management software
3 redMine - project management software
4 Copyright (C) 2006 Jean-Philippe Lang
4 Copyright (C) 2006 Jean-Philippe Lang
5 http://redmine.sourceforge.net/
5 http://redmine.org/
6
6
7
7
8 == xx/xx/2006
8 == 07/09/2006 - v0.2.0
9
9
10 * More filter options in issues list
10 * new databases supported: Oracle, PostgreSQL, SQL Server
11 * Issues list exportable to CSV
11 * projects/subprojects hierarchy (1 level of subprojects only)
12 * environment information display in admin/info
13 * more filter options in issues list (rev6)
14 * default language based on browser settings (Accept-Language HTTP header)
15 * issues list exportable to CSV (rev6)
16 * simple_format and auto_link on long text fields
17 * more data validations
18 * Fixed: error when all mail notifications are unchecked in admin/mail_options
19 * Fixed: all project news are displayed on project summary
20 * Fixed: Can't change user password in users/edit
12 * Fixed: Error on tables creation with PostgreSQL (rev5)
21 * Fixed: Error on tables creation with PostgreSQL (rev5)
13 * Fixed: SQL error in "issue reports" view with PostgreSQL (rev5)
22 * Fixed: SQL error in "issue reports" view with PostgreSQL (rev5)
14
23
@@ -2,15 +2,23
2
2
3 redMine - project management software
3 redMine - project management software
4 Copyright (C) 2006 Jean-Philippe Lang
4 Copyright (C) 2006 Jean-Philippe Lang
5 http://redmine.sourceforge.net/
5 http://redmine.org/
6
6
7
7
8 == Requirements
8 == Requirements
9
9
10 * Ruby on Rails 1.1
10 * Ruby on Rails 1.1
11 * Any database supported by Rails (developped using MySQL 5)
11 * a database (see compatibility below)
12 * (recommended) Apache/Lighttpd with FCGI support
12 * (recommended) Apache/Lighttpd with FCGI support
13
13
14 Supported databases:
15
16 * MySQL (tested with MySQL 5)
17 * PostgreSQL (tested with PostgreSQL 8.1)
18 * Oracle (tested with Oracle 10g)
19 * SQL Server (tested with SQL Server 2005)
20 * SQLite (tested with SQLite 3)
21
14
22
15 == Installation
23 == Installation
16
24
@@ -20,9 +28,9 http://redmine.sourceforge.net/
20 2. Create an empty database: "redmine" for example
28 2. Create an empty database: "redmine" for example
21
29
22 3. Configure database parameters in config/database.yml
30 3. Configure database parameters in config/database.yml
23 for "production" environment
31 for "production" environment (default database is MySQL)
24
32
25 4. Create database structure. Under application main directory:
33 4. Create the database structure. Under application main directory:
26 rake migrate RAILS_ENV="production"
34 rake migrate RAILS_ENV="production"
27 It will create tables and default configuration data
35 It will create tables and default configuration data
28
36
@@ -2,7 +2,7
2
2
3 redMine - project management software
3 redMine - project management software
4 Copyright (C) 2006 Jean-Philippe Lang
4 Copyright (C) 2006 Jean-Philippe Lang
5 http://redmine.sourceforge.net/
5 http://redmine.org/
6
6
7 == License
7 == License
8
8
@@ -34,6 +34,12 redMine is a project management software written using Ruby on Rails.
34 * multilanguage support
34 * multilanguage support
35
35
36
36
37 == User documentation
38
39 User documentation for redMine is written using DocBook XML format.
40 It's also avaible as HTML files in /public/manual (contextual help)
41
42
37 == Versioning
43 == Versioning
38
44
39 redMine versioning scheme is major.minor.revision
45 redMine versioning scheme is major.minor.revision
@@ -10,7 +10,11 Localization.define('fr', 'Français') do |l|
10 l.store 'Resolved', 'Résolue'
10 l.store 'Resolved', 'Résolue'
11 l.store 'Closed', 'Fermée'
11 l.store 'Closed', 'Fermée'
12 l.store 'Rejected', 'Rejetée'
12 l.store 'Rejected', 'Rejetée'
13 l.store 'Feedback', 'Commentaire'
13 l.store 'Feedback', 'Commentaire'
14 # filters
15 l.store '[All]', '[Tous]'
16 l.store '[Open]', '[Ouvert]'
17 l.store '[None]', '[Aucun]'
14
18
15 # issue priorities
19 # issue priorities
16 l.store 'Issue priorities', 'Priorités des demandes'
20 l.store 'Issue priorities', 'Priorités des demandes'
@@ -53,6 +57,9 Localization.define('fr', 'Français') do |l|
53 l.store 'Reported issues', 'Demandes soumises'
57 l.store 'Reported issues', 'Demandes soumises'
54 l.store 'Assigned to me', 'Demandes qui me sont assignées'
58 l.store 'Assigned to me', 'Demandes qui me sont assignées'
55
59
60 # ./script/../config/../app/views/account/login.rhtml
61 l.store 'Please login', 'Identification'
62
56 # ./script/../config/../app/views/account/show.rhtml
63 # ./script/../config/../app/views/account/show.rhtml
57 l.store 'Registered on', 'Inscrit le'
64 l.store 'Registered on', 'Inscrit le'
58 l.store 'Projects', 'Projets'
65 l.store 'Projects', 'Projets'
@@ -231,6 +238,7 Localization.define('fr', 'Français') do |l|
231 l.store 'New file', 'Nouveau fichier'
238 l.store 'New file', 'Nouveau fichier'
232
239
233 # ./script/../config/../app/views/projects/list_issues.rhtml
240 # ./script/../config/../app/views/projects/list_issues.rhtml
241 l.store 'Subprojects', 'Sous-projets'
234 l.store 'Apply filter', 'Appliquer'
242 l.store 'Apply filter', 'Appliquer'
235 l.store 'Reset', 'Annuler'
243 l.store 'Reset', 'Annuler'
236 l.store 'Report an issue', 'Nouvelle demande'
244 l.store 'Report an issue', 'Nouvelle demande'
@@ -311,6 +319,6 Localization.define('fr', 'Français') do |l|
311 # ./script/../config/../app/views/versions/_form.rhtml
319 # ./script/../config/../app/views/versions/_form.rhtml
312
320
313 # ./script/../config/../app/views/welcome/index.rhtml
321 # ./script/../config/../app/views/welcome/index.rhtml
314
322 l.store 'Latest projects', 'Derniers projets'
315
323
316 end
324 end
1 NO CONTENT: file renamed from redmine/public/manual/images/users_list.png to redmine/public/manual/fr/resources/users_list.png
NO CONTENT: file renamed from redmine/public/manual/images/users_list.png to redmine/public/manual/fr/resources/users_list.png
@@ -189,11 +189,20 input.button-small
189 font-size: 0.8em;
189 font-size: 0.8em;
190 }
190 }
191
191
192 select.select-small
193 {
194 font-size: 0.8em;
195 }
196
192 label {
197 label {
193 font-weight: bold;
198 font-weight: bold;
194 font-size: 1em;
199 font-size: 1em;
195 }
200 }
196
201
202 fieldset {
203 border:1px solid #7F9DB9;
204 }
205
197 .required {
206 .required {
198 color: #bb0000;
207 color: #bb0000;
199 }
208 }
@@ -220,10 +229,10 tr.ListHead a {
220 text-decoration:underline;
229 text-decoration:underline;
221 }
230 }
222
231
223 tr.ListLine0 {
232 tr.odd {
224 background-color: #C1E2F7;
233 background-color: #C1E2F7;
225 }
234 }
226 tr.ListLine1 {
235 tr.even {
227 background-color:#CEE1ED;
236 background-color:#CEE1ED;
228 }
237 }
229
238
@@ -1,5 +1,26
1 # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
1 # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
2 first:
2 ecookbook:
3 id: 1
3 id: 1
4 another:
4 name: eCookbook
5 descr: Recipes management application
6 homepage: http://ecookbook.somenet.foo/
7 projects_count: 1
8 created_on: 2005-01-01 01:00:00
9 updated_on: 2005-01-01 01:00:00
10 onlinestore:
5 id: 2
11 id: 2
12 name: OnlineStore
13 descr: E-commerce web site
14 is_public: false
15 projects_count: 0
16 created_on: 2005-01-01 01:00:00
17 updated_on: 2005-01-01 01:00:00
18 tracker:
19 id: 3
20 name: tracker
21 descr: bug tracker
22 is_public: true
23 projects_count: 0
24 parent_id: 1
25 created_on: 2005-01-01 01:00:00
26 updated_on: 2005-01-01 01:00:00 No newline at end of file
@@ -1,5 +1,10
1 # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
1 # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
2 first:
2 manager:
3 id: 1
3 id: 1
4 another:
4 name: manager
5 developer:
5 id: 2
6 id: 2
7 name: developer
8 reporter:
9 id: 3
10 name: reporter
@@ -1,5 +1,19
1 # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
1 # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
2 first:
2 admin:
3 id: 1
3 id: 1
4 another:
4 login: admin
5 firstname: admin
6 lastname: admin
7 mail: admin@somenet.foo
8 hashed_password: d033e22ae348aeb5660fc2140aec35850c4da997
9 admin: true
10 language: en
11 paulochon:
5 id: 2
12 id: 2
13 login: plochon
14 firstname: Paul
15 lastname: Ochon
16 mail: plochon@somenet.foo
17 hashed_password: d033e22ae348aeb5660fc2140aec35850c4da997
18 admin: false
19 language: en No newline at end of file
@@ -1,3 +1,20
1 # redMine - project management software
2 # Copyright (C) 2006 Jean-Philippe Lang
3 #
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
1 require File.dirname(__FILE__) + '/../test_helper'
18 require File.dirname(__FILE__) + '/../test_helper'
2 require 'projects_controller'
19 require 'projects_controller'
3
20
@@ -27,62 +44,4 class ProjectsControllerTest < Test::Unit::TestCase
27
44
28 assert_not_nil assigns(:projects)
45 assert_not_nil assigns(:projects)
29 end
46 end
30
31 def test_show
32 get :show, :id => 1
33
34 assert_response :success
35 assert_template 'show'
36
37 assert_not_nil assigns(:project)
38 assert assigns(:project).valid?
39 end
40
41 def test_new
42 get :new
43
44 assert_response :success
45 assert_template 'new'
46
47 assert_not_nil assigns(:project)
48 end
49
50 def test_create
51 num_projects = Project.count
52
53 post :create, :project => {}
54
55 assert_response :redirect
56 assert_redirected_to :action => 'list'
57
58 assert_equal num_projects + 1, Project.count
59 end
60
61 def test_edit
62 get :edit, :id => 1
63
64 assert_response :success
65 assert_template 'edit'
66
67 assert_not_nil assigns(:project)
68 assert assigns(:project).valid?
69 end
70
71 def test_update
72 post :update, :id => 1
73 assert_response :redirect
74 assert_redirected_to :action => 'show', :id => 1
75 end
76
77 def test_destroy
78 assert_not_nil Project.find(1)
79
80 post :destroy, :id => 1
81 assert_response :redirect
82 assert_redirected_to :action => 'list'
83
84 assert_raise(ActiveRecord::RecordNotFound) {
85 Project.find(1)
86 }
87 end
88 end
47 end
@@ -1,4 +1,21
1 ENV["RAILS_ENV"] = "test"
1 # redMine - project management software
2 # Copyright (C) 2006 Jean-Philippe Lang
3 #
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
18 ENV["RAILS_ENV"] ||= "test"
2 require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
19 require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
3 require 'test_help'
20 require 'test_help'
4
21
@@ -25,4 +42,14 class Test::Unit::TestCase
25 self.use_instantiated_fixtures = false
42 self.use_instantiated_fixtures = false
26
43
27 # Add more helper methods to be used by all tests here...
44 # Add more helper methods to be used by all tests here...
45
46 def log_user(login, password)
47 get "/account/login"
48 assert_equal nil, session[:user]
49 assert_response :success
50 assert_template "account/login"
51 post "/account/login", :login => login, :password => password
52 assert_redirected_to "account/my_page"
53 assert_equal login, session[:user].login
54 end
28 end
55 end
@@ -1,10 +1,77
1 # redMine - project management software
2 # Copyright (C) 2006 Jean-Philippe Lang
3 #
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
1 require File.dirname(__FILE__) + '/../test_helper'
18 require File.dirname(__FILE__) + '/../test_helper'
2
19
3 class ProjectTest < Test::Unit::TestCase
20 class ProjectTest < Test::Unit::TestCase
4 fixtures :projects
21 fixtures :projects
5
22
6 # Replace this with your real tests.
23 def setup
24 @project = projects(:ecookbook)
25 end
26
7 def test_truth
27 def test_truth
8 assert_kind_of Project, projects(:first)
28 assert_kind_of Project, @project
29 assert_equal "eCookbook", @project.name
30 end
31
32 def test_update
33 assert_equal "eCookbook", @project.name
34 @project.name = "eCook"
35 assert @project.save, @project.errors.full_messages.join("; ")
36 @project.reload
37 assert_equal "eCook", @project.name
38 end
39
40 def test_validate
41 @project.name = ""
42 assert !@project.save
43 assert_equal 1, @project.errors.count
44 assert_equal "can't be blank", @project.errors.on(:name)
45 end
46
47 def test_public_projects
48 public_projects = Project.find(:all, :conditions => ["is_public=?", true])
49 assert_equal 2, public_projects.length
50 assert_equal true, public_projects[0].is_public?
51 end
52
53 def test_destroy
54 @project.destroy
55 assert_raise(ActiveRecord::RecordNotFound) { Project.find(@project.id) }
56 end
57
58 def test_subproject_ok
59 sub = Project.find(2)
60 sub.parent = Project.find(1)
61 assert sub.save
62 assert_equal 1, sub.parent.id
63 assert_equal 2, Project.find(1).projects_count
64 end
65
66 def test_subproject_invalid
67 sub = Project.find(2)
68 sub.parent = projects(:tracker)
69 assert !sub.save
70 end
71
72 def test_subproject_invalid_2
73 sub = Project.find(1)
74 sub.parent = projects(:onlinestore)
75 assert !sub.save
9 end
76 end
10 end
77 end
@@ -1,10 +1,64
1 # redMine - project management software
2 # Copyright (C) 2006 Jean-Philippe Lang
3 #
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
1 require File.dirname(__FILE__) + '/../test_helper'
18 require File.dirname(__FILE__) + '/../test_helper'
2
19
3 class UserTest < Test::Unit::TestCase
20 class UserTest < Test::Unit::TestCase
4 fixtures :users
21 fixtures :users
5
22
6 # Replace this with your real tests.
7 def test_truth
23 def test_truth
8 assert_kind_of User, users(:first)
24 assert_kind_of User, users(:paulochon)
25 end
26
27 def test_update
28 user = User.find(1)
29 assert_equal "admin", user.login
30 user.login = "john"
31 assert user.save, user.errors.full_messages.join("; ")
32 user.reload
33 assert_equal "john", user.login
34 end
35
36 def test_validate
37 user = User.find(1)
38 user.login = ""
39 assert !user.save
40 assert_equal 2, user.errors.count
41 end
42
43 def test_password
44 user = User.try_to_login("admin", "admin")
45 assert_kind_of User, user
46 assert_equal "admin", user.login
47 user.password = "hello"
48 assert user.save
49
50 user = User.try_to_login("admin", "hello")
51 assert_kind_of User, user
52 assert_equal "admin", user.login
53 assert_equal User.hash_password("hello"), user.hashed_password
54 end
55
56 def test_lock
57 user = User.find(1)
58 user.locked = true
59 assert user.save
60
61 user = User.try_to_login("admin", "admin")
62 assert_equal nil, user
9 end
63 end
10 end
64 end
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
General Comments 0
You need to be logged in to leave comments. Login now