##// 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
1 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 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 class AccountController < ApplicationController
19 layout 'base'
19 layout 'base'
20
20 21 # prevents login action to be filtered by check_if_login_required application scope filter
21 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 @user = User.find(params[:id])
26 end
27
28 # Login request and validation
29 def login
30 if request.get?
31 session[:user] = nil
32 @user = User.new
33 else
34 @user = User.new(params[:user])
35 logged_in_user = @user.try_to_login
36 if logged_in_user
37 session[:user] = logged_in_user
38 redirect_back_or_default :controller => 'account', :action => 'my_page'
39 else
40 flash[:notice] = _('Invalid user/password')
41 end
42 end
43 end
25 def show
26 @user = User.find(params[:id])
27 end
28
29 # Login request and validation
30 def login
31 if request.get?
32 session[:user] = nil
33 else
34 logged_in_user = User.try_to_login(params[:login], params[:password])
35 if logged_in_user
36 session[:user] = logged_in_user
37 redirect_back_or_default :controller => 'account', :action => 'my_page'
38 else
39 flash[:notice] = _('Invalid user/password')
40 end
41 end
42 end
44 43
45 44 # Log out current user and redirect to welcome page
46 45 def logout
@@ -64,20 +63,15 class AccountController < ApplicationController
64 63 end
65 64 end
66 65
67 # Change current user's password
68 def change_password
69 @user = User.find(session[:user].id)
70 if @user.check_password?(@params[:old_password])
71 if @params[:new_password] == @params[:new_password_confirmation]
72 if @user.change_password(@params[:old_password], @params[:new_password])
73 flash[:notice] = 'Password was successfully updated.'
74 end
75 else
76 flash[:notice] = 'Password confirmation doesn\'t match!'
77 end
78 else
79 flash[:notice] = 'Wrong password'
80 end
81 render :action => 'my_account'
82 end
66 # Change current user's password
67 def change_password
68 @user = User.find(session[:user].id)
69 if @user.check_password?(@params[:password])
70 @user.password, @user.password_confirmation = params[:new_password], params[:new_password_confirmation]
71 flash[:notice] = 'Password was successfully updated.' if @user.save
72 else
73 flash[:notice] = 'Wrong password'
74 end
75 render :action => 'my_account'
76 end
83 77 end
@@ -16,26 +16,32
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 class AdminController < ApplicationController
19 layout 'base'
20 before_filter :require_admin
21
22 helper :sort
23 include SortHelper
19 layout 'base'
20 before_filter :require_admin
21
22 helper :sort
23 include SortHelper
24 24
25 def index
26 end
25 def index
26 end
27 27
28 28 def projects
29 sort_init 'projects.name', 'asc'
30 sort_update
31 @project_pages, @projects = paginate :projects, :per_page => 15, :order => sort_clause
29 sort_init 'name', 'asc'
30 sort_update
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 38 end
33
39
34 40 def mail_options
35 @actions = Permission.find(:all, :conditions => ["mail_option=?", true]) || []
41 @actions = Permission.find(:all, :conditions => ["mail_option=?", true]) || []
36 42 if request.post?
37 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 45 a.save
40 46 }
41 47 flash[:notice] = "Mail options were successfully updated."
@@ -44,6 +50,5 class AdminController < ApplicationController
44 50
45 51 def info
46 52 @adapter_name = ActiveRecord::Base.connection.adapter_name
47 end
48
53 end
49 54 end
@@ -24,63 +24,73 class ApplicationController < ActionController::Base
24 24 end
25 25
26 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 39 end
29 40
30 def require_login
31 unless session[:user]
32 store_location
33 redirect_to(:controller => "account", :action => "login")
34 end
35 end
41 def require_login
42 unless session[:user]
43 store_location
44 redirect_to(:controller => "account", :action => "login")
45 end
46 end
36 47
37 def require_admin
38 if session[:user].nil?
39 store_location
40 redirect_to(:controller => "account", :action => "login")
41 else
42 unless session[:user].admin?
43 flash[:notice] = "Acces not allowed"
44 redirect_to(:controller => "projects", :action => "list")
45 end
46 end
47 end
48 def require_admin
49 if session[:user].nil?
50 store_location
51 redirect_to(:controller => "account", :action => "login")
52 else
53 unless session[:user].admin?
54 flash[:notice] = "Acces not allowed"
55 redirect_to(:controller => "projects", :action => "list")
56 end
57 end
58 end
48 59
49 # authorizes the user for the requested action.
50 def authorize
60 # authorizes the user for the requested action.
61 def authorize
51 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 64 return true
54 65 end
55 # if user is not logged in, he is redirect to login form
56 unless session[:user]
57 store_location
58 redirect_to(:controller => "account", :action => "login")
59 return false
60 end
61 # check if user is authorized
66 # if user not logged in, redirect to login form
67 unless session[:user]
68 store_location
69 redirect_to(:controller => "account", :action => "login")
70 return false
71 end
72 # if logged in, check if authorized
62 73 if session[:user].admin? or Permission.allowed_to_role( "%s/%s" % [ @params[:controller], @params[:action] ], session[:user].role_for_project(@project.id) )
63 74 return true
64 end
75 end
65 76 flash[:notice] = "Acces denied"
66 77 redirect_to(:controller => "")
67 return false
68 end
78 false
79 end
69 80
70 # store current uri in the session.
71 # we can return to this location by calling redirect_back_or_default
72 def store_location
73 session[:return_to] = @request.request_uri
74 end
75
76 # move to the last store_location call or to the passed default one
77 def redirect_back_or_default(default)
78 if session[:return_to].nil?
79 redirect_to default
80 else
81 redirect_to_url session[:return_to]
82 session[:return_to] = nil
83 end
84 end
85
81 # store current uri in session.
82 # return to this location by calling redirect_back_or_default
83 def store_location
84 session[:return_to] = @request.request_uri
85 end
86
87 # move to the last store_location call or to the passed default one
88 def redirect_back_or_default(default)
89 if session[:return_to].nil?
90 redirect_to default
91 else
92 redirect_to_url session[:return_to]
93 session[:return_to] = nil
94 end
95 end
86 96 end No newline at end of file
@@ -16,28 +16,32
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 class HelpController < ApplicationController
19
19
20 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
24 if @params[:ctrl] and @help_config[@params[:ctrl]]
25 if @params[:page] and @help_config[@params[:ctrl]][@params[:page]]
26 template = @help_config[@params[:ctrl]][@params[:page]]
27 else
28 template = @help_config[@params[:ctrl]]['index']
29 end
30 end
31
23 # displays help page for the requested controller/action
24 def index
25 # select help page to display
26 if @params[:ctrl] and @help_config['pages'][@params[:ctrl]]
27 if @params[:page] and @help_config['pages'][@params[:ctrl]][@params[:page]]
28 template = @help_config['pages'][@params[:ctrl]][@params[:page]]
29 else
30 template = @help_config['pages'][@params[:ctrl]]['index']
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 36 if template
33 redirect_to "/manual/#{template}"
37 redirect_to "/manual/#{lang}/#{template}"
34 38 else
35 redirect_to "/manual/"
39 redirect_to "/manual/#{lang}/"
36 40 end
37 end
41 end
38 42
39 43 private
40 def load_help_config
41 @help_config = YAML::load(File.open("#{RAILS_ROOT}/config/help.yml"))
42 end
44 def load_help_config
45 @help_config = YAML::load(File.open("#{RAILS_ROOT}/config/help.yml"))
46 end
43 47 end
@@ -32,58 +32,62 class ProjectsController < ApplicationController
32 32 render :action => 'list'
33 33 end
34 34
35 # Lists public projects
36 def list
37 sort_init 'projects.name', 'asc'
38 sort_update
39 @project_count = Project.count(["public=?", true])
40 @project_pages = Paginator.new self, @project_count,
35 # Lists public projects
36 def list
37 sort_init 'name', 'asc'
38 sort_update
39 @project_count = Project.count(["is_public=?", true])
40 @project_pages = Paginator.new self, @project_count,
41 41 15,
42 42 @params['page']
43 @projects = Project.find :all, :order => sort_clause,
44 :conditions => ["public=?", true],
43 @projects = Project.find :all, :order => sort_clause,
44 :conditions => ["is_public=?", true],
45 45 :limit => @project_pages.items_per_page,
46 46 :offset => @project_pages.current.offset
47 47 end
48 48
49 49 # Add a new project
50 def add
51 @custom_fields = CustomField::find_all
52 @project = Project.new(params[:project])
53 if request.post?
54 @project.custom_fields = CustomField.find(@params[:custom_field_ids]) if @params[:custom_field_ids]
55 if @project.save
56 flash[:notice] = 'Project was successfully created.'
57 redirect_to :controller => 'admin', :action => 'projects'
58 end
59 end
60 end
50 def add
51 @custom_fields = CustomField::find_all
52 @root_projects = Project::find(:all, :conditions => "parent_id is null")
53 @project = Project.new(params[:project])
54 if request.post?
55 @project.custom_fields = CustomField.find(@params[:custom_field_ids]) if @params[:custom_field_ids]
56 if @project.save
57 flash[:notice] = 'Project was successfully created.'
58 redirect_to :controller => 'admin', :action => 'projects'
59 end
60 end
61 end
61 62
62 # Show @project
63 def show
64 @members = @project.members.find(:all, :include => [:user, :role])
65 end
63 # Show @project
64 def show
65 @members = @project.members.find(:all, :include => [:user, :role])
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 70 def settings
68 @custom_fields = CustomField::find_all
69 @issue_category ||= IssueCategory.new
71 @root_projects = Project::find(:all, :conditions => ["parent_id is null and id <> ?", @project.id])
72 @custom_fields = CustomField::find_all
73 @issue_category ||= IssueCategory.new
70 74 @member ||= @project.members.new
71 75 @roles = Role.find_all
72 76 @users = User.find_all - @project.members.find(:all, :include => :user).collect{|m| m.user }
73 77 end
74 78
75 # Edit @project
76 def edit
77 if request.post?
78 @project.custom_fields = CustomField.find(@params[:custom_field_ids]) if @params[:custom_field_ids]
79 if @project.update_attributes(params[:project])
80 flash[:notice] = 'Project was successfully updated.'
81 redirect_to :action => 'settings', :id => @project
79 # Edit @project
80 def edit
81 if request.post?
82 @project.custom_fields = CustomField.find(@params[:custom_field_ids]) if @params[:custom_field_ids]
83 if @project.update_attributes(params[:project])
84 flash[:notice] = 'Project was successfully updated.'
85 redirect_to :action => 'settings', :id => @project
82 86 else
83 87 settings
84 88 render :action => 'settings'
85 end
86 end
89 end
90 end
87 91 end
88 92
89 93 # Delete @project
@@ -181,7 +185,7 class ProjectsController < ApplicationController
181 185 end
182 186 end
183 187
184 # Show issues list of @project
188 # Show filtered/sorted issues list of @project
185 189 def list_issues
186 190 sort_init 'issues.id', 'desc'
187 191 sort_update
@@ -189,10 +193,10 class ProjectsController < ApplicationController
189 193 search_filter_init_list_issues
190 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 197 @issue_pages = Paginator.new self, @issue_count, 15, @params['page']
194 198 @issues = Issue.find :all, :order => sort_clause,
195 :include => [ :author, :status, :tracker ],
199 :include => [ :author, :status, :tracker, :project ],
196 200 :conditions => search_filter_clause,
197 201 :limit => @issue_pages.items_per_page,
198 202 :offset => @issue_pages.current.offset
@@ -206,7 +210,7 class ProjectsController < ApplicationController
206 210 search_filter_init_list_issues
207 211
208 212 @issues = Issue.find :all, :order => sort_clause,
209 :include => [ :author, :status, :tracker ],
213 :include => [ :author, :status, :tracker, :project ],
210 214 :conditions => search_filter_clause
211 215
212 216 export = StringIO.new
@@ -62,9 +62,6 class RolesController < ApplicationController
62 62 end
63 63
64 64 def workflow
65 @roles = Role.find_all
66 @trackers = Tracker.find_all
67 @statuses = IssueStatus.find_all
68 65
69 66 @role = Role.find_by_id(params[:role_id])
70 67 @tracker = Tracker.find_by_id(params[:tracker_id])
@@ -80,5 +77,8 class RolesController < ApplicationController
80 77 flash[:notice] = 'Workflow was successfully updated.'
81 78 end
82 79 end
80 @roles = Role.find_all
81 @trackers = Tracker.find_all
82 @statuses = IssueStatus.find(:all, :include => :workflows)
83 83 end
84 84 end
@@ -16,58 +16,62
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 class UsersController < ApplicationController
19 layout 'base'
20 before_filter :require_admin
21
22 helper :sort
23 include SortHelper
24
25 def index
26 list
27 render :action => 'list'
28 end
19 layout 'base'
20 before_filter :require_admin
21
22 helper :sort
23 include SortHelper
24
25 def index
26 list
27 render :action => 'list'
28 end
29 29
30 def list
31 sort_init 'users.login', 'asc'
32 sort_update
33 @user_count = User.count
34 @user_pages = Paginator.new self, @user_count,
30 def list
31 sort_init 'login', 'asc'
32 sort_update
33 @user_count = User.count
34 @user_pages = Paginator.new self, @user_count,
35 35 15,
36 36 @params['page']
37 @users = User.find :all, :order => sort_clause,
37 @users = User.find :all,:order => sort_clause,
38 38 :limit => @user_pages.items_per_page,
39 39 :offset => @user_pages.current.offset
40 end
40 end
41 41
42 def add
43 if request.get?
44 @user = User.new
45 else
46 @user = User.new(params[:user])
47 @user.admin = params[:user][:admin]
48 if @user.save
49 flash[:notice] = 'User was successfully created.'
50 redirect_to :action => 'list'
51 end
52 end
53 end
42 def add
43 if request.get?
44 @user = User.new
45 else
46 @user = User.new(params[:user])
47 @user.admin = params[:user][:admin] || false
48 @user.login = params[:user][:login]
49 @user.password, @user.password_confirmation = params[:password], params[:password_confirmation]
50 if @user.save
51 flash[:notice] = 'User was successfully created.'
52 redirect_to :action => 'list'
53 end
54 end
55 end
54 56
55 def edit
56 @user = User.find(params[:id])
57 if request.post?
58 @user.admin = params[:user][:admin] if params[:user][:admin]
59 if @user.update_attributes(params[:user])
60 flash[:notice] = 'User was successfully updated.'
61 redirect_to :action => 'list'
62 end
63 end
64 end
57 def edit
58 @user = User.find(params[:id])
59 if request.post?
60 @user.admin = params[:user][:admin] if params[:user][:admin]
61 @user.login = params[:user][:login] if params[:user][:login]
62 @user.password, @user.password_confirmation = params[:password], params[:password_confirmation] unless params[:password].nil? or params[:password].empty?
63 if @user.update_attributes(params[:user])
64 flash[:notice] = 'User was successfully updated.'
65 redirect_to :action => 'list'
66 end
67 end
68 end
65 69
66 def destroy
67 User.find(params[:id]).destroy
68 redirect_to :action => 'list'
70 def destroy
71 User.find(params[:id]).destroy
72 redirect_to :action => 'list'
69 73 rescue
70 74 flash[:notice] = "Unable to delete user"
71 75 redirect_to :action => 'list'
72 end
76 end
73 77 end
@@ -38,6 +38,9 class VersionsController < ApplicationController
38 38 @attachment = @version.attachments.find(params[:attachment_id])
39 39 @attachment.increment_download
40 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 44 end
42 45
43 46 def destroy_file
@@ -27,7 +27,7 module ApplicationHelper
27 27
28 28 def authorize_for(controller, action)
29 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 31 return true
32 32 end
33 33 # check if user is authorized
@@ -18,68 +18,73
18 18 module SearchFilterHelper
19 19
20 20 def search_filter_criteria(name, options = {})
21 session[:search_filter] ||= {}
22 session[:search_filter][name] ||= {}
23 unless session[:search_filter][name][:options] and session[:search_filter][name][:conditions]
24 session[:search_filter][name][:options] = []
25 session[:search_filter][name][:conditions] = {}
26 yield.each { |c|
27 session[:search_filter][name][:options] << [c[0], c[1].to_s]
28 session[:search_filter][name][:conditions].store(c[1].to_s, c[2])
29 }
30 end
21 @search_filter ||= {}
22 @search_filter[name] ||= {}
23 @search_filter[name][:options] = []
24 @search_filter[name][:conditions] = {}
25 yield.each { |c|
26 @search_filter[name][:options] << [c[0], c[1].to_s]
27 @search_filter[name][:conditions].store(c[1].to_s, c[2])
28 }
31 29 end
32 30
33 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 33 end
36 34
37 35 def search_filter_clause
38 clause = ["issues.project_id=?", @project.id]
39 session[:search_filter].each { |k, v|
40 v[:value] ||= v[:options][0][1]
41 if (!v[:conditions][v[:value]][0].empty?)
42 clause[0] = clause[0] + " AND " + v[:conditions][v[:value]][0]
43 clause << v[:conditions][v[:value]][1] if !v[:conditions][v[:value]][1].nil?
36 clause = ["1=1"]
37 @search_filter.each { |k, v|
38 filter_value = session[:search_filter][k] || v[:options][0][1]
39 if v[:conditions][filter_value]
40 clause[0] = clause[0] + " AND " + v[:conditions][filter_value].first
41 clause += v[:conditions][filter_value][1..-1]
44 42 end
45 43 }
46 44 clause
47 45 end
48 46
49 def search_filter_tag(criteria)
47 def search_filter_tag(criteria, options = {})
48 options[:name] = criteria
50 49 content_tag("select",
51 options_for_select(session[:search_filter][criteria][:options], session[:search_filter][criteria][:value]),
52 :name => criteria
50 options_for_select(@search_filter[criteria][:options], session[:search_filter][criteria]),
51 options
53 52 )
54 53 end
55 54
56 55 def search_filter_init_list_issues
57 56 search_filter_criteria('status_id') {
58 [ ["[Open]", "O", ["issue_statuses.is_closed=?", false]],
59 ["[All]", "A", ["", false]]
57 [ [_('[Open]'), "O", ["issue_statuses.is_closed=?", false]],
58 [_('[All]'), "A", nil]
60 59 ] + IssueStatus.find(:all).collect {|s| [s.name, s.id, ["issues.status_id=?", s.id]] }
61 60 }
62 61
63 62 search_filter_criteria('tracker_id') {
64 [ ["[All]", "A", ["", false]]
63 [ [_('[All]'), "A", nil]
65 64 ] + Tracker.find(:all).collect {|s| [s.name, s.id, ["issues.tracker_id=?", s.id]] }
66 65 }
67 66
68 67 search_filter_criteria('priority_id') {
69 [ ["[All]", "A", ["", false]]
68 [ [_('[All]'), "A", nil]
70 69 ] + Enumeration.find(:all, :conditions => ['opt=?','IPRI']).collect {|s| [s.name, s.id, ["issues.priority_id=?", s.id]] }
71 70 }
72 71
73 72 search_filter_criteria('category_id') {
74 [ ["[All]", "A", ["", false]],
75 ["[None]", "N", ["issues.category_id is null"]]
73 [ [_('[All]'), "A", nil],
74 [_('[None]'), "N", ["issues.category_id is null"]]
76 75 ] + @project.issue_categories.find(:all).collect {|s| [s.name, s.id, ["issues.category_id=?", s.id]] }
77 76 }
78 77
79 78 search_filter_criteria('assigned_to_id') {
80 [ ["[All]", "A", ["", false]],
81 ["[Nobody]", "N", ["issues.assigned_to_id is null"]]
82 ] + User.find(:all).collect {|s| [s.display_name, s.id, ["issues.assigned_to_id=?", s.id]] }
83 }
79 [ [_('[All]'), "A", nil],
80 [_('[None]'), "N", ["issues.assigned_to_id is null"]]
81 ] + @project.users.collect {|s| [s.display_name, s.id, ["issues.assigned_to_id=?", s.id]] }
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 89 end
85 90 end No newline at end of file
@@ -30,7 +30,7 class Attachment < ActiveRecord::Base
30 30 self.filename = sanitize_filename(@temp_file.original_filename)
31 31 self.disk_filename = DateTime.now.strftime("%y%m%d%H%M%S") + "_" + self.filename
32 32 self.content_type = @temp_file.content_type
33 self.size = @temp_file.size
33 self.filesize = @temp_file.size
34 34 end
35 35 end
36 36 end
@@ -19,6 +19,7 class Enumeration < ActiveRecord::Base
19 19 before_destroy :check_integrity
20 20
21 21 validates_presence_of :opt, :name
22 validates_uniqueness_of :name, :scope => [:opt]
22 23
23 24 OPTIONS = [
24 25 ["Issue priorities", "IPRI"],
@@ -17,9 +17,10
17 17
18 18 class IssueCategory < ActiveRecord::Base
19 19 before_destroy :check_integrity
20 belongs_to :project
21
20 belongs_to :project
21
22 22 validates_presence_of :name
23 validates_uniqueness_of :name, :scope => [:project_id]
23 24
24 25 private
25 26 def check_integrity
@@ -17,24 +17,26
17 17
18 18 class IssueStatus < ActiveRecord::Base
19 19 before_destroy :check_integrity
20 has_many :workflows, :foreign_key => "old_status_id"
21
22 validates_presence_of :name
23 validates_uniqueness_of :name
20 has_many :workflows, :foreign_key => "old_status_id"
24 21
25 # Returns the default status for new issues
26 def self.default
27 find(:first, :conditions =>["is_default=?", true])
28 end
29
30 # Returns an array of all statuses the given role can switch to
31 def new_statuses_allowed_to(role, tracker)
32 statuses = []
33 for workflow in self.workflows.find(:all, :include => :new_status)
34 statuses << workflow.new_status if workflow.role_id == role.id and workflow.tracker_id == tracker.id
35 end unless role.nil?
36 statuses
37 end
22 validates_presence_of :name
23 validates_uniqueness_of :name
24 validates_length_of :html_color, :is=>6
25 validates_format_of :html_color, :with => /^[a-f0-9]*$/i
26
27 # Returns the default status for new issues
28 def self.default
29 find(:first, :conditions =>["is_default=?", true])
30 end
31
32 # Returns an array of all statuses the given role can switch to
33 def new_statuses_allowed_to(role, tracker)
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 41 def name
40 42 _ self.attributes['name']
@@ -43,7 +43,7 class Permission < ActiveRecord::Base
43 43 end
44 44
45 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 47 @@cached_perms_for_public.include? action
48 48 end
49 49
@@ -16,29 +16,33
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 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 20 has_many :members, :dependent => true
21 has_many :users, :through => :members
21 22 has_many :issues, :dependent => true, :order => "issues.created_on DESC", :include => :status
22 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 25 has_many :issue_categories, :dependent => true
25 26 has_and_belongs_to_many :custom_fields
27 acts_as_tree :order => "name", :counter_cache => true
26 28
27 29 validates_presence_of :name, :descr
30 validates_uniqueness_of :name
28 31
29 32 # returns 5 last created projects
30 33 def self.latest
31 34 find(:all, :limit => 5, :order => "created_on DESC")
32 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 37 # Returns an array of all custom fields enabled for project issues
40 38 # (explictly associated custom fields and custom fields enabled for all projects)
41 39 def custom_fields_for_issues
42 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 48 end
@@ -20,6 +20,9 class Tracker < ActiveRecord::Base
20 20 has_many :issues
21 21 has_many :workflows, :dependent => true
22 22
23 validates_presence_of :name
24 validates_uniqueness_of :name
25
23 26 def name
24 27 _ self.attributes['name']
25 28 end
@@ -18,58 +18,46
18 18 require "digest/sha1"
19 19
20 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
24 attr_accessor :last_before_login_on
25 # Prevents unauthorized assignments
26 attr_protected :admin
23 attr_accessor :password, :password_confirmation
24 attr_accessor :last_before_login_on
25 # Prevents unauthorized assignments
26 attr_protected :login, :admin, :password, :password_confirmation, :hashed_password
27 27
28 validates_presence_of :login, :firstname, :lastname, :mail
29 validates_uniqueness_of :login, :mail
30
31 # Login must contain lettres, numbers, underscores only
32 validates_format_of :login, :with => /^[a-z0-9_]+$/i
33 validates_format_of :mail, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
28 validates_presence_of :login, :firstname, :lastname, :mail
29 validates_uniqueness_of :login, :mail
30 # Login must contain lettres, numbers, underscores only
31 validates_format_of :login, :with => /^[a-z0-9_]+$/i
32 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
36 self.hashed_password = User.hash_password(self.password)
37 end
42 # Returns the user that matches provided login and password, or nil
43 def self.try_to_login(login, password)
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
40 @password = nil
41 end
52 # Return user's full name for display
53 def display_name
54 firstname + " " + lastname
55 end
42 56
43 # Returns the user that matches user's login and password
44 def try_to_login
45 @user = User.login(self.login, self.password)
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 def check_password?(clear_password)
58 User.hash_password(clear_password) == self.hashed_password
59 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 62 def role_for_project(project_id)
75 63 @role_for_projects ||=
@@ -82,8 +70,8 class User < ActiveRecord::Base
82 70 end
83 71
84 72 private
85 # Return password digest
86 def self.hash_password(clear_password)
87 Digest::SHA1.hexdigest(clear_password)
88 end
73 # Return password digest
74 def self.hash_password(clear_password)
75 Digest::SHA1.hexdigest(clear_password || "")
76 end
89 77 end
@@ -16,12 +16,13
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 class Version < ActiveRecord::Base
19 before_destroy :check_integrity
20 belongs_to :project
21 has_many :fixed_issues, :class_name => 'Issue', :foreign_key => 'fixed_version_id'
19 before_destroy :check_integrity
20 belongs_to :project
21 has_many :fixed_issues, :class_name => 'Issue', :foreign_key => 'fixed_version_id'
22 22 has_many :attachments, :as => :container, :dependent => true
23
24 validates_presence_of :name, :descr
23
24 validates_presence_of :name
25 validates_uniqueness_of :name, :scope => [:project_id]
25 26
26 27 private
27 28 def check_integrity
@@ -16,10 +16,9
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 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
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
23 validates_presence_of :role, :old_status, :new_status
25 24 end
@@ -1,12 +1,12
1 1 <div class="box">
2 <h2><%=_ 'Please login' %></h2>
2 <h2><%=_('Please login') %></h2>
3 3
4 4 <%= start_form_tag :action=> "login" %>
5 <p><label for="user_login"><%=_ 'Login' %>:</label><br/>
6 <input type="text" name="user[login]" id="user_login" size="30" /></p>
5 <p><label for="login"><%=_ 'Login' %>:</label><br/>
6 <%= text_field_tag 'login', nil, :size => 25 %></p>
7 7
8 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 11 <p><input type="submit" name="login" value="<%=_ 'Log in' %> &#187;" class="primary" /></p>
12 12 <%= end_form_tag %>
@@ -3,13 +3,14
3 3 <p><%=_('Login')%>: <strong><%= @user.login %></strong><br />
4 4 <%=_('Created on')%>: <%= format_time(@user.created_on) %>,
5 5 <%=_('Last update')%>: <%= format_time(@user.updated_on) %></p>
6
7 <%= error_messages_for 'user' %>
6 8
7 9 <div class="splitcontentleft">
8 10 <div class="box">
9 11 <h3><%=_('Information')%></h3>
10 12 &nbsp;
11 13 <%= start_form_tag :action => 'my_account' %>
12 <%= error_messages_for 'user' %>
13 14
14 15 <!--[form:user]-->
15 16 <p><label for="user_firstname"><%=_('Firstname')%> <span class="required">*</span></label><br/>
@@ -39,14 +40,14
39 40 &nbsp;
40 41 <%= start_form_tag :action => 'change_password' %>
41 42
42 <p><label for="old_password"><%=_('Password')%> <span class="required">*</span></label><br/>
43 <%= password_field_tag 'old_password' %></p>
43 <p><label for="password"><%=_('Password')%> <span class="required">*</span></label><br/>
44 <%= password_field_tag 'password', nil, :size => 25 %></p>
44 45
45 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 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 52 <center><%= submit_tag _('Save') %></center>
52 53 <%= end_form_tag %>
@@ -1,4 +1,10
1 1 <h2><%=_('Information')%></h2>
2 2
3 <%=_('Version')%>: <%= RDM_APP_NAME %> <%= RDM_APP_VERSION %><br />
4 <%=_('Database')%>: <%= @adapter_name %> No newline at end of file
3 <p><%=_('Version')%>: <strong><%= RDM_APP_NAME %> <%= RDM_APP_VERSION %></strong></p>
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 3 <table width="100%" cellspacing="1" cellpadding="2" class="listTableContent">
4 4 <tr class="ListHead">
5 <%= sort_header_tag('projects.name', :caption => _('Project')) %>
5 <%= sort_header_tag('name', :caption => _('Project')) %>
6 6 <th><%=_('Description')%></th>
7 <th><%=_('Public')%></th>
8 <%= sort_header_tag('projects.created_on', :caption => _('Created on')) %>
7 <th><%=_('Public')%></th>
8 <th><%=_('Subprojects')%></th>
9 <%= sort_header_tag('created_on', :caption => _('Created on')) %>
9 10 <th></th>
10 11 </tr>
11 12
12 <% odd_or_even = 1
13 for project in @projects
14 odd_or_even = 1 - odd_or_even %>
15 <tr class="ListLine<%= odd_or_even %>">
13 <% for project in @projects %>
14 <tr class="<%= cycle("odd", "even") %>">
16 15 <td><%= link_to project.name, :controller => 'projects', :action => 'settings', :id => project %>
17 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 19 <td align="center"><%= format_date(project.created_on) %>
20 20 <td align="center">
21 21 <%= start_form_tag({:controller => 'projects', :action => 'destroy', :id => project}) %>
@@ -26,10 +26,7
26 26 <% end %>
27 27 </table>
28 28
29 <%= link_to ('&#171; ' + _('Previous')), { :page => @project_pages.current.previous } if @project_pages.current.previous %>
30 <%= pagination_links(@project_pages) %>
31 <%= link_to (_('Next') + ' &#187;'), { :page => @project_pages.current.next } if @project_pages.current.next %>
32
33 <br />
34
35 <%= link_to ('&#187; ' + _('New project')), :controller => 'projects', :action => 'add' %> No newline at end of file
29 <p><%= pagination_links_full @project_pages %>
30 [ <%= @project_pages.current.first_item %> - <%= @project_pages.current.last_item %> / <%= @project_count %> ]</p>
31
32 <p><%= link_to ('&#187; ' + _('New project')), :controller => 'projects', :action => 'add' %></p> No newline at end of file
@@ -10,7 +10,7
10 10 <th></th>
11 11 </tr>
12 12 <% for custom_field in @custom_fields %>
13 <tr style="background-color:#CEE1ED">
13 <tr class="<%= cycle("odd", "even") %>">
14 14 <td><%= link_to custom_field.name, :action => 'edit', :id => custom_field %></td>
15 15 <td align="center"><%= CustomField::TYPES[custom_field.typ][0] %></td>
16 16 <td align="center"><%= image_tag 'true' if custom_field.is_required? %></td>
@@ -24,14 +24,16
24 24 <td><%= link_to attachment.filename, :action => 'download', :id => @document, :attachment_id => attachment %></td>
25 25 <td align="center"><%= format_date(attachment.created_on) %></td>
26 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 29 <% if authorize_for('documents', 'destroy_attachment') %>
29 30 <td align="center">
30 31 <%= start_form_tag :action => 'destroy_attachment', :id => @document, :attachment_id => attachment %>
31 32 <%= submit_tag _('Delete'), :class => "button-small" %>
32 33 <%= end_form_tag %>
33 34 </tr>
34 <% end %>
35 <% end %>
36
35 37 <% end %>
36 38 </table>
37 39 <br />
@@ -1,7 +1,7
1 1 <%= error_messages_for 'issue_status' %>
2 2
3 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 5 <%= text_field 'issue_status', 'name' %></p>
6 6
7 7 <p><%= check_box 'issue_status', 'is_closed' %>
@@ -11,7 +11,7
11 11 <label for="issue_status_is_default"><%=_('Default status')%></label></p>
12 12
13 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 16 <!--[eoform:issue_status]-->
17 17
@@ -10,10 +10,10
10 10 </tr>
11 11
12 12 <% for status in @issue_statuses %>
13 <tr style="background-color:#CEE1ED">
13 <tr class="<%= cycle("odd", "even") %>">
14 14 <td><%= link_to status.name, :action => 'edit', :id => status %></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>
15 <td align="center"><%= image_tag 'true' if status.is_default? %></td>
16 <td align="center"><%= image_tag 'true' if status.is_closed? %></td>
17 17 <td bgcolor="#<%= status.html_color %>">&nbsp</td>
18 18 <td align="center">
19 19 <%= start_form_tag :action => 'destroy', :id => status %>
@@ -10,7 +10,7
10 10 <p><b><%=_('Assigned to')%>:</b> <%= @issue.assigned_to.display_name unless @issue.assigned_to.nil? %></p>
11 11
12 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 14 <p><b><%=_('Created on')%>:</b> <%= format_date(@issue.created_on) %></p>
15 15
16 16 <% if authorize_for('issues', 'edit') %>
@@ -65,7 +65,7
65 65 <table width="100%">
66 66 <% for attachment in @issue.attachments %>
67 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 69 <td><%= format_date(attachment.created_on) %></td>
70 70 <td><%= attachment.author.display_name %></td>
71 71 <% if authorize_for('issues', 'destroy_attachment') %>
@@ -81,7 +81,7
81 81 </div>
82 82
83 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 85 </div>
86 86
87 87 </div>
@@ -6,5 +6,5
6 6 <b><%=_('Date')%></b>: <%= format_time(@news.created_on) %>
7 7 </p>
8 8
9 <%= @news.descr %>
9 <%= simple_format auto_link @news.descr %>
10 10
@@ -4,15 +4,23
4 4 <p><label for="project_name"><%=_('Name')%> <span class="required">*</span></label><br/>
5 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 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 18 <p><label for="project_homepage"><%=_('Homepage')%></label><br/>
11 19 <%= text_field 'project', 'homepage', :size => 40 %></p>
12 20
13 <p><%= check_box 'project', 'public' %>
14 <label for="project_public"><%=_('Public')%></label></p>
15
21 <p><%= check_box 'project', 'is_public' %>
22 <label for="project_is_public"><%=_('Public')%></label></p>
23
16 24 <fieldset><legend><%=_('Custom fields')%></legend>
17 25 <% for custom_field in @custom_fields %>
18 26 <input type="checkbox"
@@ -2,7 +2,7
2 2
3 3 <% fixed_issues = @fixed_issues.group_by {|i| i.fixed_version } %>
4 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 6 <%=h version.descr %></p>
7 7 <ul>
8 8 <% issues.each do |i| %>
@@ -2,15 +2,13
2 2
3 3 <table width="100%" cellspacing="1" cellpadding="2" class="listTableContent">
4 4 <tr class="ListHead">
5 <%= sort_header_tag('projects.name', :caption => _('Project')) %>
5 <%= sort_header_tag('name', :caption => _('Project')) %>
6 6 <th>Description</th>
7 <%= sort_header_tag('projects.created_on', :caption => _('Created on')) %>
7 <%= sort_header_tag('created_on', :caption => _('Created on')) %>
8 8 </tr>
9 9
10 <% odd_or_even = 1
11 for project in @projects
12 odd_or_even = 1 - odd_or_even %>
13 <tr class="ListLine<%= odd_or_even %>">
10 <% for project in @projects %>
11 <tr class="<%= cycle("odd", "even") %>">
14 12 <td><%= link_to project.name, :action => 'show', :id => project %>
15 13 <td><%= project.descr %>
16 14 <td align="center"><%= format_date(project.created_on) %>
@@ -17,14 +17,12
17 17 <tr>
18 18 <td colspan="7"><%= image_tag 'package' %> <b><%= version.name %></b></td>
19 19 </tr>
20 <% odd_or_even = 1
21 for file in version.attachments
22 odd_or_even = 1 - odd_or_even %>
23 <tr class="ListLine<%= odd_or_even %>">
20 <% for file in version.attachments %>
21 <tr class="<%= cycle("odd", "even") %>">
24 22 <td></td>
25 23 <td><%= link_to file.filename, :controller => 'versions', :action => 'download', :id => version, :attachment_id => file %></td>
26 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 26 <td align="center"><%= file.downloads %></td>
29 27 <td align="center"><small><%= file.digest %></small></td>
30 28 <% if delete_allowed %>
@@ -35,7 +33,8
35 33 </td>
36 34 <% end %>
37 35 </tr>
38 <% end %>
36 <% end
37 reset_cycle %>
39 38 <% end %>
40 39 </table>
41 40
@@ -3,17 +3,19
3 3 <form method="post" class="noborder">
4 4 <table cellpadding=2>
5 5 <tr>
6 <td><%=_('Status')%>:<br /><%= search_filter_tag("status_id") %></td>
7 <td><%=_('Tracker')%>:<br /><%= search_filter_tag("tracker_id") %></td>
8 <td><%=_('Priority')%>:<br /><%= search_filter_tag("priority_id") %></td>
9 <td><%=_('Category')%>:<br /><%= search_filter_tag("category_id") %></td>
10 <td><%=_('Assigned to')%>:<br /><%= search_filter_tag("assigned_to_id") %></td>
6 <td><small><%=_('Status')%>:</small><br /><%= search_filter_tag 'status_id', :class => 'select-small' %></td>
7 <td><small><%=_('Tracker')%>:</small><br /><%= search_filter_tag 'tracker_id', :class => 'select-small' %></td>
8 <td><small><%=_('Priority')%>:</small><br /><%= search_filter_tag 'priority_id', :class => 'select-small' %></td>
9 <td><small><%=_('Category')%>:</small><br /><%= search_filter_tag 'category_id', :class => 'select-small' %></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 13 <td valign="bottom">
12 <%= submit_tag _('Apply filter') %>
14 <%= submit_tag _('Apply filter'), :class => 'button-small' %>
13 15 <%= end_form_tag %>
14 16
15 17 <%= start_form_tag %>
16 <%= submit_tag _('Reset') %>
18 <%= submit_tag _('Reset'), :class => 'button-small' %>
17 19 <%= end_form_tag %>
18 20 </td>
19 21 </tr>
@@ -13,8 +13,8
13 13 <% for tracker in Tracker.find_all %>
14 14 <li><%= link_to tracker.name, :controller => 'projects', :action => 'list_issues', :id => @project,
15 15 :set_filter => 1,
16 "issues.tracker_id" => tracker.id %>:
17 <%= tracker.issues.count(["project_id=?", @project.id]) %> <%=_('open')%>
16 "tracker_id" => tracker.id %>:
17 <%= Issue.count(:conditions => ["project_id=? and tracker_id=? and issue_statuses.is_closed=?", @project.id, tracker.id, false], :include => :status) %> <%=_('open')%>
18 18 </li>
19 19 <% end %>
20 20 </ul>
@@ -32,9 +32,18
32 32 <% end %>
33 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 44 <div class="box">
36 45 <h3><%=_('Latest news')%></h3>
37 <% for news in @project.news %>
46 <% for news in @news %>
38 47 <p>
39 48 <b><%= news.title %></b> <small>(<%= link_to_user news.author %> <%= format_time(news.created_on) %>)</small><br />
40 49 <%= news.shortdescr %>
@@ -7,7 +7,7
7 7 </tr>
8 8
9 9 <% for role in @roles %>
10 <tr style="background-color:#CEE1ED">
10 <tr class="<%= cycle("odd", "even") %>">
11 11 <td><%= link_to role.name, :action => 'edit', :id => role %></td>
12 12 <td align="center">
13 13 <%= start_form_tag :action => 'destroy', :id => role %>
@@ -7,7 +7,7
7 7 </tr>
8 8
9 9 <% for tracker in @trackers %>
10 <tr style="background-color:#CEE1ED">
10 <tr class="<%= cycle("odd", "even") %>">
11 11 <td><%= link_to tracker.name, :action => 'edit', :id => tracker %></td>
12 12 <td align="center">
13 13 <%= start_form_tag :action => 'destroy', :id => tracker %>
@@ -2,10 +2,13
2 2
3 3 <!--[form:user]-->
4 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/>
8 <%= password_field 'user', 'password' %></p>
7 <p><label for="password"><%=_('Password')%></label><br/>
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 13 <p><label for="user_firstname"><%=_('Firstname')%></label><br/>
11 14 <%= text_field 'user', 'firstname' %></p>
@@ -2,18 +2,18
2 2
3 3 <table border="0" cellspacing="1" cellpadding="2" class="listTableContent">
4 4 <tr class="ListHead">
5 <%= sort_header_tag('users.login', :caption => _('Login')) %>
6 <%= sort_header_tag('users.firstname', :caption => _('Firstname')) %>
7 <%= sort_header_tag('users.lastname', :caption => _('Lastname')) %>
5 <%= sort_header_tag('login', :caption => _('Login')) %>
6 <%= sort_header_tag('firstname', :caption => _('Firstname')) %>
7 <%= sort_header_tag('lastname', :caption => _('Lastname')) %>
8 8 <th><%=_('Mail')%></th>
9 <%= sort_header_tag('users.admin', :caption => _('Admin')) %>
10 <%= sort_header_tag('users.locked', :caption => _('Locked')) %>
11 <%= sort_header_tag('users.created_on', :caption => _('Created on')) %>
12 <%= sort_header_tag('users.last_login_on', :caption => _('Last login')) %>
9 <%= sort_header_tag('admin', :caption => _('Admin')) %>
10 <%= sort_header_tag('locked', :caption => _('Locked')) %>
11 <%= sort_header_tag('created_on', :caption => _('Created on')) %>
12 <%= sort_header_tag('last_login_on', :caption => _('Last login')) %>
13 13 <th></th>
14 14 </tr>
15 15 <% for user in @users %>
16 <tr style="background-color:#CEE1ED">
16 <tr class="<%= cycle("odd", "even") %>">
17 17 <td><%= link_to user.login, :action => 'edit', :id => user %></td>
18 18 <td><%= user.firstname %></td>
19 19 <td><%= user.lastname %></td>
@@ -25,10 +25,10
25 25 <td align="center">
26 26 <%= start_form_tag :action => 'edit', :id => user %>
27 27 <% if user.locked? %>
28 <%= hidden_field_tag 'user[locked]', false %>
28 <%= hidden_field_tag 'user[locked]', 0 %>
29 29 <%= submit_tag _('Unlock'), :class => "button-small" %>
30 30 <% else %>
31 <%= hidden_field_tag 'user[locked]', true %>
31 <%= hidden_field_tag 'user[locked]', 1 %>
32 32 <%= submit_tag _('Lock'), :class => "button-small" %>
33 33 <% end %>
34 34 <%= end_form_tag %>
@@ -1,13 +1,13
1 1 <%= error_messages_for 'version' %>
2 2
3 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 5 <%= text_field 'version', 'name', :size => 20 %></p>
6 6
7 7 <p><label for="version_descr"><%=_('Description')%></label><br/>
8 8 <%= text_field 'version', 'descr', :size => 60 %></p>
9 9
10 <p><label for="version_date"><%=_('Date')%></label><br/>
11 <%= date_select 'version', 'date' %></p>
10 <p><label for="version_effective_date"><%=_('Date')%></label><br/>
11 <%= date_select 'version', 'effective_date' %></p>
12 12 <!--[eoform:version]-->
13 13
@@ -2,7 +2,7
2 2 <h2><%=_('Welcome')%> !</h2>
3 3
4 4 <div class="box">
5 <h3>Latest news</h3>
5 <h3><%=_('Latest news')%></h3>
6 6 <% for news in @news %>
7 7 <p>
8 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 17 <div class="splitcontentright">
18 18 <div class="box">
19 <h3>Latest projects</h3>
19 <h3><%=_('Latest projects')%></h3>
20 20 <ul>
21 21 <% for project in @projects %>
22 22 <li>
@@ -5,6 +5,14
5 5 # (on OS X: gem install mysql -- --include=/usr/local/lib)
6 6 # And be sure to use new-style password hashing:
7 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 16 development:
9 17 adapter: mysql
10 18 database: redmine_development
@@ -18,6 +26,17 development_pgsql:
18 26 host: localhost
19 27 username: postgres
20 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 41 test:
23 42 adapter: mysql
@@ -25,15 +44,26 test:
25 44 host: localhost
26 45 username: root
27 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 66 demo:
30 67 adapter: sqlite3
31 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 73 # application name
74 74 RDM_APP_NAME = "redMine"
75 75 # application version
76 RDM_APP_VERSION = "0.1.0"
76 RDM_APP_VERSION = "0.2.0"
77 77 # application host name
78 78 RDM_HOST_NAME = "somenet.foo"
79 79 # file storage path
@@ -1,21 +1,62
1 # administration
2 admin:
3 index: administration.html
4 mail_options: administration.html#mail_notifications
5 info: administration.html#app_info
6 users:
7 index: administration.html#users
8 roles:
9 index: administration.html#roles
10 workflow: administration.html#workflow
11 trackers:
12 index: administration.html#trackers
13 issue_statuses:
14 index: administration.html#issue_statuses
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.
15 17
16 # projects
17 projects:
18 add: projects.html#settings
18 # available languages for help pages
19 langs:
20 - fr
19 21
20
21 # issues No newline at end of file
22 # mapping between controller/action and help pages
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 18 class Setup < ActiveRecord::Migration
2 19 def self.up
3 20 create_table "attachments", :force => true do |t|
@@ -5,8 +22,8 class Setup < ActiveRecord::Migration
5 22 t.column "container_type", :string, :limit => 30, :default => "", :null => false
6 23 t.column "filename", :string, :default => "", :null => false
7 24 t.column "disk_filename", :string, :default => "", :null => false
8 t.column "size", :integer, :default => 0, :null => false
9 t.column "content_type", :string, :limit => 60, :default => "", :null => false
25 t.column "filesize", :integer, :default => 0, :null => false
26 t.column "content_type", :string, :limit => 60, :default => ""
10 27 t.column "digest", :string, :limit => 40, :default => "", :null => false
11 28 t.column "downloads", :integer, :default => 0, :null => false
12 29 t.column "author_id", :integer, :default => 0, :null => false
@@ -18,8 +35,8 class Setup < ActiveRecord::Migration
18 35 t.column "typ", :integer, :default => 0, :null => false
19 36 t.column "is_required", :boolean, :default => false, :null => false
20 37 t.column "is_for_all", :boolean, :default => false, :null => false
21 t.column "possible_values", :text, :default => "", :null => false
22 t.column "regexp", :string, :default => "", :null => false
38 t.column "possible_values", :text, :default => ""
39 t.column "regexp", :string, :default => ""
23 40 t.column "min_length", :integer, :default => 0, :null => false
24 41 t.column "max_length", :integer, :default => 0, :null => false
25 42 end
@@ -59,7 +76,7 class Setup < ActiveRecord::Migration
59 76 t.column "issue_id", :integer, :default => 0, :null => false
60 77 t.column "status_id", :integer, :default => 0, :null => false
61 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 80 t.column "created_on", :timestamp
64 81 end
65 82
@@ -99,7 +116,7 class Setup < ActiveRecord::Migration
99 116 create_table "news", :force => true do |t|
100 117 t.column "project_id", :integer
101 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 120 t.column "descr", :text, :default => "", :null => false
104 121 t.column "author_id", :integer, :default => 0, :null => false
105 122 t.column "created_on", :timestamp
@@ -109,7 +126,7 class Setup < ActiveRecord::Migration
109 126 t.column "controller", :string, :limit => 30, :default => "", :null => false
110 127 t.column "action", :string, :limit => 30, :default => "", :null => false
111 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 130 t.column "sort", :integer, :default => 0, :null => false
114 131 t.column "mail_option", :boolean, :default => false, :null => false
115 132 t.column "mail_enabled", :boolean, :default => false, :null => false
@@ -125,8 +142,10 class Setup < ActiveRecord::Migration
125 142 create_table "projects", :force => true do |t|
126 143 t.column "name", :string, :limit => 30, :default => "", :null => false
127 144 t.column "descr", :string, :default => "", :null => false
128 t.column "homepage", :string, :limit => 60, :default => "", :null => false
129 t.column "public", :boolean, :default => true, :null => false
145 t.column "homepage", :string, :limit => 60, :default => ""
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 149 t.column "created_on", :timestamp
131 150 t.column "updated_on", :timestamp
132 151 end
@@ -158,8 +177,8 class Setup < ActiveRecord::Migration
158 177 create_table "versions", :force => true do |t|
159 178 t.column "project_id", :integer, :default => 0, :null => false
160 179 t.column "name", :string, :limit => 30, :default => "", :null => false
161 t.column "descr", :string, :default => "", :null => false
162 t.column "date", :date, :null => false
180 t.column "descr", :string, :default => ""
181 t.column "effective_date", :date, :null => false
163 182 t.column "created_on", :timestamp
164 183 t.column "updated_on", :timestamp
165 184 end
@@ -172,13 +191,13 class Setup < ActiveRecord::Migration
172 191 end
173 192
174 193 # project
175 Permission.create :controller => "projects", :action => "show", :descr => "Overview", :sort => 100, :public => true
176 Permission.create :controller => "projects", :action => "changelog", :descr => "View change log", :sort => 105, :public => true
177 Permission.create :controller => "reports", :action => "issue_report", :descr => "View reports", :sort => 110, :public => true
194 Permission.create :controller => "projects", :action => "show", :descr => "Overview", :sort => 100, :is_public => true
195 Permission.create :controller => "projects", :action => "changelog", :descr => "View change log", :sort => 105, :is_public => true
196 Permission.create :controller => "reports", :action => "issue_report", :descr => "View reports", :sort => 110, :is_public => true
178 197 Permission.create :controller => "projects", :action => "settings", :descr => "Settings", :sort => 150
179 198 Permission.create :controller => "projects", :action => "edit", :descr => "Edit", :sort => 151
180 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 201 Permission.create :controller => "projects", :action => "add_member", :descr => "New member", :sort => 220
183 202 Permission.create :controller => "members", :action => "edit", :descr => "Edit", :sort => 221
184 203 Permission.create :controller => "members", :action => "destroy", :descr => "Delete", :sort => 222
@@ -191,9 +210,9 class Setup < ActiveRecord::Migration
191 210 Permission.create :controller => "issue_categories", :action => "edit", :descr => "Edit", :sort => 421
192 211 Permission.create :controller => "issue_categories", :action => "destroy", :descr => "Delete", :sort => 422
193 212 # issues
194 Permission.create :controller => "projects", :action => "list_issues", :descr => "View list", :sort => 1000, :public => true
195 Permission.create :controller => "issues", :action => "show", :descr => "View", :sort => 1005, :public => true
196 Permission.create :controller => "issues", :action => "download", :descr => "Download file", :sort => 1010, :public => true
213 Permission.create :controller => "projects", :action => "list_issues", :descr => "View list", :sort => 1000, :is_public => true
214 Permission.create :controller => "issues", :action => "show", :descr => "View", :sort => 1005, :is_public => true
215 Permission.create :controller => "issues", :action => "download", :descr => "Download file", :sort => 1010, :is_public => true
197 216 Permission.create :controller => "projects", :action => "add_issue", :descr => "Report an issue", :sort => 1050, :mail_option => 1, :mail_enabled => 1
198 217 Permission.create :controller => "issues", :action => "edit", :descr => "Edit", :sort => 1055
199 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 220 Permission.create :controller => "issues", :action => "add_attachment", :descr => "Add file", :sort => 1070
202 221 Permission.create :controller => "issues", :action => "destroy_attachment", :descr => "Delete file", :sort => 1075
203 222 # news
204 Permission.create :controller => "projects", :action => "list_news", :descr => "View list", :sort => 1100, :public => true
205 Permission.create :controller => "news", :action => "show", :descr => "View", :sort => 1101, :public => true
223 Permission.create :controller => "projects", :action => "list_news", :descr => "View list", :sort => 1100, :is_public => true
224 Permission.create :controller => "news", :action => "show", :descr => "View", :sort => 1101, :is_public => true
206 225 Permission.create :controller => "projects", :action => "add_news", :descr => "Add", :sort => 1120
207 226 Permission.create :controller => "news", :action => "edit", :descr => "Edit", :sort => 1121
208 227 Permission.create :controller => "news", :action => "destroy", :descr => "Delete", :sort => 1122
209 228 # documents
210 Permission.create :controller => "projects", :action => "list_documents", :descr => "View list", :sort => 1200, :public => true
211 Permission.create :controller => "documents", :action => "show", :descr => "View", :sort => 1201, :public => true
212 Permission.create :controller => "documents", :action => "download", :descr => "Download", :sort => 1202, :public => true
229 Permission.create :controller => "projects", :action => "list_documents", :descr => "View list", :sort => 1200, :is_public => true
230 Permission.create :controller => "documents", :action => "show", :descr => "View", :sort => 1201, :is_public => true
231 Permission.create :controller => "documents", :action => "download", :descr => "Download", :sort => 1202, :is_public => true
213 232 Permission.create :controller => "projects", :action => "add_document", :descr => "Add", :sort => 1220
214 233 Permission.create :controller => "documents", :action => "edit", :descr => "Edit", :sort => 1221
215 234 Permission.create :controller => "documents", :action => "destroy", :descr => "Delete", :sort => 1222
216 235 Permission.create :controller => "documents", :action => "add_attachment", :descr => "Add file", :sort => 1223
217 236 Permission.create :controller => "documents", :action => "destroy_attachment", :descr => "Delete file", :sort => 1224
218 237 # files
219 Permission.create :controller => "projects", :action => "list_files", :descr => "View list", :sort => 1300, :public => true
220 Permission.create :controller => "versions", :action => "download", :descr => "Download", :sort => 1301, :public => true
238 Permission.create :controller => "projects", :action => "list_files", :descr => "View list", :sort => 1300, :is_public => true
239 Permission.create :controller => "versions", :action => "download", :descr => "Download", :sort => 1301, :is_public => true
221 240 Permission.create :controller => "projects", :action => "add_file", :descr => "Add", :sort => 1320
222 241 Permission.create :controller => "versions", :action => "destroy_file", :descr => "Delete", :sort => 1322
223 242
224 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 247 user.admin = true
227 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 18 class DefaultConfiguration < ActiveRecord::Migration
2 19 def self.up
3 20 # roles
4 21 r = Role.create(:name => "Manager")
5 22 r.permissions = Permission.find(:all)
6 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 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 27 # trackers
11 28 Tracker.create(:name => "Bug", :is_in_chlog => true)
12 29 Tracker.create(:name => "Feature request", :is_in_chlog => true)
@@ -2,13 +2,22
2 2
3 3 redMine - project management software
4 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
11 * Issues list exportable to CSV
10 * new databases supported: Oracle, PostgreSQL, SQL Server
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 21 * Fixed: Error on tables creation with PostgreSQL (rev5)
13 22 * Fixed: SQL error in "issue reports" view with PostgreSQL (rev5)
14 23
@@ -2,15 +2,23
2 2
3 3 redMine - project management software
4 4 Copyright (C) 2006 Jean-Philippe Lang
5 http://redmine.sourceforge.net/
5 http://redmine.org/
6 6
7 7
8 8 == Requirements
9 9
10 10 * Ruby on Rails 1.1
11 * Any database supported by Rails (developped using MySQL 5)
11 * a database (see compatibility below)
12 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 23 == Installation
16 24
@@ -20,9 +28,9 http://redmine.sourceforge.net/
20 28 2. Create an empty database: "redmine" for example
21 29
22 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 34 rake migrate RAILS_ENV="production"
27 35 It will create tables and default configuration data
28 36
@@ -2,7 +2,7
2 2
3 3 redMine - project management software
4 4 Copyright (C) 2006 Jean-Philippe Lang
5 http://redmine.sourceforge.net/
5 http://redmine.org/
6 6
7 7 == License
8 8
@@ -34,6 +34,12 redMine is a project management software written using Ruby on Rails.
34 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 43 == Versioning
38 44
39 45 redMine versioning scheme is major.minor.revision
@@ -10,7 +10,11 Localization.define('fr', 'Français') do |l|
10 10 l.store 'Resolved', 'Résolue'
11 11 l.store 'Closed', 'Fermée'
12 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 19 # issue priorities
16 20 l.store 'Issue priorities', 'Priorités des demandes'
@@ -53,6 +57,9 Localization.define('fr', 'Français') do |l|
53 57 l.store 'Reported issues', 'Demandes soumises'
54 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 63 # ./script/../config/../app/views/account/show.rhtml
57 64 l.store 'Registered on', 'Inscrit le'
58 65 l.store 'Projects', 'Projets'
@@ -231,6 +238,7 Localization.define('fr', 'Français') do |l|
231 238 l.store 'New file', 'Nouveau fichier'
232 239
233 240 # ./script/../config/../app/views/projects/list_issues.rhtml
241 l.store 'Subprojects', 'Sous-projets'
234 242 l.store 'Apply filter', 'Appliquer'
235 243 l.store 'Reset', 'Annuler'
236 244 l.store 'Report an issue', 'Nouvelle demande'
@@ -311,6 +319,6 Localization.define('fr', 'Français') do |l|
311 319 # ./script/../config/../app/views/versions/_form.rhtml
312 320
313 321 # ./script/../config/../app/views/welcome/index.rhtml
314
322 l.store 'Latest projects', 'Derniers projets'
315 323
316 324 end
1 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 189 font-size: 0.8em;
190 190 }
191 191
192 select.select-small
193 {
194 font-size: 0.8em;
195 }
196
192 197 label {
193 198 font-weight: bold;
194 199 font-size: 1em;
195 200 }
196 201
202 fieldset {
203 border:1px solid #7F9DB9;
204 }
205
197 206 .required {
198 207 color: #bb0000;
199 208 }
@@ -220,10 +229,10 tr.ListHead a {
220 229 text-decoration:underline;
221 230 }
222 231
223 tr.ListLine0 {
232 tr.odd {
224 233 background-color: #C1E2F7;
225 234 }
226 tr.ListLine1 {
235 tr.even {
227 236 background-color:#CEE1ED;
228 237 }
229 238
@@ -1,5 +1,26
1 1 # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
2 first:
2 ecookbook:
3 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 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 1 # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
2 first:
2 manager:
3 3 id: 1
4 another:
4 name: manager
5 developer:
5 6 id: 2
7 name: developer
8 reporter:
9 id: 3
10 name: reporter
@@ -1,5 +1,19
1 1 # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
2 first:
2 admin:
3 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 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 18 require File.dirname(__FILE__) + '/../test_helper'
2 19 require 'projects_controller'
3 20
@@ -27,62 +44,4 class ProjectsControllerTest < Test::Unit::TestCase
27 44
28 45 assert_not_nil assigns(:projects)
29 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 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 19 require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
3 20 require 'test_help'
4 21
@@ -25,4 +42,14 class Test::Unit::TestCase
25 42 self.use_instantiated_fixtures = false
26 43
27 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 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 18 require File.dirname(__FILE__) + '/../test_helper'
2 19
3 20 class ProjectTest < Test::Unit::TestCase
4 21 fixtures :projects
5 22
6 # Replace this with your real tests.
23 def setup
24 @project = projects(:ecookbook)
25 end
26
7 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 76 end
10 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 18 require File.dirname(__FILE__) + '/../test_helper'
2 19
3 20 class UserTest < Test::Unit::TestCase
4 21 fixtures :users
5 22
6 # Replace this with your real tests.
7 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 63 end
10 64 end
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
General Comments 0
You need to be logged in to leave comments. Login now